diff --git a/evals/packages/types/src/roo-code.ts b/evals/packages/types/src/roo-code.ts index 32b54c4c81..cef4056ce7 100644 --- a/evals/packages/types/src/roo-code.ts +++ b/evals/packages/types/src/roo-code.ts @@ -102,7 +102,6 @@ export const modelInfoSchema = z.object({ supportsImages: z.boolean().optional(), supportsComputerUse: z.boolean().optional(), supportsPromptCache: z.boolean(), - isPromptCacheOptional: z.boolean().optional(), inputPrice: z.number().optional(), outputPrice: z.number().optional(), cacheWritesPrice: z.number().optional(), @@ -336,7 +335,6 @@ export type ProviderSettingsEntry = z.infer const genericProviderSettingsSchema = z.object({ includeMaxTokens: z.boolean().optional(), reasoningEffort: reasoningEffortsSchema.optional(), - promptCachingDisabled: z.boolean().optional(), diffEnabled: z.boolean().optional(), fuzzyMatchThreshold: z.number().optional(), modelTemperature: z.number().nullish(), @@ -699,7 +697,6 @@ const providerSettingsRecord: ProviderSettingsRecord = { // Generic includeMaxTokens: undefined, reasoningEffort: undefined, - promptCachingDisabled: undefined, diffEnabled: undefined, fuzzyMatchThreshold: undefined, modelTemperature: undefined, diff --git a/src/api/index.ts b/src/api/index.ts index 10cbe14429..f0d9a86120 100644 --- a/src/api/index.ts +++ b/src/api/index.ts @@ -32,7 +32,7 @@ export interface SingleCompletionHandler { } export interface ApiHandler { - createMessage(systemPrompt: string, messages: Anthropic.Messages.MessageParam[], cacheKey?: string): ApiStream + createMessage(systemPrompt: string, messages: Anthropic.Messages.MessageParam[]): ApiStream getModel(): { id: string; info: ModelInfo } diff --git a/src/api/providers/__tests__/gemini.test.ts b/src/api/providers/__tests__/gemini.test.ts index ba7501f2a2..97c757f8fb 100644 --- a/src/api/providers/__tests__/gemini.test.ts +++ b/src/api/providers/__tests__/gemini.test.ts @@ -219,7 +219,7 @@ describe("GeminiHandler", () => { mockInfo.cacheWritesPrice! * (cacheWriteTokens / 1_000_000) * (CACHE_TTL / 60) const expectedCost = expectedInputCost + expectedOutputCost + expectedCacheWriteCost - const cost = handler.calculateCost({ info: mockInfo, inputTokens, outputTokens, cacheWriteTokens }) + const cost = handler.calculateCost({ info: mockInfo, inputTokens, outputTokens }) expect(cost).toBeCloseTo(expectedCost) }) @@ -247,384 +247,3 @@ describe("GeminiHandler", () => { }) }) }) - -describe("Caching Logic", () => { - const systemPrompt = "System prompt" - const longContent = "a".repeat(5 * 4096) // Ensure content is long enough for caching - const mockMessagesLong: Anthropic.Messages.MessageParam[] = [ - { role: "user", content: longContent }, - { role: "assistant", content: "OK" }, - ] - const cacheKey = "test-cache-key" - const mockCacheName = "generated/caches/mock-cache-name" - const mockCacheTokens = 5000 - - let handlerWithCache: GeminiHandler - let mockGenerateContentStream: jest.Mock - let mockCreateCache: jest.Mock - let mockDeleteCache: jest.Mock - let mockCacheGet: jest.Mock - let mockCacheSet: jest.Mock - - beforeEach(() => { - mockGenerateContentStream = jest.fn().mockResolvedValue({ - [Symbol.asyncIterator]: async function* () { - yield { text: "Response" } - yield { - usageMetadata: { - promptTokenCount: 100, // Uncached input - candidatesTokenCount: 50, // Output - cachedContentTokenCount: 0, // Default, override in tests - }, - } - }, - }) - mockCreateCache = jest.fn().mockResolvedValue({ - name: mockCacheName, - usageMetadata: { totalTokenCount: mockCacheTokens }, - }) - mockDeleteCache = jest.fn().mockResolvedValue({}) - mockCacheGet = jest.fn().mockReturnValue(undefined) // Default: cache miss - mockCacheSet = jest.fn() - - handlerWithCache = new GeminiHandler({ - apiKey: "test-key", - apiModelId: "gemini-1.5-flash-latest", // Use a model that supports caching - geminiApiKey: "test-key", - promptCachingDisabled: false, - }) - - handlerWithCache["client"] = { - models: { - generateContentStream: mockGenerateContentStream, - }, - caches: { - create: mockCreateCache, - delete: mockDeleteCache, - }, - } as any - handlerWithCache["contentCaches"] = { - get: mockCacheGet, - set: mockCacheSet, - } as any - }) - - it("should not use cache if promptCachingDisabled is true", async () => { - handlerWithCache["options"].promptCachingDisabled = true - const stream = handlerWithCache.createMessage(systemPrompt, mockMessagesLong, cacheKey) - - for await (const _ of stream) { - } - - expect(mockCacheGet).not.toHaveBeenCalled() - expect(mockGenerateContentStream).toHaveBeenCalledWith( - expect.objectContaining({ - config: expect.objectContaining({ - cachedContent: undefined, - systemInstruction: systemPrompt, - }), - }), - ) - expect(mockCreateCache).not.toHaveBeenCalled() - }) - - it("should not use cache if content length is below threshold", async () => { - const shortMessages: Anthropic.Messages.MessageParam[] = [{ role: "user", content: "short" }] - const stream = handlerWithCache.createMessage(systemPrompt, shortMessages, cacheKey) - for await (const _ of stream) { - /* consume stream */ - } - - expect(mockCacheGet).not.toHaveBeenCalled() // Doesn't even check cache if too short - expect(mockGenerateContentStream).toHaveBeenCalledWith( - expect.objectContaining({ - config: expect.objectContaining({ - cachedContent: undefined, - systemInstruction: systemPrompt, - }), - }), - ) - expect(mockCreateCache).not.toHaveBeenCalled() - }) - - it("should perform cache write on miss when conditions met", async () => { - const stream = handlerWithCache.createMessage(systemPrompt, mockMessagesLong, cacheKey) - const chunks = [] - - for await (const chunk of stream) { - chunks.push(chunk) - } - - expect(mockCacheGet).toHaveBeenCalledWith(cacheKey) - expect(mockGenerateContentStream).toHaveBeenCalledWith( - expect.objectContaining({ - config: expect.objectContaining({ - cachedContent: undefined, - systemInstruction: systemPrompt, - }), - }), - ) - - await new Promise(process.nextTick) // Allow microtasks (like the async writeCache) to run - - expect(mockCreateCache).toHaveBeenCalledTimes(1) - expect(mockCreateCache).toHaveBeenCalledWith( - expect.objectContaining({ - model: expect.stringContaining("gemini-2.0-flash-001"), // Adjusted expectation based on test run - config: expect.objectContaining({ - systemInstruction: systemPrompt, - contents: expect.any(Array), // Verify contents structure if needed - ttl: expect.stringContaining("300s"), - }), - }), - ) - expect(mockCacheSet).toHaveBeenCalledWith( - cacheKey, - expect.objectContaining({ - key: mockCacheName, - count: mockMessagesLong.length, - tokens: mockCacheTokens, - }), - ) - expect(mockDeleteCache).not.toHaveBeenCalled() // No previous cache to delete - - const usageChunk = chunks.find((c) => c.type === "usage") - - expect(usageChunk).toEqual( - expect.objectContaining({ - cacheWriteTokens: 100, // Should match promptTokenCount when write is queued - cacheReadTokens: 0, - }), - ) - }) - - it("should use cache on hit and not send system prompt", async () => { - const cachedMessagesCount = 1 - const cacheReadTokensCount = 4000 - mockCacheGet.mockReturnValue({ key: mockCacheName, count: cachedMessagesCount, tokens: cacheReadTokensCount }) - - mockGenerateContentStream.mockResolvedValue({ - [Symbol.asyncIterator]: async function* () { - yield { text: "Response" } - yield { - usageMetadata: { - promptTokenCount: 10, // Uncached input tokens - candidatesTokenCount: 50, - cachedContentTokenCount: cacheReadTokensCount, // Simulate cache hit reporting - }, - } - }, - }) - - // Only send the second message (index 1) as uncached - const stream = handlerWithCache.createMessage(systemPrompt, mockMessagesLong, cacheKey) - const chunks = [] - - for await (const chunk of stream) { - chunks.push(chunk) - } - - expect(mockCacheGet).toHaveBeenCalledWith(cacheKey) - expect(mockGenerateContentStream).toHaveBeenCalledWith( - expect.objectContaining({ - contents: expect.any(Array), // Should contain only the *uncached* messages - config: expect.objectContaining({ - cachedContent: mockCacheName, // Cache name provided - systemInstruction: undefined, // System prompt NOT sent on hit - }), - }), - ) - - // Check that the contents sent are only the *new* messages - const calledContents = mockGenerateContentStream.mock.calls[0][0].contents - expect(calledContents.length).toBe(mockMessagesLong.length - cachedMessagesCount) // Only new messages sent - - // Wait for potential async cache write (shouldn't happen here) - await new Promise(process.nextTick) - expect(mockCreateCache).not.toHaveBeenCalled() - expect(mockCacheSet).not.toHaveBeenCalled() // No write occurred - - // Check usage data for cache read tokens - const usageChunk = chunks.find((c) => c.type === "usage") - expect(usageChunk).toEqual( - expect.objectContaining({ - inputTokens: 10, // Uncached tokens - outputTokens: 50, - cacheWriteTokens: undefined, // No write queued - cacheReadTokens: cacheReadTokensCount, // Read tokens reported - }), - ) - }) - - it("should trigger cache write and delete old cache on hit with enough new messages", async () => { - const previousCacheName = "generated/caches/old-cache-name" - const previousCacheTokens = 3000 - const previousMessageCount = 1 - - mockCacheGet.mockReturnValue({ - key: previousCacheName, - count: previousMessageCount, - tokens: previousCacheTokens, - }) - - // Simulate enough new messages to trigger write (>= CACHE_WRITE_FREQUENCY) - const newMessagesCount = 10 - - const messagesForCacheWrite = [ - mockMessagesLong[0], // Will be considered cached - ...Array(newMessagesCount).fill({ role: "user", content: "new message" }), - ] as Anthropic.Messages.MessageParam[] - - // Mock generateContentStream to report some uncached tokens - mockGenerateContentStream.mockResolvedValue({ - [Symbol.asyncIterator]: async function* () { - yield { text: "Response" } - yield { - usageMetadata: { - promptTokenCount: 500, // Uncached input tokens for the 10 new messages - candidatesTokenCount: 50, - cachedContentTokenCount: previousCacheTokens, - }, - } - }, - }) - - const stream = handlerWithCache.createMessage(systemPrompt, messagesForCacheWrite, cacheKey) - const chunks = [] - - for await (const chunk of stream) { - chunks.push(chunk) - } - - expect(mockCacheGet).toHaveBeenCalledWith(cacheKey) - - expect(mockGenerateContentStream).toHaveBeenCalledWith( - expect.objectContaining({ - contents: expect.any(Array), // Should contain only the *new* messages - config: expect.objectContaining({ - cachedContent: previousCacheName, // Old cache name used for reading - systemInstruction: undefined, // System prompt NOT sent - }), - }), - ) - const calledContents = mockGenerateContentStream.mock.calls[0][0].contents - expect(calledContents.length).toBe(newMessagesCount) // Only new messages sent - - // Wait for async cache write and delete - await new Promise(process.nextTick) - await new Promise(process.nextTick) // Needs extra tick for delete promise chain? - - expect(mockCreateCache).toHaveBeenCalledTimes(1) - expect(mockCreateCache).toHaveBeenCalledWith( - expect.objectContaining({ - // New cache uses *all* messages - config: expect.objectContaining({ - contents: expect.any(Array), // Should contain *all* messagesForCacheWrite - systemInstruction: systemPrompt, // System prompt included in *new* cache - }), - }), - ) - const createCallContents = mockCreateCache.mock.calls[0][0].config.contents - expect(createCallContents.length).toBe(messagesForCacheWrite.length) // All messages in new cache - - expect(mockCacheSet).toHaveBeenCalledWith( - cacheKey, - expect.objectContaining({ - key: mockCacheName, // New cache name - count: messagesForCacheWrite.length, // New count - tokens: mockCacheTokens, - }), - ) - - expect(mockDeleteCache).toHaveBeenCalledTimes(1) - expect(mockDeleteCache).toHaveBeenCalledWith({ name: previousCacheName }) // Old cache deleted - - const usageChunk = chunks.find((c) => c.type === "usage") - - expect(usageChunk).toEqual( - expect.objectContaining({ - inputTokens: 500, // Uncached tokens - outputTokens: 50, - cacheWriteTokens: 500, // Write tokens match uncached input when write is queued on hit? No, should be total tokens for the *new* cache. Let's adjust mockCreateCache. - cacheReadTokens: previousCacheTokens, - }), - ) - - // Re-run with adjusted expectation after fixing mockCreateCache if needed - // Let's assume mockCreateCache returns the *total* tokens for the *new* cache (system + all messages) - const expectedNewCacheTotalTokens = 6000 // Example total tokens for the new cache - - mockCreateCache.mockResolvedValue({ - name: mockCacheName, - usageMetadata: { totalTokenCount: expectedNewCacheTotalTokens }, - }) - - // Re-run the stream consumption and checks if necessary, or adjust expectation: - // The cacheWriteTokens in usage should reflect the *input* tokens that triggered the write, - // which are the *uncached* tokens in this hit scenario. - // The cost calculation uses the token count from the *create* response though. - // Let's stick to the current implementation: cacheWriteTokens = inputTokens when write is queued. - expect(usageChunk?.cacheWriteTokens).toBe(500) // Matches the uncached promptTokenCount - }) - - it("should handle cache create error gracefully", async () => { - const consoleErrorSpy = jest.spyOn(console, "error").mockImplementation(() => {}) - const createError = new Error("Failed to create cache") - mockCreateCache.mockRejectedValue(createError) - - const stream = handlerWithCache.createMessage(systemPrompt, mockMessagesLong, cacheKey) - - for await (const _ of stream) { - } - - // Wait for async cache write attempt - await new Promise(process.nextTick) - - expect(mockCreateCache).toHaveBeenCalledTimes(1) - expect(mockCacheSet).not.toHaveBeenCalled() // Set should not be called on error - expect(consoleErrorSpy).toHaveBeenCalledWith( - expect.stringContaining("[GeminiHandler] caches.create error"), - createError, - ) - consoleErrorSpy.mockRestore() - }) - - it("should handle cache delete error gracefully", async () => { - const consoleErrorSpy = jest.spyOn(console, "error").mockImplementation(() => {}) - const deleteError = new Error("Failed to delete cache") - mockDeleteCache.mockRejectedValue(deleteError) - - // Setup for cache hit + write scenario to trigger delete - const previousCacheName = "generated/caches/old-cache-name" - mockCacheGet.mockReturnValue({ key: previousCacheName, count: 1, tokens: 3000 }) - - const newMessagesCount = 10 - - const messagesForCacheWrite = [ - mockMessagesLong[0], - ...Array(newMessagesCount).fill({ role: "user", content: "new message" }), - ] as Anthropic.Messages.MessageParam[] - - const stream = handlerWithCache.createMessage(systemPrompt, messagesForCacheWrite, cacheKey) - - for await (const _ of stream) { - } - - // Wait for async cache write and delete attempt - await new Promise(process.nextTick) - await new Promise(process.nextTick) - - expect(mockCreateCache).toHaveBeenCalledTimes(1) // Create still happens - expect(mockCacheSet).toHaveBeenCalledTimes(1) // Set still happens - expect(mockDeleteCache).toHaveBeenCalledTimes(1) // Delete was attempted - - // Expect a single string argument containing both parts - expect(consoleErrorSpy).toHaveBeenCalledWith( - expect.stringContaining( - `[GeminiHandler] failed to delete stale cache entry ${previousCacheName} -> ${deleteError.message}`, - ), - ) - - consoleErrorSpy.mockRestore() - }) -}) diff --git a/src/api/providers/__tests__/openrouter.test.ts b/src/api/providers/__tests__/openrouter.test.ts index b4849c56df..7b2998f8e7 100644 --- a/src/api/providers/__tests__/openrouter.test.ts +++ b/src/api/providers/__tests__/openrouter.test.ts @@ -78,7 +78,6 @@ describe("OpenRouterHandler", () => { topP: undefined, promptCache: { supported: true, - optional: false, }, }) }) diff --git a/src/api/providers/__tests__/vertex.test.ts b/src/api/providers/__tests__/vertex.test.ts index b15e8842c7..99178c9ab7 100644 --- a/src/api/providers/__tests__/vertex.test.ts +++ b/src/api/providers/__tests__/vertex.test.ts @@ -56,11 +56,7 @@ describe("VertexHandler", () => { yield { type: "usage", inputTokens: 0, outputTokens: 5 } }) - const mockCacheKey = "cacheKey" - // Since we're directly mocking createMessage, we don't need to spy on it - // We just need to call it and verify the results - - const stream = handler.createMessage(systemPrompt, mockMessages, mockCacheKey) + const stream = handler.createMessage(systemPrompt, mockMessages) const chunks: ApiStreamChunk[] = [] diff --git a/src/api/providers/fetchers/__tests__/fixtures/openrouter-models.json b/src/api/providers/fetchers/__tests__/fixtures/openrouter-models.json index a8fd47fe04..5edc53d8b1 100644 --- a/src/api/providers/fetchers/__tests__/fixtures/openrouter-models.json +++ b/src/api/providers/fetchers/__tests__/fixtures/openrouter-models.json @@ -6,16 +6,16 @@ "body": "", "status": 200, "response": [ - "6300f8ffc388d4a41e008dd0e173de57a9daffe9da8597a45a0c84c420fe485ab2566b5256f426bd929b4003e8afc10c3cdd60b05ff0e1fa53ba5fecffff7ed9f787497a6287a87a84dce79e231e891710452224aa9288aa548b74ff39f7d64b755525bda692a14a6360a0995c48d020283236e921fa20cce8312a30086ad62842e1c6cb511933fa717b28561ad2720ae8c45ce6afb3792340662aa6a159b37de5a60744910068fb7bf097a846c568f1eb9788eb6811f55c052fbed1b31ed9d46242b668025114470e7b8a16518ef087b780cdf21a2e1ee03e839326109d467134cff2b5a98e16d9ac9c64e76596a67154cf80ffd31a94bd8b16d166796d2e1ecc7d062c8030785133fff22cd530c3f5bbc029f8062e888607a257739f41116acd3554395502f281c0f21a94b007f5c0fd10fc8e3eb448ef6bb2dfbefeb7c0b4138bf18e1c898077305aee027b84adf5d52bd5a07ee04aa0e6aedf2de43a7415bb165805041bd2230cc1376c2981d5c856c13b9847bd0eabe9e73550bc63d74233fd3f0d54f62e065660a7d4065412c8b2f415b435825875173e8e7634053cbc7d841a1585b4e18a5dc5247dedc257131c5a7b846a0ca85443dbf3552bf1dbd106755e83965bd79353903e64137814c957038114d9098806efdad0e663a87cfdb8175d0dd334addb88b73b762d5438347cbf87496231c5a393de34762d68fc46c0373004df0f2a92be6b028906ae946a6007f759f2ec9e5d54b02784e8201991cd3544d565c03be830f4d0b3722bd5b9604baeea7a0caf1270dd54460ce0ba2adf0fa4acbc23a8026eb340555d55d5596bed681a549457a9c8ec1419c3b048033604f799c966b329b003ed3b17f4a481abcacb06dbb853f269a4c0140ca9baebbc2460095fb125e080b734a32d982f84496f1af0a8d1e0d40a084d735cacf1a1a7001b7f09e51e142b553a06ead7241680341eb2d04c5bb4248c4250a190c45015d80faa66d742c76d6744f195046adf4785cfcf58758002965ab431f454738536061f0047f5cef77e1428bb212f4914478332f9a02f259b6c205a64d3625ea67114cccf42b4f812f5be46cb7a8c1691d241cddf2b1d348a2376c3a82f9f28629268f1ebfe52467f8c233fea6151f5afe4f833856811e91cba29451c7c065ef43850b4886aa241885e4dc8a23fc7d110b862d7468b2f51c4ec8a16513a283dfd600991cad2288e029594603ed2cf3db6f4bc774fdb9769e5ccc9a862f4128ff066f99fe348fdf092721d5ab4f822b0293d1e5e42e1bd0cdeb2122ddc686d1cb1bcf4be261d5f255a346885fe1c47038597700e79b1dcb37ea7fdcf31727f80adf7ada5b3967a766cf2646286e00dd65d83f6262d4c3e0171efea0ba9055cade7813c99c06df070fbc785e3bb5a9ee7659e4e5ddf4fb340978182cb89a292f18dd18e0c069c2610e2a901bd5a8f38e9aa88453af922605aa7544c4eb9e14a6f557d7bbf6e02dfbefe9f76ec5ed9b5dfbefe3f6815c8e1d6027a3d140a3f0ea5052403c18f6d97420c25813d6b07ff59aaa110d0b83a06a0cd8d6f181d08819d344ce4682d0184db28a07e30ca14900cb0dd3a5882306756e507d170103583c58a60f0c2caa90902bd0e82f56619c821d4f6f7c3d87a0c750c811a4b95b26b81b4d64113486a0c8fa881a42185ae86c9035b3aa0bdec2a2bfc654bcbf964365d7bdfe9d008f59e95ed8a8ba3862dc100c5c0c6d189f42281ee1727699aa669a60c24030601bc3bc60c0aaea8244d27d9141018ecd65161d5d14b20ac0311a75375b43e7466f681959084c74492e3d9994e26c564fd75d36eacfbb3d6f6e673668a7c4bffbe391ebf7fbad82ce06abd815f3228f2d56e57cbf3bccccaf97257eb8df9253345be32699995d71aa77522478b08ce79b5de98d214f92a862df7ba66e303d444034a94a28dc1faf60945f1d69acce2798888d23c0290e05bad61194e027450727500749358e38af4846974eedbd77f2be7a70fe5d5d86d3974359bb8d6801cf62c04fae699f4bcf5dbd77f63a52e24a038e81f1061c088d2006c456f7c3f6020a5d0fa295b14120421e97131fc92c1e4cbd7b747d87a2f2a6c0d14060a32690c24e1181d04677bb46400944c314529ddb859a002d30d6b8cdd5b9406811d23dfab05b3049879ac6f1a0a742e53f90e8bfa1a1fa006d985c6871e941e1c0c89c7503f28f7fc398d8847e151ab624b4eb982bd0faf8df5fb448180b38324c8d27941ea4fe764c7083fe3fdcd690c3f3cbcbf01f5de4285d632dd1dd2b023d3da1f20cd3e77a4d0703b06b259687c00615cedecc6f3e404ae2b2dc1412dab5048a0b0e532762dd454c6d834548a8f6a4474fab0eaa2c03b43a132cdfa672af2d974bebae0f7da518810761bbb18616dba8342c6fd2857632f572f333dcf260dca15ba136d6dbbeb9dbce9d89190591818e73b053f9033ad26163793e1580e253aa6f23581bbc02abedca10850b232237ab40445d9db4056f9b9bd836cf208ed69ceb69d712d91d163b85b91e9087747bb15d6ee727b1468c6a01d0508d46898aafd3ac8c95384921802fd13595bac8d41dcab8af86cd9b6793a5464518f467fcde1b2c11830283758a934402b234548520f02e220667293d9b5d8ed55f00c2c18ae1eae6e1f4de919a23801ca3f14262df2d2e254a5fe475bbab79d2979620ab5e3d0ed0a96d3406351ba6d72abe9d4de5a946efbfa66e5743aa32ec879b43f6cf6dafbf0daf920eadd110307811b6833195392a08268951976f01ca5fa6fc57364549911e8b4a6acbad05763f5c6cfeed9dd78a545499461ef1c114f6539b003dd7b2f615616404bc84ccb7a67780ab9bd8c5e9b180defe24424dc49cab534569676f4aaeecbe07b47805e7fa5bca304ae1b38fab102f930cfd8a3ca61ec8013bf71b97604cfd162b7e4730432360d1f4e637056865006e75a74182c57acf608b8f3cc3461de49a0c8674042cb3e7aa8c4c4d828e0e49c3a6145bca3ee78f1704815fb0b55e7bd1c1dc1353e59b8fedaaa2ea87b6a470ed855a3b8ba3a6e3bc9510f1a18d9d3d8555904b3da630cca20bc0b186b0c74125fa6c743a8c1c7c4de6a798e60663c851850c0d5ec6f3d8df36a4750fb6aecc92999fb844f3ad5411667677e2017fca81412e4b3da5772360a1922577396b0517f7b7ed3e3e1e9a0697c30e6de8ff3a9a14c98eac720be75fe3d376976e8693addfe03a5d3ec3c4f0236b1cd3b92ab286e9592830e3851865f8e729a32fc0e514cfecce10772c867be34eb291db75d22b0f2fb81dcf27a01be840d3b86ef3f61db00bb38cfcb3ccbe9db75d0e95a68eb4a56b0f7c0f5a0c0af1f3bc01f4fce82e39f02a988ace6a5a1272910cadee8eeb8ed3897a377c029b2619b2ad516433f8d66747a539c7ba3d891b09e064563a8bca8a90d4dbdfa3429df9cb29791114167b8be107f2370348ce7ca9c80f9211e4778e8da46c9e7b4b3851db9ba3c04c6dbeb34d54d76af32bc236863c97ccbebcd259c9c9f2793df09b2f8f6a89d77a701ec7af8f1d258ea5eec0da02e52b611f2b2e7aba922111fc01742ed4357438357f402154861d599115ee1779dec7b72aeeac2dcf17b82257bb49602087fa678140da343c75b56a1d3ca682a67070f8f971bcf845dfd05a74bfbc387134ada24860d6af781453186cd66f3741acba88c806a56e77796057ec1b4a03dc29eac3532b2d20678790cd47e15c3a82015390cec055a3e13d9b6d9c447f02f79d2c55415d80d3f2c81c70eddabfc16a34505e28be5be84c4d92b94c0b7e3c1cf41f0c30496d1f00a1d541db28b271d12fbb54621370e539a69deeec8fb0a39920675f7ecd8f97a0e8bc76f5fffad3d313976d090971a58d241071d95fc355e8e855b1ecaabedc5a1c35b9265abe7a12ce379990654e5af239bcb950f76d8f96ce2d6659127a1ff41f611c7f1c86918817eb402de472940fdc04539a1ef6dbe4057a8522af83137091e5434e57e4fa119ad5927050a1b06284eae452a80e0688f1ea41a1f82733f8ec827a8489a636c8032822a58ef452b1e086d4185133c54cc155ad887e68f6e702ad8cbde995d5f8261c83c09b1e3080625d2d2d48561d1c60bec471daf143782c313ea1416d8a4940ecea2ada6614672989304e46ee5b0faf9fd3b60aec4d89d4883fb6f86041e48611ca0a3400b88cd58de169e29aafefc60efa4b926f918c1c7afc56cfaf15322ffa000684c51185621027b41d2f3f2075ac3a2efa3c4437b4ac78206f9ecc2d771971b6bb1c72229cc2ce5bce779e8581096d70bf8fde6f990c3da628f502405ccd21590e0279e4dcaf9441894a43bc85a15112eebe37f603f541daac1868e23ada31388a39b7325cb6bf00e36a4a82dc130fa6694322b731d3743788b188a3768d0c79f497aa7e8f5915a771934db9c2bf1f5b83d0a5cb88840502d258347c44774798496a1a4e703f846e137b863a17abc61f1d20f6f1fed76f6e2f6bd763c105acf63a9371b88056a78e830d0d5ed23e54fac3d54c7be254a0c0d3e2c784b83c5237658e2dd8e82845b26be33a9871d4fb2fabb2981ddaa71ec1d67109695ee409694c908fb6477f308d7ec14c0a942d8b939bfea650bf820d40a0665428a5d2b5b9265b06596aee497294b080cc8cc9c55515e7da253bccefb6b87a9a9cec5566dc5de5b42cdd21f96b079841566b0e7e5fae75f9690a5a9a5bd807b7c1d6bf4e42508593e7f3796827353dbc6acd3b5017b48efbd76f6e8934572540be706a573efdd77d76ebddeccf6b287ab35bab6b8078506bc0f3a52ba20351f291615b0a782ef3d12d46558428f89c179a8b251b20c2cba2497abab4b096296e1c67c11e8c06a294ac1725cd5a1c6e9c7a3805c937bf9e388e5a43f2ccf2e6fbc8e11058c24b84f1ed657d7cdc088bced8a884f73e7dadbbd6ae2c3fcb42777f6694f2e4f26a6f2350533db9a59acb2e9d2bb3db905dcddf9b1f0e6d560b6826b877b98b928e7f314db74e261a6d9cc8c3730cda6d90aecb7135cf207fb65d551913960bb76aa173d2e88685809a7641e502c55bc1d5b68f800aa85abca8d9c7634c656d6e9c7b53f5208168ae4b5a727a7e8e40777ef6f2f6378d8f3d5fa2986fbcdc38d0f7ddcd67775b7848a2e8ad30d640ade43765049199840bc47f7cf787fa344dd03e8a001076fe039e4d5f2ae668493fa520c950fc3289e26e5c7a0785ab8a618e4e8b423e5ca5ba0d5a6e8a0f33f8616f700484179223cce49fd7614b5b9bc7f4a31f69904cf21aa9e118098f217517b1a71aac5fea5060c15627aaad34212c1ee566a0daa49bd007eb72bd35f087a11386b73aacffd8ba473f3d734587fecc96902f79e2ba811c2b5b423580e5875047992c2f693b6055375c6eff6e422d27f2c3930881bb7bae13242b07df16b389d8b6907356592617ed0f3e1461b4b38c974921573d5263d807895bd1a8bad743cb4a4e47647945ada5e591ef1984068cd49850ba160d31257532607fd34c711629ddc31471e7ab6d6adda8187750a68eea712fb3ad133d2188693666b1ae5394e266532fd1d55721be003056e98ea53ff8e7cca63c5e4c227f35952fe0eaedf5eeed0a6df353d06821605ddd42476ad4a92cd54384a19649f4489ce28a9b96924b619fd10c832a94dfd005e900f54a165b668be30e3cb13222731142477022bb961868a2486eb8bcbb45aa6babd97c4b5c359e891cad92f1208a481698796f1fdb19b3d55cd1a1cf1abdbc7b7446f6ffaf9db5863c8f1694f65f256cd5654f3c5fc8cc1e08e6c022a828f301a4f55166dd8d87ccfb511db40aead5093e55d0585956f5ad427a01ad61dcfa320e356149de256ea183f198d22a02b16350c44cd56e36741a97c2081729264bf2bbb7558acb9688756622826c9fc4e0b6f46abfca6436bc9b5d07ffbbcec02357f3f1977b01453a5f37bcf8c5756a5182ab3abc8926917f24bae2924f0c3066f8fadf56a0094b9a0b437de7122699b14ab915bb5ff54464d32ce3ad81e9ee1063d15d53b660230d73f27d8a9b475300915d1af5ff36cdada7faa644f2fa743e7fd9b7bb8c383673b3dcfbcf521a100e595aea977dbe1be7dae19c3d5ede3b7afff5c261938745e0252d2a02849c17f79d5110e2408975168b021219d067cbeb11c9d02ab8498002dd4915640881d1fb4a41f0eab9883baf8fd09f3748ecd66fd14c3244d8aabbaaf6eef968e37387f41a3550dd684f3e96f5fff951910a57007ba09e179ec590ac0943fa6a40cd20d7d0a930412e2ea74b54cec28da662286fed73c2dbd703568bfcdfb7f9790a5513b0ac867d652dfe3cb6c4bd20797f7c82faf17b07e7f1838dae7cc6591e7a13b3fc4c0cbae689de977532d81987aca1e05d646e3d78ea2e78daf09ae4ecf5650886548169d592fab1dc16df0be31b76cc9e4fde8c9d37495ab87c9186008f2021828b9bd1357a3c5608fa4611baaf68554c0c7fab1ed74506d414007ba32ab42e5fb6194bdb7a1a5881ac138aaf51011ed570b75a172acbd31f559fd9ba7e0fcfe98caf47c0ac2ed1b9e07e16bc556f59391a5b734c992f832bac3be486e9743db04aa87e0e5acf23511371628772d23de72cd7a6c46def261f9dbe06581cd1db75ee306f1b92678789cab6dbdd46c3e2bbd2507436f99196cc34c51e106d26aceb1c6cd124c8fa8e935a9e72eb9d705901e43c6d613b0d2057b89d26c59e16eedef7b0af11fc913c0fefc5facdbcbb78f60791b301c97dc158265e4b34ffb4fa6c8b7e6aa0b34610866b7bea9b996c1f2f27a0177fbbbf2da53b91fee61f77fc1e56432399f6b3f5277fbbb1a5beadc10733fdc9b1d8233aec86164e30d14a3885533f5dfedc99d7547c8395e09137c0f5234adb562fa4c56e3c4ab18439106afcb8ae44fe723b8bfdde021b46b6229e5d0ab83d31feae8eb507ecb09d6c8924c4e60740cae70370db647380fe91cbb5656a019b5a4ebffea060a50335adf8e043a06472e1857035981f64c7129a091f48258856ce328d0b4c7a433edcf6bde3f98bbf5fbfbe577e01dccdf812b9ca98b91a192508375a2db8c4566daea8ba0228263307706c0e0e40d4091bf3b5db4ae3200af3f59672de8ea0560550130456c410747940a1f31d02662feacad981abc48628ef8ca1015c66cdd21e454b0b1a0c3e311bea62aa8c3f737cf8a5626e3b9e57fefcc74ffa62c310f1a1fdab39a68a878e5b2722b1073c195b993b7d084e3bf2990952b6d5822dc9ab838cf33f75f100d6f9eb363651e054cfe7159895b0daa8255121cd36e7a6b9a0b16656bcddd9e9cc94a5c4b423ec2d69fbfbabf7dff5d9818b33e59e78ea68d34c046948876ef6a76d2da54814c6909fcd19caba17a6fa872f6ae6ce7a213d4e4dba769de68d89a77f4c6d7549e9f057693388d06b032b280ac2f4c26cfb56dbdd5e7535ed34e6f27340b6bd37dfc087bef9d745e91cf5eb967b3b3068bada2cf454c0a36f7c0ff8bbfe39ee1c31a96c50a1e557209f6c1131769392fd3b6a5efb867f361ad9d29586e3b9ded15c3860f3a0655e6d0cbc34041250bd9c8947fc07986621c955f39c1f9d63c99efbf34e042a0402a1a9d09aeb433b07f1836269712c6decf50d126e347f35606cdb258996521fa3dcd9dc220e79e6d26f4df0863c279cc6e6a393a70d4556587643846a6024bcceecd66f33475d64ccdaec03b34179013e947592d0c7b2d97e8b9ee9bffb036b3d5736ff88afa1e4d61b27c95d4c2ecb8816b443913e830293cd877e165b40cabc0c67bf7811f811cdc57ce2efdf316593acb93be3f2ddfdb77f022db741031cfc1209fb5c1bf1a0ef231664b8a535def50db2d04ff0a4511c25fddc4ce16cd92976936005bf774824014539645398b6d54686f390dc8a532e30de40f42d1ed46277b7f2cebdabfc44af257fdb490e4760a9c9e0649a8837a8875e54a25bf673c7888cc82e7dcadf6eedbd7ffce4383469715de51b15539d3647ce133c4bbb4c3eeacf4d3884e59273bda5f94f74a361094e30c81282f3f7efe6c89c1078c302c6de336761b023a1930905351f9ee1ab0228163e69e93b79612b8a00647ab1044325d529a5eac0c83f7194198118774c2c7ac67f702be804872630b788e3a6ebbe708fefcd16dc4438b8e3850166e31dd7b382caf815c7d38dc943ab3342ad9d5118e3b25828b2dc03321be551af66493a1afcb413ef85149176e59baf17388683cbd476715d2d7a0e84d70df3b57e800eb1a3eee6bf9057c01795b8a985ef4e78f31a8ff27f24816c6fa572276a2847502cf0ed236515ee48c5f05ff1a7d796a8adf29d209a62584b32448f6fca4d3b92932b558d4b2122ca7871d96d7095ceb1f6ed3c481cda263988854659a08a12cef30b077d7a8c8344399d8e1268dd1772f19fb1e037fa6a1e56fbd08792dc3cad1894953801d5cee85f74c31748456bb0a03c560b13a05811c8c0ba34bf32f4ab241fa409c3ef0f55c510855ae32eb37abf063e866fd646e8357b84ec0ca8cd1c08c3256ecdd4f314d7058547cbf0c4e927cf9e99f7d29753bae19cfea01f78a22c98ca3de6bf0ce3874deccb799d6dd6f3e5c5f5c2f17328c4c0637f74301fc1061be4abcee629617f35911ad5fc1236f1e7613ad12b06c4950993d573859af37a7f6989cc83866438a7f9073b464664e0a7619a439147bb28688ec5b1f6b1a9ad03243a070107657c1e0d8f62eb28a11dc0f27f7cb2b465bbf7a6f8d99621d504a9073ecdfa24517d1280f34e6999654c7181a0e5af49128ad7004efd40382b06b2d07e503187b0aa60d5813dc3ffe0457b74f7092b2bed26c29b2aa72fa17570571b835dba02459df8c6ff8c335890b9b98c0186bb80ef8d8cd4219c664bdfbe81e4126f1ec07eb38a547d06e64e1a712b825d2ae014204bf3e09b604f774523a7ebddca23f1a74add68d6dcbae6db0a2a4f2679bb459f5b52f1bd51a4f56039a7c52accc2efbcd290d84e658fb6f8b41579b51b025139ec93b85e27757ef03cdf07ea24d9968e731a77341d71315903e1dae29cfff3e51718b1fc6810294e7df5fafecbc3c2f9fa8081e5e85fa9b14b892107fadc9cb66c320e8180e35810bd47408e0a04e600ffdeb21dcd018d0420b9e104ed1693738b9593e9c2a7b1bc57e5964e18dc292e01ba69572213b20ab1ea0de87a3f01fe2073f317a94ab1f422c285a8a1dea2d61e059630157e52f98bfe61ad6e7f714471943dddaa4d6abdba7c92b0d7dff4502dfe7690a803a6e0bc7755dc5ffb1893c141243e0cb354927e789b6b77dfd9b1a54d432219794829b09feeabea97f4f9499329dfcaf2e14ca44e41c00490a0ada17d5c746848f41dc6a087d46745303058a41dc1f28ac01113b29a5dfa4e791527c1ac668e5b8ae4ad8d857a18353ff68481839880ee6070cfc9f982c4dc1f99a80f0a7e65a5fba6967afdd3d299a0f1834bc8da5e9714781abd78a5f9614b12f53c2e68609b0ee0d2fe6f36c9ee7d603d4653cb892932c9f5f9e7ae741e1cccdf9ac429c9347ca33556e57828e5e357dd5f0117482938dbf3cb5464316bb37cbe770bb63d0d59071ea8c70c155405ca9f1618fa1860145e0a4e498cea0684f6b616842c1ade2a42086ba0f95c1a80ec0a7083726ba0f345854aa62de51479663530d696ea74b02ef1d739c4552331397850f4539c5004ac10b59564a84952e9e292172abc3207ef97a54d15d59a4139aae98ea281bc19eac776e841803316fe3661494141a1fc071bb54d9959d534724a60913fab02db465d298d922d02a0f3603612c23f5eb7732b02145d3b2d1086ff9e47636c0ae85bfe439687801a110947412f5aead46f54d03ec6039b6a328e4695e8a59bf6aef603904b63089214ff389ba95770ce95ed906eb57e85865da35b02d508885d500b43d3e548c362762c27fa44a3824d0f56c871c906bb566c752d9c9ca0634bf0e93e907fe671443f7357563fb096379916d25001f1176ffa03468ff38667d0437f36f43cc3f946c1695a147d41ae1f7683a2f3fa0e1e8a601f45397ca8f1a8a9fe243e547fdf17c4db273bab7ebbf700ae9c9a26857ddc8ee134dd08e962dd44345e3b38ea4d59975f9183b5f18f806b2f49c4ae64617c2e109e0049dc986cb866303c0eac6a755f99a4e01b9fea2bd8fc02af5e8d2e1eca840bc0be205bafb2824904de714ee1108aa2f46d48a898509b2143a157a05ea48a88d630ef89732053b8077b4eadb089870a589a99005f744091e95ff4aa378eb7258e93883f63e21ec2f8e12a3492d98c406890a20c15cc3f41ab44752ca4a652a1cbab0d23c83866147d08a115287d8fb3d46d4a64fda348ba2630f081594d1d1c3012daf321c5dd5913d19e572eca1a1a29ae00fe6499607c9bcc8b6c247e06a7248dde4586a00f8ff0340ee7d9dff7dfdce76384732926c53b21552790f52809b2dc996b13d801eb2c6916408ebffff5efd9cc2260d837c40c306650506b07d0a784f7a40b2055a8a4b8ac769fe9e52cfb9efbe26eb7bc925592e69d53369f64f3aeb858581d6e0001cc2256b5a67090c0a8c8ab8a20ef161b0d3388e4152ba8f82fbe612f75de3faa0515739fbe187623eab1ce42a4ac2ef89cec923fa2642c6e3bff5a56b7b4cf73d2bdcaf7b3ca16f22acd66da5fbbf2bf4af73e7639d2b5dd8e4efbe7c56386083dc2c68590d7a9e41130fb66379d83af4a6aadb1bdf8c65be66032bf6ab277b9b38a7a1633d79c9e8f1dafa38a1fc5badd771d0625031165301502c82bd82098c6ec34af9a9a8b14ac0bfd421dc924f32f33b68acb83e6782808952572645155a843bc89e200237ba5bccc61529a8a1de2e8f680230ec34d48a4afe9890e0e8e7e5da6a730ba87018faa1f70231428557471e5f7f34a06875d64aae66eac053b26b25c2be2f3edbb6df3beb09a34c49abdb40fc45e4628419fed33d7481bb602961b8c2fc755919c158b9141b67f45b3cbf2edfb90991fcd2cebe0f52f4fbaee936da8b560e0747c697ecffb196241b695b55c9bd056ca202b233655904f4112d2f8bb8953354385e8dfd3b8c19fff0e2c88b6fe898cd1c06c4fd5a1b534037da1bf7a70774728a9892aefff7d10dac6f72224c17e6eeec2257ca34c1b97b910719e6a80d798e01f3738cbdbcd0d438bf2835b1ca6dd77311f955ae5d17ba5a70d40850db0a278dfec035b72dfb483ee67f84dbfa55728f4d9e192a4419ca0509a17b3ac23335101d6e695be2a029dcaad9ade7746cb90d01d49484e75c6b39506d9325c6d2247e333beab65f0eceda1d0438be48c436177b135b23b6c45ea56b02e76e096c0c7566f74461e43f2c70c53cbfe41482a4059036311cff5a3b30f6140368610d811c5c32425a4e457a5692d0c5d40bd70534d12d09a0abe5ecd7e3d473578247fa68a9361f7662033a0c71b9dd9fbf2e59ca055ca78ff15403dfb2ac0da39afd865c217fc095ed03ed950803eb6db32f0f86114c16c170d31ce066a0000c8f438fa313b8461ff89480cb0c37759517e2add69043e4fb9073575cc06fbd74d3198945f594afebe4a5af3a1b355877ceb9748750ad8134cf67376df47d78cf919f63629d679b8951a622deb020a15d0c36d542677cbb9663725768097dbccc5d18d1ae3fb071763d2982e06926838a44fadca4bb446c31548e0005e40bf491f6bda3e62636667933af94b0f0c7c6130d2df031b923dfef9c1f7b45123ac9c757b1bc1765d14306672fef6bd1a7601714dbd44536ddc520b94de6ea87d729b4f69b1220a9eb0b60f2d58d454242e394a1e5b2ea2e62648fc922ec8044463c083851747149848d00461dddc0351b190592713e9a2fcd3e6feb1f27d629ff1e8c4ecc6f4e7dc424cff9f0d78ed85cc114c84028d1197b52fe3aa237b3a26bae8a75a5d577d5e63f31cfb44cd7eec8ec8d9c42e2b776b7988229d65670dd79613d1b975aa749d6f34ccb8771ad2f347edfb23ba2e546116b6faa69ec403d600a69109bffa658cb20cf740ec4977a73a5e2b922f0990287441fac7f216eb0b8bf43ac0f41874d8a82080941308f04cd4e103ce44ddad11aa2a50878a18686629c4d9bf0784f22755f17f8f5eb41043bc04abcd8c4ebb92a60bd5bfd760560dab25bf245989deca3949b6bc8c8adf6b149ea12d38299351ab95a94ab275343c027b444f3090ae7c104384bad13b43c5dfc2a0f3ce098deafb678b3053bfad03ba5124638d38ff00db4948edcb0e3c3b54f3a20c9e09d47828f4438a87b8eae6515ed0f5b0cdff69c71388cb08a23536893e97ca28c51fb8f30d5b3e2cbf4d723fb9a7eed26c545d65e147a9ab4a023373f46eef013f5e3e127eac7d7504f94eb5529fe7bae57f23e9b288b973b3e1d040b8f232e34f4458bd6c4e58c5d351662e8c8f10831fbcba863636ae4e698d1ae71283145c6389d80be3948cdda8e85568066456a987ad4cbd9198cb42e6f52112a124d59b6bf91cc0c219b19be3f96b4434974d9860c2d768f1ef9b294932926698392986640cb85b7f6e9b05aada380379c334c7172bf0a2339ebc9902dc2e6ebcaa64ff5d36f0049ff87433b6ad9b52c27956c4ac80773e700fdff44d6ec5a86c902ee6a57ce562637053911dd15c6898967babc5f3705eb9d79160e4b98c3ab68c2d661b6ef39c07c99bd28be2770494c62eb81aff67bcd0210b0256bfbf2b64414598cdc55561be3934b647a75b5431ba49e1c7444815eded48d6be9dbf9e5c08554a57e706bd867eb54141fa310b8c9840c33f827ecc01df7d63780eee118d49cde2df3f63cb48f2305ea84ebd7ec446e7d14f671f4f9fed6e3f13e9fcc68bca7bc9ad25ecd144e6bd4b361062bc2e08375cb58896e083c31c3ab6fa2f7dcd3326d40e5f840c967faf2f074adecc9e1d16cab1c1f86b0f4ce3eae27655c1b1f6ef1ade3c8146a96e9892ec6439b4cafe623270b79a7002ef9c811bd7f72b2784cc624a55b12f51fea7dd20f928a8706b7abe5eb0b62329c7bd6ce76f26c93ecbfff69b2c3541f7521f37c3c044435b35fd081958a3dcd91ea38bb8e757711270150df7b070e990d06f6209e4a340fbac90c458390026466059ea7966dbc421d045c81d99ff31d42fb449f22a749de99c1dc398d3f9d08b1b825ebe13d97fce11ec960f4c82f35111f20be6a3b37d5456c733ad1eb19c521a864d44b856994c90068df7d9d0bded16022a17d08a200d23e2ddfb129d3b43771ae709ff93223072a586ac460beaa5c7cd0e248c60b614d4ffc1fd5fdf15daa6ba2067d4d3233f7071ef556260c514e5442b51777f893ba811f4bb99b6fb630315ca9e7ce95516a8c4ce6ee0cec4c9f77b6563b476f9d170f24c9e1b42d8ddcac025f6266e3760dc55362bd04a2b8c35f7585f04a1a18ddfbb1a386a47882cc1836f3c276c5d5a299ec0ac164b45285e3b00b24da068bdf4df4b6eb094abf20ef81bdbcc69cfce24e6c30716ef25b5456c9ef72b1e9683d5ca87acf5311c451ea7b77e91887316af446ea35f424d6e6cefb16dd1cc6eb236f391093b7682ac291eb3b6753c2fcd2070da509ad27e0ba9d809286522d38985a72a819079338e9f13e7bdb3c5732f562767e49677f3c67ec9684d671600954892936dbd10e1fb2cd6d20fdb2891e2aaad46c51f951e228b009ba0d9ff700e169e6d2ebec090fc72cb2b02aa3bafff598c132cd6da49475c8b3f6f5624c23d98f3511aba9162c22b53853e23cbd337da4f2265c96ad22c4e585b04c725661973dc1e8879d9dcc7f0939f1018ad18f785f41de0e14e1cd9fa28b12ab28f030083758730a7648d1e779efb70b79d811b6eb7850f7c8ea7f042742c32076cf3fd4cda7fff412b6bc9bf7b875795f328ed2e99533069bc135b8a49ddf43b99dbec363f27d55a113ebbf676c1603cfea2286d6b019e8d5dfeb8eebf7b7b9800da1bb24d75bdee602d6bbff7d95529dbd1f605c13a0a5eb2efff657ee03b45c594751a4a2d378d7dacdc132c6d17cb59d4232cd308a75a36e9c926d8863c08647359432682d551930bc1bbd8c33a13bb27f3181cb202466a455bf7c7273d9f7e689ce8a63bd19d5a936ded38ac7a3b16eba4ab705a8c90d0ce3b7a070263838ae50bc01a24e77a0681b8a51ec35f40de87af3eff488e7cb3c764a3ad2c9030ac306e8c23535af35b8a2127482b94f1bb15f9562ab45b2992056ffd505fccc81d00b9807ac6c2de0dd52f2d8feff7216b41e00443809d989a29f1ff8973b7dac9c7ee4d785bc6bb3834dc7beca2cff40237c559edd88b4fc77fa78b4e9a9af2050c7ab28be5fbfe676c5b3b45affdc7d5fad9f0847058b0205df44a353a7fa4591d7bf640c1f3bf687ab85378bfe421e56cbdbfbe7ed3dcc1f37f7f7ebfbe7ddbf9758bfb1ce4aa9b55ac8db23a651e5b81ab568fde8e1f2a5febca8c745c1fdeebe91c0cea77fce076ce67e8f50443aa0ef4e0d696842c913f8b6f21a18f2de89551036818b109ddbcc8c51b3cea6d0633d022a8ff445ad54af0d6909bb0c3d493d683126a0420d4f616772b7cc8fd7647e7cfd98693e9be6d3be7c5fd105057fcf8f0e3bc62133f2f2d938c0522ea3d008fb737c009309fd1fece204cfebb1b5f8948c64e4f0bddaa8f386f3f4c6874c79c2dd1ea8e683b7abb337d0778a1798a53c2fc15bd63b21bc112276eed059fed114d769f029ebb12bcd57aaeca498c1f10d25ec62fd62c9a99b10495e568df8082c1701d6f817b50df17a7d5f9bc0925e9ac1895dad1d86d643b4ed73928ae2295489f851d6ab1fe2e30b7d28b49e1d53f3bae4920415cf3a2d82bec68ce69aa24d4d1956e65126e6e5df5a9b69d770c90b19c668183f3334f6ff7ce207df868fe0cc991c21830ad78842786af1eae55ba172539cdb4c4d3129f950ec033c5000c2785a2e6445cd8ea2ad180b9ab6a87f65ee01e60ea3283e48af8571c069b9a174ba06ddf4c5af24c2360c818ee2dbea9aa8018ead7fbcbff8225a7e960656008e02a1e623c2e98248d024e5f3692995ebecb38eef6762b0f436ee63c638283c0416f073bf84e8d6dcffc6d3c14406aee709a09b5864da8b2053bfe6495b74812018b9ae5578a70fa33d613a527014e3e8eb42e174cd4c276fffe7a160a25af982a698ea72a6cc861e939b03bf90b39e3048a9329fbef9fbcfefb097034da0f44d563e230f1753b3bd5f62185eee53a5ce2b0ca20e3a198ad03fb1b5464719ac141683718a5e86514bd3143d21562f855555f48f8f1d51d37711067fd14aa9efa17033a73c51c35e24e07b4cbb0701f861bfe17c732be0899cc3ed050f0256d856d8b87d2bebf5ea872bac128d0ce90d2113b0ffce6816447b2147ae2d402eb0defc7bba2ef0b76d3191bb42aea2faa69dcd77b0995cb23906a29144f9396720553a43666041488e56d7ea2b5ae8ced0b20b0c6700c982f2ff0546f02926373d2590c12a522206c0fbb92b506f88886f0c292cb8cc46d69f38eaf4827c13af9d73b172127d4452422f97264caa5d435a895b2ccd33ac1f31348f4aebfb40e3a7bd40e1f4e4f9023d66449b9afcdfbbdb46654bd7e73181165a1a0d32f73f64f47852fa71b3ab388d3bd7876847ff2d91c48a406a3f9c29c2b5dcc99bddb4f4265b791bd729cf3498621e7bed269fcef28847f16d072b1efa8e7aa7d1cc67a13bdf0706a6547a2850802e64fd014cd17a40a5ffb900b8e158099ff24502108168402062c0259ce1d00ace760dbdb40521f33ead4d2c05423fe1fe2399a4a4ea7f85ff4f1e064ea7a2fb6570ffd5dbaee3969d464f41b9aacdf4d4d3a9592369c0dfcf37400266ea4290d84c60a998e5907aafc7e22181ea185393ac88bc9f1c05ec20cfb522811ed076818ee4233286347aebce602c465dbee97972cf4089cbeffc7e52fe3a135c80449a8f681531da526c4d2966e6511df665dec3b3b3072b110b44f6ff29534acdcc384835b909d4caa1aeca61ff7632e811bb6bdbd95a3a42cece11d2979b000b6c32f8eedc464d26c610bcba07301967477985aa3157243e8ef34246c4c5df72cb0d3d70a829ca5bdec55e895ecda989c0c2f3225a29a194628db743df6c41c82780c8a16c7e2fb0dd3d5dc1a2206f1d59be2c31fc6ebbe586f6af985071857a7a83a280fda984a675ded20fe555425962f7e53d693687e7e498c1815593195191931eabf0c6b75a690329dd3468a20ba55f42c538a60515f52a262092c1369e90aaa313eb0dd8c86bb91f77242fcbf5fc622632e347c644e4e2a9776ee4f22c97c2d1bf6a4019b49c28dd43bfc63611b9eda977ee06567996c3fd8dcf0d1b0d13e5987c2c359e8ca124d6f22c9777be9ddc683951d1ea694f5f4439eeaa923feef8c37b6ca9d1a6a2fb9eaa614e69b8d12028033d6c53029e238372dd24aea096b80f922f47d8ae9683b5f11747d3344b50b6528618b237285d4b1d147f3ba80dc4566054e3248a60bb8723c120e5bcfde575637e3e2c750c568e4ff6e60c725f2c071fa2dbfbc7e2b6891a07f7ddcb483c9b0a2c22ddb5db327c2eba34861b420031d39768c2f4d9c78b9d1c7a226bdbb327e7b33db01a7a0f73074155d9a067b7210e73ff2961c6fb2e37a9c21098bd3b918c89132b69fb1da8801425aad7a545c841bb0b17d4b3715e969b7592bb727e8a542c645149e31b3c5d9e80f25198b751cc0901e675ef4e0b70dc526edcede9289a1c182266af2e22d33554e5a8bbc221b484d0820089b14095aa0961d089e48a501a00ff27ce7792698ef687ec0bda089ed3ea6898c1036e961e0f7303fd1683f3a8808ec1530ed5472b16ff1e7c7cb714b9e36fce5b8ca2aa43935fbffe4b75e2ad2e3996fbc11519735756bc4eaa2cb512c9450daa40845a459bcf09566fc1d9caa0fb84cff5a243d22c7f2f97df2b9a9216c67151642a9aaddfa3c7c423be8381e33a91e2515f0a54313caaabbbfb31688d1efd826d85526763cc0c335dfce4f9d2e81bf809db0a41676358dd243855eca04532accd9746df1bf7c463842339688ff982c76b156cb3a1445e36c8850bdd62fd01b64944db551dd604eba5d6b6c11adb0af70c51dfed2ad048ca559c6310285bfea495f9d268d0ba8ce0a2cca626bddea0f6b1357d7d60cab19884fd86a29256ba6f34ceeab880d2c124b66eb2f21b65193a112d9a1dad1e59472a574334e2d05bfb69fbf26c27306415a1cfcd5f3c931e89308ba4e730f51d19e433a444f3b5466e0c3745917ce9a1e192620959b70610a91fb1f469aa765542dbd83d24e390d66d17a6c695b93b748b806d87febf741f02eea0d959e6b2806be0f2f509b8eb537d147009984ce3e65f08f40d3c5115e8d2298972323a839317d057ac4699a7c880dadce372b964688d6eca64c6d2561c18c034c1e3b72497697e7364195c9d4f6a5940327966d7e6031eabc8f7d5d59384ac1a4f0079bf41fbcae93a1bff76a55aeecc81e959b760e9df199435419637b4f72fcd0f766c143376e853507b65eddd1860d088fe2d16af13f8611c24532ddc423c51981a1f9e4afbb00d094c6a406e47710e2a70429f8f9a526fade8ad32a0df4c59a69e804bf2c83088655af0a7ef9f662d52e4f3537ef1676815f35e6b134b9bd02cee0f306311a18be59ac61f4d892f8ea8666a1ec8e840053057b9f7781f6b647b67be0c2f1a5a3bc04c7e3c9499fcf808562481c661fc107c74c5d893f044d45ea65ef2958e5bd0863b7f8751cd6d8bbe91e8e227b7ff6f7223f1e04cf40dcc67bf8f319d15f9ee59f42e5c1c5be33d483e4804adb590522a4b3b134c393e95630965ce1ef6d2b7b135b4dcee7d2614e29d74b2afca030a9828a604f458f6e977504a80d1b221887ac7b78621ebde07cf48e6bdb228ef76dc93b6af91cb2ebb2619f52d6cd61a9ba4a24d172714f2030ceafdfa683dc52837caa4fc486158ff8952f7d565ba7c8ed926d87c0cae229e6675b172a71c3b65e18134378b2a505be1e57464d3ed45364cc4b6211f444ff5542b15a1c7787540655f0e669386dfbdf71ce04215c47b3cd07ab83d62825b43432925bb1304bf8173cc67ee2b44dba0c74abff63a9dbb1a2aa3347186ced26a3456c7d9ff509745926dcec59eab1b9952caa8009899b9808f5f4c91d18e9ac97fb793a4f9dde0b33574a2e59ca8b766322b6681bb2fdea7681926f4c44ce5a7e77fc97cacf36fbe53a013a21d053ae1a61bc7e599f8cd0d9df066778d93e449f88f31d566cad4fb960d9df0cea88d659e1d119bb193204aca172287e2fa838da612f1a8fe830d9d608833023ae1e76d8196007257b42dc7bc84d08e58721cfeeca103e0c31072a38398263d5a7e9866da02602f5b069bd5cbcb908f880d53603351ced3b16c42b4a34775a1d8636264a70c37f1641cc1abf6cca90bd20455d8bb25be6c0b324ccf166abb6bf615f049621f1f107b27392009ae8e4989998d41c3175f16b14d3f2e00937a6cda49c4d0b2df8e84e024e7a9617e60c24384c1e7afffe4d97ffa5f3e7f3d844b4900c9a862f8eb50003da829462b836f41aeb6366d5144c1406bed99869112dcd5bd317d39805d06795b1cd91106aae44c1bab89d561a10d8b18f8ff0340ee55b5be6ae7e992f43e010104a32a87dd4cefc9b22eda5b8cc8a1883508d00028593f37c51545757eff4bebe54e049800131011313435ab5b55a0d52d106680341aa0991f42acaa7e92ba35f28e366b4348b38e380768804c488a879b4169d62903149061521117b6ed117b504aea3806c9bd25fd722f18f9b87cec3d8c5dd201a5e50fff472ef342e5b5fef2c8b4bc215dca60396952c6b94f904742a32582b8129dda7252aab27c67d325f70efc7dfafed7dfd27a3857aef04a6f73bf246b6cbbf4dc808c53b75e0c04309197d2fae8517f5569ee2d37847955f93860342a95cf1d07eafc3c8ee4d768e7830e919a6f2b457e6027d00e1bfb81de3cb4bb81eb1f28a4f00ea5c86fe057f40e3b964596a675d521c2e73294bd550bb75a6c52876fdef9fc7b2c79393054737eb947e4e207fe5c5d83970c2374e1010972977f63233a30b16b44906cb79e6292804c0bb18b88778a56b8c2f033c38553442804ca91614694d550433caed1e842ea98f424fd961244f4240f685867f56d79eee47cf478c980aa565d387dfb801dc5fb6aab8495b101c60c8f70f818c358cb0d17f42694091848e1f7cf19481a14f63110850b44b43c5de7b213b258351f21041a6699ed66dc6beac957d3d954c6d4b1ec06aad8440a094b71fd1eaaf760bbcd71fcf60d1a8c3ace1d1d71a4b03ee3a5474f3ea559af1407ac35f34c71829f79f3bc37bc5fdbc06f3fb009e65c296eda79dcb11c43151519a8b25721575ccf2980d44b0f6377228bd402c3b610a37d8c583180eb799c1c1e10ce6adff05159e7f5896c82c55a13f8e4491132c41c5b0a994d6c0450170a42267a5f6f74cb68a4df3acbcda01d801322b1b503df8a22f0167d78d77c78c7a2a88b9acf267107bc7c83806ee6600a7fad3b25ad437be444d06b718273b7cd84e4b899d2fe7503444c10cf08d1f94b9c7d216c0c8d61ae259bfae48f023d6a337bda25d63d57772301f326667a0e194236632f21b76245d2a55d865d5732c3cad093990203667affed0e1d4a52dad071fdb62cb15517f7372b8d0cc2f3a58f47741dc5819d5249a4f1f0b8bb0355dcc0af6987b1efbca899857bdeca299540e4caec63a4064144ce96e642421c765dc88cf3ee0b5bb5d77126a701c12167ac0ea3eb9f6b40a5a72c2b4076c3cb5fda24cf7298f00e110d8ef7e838046753a293db4c8366191b619687b4e1e475cfdcc076d090e52ea2674c0351c8772c555da41530de736f07cd5e02d1279822e49d0d41ce8b1b6d7064fa8b1c5264ff9be07b3d1d328c74629e9808a04213020d8ae3915397590bbcf410c2715f91b458d93ed1d2b574afa9cb4e5825d6a6016e131b302688b528211d3921958b173525ec46d6bf35c2c6600b1457c9fc64c86bc068bbc4f25fb349a9238158ea8a356ef353aa2735e6c57a763cd11b71fbcece2818c575bf77de51a1cee947997b4d5052e60aa3fa6093665007a6a454be7a1726830d14811a3647cf0b7734259b328fb30c3675c2a822d48bfb178ab3067cee114cb4ae9b0626942490b8cbb84f13d8846c57447f41520f22e3d5d1091edb435906ace7e13f674fbcc192fbc42364d91c5261b5685cddd3b43db27bca40252cb81d314baf91850a91c8251bd3a09925e5295baf389efb85b5881c93857262c79d3a68a18889ff3c6551e5a397f1e9fb7fdc89fc64e855c7cb3a388bd4e183e89ecded635fbb810767d1c36e53f60ddb709f3b964a2a250205019c3c5e627deb5d3114383fe94c807792297976f77b36870722784cf61605a4b8ac736de01b731a47bdfe2c5c74c2da59b0f80e2e6ecebc073f063b78c2e7ce9d2d5dfab2addf6468bb6583c9bb15bfd3c96ed311e9e80e93a75113b473b472ea00c006c98529a129b6ec9640f8a6eb613f5f775dcb5bb75fa95bd4aa8c064eda43bf4a5bd6d114077b3484fd61e303cce415a8e3e0f3ca85203b4b8b166e4806e29e12ad86b6b3f8fc70106c250534362a470ecb4f708a10f10c28a305dccbef8385e5434a2ed35145fd183b07c106ef52c635e060ab91c5ef058669fbe52dfe00d20c67ce2efd357b97e1ca5ccfef0f44cf2d4123f4048abef938d0360337526e674b866eb0735d476d8a01725134ef5ee7e69213cc109404a8b4c9ae01862e9ab8ec926af7320e5b33e3bc2bef144821635778d3387b8ca14c219125af1e3a068e410461789dcd938bd7b10287d63f0a52cebb81d1680ab18bbf199937fa61f835c3866c212efbf7774453e2f8e4e67f9b374413ec1e1c7504c79069a669287932c2034aa27a452c85eba647c6661b8bba1d0a0b580aec897912b9f232ec0f1cc0f62b145188262c4dfd7856cde53ca6b9fcbc9bec67d8051d0ad37ff488461f6e705dc7505981970106d0118e190d6a412667bc6c32580b2e9640f4e122eef10a330f713475659a412866082b88b0cee00982d6ecbfa76c522b81c3842737cdc6f6b41ec0f2f1612b164b46f2a7cacb562b78b20c3e5a63e05a84cd6ee8b06dd95611224bd79773887cf6e80afe01b7dd973e66230e14b86a983b094079186839a5bceefad9ca5d72fcceb67ab2eccc22c474c598b5530ef4d700d141eb6c37b711e875c0390cb1e40cccb99d6887c20a643aa5e8eb237c9fafa510e2b536395c43cb82d640ef8f66453d084c5b282bc423df0b2ef34226b474a032763a7fb24c68a646f0b24e87a86d1bb98e55e1b357e03649efcc81bdf50326ac2c278ef6d1e124a35a030b1f51406595dcd96a6f15e7bc8e01b95d36c09630d23ceff662e0207339c241c7fccec49711513a57f6c1af87e3edcf3038907cf8686735ce244d4a12bacec4e15898d506d29666a462277141594d42fc88642dca563f3a929b6a2defd6e80fe485580a29f7775a49a722a857d712fbd5d83fc9bb18599254c9a657fac0ec24fc49de99ea5e3dadcb4c516d90dc4c03b693ec05a8a9b2a29081af744e7a543560a1c5fc2c49a6ad288ec409b839025fc87110f932a3476dd15f98cf31159a000619b539a0779a74c638e66f1d850968d299d0f0338412f4344f23fa670d61a420539198e3179c7dd724b05382db3d45001bf4e63630552b2d57553169bc140403a0a3d9ee4a6093631de37769919d829f271f22e96ab4eb8c7c93f70a8016b1353918c97dec506af6196ce646fdaa4290b73c27ece4d7046d6d2f01d9932cdf7eb71fcad3ca9676209c586c77fc1af71c4b3103b1b029d818a5c3562f31ad25d5e994f77fee58a6a2aa646fd0bf3fdfbb909b0b2df43a5597414a681216b76626d436899f7cd39ab5e0584500c89e1d12b83fdf27656cc975a9840a134d02b42ebc809b252a1b0eed11e5a752731ad7ae3f86b6d0b9b30dd197230b594d6d6509884d2fe749a59cc6c57de86e426ff728757a1e69019b164cbaad84553755ca49b2e177779f350e801dbd472f2450440cdb43f4127014884bb54bbf6bd9103301dac0bf98c5cbf9a50d4e9f8d27f911e3fe96d2fc7ef9d8ee4631c1b3dcbf419c4d75b45c0e06a30b3b935319d9090e46e72c45b80193c581a3a0ecb248729ebd73df8abb670e4016374c0535454cb9b7db5d8852d695006a6a57e0ac37ec5a01679b9545e2d2d1407af478b5ecaa6fcd71e6ca19124cd763d617c2337f4f03692b62cf4e1414d03158628d2f84823b6dd1537470bbdb331d64dd8bd3af99c8c3bbe6e7ad8e4783e939bc14f02fe1b9728b88858ceb1d15f6fdb70e41288ca7da4c310e2cdecc67dcdd29658d8e0411402d07ac5b5b0d8c543529bb47ca63b136d35a6fd152d7d75b80e4a22952f5a5380de55d9e9ae64ea653428811bbf4a3ef642b9ee5bc6e63172ddcc8fa3eebe6a005a21cbdaf19c88f149832533d2056910addf8e2e6402834fbf0bc1550b8f50e062a6aa1efad2865adca545fcffe6a59c2354e3690046aad3a3383e3d530b9230998ddf30f17f8e2e6a01a4473b3b5a123e01ed2a2588b653e373770ed9ed7fd65763b5b8688a3c43294f9499c2b490bc8966e9a6f92718820fa9ddca9a5fba169ee208fd21b93a766e6568ad6e3320ebf117c706d8893ba5acf654d451ddad6e94a9f96c0b7b93b26bf44ff11bb90c988ba7487c67ba0df34777d8a6e385596eb694f0b6de32cbe1ffd6991d04734e84d693bcd0eaac2f77a71b4cfa86b2261f4f6cf4c20bae3d190259e809c6dcaa790974ee8d8357b8ddf5629637886eaef4f1eb66193e7b03c03e39ee05c455556c1b9c3a7424b2e3d95208cee82eb43c3b6ae3f3ac1308bc04060a827748579ae36b8dcedadedd0bae2cd5415dae63e59242d4c7e6f72f762282626ed853937075b5936ba60f3574047ec68dbbd587e937ce8088dfa8a1b0cf72826583140539abdc067f363608c3bc336227d1a659fc93c79a28c507a1dc55c38b7e1041f9b689002f337eac498031760c0c18545c0d94c95207620ee004025d6e5f016ae3be3c3adc1c76987e6c85675488a5b8bda7cc167a33070eb89ace2a9a346bba8f00cbe5e35a03173abedae9f695d942529f1065f37f2b093f6a3c3f9e4f06c3f3f3a18c84c1381722ed3a9d60dd16bfdb8df5bd5e3d43b4e26a99282410cd6c170aad2447b4fdb792a0a85c6a1de9311180a5aee7cf454b009798010d04059a279198b08124998c992cf7c0c7b8a7560fb81b6471664e5d6b07cbd5a042059dc3885a3af12c014a555deb4926fe57f042e45a5ca3ae1ec01551993612645ca9d14474247de7877a3425c6f168f181d89c565e1019e7519068aa45cd405eaa88d8e31e1af217251a4f5212a7fba04169c846a488995ded263800e881aa465ba332cf7fb77fb5553cd1f5f1fa58ada81e4f9d7e57afb1086655df2fc36f844431aa9fa18c0946230c2b66e684e1880c85b91a365d9efe4e049bf0fd01860982971e5a576851d345b42f38a09b66d8b08c67f89aaa994d4c4a617093117c9ad66181629e30b97f60b441b07ef26ddae5b8373474cf19205672d65dc2dae1fd8ddc0ed0f6f038a97f0e05bce39b23495e24cfc54fa5ab15663076430b68f7ace3809a5e2c0bb4657653f86873ac4e436d148e7fa7a6ac542673c7c1808121a5949a0e05e82a0f26a1e27dd09fc39953d254bb899f7d8e162c4c6261b82090947aef1aaff747a143f15199791997d855460922df6c8c7ed2d3f9a6174f12c4688929fa49f8d612162fb0c393f4fd65842a897e13f577ea5a4e275e641e63615d5c84c8fb752106b971c6451b64c08ca2080a4c1d18deab6440451b9cc4234b682d6a6706866ab083ac91c447a74ad07dea4806799296f70cea42ac36802762889c318115180726943e43d70bfa573684c6f61a532c7b2231f4073ded38bae71d4f680ff065c88ac923a908bd83d446bf387dfb65f15eb86d1942c58dfaa35da1a41279b58abb05f7bd3df0684c387e86b1f0f647ab6127f9e64d5e34ab0e571fc669d651abe08a35b2f7ce3d676121ee005d7ab0b91d5291e4b7e026639ecfca6357883865ef9a09a722c6162c37d6c6b9e092dd9e03c7c2b887cc4ec5bcb08943b271857ee52a2e3de24eb03538055d7a9a1766a59a84280148bc23658d741b3b9012e8ae410dfd61e87a174b234f7979d8b71a2253995f0d835d81f4d4b57a7d282d16a466f8bae7531b74270cb3165ff8be75b2fcc07d2a75bf16a4ff4284458ad8ca656d28b69412cf23e1d2ba1889082c53681e7a441c4c165599d8f0eeedd3feda7971bfd4c460fce0513329f252af048ebba13d199ea6a137d8175cf3cc6e1f1ed09e6751b7670eb4dc7f45d6d3bcbe6c938ec02c7ef4dc96b1f8ddad9f5a3be25eba2ccdb4aa9b413b2cf6bd5b5b5a864d9e7ebf7fa4bfaebcb6d3ee0f997e3f5fb4f85fb60904ff6b80a7ee684e8aa2b9c81b9b65a4c517aebd19a0172b92390dfdec93d3ec7e171f6dcd65276b136ee6bb3d99ff5cde5654a1fcaf0f997d3ede96326765f02d5068107fde8048f37c61d611b1121f088ea0df321128201c4bda9ed9135fc71cda40c29678f4c9721e0d1b658d89e2e914ff3f62d34bd8beacf5c86e568160f2967987a4d6f030f8baca261e7aaae844a157e568d7fd4c30376dc7ba599215ba4cd4d2c8b6316eb44fbecae33046fb1ba32fa6125b8035c078d49d975200151790eaadda431952ef60a4327b4bd6cb2c5976de7260edaaab321d07a9e8eb6eadc1f4631068a1103eb333fda4ea365a503312963e7fefeff5f89a737f6386aef8f8f7987062f6870fcfbff7f25592428c0480ccbaca2f46ed6edad63b49ee096e351f40353072b5dcf98784610272516fccc283b0274cfe7c73338ea35597526ff6f3a654a47d74b17748a7902ede9858497e626f637210a939445c52ac2184f674f84c8ed8b8675e7cc3468abb8605eb283bacf342b1858f3cd63d76127c9182561b6dab9aab322cd6acc33fc4a39fcc0666b475a7a75f4659c7df20463af267db837529fe1106dd57e6082e854a6905aab18c97315c05014508148d8b1f54e94b135db9a4ac2aad0680cd304f2b22e6b15d859acee6449bc541815da38df76ef3c28a0c9b54300ea8bd27d9c5e09f13cbce3223a286e6dde7754675d445284f91aefd24dd463d8fec9b8d1e6956517ca1e884413ecd21c88edbcea76c0f87ebb4fb4ce52da439a0759dfa2afdf54edf1b89ac2139b016324b6382208e9a7e537cb94604559e2212bfb527565df174599a9baac51ade0b63fae62d16e7efe0e17787ceb750b1fd0c7def96e453a343ceafb7695c0e30d5978af632480f0b2833e86e8fcf894f79d7173a04fb3bf98873144eae2b6fd9117866c6dea7e2a6baebb4227bb5d3f7be3c69343f73c7debf03f0ffff316827ea9fb7aeff0b3ac727aff36fe5eed8fd2f043b2d478cfd19bc5ec461f3ecee83bf706133a00ee0b0fbf9fd1774e0c71577576219504bb153c9334797913defb3692553730d52a96059428402e5dfda820cea8889b2f29d31c8787c6af86c662d2aa919ab243e1334852e4d7685e5e3bd76447fa4d7317bdb3b13ce251f99a90a67f6f6d1d15fa0196c3cbf02934f74dcc46329cfce936cd5d419d2aba9e241a34140a44ba1843a329c9aa9aa1829d0f231cf5c9ba8ea2c5800c32debca1cb1cfd5a701e661bb0e7a6dfecff57aeab8cb8667480a72fbbc0d4b4790027edf4a124ed05479c4a09d734b6e283803d9d2635289175efaeb925f9a7163be49ef99a01ff89be0b50e26c92a65d917c0489054eb2a3292e27b55cfc74da1cbee637c386f0159c512257aa5137e6cc82faddd93225f07945c834bad4ce73354ca3d4906c662218845b99904f355c197aff4e045e9691a91a325417649d2587cf031379004f2c4e99525e20616dd17d32b8d8854925e17ca7d4b554adca1497179e5d839756984e13b0249c6f57bd1b15bf08a642a2726e466ab5c0c5936a90a9ef0163c3c86ab049598f57b4adcf88c323cdf9bd300beda67395cff7c78b832702ecbecdc15ad1bc296f94deb95c8f0165e6994a6a34c1cf9518555989f488abb5436c8375842b398dd7516da959d013221c4991b1eab8196bdfe104d52ff2d641d68a3b98b3a6199168769703cf005f30e6553a3e941979c6ebe052ac98ece7c50f7228d985c32d8ec0f53c0f41d53f4051c131cbfb1d7c731ec87be74341922b2fa105f5139f81c8142507440a0c5e24a7ef068c1823804d1aa2dd40366683f115274fb3baad178c7d139daa61bb722adc27a805edf7feda3e3da5fa65dbb3b0d8596e2111f686a3af4ee242d8426e7f3e23cc0f0946c82329055769c4a00eebca57045ae28eeda8007dae6d80c9412888a5cdf750d5aa2ce5654abfc71432af4292b5a3e1f144975496523591cbd1bf2ed7b23209b2869e40b1aafe21774ea87dc9d0b1949c954c49807d5e794839954826b719893980a1b79ba714327ae925cb66a62b545e530269f831270ce14a6e20173ce34af2fcebfd07960bb1f0ad55cda5c19dd8821d47f31d6c40a622ef4373932dab1ed268d5faaa265d063bf953e8ccad322121324ebdcd6ccb9d934618a08309936dc76127db0460f487366dcc6ac743ee398dd5cbc8e174c558c24ba7beac2ac98e1bf5fa45aeb502807ff77e7f632afd7eaa46aab467ee70c2e574d9f7bf23d9c8795a3183ca7b771ca265e087657ccc86772f0b3bb67394459de5c3e667a248bdfd948b2cabf70e4e65a195b8f8bcb0f3865a0656c6f41b3ead9c58487a39b29938d8480f0db2f16c700cb9b124e3a5de826798c5e3dd5baddbb106f92257fc0e961345a02e4f490801175348d40e95490aede1b72a31425ea6c2e22635f454703ae493f1d791e6ce1f538ab28c73af731264a58274e235d37a8df16190506a231f819d0c9bcc1c02734a18b087c9c2af4d14f2b89338869229d6f9d7dc9fc9fe14e0ad9f13d2d9357ecd092305c60732a723393c38a22a8c5d30bce20a8158e20ec1b84c71b8b847d9266701f46473cd492096b4f46be9eab5b2f95cef10aec20501c4a5c7a9ebdc659e4682cf8009d83481246d45573ca3ceb3d8b8b1599910b48af0f92b314612fe26f4aa096cd935f76fb9ccbdb0b6e59e43c37469833c8842fdf00f94165575f5c59e4cf9f5b0c9dc8f0ab00bbb87b0feaf39c94580db6fe75a3bdbe0216ce07ab91f419ca3a8cbbc1ab4f20c8c16e0d388a10197c7c473104f92b8052ee9c4c88ac328459c3a05582994c2ab950f6712808b4597589ba5962fb32f41db41a4763000f8ff0340fed4965fb5ef930b662ca1a7c3c75639c965efc1129a253311468006231149c6902a4df1cbfffb66fdf8a9254f05249054d658876101f4cdcc07926ce02dc0d7bb37a5cf1f7d59b27dbd7bd1d5821b0b4061a4560825ef55876d585061090a003836a459efda6ee562107458a60724cbf1c317c11867292b238c171e61503622f672f05b903bf3c177d63ba8f5fa4dbaa9ce46ad7a04a096d2e7b3ca19b9cbc77141d0e2b422927d19389e2c11548e3e9290193eaca3382cc5acdef2cc90e16a3d0185378be016e118de68d52d9d88ef2e59ffea11933a2e5a3334ce0d80347a9f5929223d647369d6ceb6ed3bd1c8941a11a1bf45c3ac8f268b2708937b46e54cc8cd4604b723671370f02b8dceea686d95cea803c13bf69b3d9d4f96e3f6f3a477d1c2d25dc41f67dd2161265c6f8ee46178208f87eb029179b121b42803ebd294a7540cc8351a3b89f06a9630e03b725880b1bf3b507e1f0b27ab73603c854d7b5fc4fc1e90321897ef27d35faf9c79c6d7ec202c92110870200b16d4f51896948a9757a55e0917e3ba9b37e6f7591737c9bb5e3e8d33982b66ee9577b36e07c9bd0ed11e69602d275f74d81c40d4b49044acf81d2940e51c8acf256210fd372476aa42a5d608d7e9fa3950d4c23473d8231101a08d2426201ccfb6dc318f22df0ee79975c03b5c0d937e1d02fc558eddc827baf6eba82fefa2e6bffda5e2794a21059324175f896616a6280c37f7341562edb6a8508cf9f8e0d6c2981815696cdd9d369e2aece25988e891a437c89986091e858f48a13f66e4f79b23113541ceabd757d822fe4fa28c21e3908d9494a2518c81e3a63eac7d331d258bff35bebc3ab2aaa0eb14b25d0dce9329ce5643e3d8b834a3451b94e8b89f46919f481996f0522a1ae2e3b2dce5d6e3c964c32d6f138d185c251a0cf3696cebc7e4202a62f51af7a5d4ec274e776b631559b53dad02edb1871092d0f9316e666324a5584f30af29f9b3e133f3e85dea588a9c8db6d088de3466b0b6611333d85af7c767b02e9a364dfa235d149818e9aeb20464aa1ed952e046907b23822b680d296660db7471a554204c32acd057df2767a02e2badbc56ca03644cb55bf820a076ff7c9cc9b261b7a34d4fdd1af3867337b38367711006e6ccfd510cd9199433f354a857db05419f7a924f4dc9aa9a7ea4ad0bc8b3a94b56ba9020d8b5e37b95b5c2de047eff48fc48c1c7ccb7981b67eb061a5091ee1109330c108e433eabd120b6e15040af1825582204514ac7218dbe408b7b75cecb6a9f8dbeac4179b6209d9578cd5a90b892fd0d1ca4328e84baa9f535e3cff142b973e225c6b3eda5ed10b249457886339cd0edd1f84feb5e6538c22f9903a4faba73506cb05490c0707c531360d38ba670e1d189dd03b3c72f8e741b986767f4488d6475bd933befdbce8cd9ac757b80f1bcfe329b64435fb3f18329c62bdcc0fd9f003642ef0ece0f2e0a8c5c083f54eb23b5bb4d03b9e44be4f7c590475683bb258a6cb224fa088505d21f861432f1baab2b21ec3241a75b74f2bebba7bdc17690459d0bbf760fc4511a270bcc90d80bee830b32588ddcac3556a3b8e35a57a3ce0fab918dc0d8270aedd77d01b230acd885218464ec04fec1cd6d3c68442d9037e63e6f6a50132c67a3d28d38afd8f53bf825491eff1209a12377a69ea91f42178aa9e7edf9a2d360141e1052f5151e37f78e547ded2378c92a9ba14594530e43fba76d919ee6555b9353953627ee48d8fea60243a0852ad2e864c47e93bd97a3e6455ff36c0210b171e75d57d978a1ae48b38db7d5fba99e3edf2f407a600a859e0e878a7a2dceb8244c111413287d67e8b4870f9cfc9001af1a68e9a5ecfeb2e24998a4f5517849abfffd72b4dec5b7b9bc01c5692184bd1741ab21b7926f070259979b6d02eefd9547036303905996e36618db78b1b376f33276eb43b862e542c275ed9cba4258c127c89592cc2e145f7fc3ec4f63a5ea45efe34db52c78c51ce4b1775f69bf0d9e0752d999a14c0335600feb13d32a3c451a2adac586d48a5e7077f3c01e1a8b23176afc6e25beb248cfb6d70e6f9afac738d2a1d3bed47e82055ef41e9dcc75522bd11208ef33b4dbc894a2fe366c361f79bfc363729234f7dc8906853b41db3e6ff60eccefde9e070563092224268375e47849996336f3e0b11cef70c3db1bd5d67214258c3714a6c64db88d6ebcd126a53d680c803df3fc7465db3352641c246ed71a1d98a208dca61806c8cb4a77b0d59e012323b99292379bace4534896a0d2eb9cbb28b192a5701ea469829483b58f6e51ef7686e004cbae149c54f12910e2fe8dbd893ec44d8172d7fbfde2e670f121ccf000088a14d2ea1047aa9bb0a354fa179ce6e4c8a42a49853ee8df535ee1ea4dd582320f9082ca4ea7d8e44935a892f0105ef9992ced08d28ec1e376875163406c5767ff2a8b8d30dbb68381b551ea75c87384f219a27c8144259f1f94cf10a57ba021b604e287073d651a6db627af58a50f5601eb93694a96af2a97abf7c07dcd398d978e1392da3bec81a51d63caed718389ac4dc244f1a70154c34b8e6ee9b49f242bb63eb548098d1fd2a676b625504bd7ba221138eea9e0e6caeb361850d7b144aad124f3928103a78297e442944c01e0cb52c5a280d0272035575b5726492515b12d0a8fa0d9bbd68313db499eb9f7b118798d1f8fa6f1e5a4650988a8ef8f0179f1aa5dbd21c8b28ae54e5762132be3fa9d9fbfd2ed3798bd21b40f98347e1f86a28c98936239dc8a8d884fabd21a4699a124167c6205a6c8db1f6f3efffd17bf95fa365b07152f620f1d6d44ad859855e2df1355145f951d36973677361c46e4a04068fc751858aa9d101202e9e41049dc1e84b1e9016efcfad0a63e1076df3332c883ec06dd57d8c24b192beaa7eeecefde6ea6ddf6488af56254ffd739de403d6b202afd731745c9f2b24c89e37df5ac21c5fb0ceacdf39eb589895847ec535b7ced110a97b7dba3576382f02c96642b5e44d1909c1e44cc5c3dd577a3701faa29a03bc1c32a40e913396db3e38ceb593329a787ab96110566adda3a76b167757e409cd7a5a181bb006cad550a82d415601d573d6c179e0c421e319eac8e636a1696c081aa02a3918e9f7bd888685502c825281f7ddc999494d3826118e88b7f26d5f6338116abd6b8758814b3af755bbf7cabdc6e57d0ac7591dabd4ec76ee916d6a9ed8f4377b4374e2f567c5a1fd1a39f54f450613fd12830fa265e5199b24230f95bddd878f360feaa91220e65986b043d972402760f6549c49041e8ba1008541dc2324b21d5247134663e8159f171e6fcf696f5e9a9537ac1624cbcdf5b22a812320f02fa85f691094daa555852f92aaf941aeda68f0aaa14833b836e08d46080bf53d718710171be42ca90df0ff0389f0e89976381a83bc5e4b14f7dbae853e3c39ebf4aa54f1cd326e96cf464670593acc4f614eceb718a3c1758390a4ddea71dad8dcc60322964e2bd1c607f18f5dd71c239b9ed31292e46e50d104faa60946d213d35354d09f18afd7856870edd64b5155f7bcca8c6965159c3376ec358d19661e2b680f1a1729ad09bbab6f01db6ecff6d22b79783779303160d7d44890ca47cef756c83b6eeb87103ee476b24d8a06de6513d65b6c7c9492ea32129a33458a08dac005dd3ac5f1a46cb112f6bd719686cdcbd7abc46664ed1c8f3f5c992108be58955517bdcc0992172c590338cd5c6bf2ec0daaddf8cc09bbd06b461bf48fbc7c03618d35dffe95b958b39555683d3e9289b79cb1a766aaf4d670a588adfc2ef403c0305d9f2ba5fb8d853861e251d2e8fc9e913467fdafb783d9e74da1baba7c1ef7a43828f86201388a976e3624fd1bc281a3f92b98f069089f77066944f5a7db05268d6431fc450f02600262d4574cfd227fa9697a388cfd1296408397476a83f1033081da316ad8f9e0d9920c899cd6118762fd0fa49a962f0c27a0117666edc3af851ea6db8ff2b626b9ca93c28218b10f97a4f16bad422c6bd8b9ecc3bbb6fbc305e92a335333111eaf4d8b4a67cc7b6561d362f8bd96e2b013923b9ceb404ed0ec6858ccce302adbc3110d5860d2852e5d0b31bcb79a95aee1e85719141700f27b737bf0cd691984cd7e9b03e3172e613134ef4c2f69db9f099d9ecc28f144d381a01c6280948978a2d779f8cffdb9c6ddb3b00054a0a7b1d158a6cf432fdf3e684cdc5131beb6ca32f70a3d69a0b7853f239e7152a9943f1adae43b2068e509483b52ecc251186acd66ec94b3559a6a7838c2deb4bf6b000e3629bf5fcf73a825439328cb0c2d34f2a5a5dc28b61d50b5c95ad97a8bc031492c60e97f36e12ffdd1a2526b5612c757679eb40d23c728eec6bba2766796d77fbd4a16bef2a4375b50c1efd361df5e59fb5c97e1bc24f62d9d113e5df895f27ed0d3cfffd6f6917a4a9ef495d37cf7fffaf3e1796399d162a6955a461fd98e861225601097acc61301807253ac087a68a3cb7701806dac028ce42152b84b4362ec6db36095f71fc9519638889553edbd961fcf5fb0377bfdc7318440ccb65f2193b92a81a3abff51bf3f7204dd0da870b3d0cfe28d2a7ac9402f33c793ac2ec9fe3e9adb54cde44687b9b2b110120d65212a7a0be687450b75b8f48c162e1a075c70961c584400c526bab6de1ac8db6d8ae23d6e952c9f90dd502e3d9d766e25d0af5d58a0386892015f648268e64bc17ad204b24a5eecd6c08ab43751753fbd178567b4d7bc83f8ae71c2564b7b9293fae8fe8141501724a9eb6124ea47e0e475e3f60a001395f23b303bca62cabb2107c02250e5bf405fe8f68b207db29258cc692e7a9a27681e98553e5362e731c69f81a48d28372ad25d34398436b5d229b04faffa80ff1ff01a17e1da36c5307836cabc8611cff5d029453334325ada79d9a2e881b3aa57893334a15460983a1381558be4a0c2e52b867323be6e069941c0eea71a50093ecab77de1938a9aabc28b374c4a8b23d82a7414289419e9ff58dd33ba9ff1e3ba197680449f22b1aaaba669c55687816253b503764813a261dcc80cc843c84322851a7fa0293d1ae732ec068b8e09af9d869b3bd70acac989aaca2aeafd2d891d3545a7995e9f547b07ff912e5e0294faeddeba49fe4f695d767696fe582292e5170dde8596429e4a252cac76103b44538b2420c6cb43fd924d1fd436325a85c58a97a138bfb6a3b0883dd29dc1b4f58e01d38a8e6b7810a58735a6132a0de9e51b495c19c8db653afcc8d782a9124396273d4c8761ecad2a2ea4a978e1e8ceaa184e51d322772ddf3ec671b6d8227ff45fbb714007b9fe3757a2e5f375b0af0fa8d4100f077671630cbc2039c04729e5735758070c383c783fb724478cbf354ba554340efcfd2f16f7beaf142338419609b0eca6a0cc8956d3f417b6487295238e7d487abeecca7336a8fecfb8dad9ef8d345d3844d8e23955015aa4072a55a6de9a760533249b679036dcbbbc229913808ee45e1b0dc5c70f064cbcfa10740860858d25a25f97a98dfc2d3ad2311cb89674ef9cff1b463f211b69c760f3e60aa1a1cc2101009ca06c56bd8ba750aa062ef364dd52ab57667aadadcb13d672955555506e10b8b698976830e0fdeed96a4042e03da211dfea819782479e56c93a240e5c8cbb9d87a76a700197981db6c6381eae29be0b08734e3b33e58c962abf0eb17a0f222d6030b4f994a6cc4f8f16e9092b8366c94516459ce72b60fac9392795efdb8f8d4906004c95a993b0b417dd4bcb8cea80be17eff114022cf569892a4429a05cdfd35fa049193506a664c2143cfb3afadeffcee0ab02befb065587f521425c8846f7b3c26b1d78e202d4aeb522487ccdd83144f8361fbdaa8ecbd10d9a93ecceff3c2f8f0c798b326bdb389309c9ab344e13188a042cc56bb7d5abeb328d7534c51af5b148560c2bc6eb2564d95a9c8ed154b35b684a12be4ab4c42b18ef753399ee58a8221cd8f303949af318f055f8fd28cc293c03652f94e56bc2a642ec0bbbf40319593080276fb133e98cec49456ec08a3f19bc9a1e20c2f05f4eae4941e3a2138c97caa1a246489dcbe79d296baefde6435da76faecc36a4479936d0da7dc4bc28e0e34942d078deb2a19036488fd8703651de5381507b967190239ef283ff4d8546581463831c4df24c8eb48c69d521518a8c96179a187c1ef997db82804368929d7958890e3e8749fd12a1c7df7557082a6f05a483ad3025d4c6a43abd947dd48d40dbe321efb35381f0ab3e08f004a24b0a543e50414f06554f816f8d4b294cec1c612f51d4ecd410a6f3bbfbb8246fac1d7274270972e44ec15311913485d1a92dcde431dcafb0f37b688f341fb4d42051b8cd42f39640157cffdf5a3fbaa02ef0be6eb467b0063bff174b1bb13401c2eb8506d13d144d3e88f1c39c6256d50552aef8c9c47b19042765543b1df0386062512302eabce92d7afb9bfa675e8809edc9de7e06400f8ff03402ed355af6f972f311ecb58928d817b3161234c4acbd6566337a01b2bac24132ef9d1d2de00b1013144ce0c18d0f7aa0a2801ed3a29385edcfd1763754dcf4c8fa45da79491efd8a7e0be013bc84672d61d01219bc8b4ba5efe0321595c9055473ac91612374a5ce9489c6348dde900873e9dc60db2bb69a16067b6d70471731fb329e474671d1d6418bd7c9f570ba1a2f0ccc908d264873677db8e42bb668bd80d17895b721ef76958aa716dd81e5133c2a8e3c77cbd625cd84a7067738856c799bbfa0c06b70c97335e77c9ab31af927c52bd39159a405730953a8883ddba0e611b8e4fbb5631ae8ca16902d539c0b48aa4e8867def6ef63183a4cd8a3f906a28475dcc4330b42e23227c7693b557837b7bee3a4acb1bbafff1233a5b3968ee10dc8f2bff08e97579f68ded54e3981d68ff4cc43bc29195b4671fe18698bbb9f89cf8feee11ef61b6f13470f8cdbf1f1003ab2c828c5583ad9359e3d370da497ba377ef19f3c07c378dfbd4ec6a88afb5a73b28cbdd9cfba38353719817ce443d485cdf8094135957c1894a6810dcd3678c7ee8f430248be62837772f690774e226bf1d2dfdab5a445e514f98336af049d22954c37f0d6bdd2f20ab62c431159c3d6c299079bfbf486d4a951a75a60c68a4c232dc20da48380ff4f268bcdbc15499b0ed993f8a6f28338c50518944ba7b5c15fbe3cd97a63b7e09e3da4a35be5852f81c46c9ab3085a2fe1ffc011919bcc71e1edd04585903fb80f7b95a1d701b681b73afdaf621fa23311683bfe00b5c52c6568aa9ca19c55b48b119d22ae909401a7abe4fcab42afeebf9c316bd721d7ed3b8739b73f412d33324c4e2c13c7a8f89affc47dceeacf2871c2eae2f2ee73fce677717b976783e6a053b439ebd0e8d683b7b8afcd9407bc6a1ebc97b37d0437ccea06bd8218a2e4edeade1e6a9aeda0be2caa1c545dc3f841affb66668ec0e231f4ab09918cc6ef01353b8b23b8c58a8c263a62b2e4b59cb91c4e6c13baa1a85fdc59b3abb67807f167ac6cce11a8bbdb20770f579f604e879f3566647166ce96106f72ccff23246595fc60454ea14022e62c99db807e7e57c1086142cc6529cee36e4a5fe6e15b210e6274877f628fc163ff5350e033a534218c04548679b02725cfcc3aa2ca4e8efe3fa2862f42d59145f59a2340c05f87a2021d55ce93a3ca0e1dc293ce73a9445329fc17789a706e12d686633704fd504e1931796607b3bd37fb9afec0e138a30c1bdc968a9b5dc4cfb0a4d46767d2673daeb335f7151bc830840e657401a9ef3758dc04b336911b639150383f7d30f9b60b435b574882c6f60110654436b4e0e405807923b98ac918292b1f0d6187b055a291e42a3b098baf9f4ae802c32a0d105d3fa49f04985fea8543cb00911f3d828d529aed5318d7569ce9c25ccb495c6e5db6e863100739c05368a810f1393291b18e7a289aa5576bd46629373858897723710df5a6a9c1bca1ffba07cd58f76b9b1fb400a53d500ba6ec40e91b4c9cecd875113ae68fec8e9f9f9f8d4e01c132953309a32dcd151b3c6b32a386641678282a2bfc02836cb61c6cd9f92c9313c9981c2581dff0aa77ae336ef34d9f5ba65a301f442f01b83073ac4a7db190d9ba35ae050d14f0c9e660f972fba2dc2a7afb642023fab80a557391e85958ad82918972e0e65841300f875c27cf6212b33323be08aee6fa6e9d5f5c3659a4e212196515ee00a9c8439fe08f386f14f45549a46e7563c34da93e28738c781a06d7372c7a93ec6307862ab24824ac19d3724eaaaac4a176390a1d231db9ed1e27488686f011e4aafe0b87a6f3dfbbc04956ae3509dfca6af797c8b823adafb0403fc33c9ee30cf1156a2c6683e989e0a0c52a6ee839479577f7dae441aad963d92000061c4e7593c8734f54b11e1468f0116cc05bbdfa76de2de693a554a39d3784ca1b791d0c0468fdb77a006a16ea5a1ba41a6dd51f7bb60c7add3160562f9e3f3a51139a4e91d35bd87e6c04546fe02736b5d38069818e842dd55dea6c39cf4695d824c32192360c4f218b389dbf99286b78d4c1d2d9aae0704611af64a725f45e690a6f7ee48cf2ee336ad09d3730b0afad03f8bc191493c8a09070b7722d1968029c6d77f3233ad0c461af1753a35f8cef1815100b93af3d34a079941838e3b32c985346d4d96b5f7c897a6cc214d752fdd0b4d6b1cff56303f0182c397b95aa9e22891e9d1c1aa0fe5e5266fad9ef825829b87cac87a3d1a3d611ee8c402789459960ea01b6e0299a9a75e1be7c16a6fd3346ce75a61aac1f8d69ed45465c75ba7cffdbc6d67bb1fa45f3a8da93ebd5462e76b53175613604ef5a84e330ebebc7592392c275081f2b4cc17c001987ffd52083eaaaae4f5ac9af5c922610a067f320be8fde4f173f09a99717d5672c7fe1f97c56454bcda97c4f5204f590e91a53d9e8750f204aef03d47e415ab0d407ff3f269062ec9adae4d3ebf8010bc18d53849b4e16983c4c949fe7827c70534a577aaa84825d7f8ceb074dc80718b3b31493ae4bdc01df352e3d16db4912a6f641ecd39133eef5270d210402b06b78bfbdc27e0a2ae3226f9a8872dc1862ad00fd8f1b85bf33a1b7efc3f8b5ad63b49624b9d71b90a74bcd48e739619804740724f3317a14937f6b24f12b1d3631a82df614ab01c63c3d53f172b7152c7304388840bc992402e13f87253a061a1f98f00c31ec0ef116f2de3d6c22d263348cc55f4b93c5a267699ac3efcda32b1daa8651269b3595f17b956751f367581b9bbc2b5a650ce2b8bfad1db8b040fa9f236d28e5582ed129f780e8047370fac046f209d8875e2ae0e7d885428b499da9169dca7bc62188c68cdd0b4903721e42f2d0a0846c83ccecf22f853282f7779e1745b1dfe0159f53a634df66ddcd503a260d549b310801345b1d53d5003eb1f8d12431b8f0db7bff8af25fdd1e9e6d8afe964a45294f434780ab86bac9aace5aa8e1af1614954dcf9a8c2286f7d6f517241728d248a0e6bcbff4fe6872fc027f57804da52b42d3e0ac1d44902acfa76cb44b5607064e313e267d1ba784ecde1f7b951873bbb6fc9f99e86ee26fef18d4e20a490e1228afa58116356776fc62e24eef0781f5be6457d6f72f4f67a51d427fa4eb302c3a5c955bed8433665295987f2183fba48fb40d3a78652167325ef8364be20ca224f3d69a039b3857d307ad79e96a1ec7326b3e551eb5af47a4d59e526c8ecca552a78790353de8685bb0c8151c33b848166a0757016dbfc3a01264e90702b18b31d49c60586285c22fe11d4cec9d25029b325fab9b61ea6119a6ead526c901be25ac7f823e30e7a3234762c037d35bad1de946608e29061b059cdcca710900aafaf96689a078748ed6f925aafe9be40b870ecb396e3e2948e5e7948ac0c87b364f0057798c17906e7a7a7ff6570dfc17215e0e00cf1215a11ba11454187d91e557cfe935553c9d93e16aaf1924e174bff3a96f41f15235b3c6adfc11446c78ae1fbfe6b39063d3ad81617e4f7e6a2f41f7c9829f1d34c1dc77c1096fa21d15bddd050cf413a3166f50d15008dea3be78ddd12bf3a0bdb810b784ce545963bdd9931074f7abf92b4b734845a0496d563182ceee636616d4d17d3e583b6673c1aa3fca1c4b8afdd6e719e623fdd1d6dfb1a6d4e789b0822091bb50b8072043110eb7e242cbacdc23258038db4b77c0972d26d4393fd9fca8b428c9de0ef6dcb75092716c51059097416f50e15a9277e33249fd4a3911028f75bde0c2a804a8294346bebaa6ca1b80e174711cd22c846c7738c883d6c2b3f6a2b694ccebacadbbc7adf274ed49ee21d016b4570a7fea6a136cc76d163ac679c1e3bf97c33e7f6d7d115690bfff30eac8706f40d485e8eca12066fbf1109b4347c32b5eb5edea8b5180180cd25fc82847a8d034d6b8a563442540099989a91ce3ad5852340bc50a917f45e5152e2d1f7d136eaefc2c457fd6621733ea98438d98938642a461507df02903ec246454a36f99fa671637acd7625e362b5dfa00c36f2b65bd46285734ca61d155138b33d4b67793db25e7ed45a39bb34e36d21d6f6544f8f73a0d615d6439dac854cc4eb934907ab5f80cbd1b82cc421d995d44f43a0efd985fb47f62acd48155ccde13c3de8c4af0a502846c8e21c7206f76ee7b6a5db3d99931c7ef00e8f575e99cd9d3aedd02931029aa4751f0b9e57363d83204442f2c5eda529cee2cb34cdfe87f594d3346def727bd6f2c32c4df3107dc633ea66822751a4aca7f03034a45564a04bdd3f91a6e7b6a584d9fc7448d31caeac6419b900a8fa6175cb0772b8eae36c4b04d561bddd407190d5780958a1035165d20314daa8da24d717842ad498ecfcee179f7a52dd41e64a104e8ce91f21b053d7bb6df833ad3376f29291ff961aaa15ea51f7d3c21a51dce56cc59a505f4d9dd7ea6a6af7329ff7eb5e6456936bb3620f541d8ecc7ada587efef37854eb8e86c1fa863cf94eb3f1415c0d8ceeffef05f305c433ff27e045557834e2b78c62a2bffdbb9b893cc93f9af6336431f0e3e676cf3c9a77e0236838c7f39a22102f3dcf620d7c7b567fa36fe70b268eaefc6e54673adcdfe0e64e33f1a048dfbd8a413139599780eb8a0cc80d498191c56d5c7fb80b93524994becbd23078523bb5e49d9acbbc898c576901c525f42c38848a9ee23a63938f19e82e9c190a3b1c5fe21764973f2380b5ecd879abeddd901d844cd9afdd1e0d6ad598e1ac6a825be7165fe685451df38cbc1edfa854fbf4f528dba03c73bd1bf0f3b8a32e955c2b9be1fd97e3d245a468c32ee8e2fddb506633648efa8b40bedab6cbeed606a84f317993f4800f9e6b6f42679d216d19a56af2f8ff2a69524fc00b59163812b7033d6bb42b110d3ff5d5189c26605605bba519844fe0ce36caa08994f981e4a063345e2928e91230077d76b6d626175c3ba35b6e82d693a78a6f3bfa650998af77afabf0bb786b2bb645f5de43caf01154f009d57b0fef9e5016a39ae013efcaf90845163d03362ab4c70de179d350e764834708d6f5ab421f2887aa9ba589c1391d9ac4104ebcc28cc40f1b9115144d01818140f31c768a111631ab8f2b5c25e98c2490d287fa9c5229e2b0599564728dc72fa0c9982738dd87e8d855b16c0ae9a0cb08d638e837804652b87cecd40a18beb04eb4ac32e7a245a6360435a1306f0812a68515440c537334883d8f64d53a395a5d7e1464d266dd11b2d32692836bbe9d2d64cdfc000513e2e4fb6078069ecfa07ef541f042e8826ec209f4de0a19f30c5e9d4cf6d8b5374f3cee815dc06c8e3a12ae93db4430579c98939eeb186ef82a8d715a91b3a27e77f439f3dea7114edfcc2f361c9dd67456e4cfb87e4d91a487e234405ca5454d753cdfbbea3aa8b5177657a922f004583268492124e2acf80e695ca20d491f26329a33ed9d662f11a00850a291de2aed3452a27127424e04079bac9fb28bd9b4303d94ca3ced03a995d4e4335b8c2bcbc92400452ed7ddd1aab99e14f4600f24e60949e73b63ea69a69a56b4e542a0cf90ea548b23b20e0c0638f412a068bd5847b5e502741455aa1a5744f919d20a11b248652a3ab9476095fc9e691d11980fbb27ff86d9cc42b24a3522106e64a4f7c7e4591fe4193feb9d6bd9ecbbe1deee8b0a3ab74604b6927ff028df0f1d91d338ff0970d6f55a6954ade9bf3f7e453bf2f71d919bc2fc5603702527f686ec0d8849555582b120de948b0fabd716fc90b19b0755176741570736fab07cf66b08cbe4d3e3c7cb42e89841ef1af5b9048ab057819609189f488ee5d7780ef79d75aed26e5c18febfbd274fe07abf0988bf6ecef2868b0247389e350db9806eeee0319872c10339ca35450495148f6b200b9589965c32d6c7b76e09a245e5ca79aedc7e5dc4eb7ca6bff6624fdb147938dd6c60b0f85f0f00bb527141563b01b1106b728ed586d3d0d4050c0bed1303f7b39cb781809ea2c8bf5e69c92ea00bd281504bd06aecd4ace2500da73cc380ed0c2e289e9e6bd787ed8f99757d10a24a853082757b15ecd005cd5bd7c21dffe010038ecb24ecb7ddd0805a5bbfdb71dffe867821caf9344fb0fa6483fab8fc6435b107baa2fdfe8ca64818c6ce91c52d1a76edfa20b64e1772f52682fa0e3413df6fc8a0160905101e41414bf1e191e2c731407b7e7a636d0b1819d806e773f4f914ee6b38e649fd5f4e7ecbdc74b92dc5165ef91e84e884080a40860b12a60b6b698e5065ce0a1dc38f8506d76bebed0560c15c624413d5f329cc32d4300a75fe55b6371016fc6fa9407fa291b408d0373e44168579349595d16cf65843a2e2aa5845153190376614720f2761450da7737530ffe8a2d0379ca738ef47f48608db50565d3076c0f774fa8872d01d753b9f69bc5aa9c00f692e69e8797378ff059475f3e15f3d760d5012fd33d85943cb4c392ab198878553e82aec96cc92ac2313fbfc026d2e91647266a072ca2f48ba07184b052e272bbc0c9258d28b23632e026b103ddc10c22e64cd8b5f04e4aa3abddd3d65fff483b54fcf0812ec441be83fbfd8a3bb6c441f8d2bca8e8043c77dab908c7d213191632115619b9c1288c45639af2f6351d463620657aec3593403cc041f2a809c4600f68f5df1c0617a3fee225be123517e5a6ec99e039754e844f5e55303a2e03dfafa35f9289edb279ac3362879199abf379a2cf21712132ee4609f6c0576e00730300eebbc5c03d92fde7b9f58a5625c74f7e20c274e09773a83d48ba7f099c3f9336b00dd0c6f21da44da84673f7c4244ff205373ae1562dc8a23553874e410299bd8f7568c1767659fd73d261bfc98fc9a9a969bba9ae6feeda21c1c995bd6a9c70195adac01bd673d7add967a854ca3695b62dcbc86cd977e35b5cb202f5f799e0cdcf4e6d0115832ad9186754bcc9601f8ff0340aea5daebbb49f744c8807a7ea5e9d2ea5dc7d2dada33020f203bf2eb97a50009138744a8097c1dc0dcce28ec2a47e68854eaeeff27ec6a74e590331274282ec88cd1ce5d5ea7486d646c9391ebfff7aa3e6f9500216552ce175ebdc942ab9bf73f024b4cb85066e23286c2ca6961f90de2e4a58caba74ad8b17ac0a07cc608a8f5510a9b545e299896ec9e35156a78c256f780d67e3483a508c78a307bb536b6f2706ccc85ccd19027b188717b4d33fd78d7d23a490bd29f42563cc9cbadab7d8c4086dfa8aef67b52565555f7463451a17e93d6418551bd60fe39d629afbdc24aad09b949d62e875d3e17666915da33ece9767027d9c49c93814b81dacff00d9be59f60ac792f9b0fd26455f7e4e2b41901674af4c97be030e129da76228f3489a25fa787331bdd7b1d62bc8820c2d191ef2325fbe0f61e34d27c3367ddffdbcbc37d0c77207f8e90a6321ca30bd0c0b5e5330fe28f319b13789d45a3d6a85bc0459be91b34d6b3a3ccdf8f58749f58a98884015fbda9db8a0971b1680dbdf34eeb8e36cab8ba1e21490cfa73242a3dad9cfd832a22eadc4e65c2cd4566a0f5a65527b1e2335a8dcb39e7b0e241b6ac3dc796cf56e524aa0153335a572bda5778ed141524e8706f5d04042b53d1665748d5e198c60f82b4d7b04ac0b798ab6ff2a9fa861ee45c56e7790a8f0b40d077961d6ae3ebcc5674714258917dab9ef7cde8e2100864aceb5fadac326e91861ef7311df8efa1c31ecc01812aaea58162c396dddecd9897d87fe9361630d876335f208ba361915d5b2acd2d48961f62fe8653f00a0557a524d6dda6b9bbdc4e3c5031542f0bb16a81e9e48e47eaa82fcbaee850afe68336c96ce10ba3d78fb4946cbaeca55aec48baa924523dc4f7efa6afbaebc80604e910680b84e91a93a31b1c57a0158402c35c2fce2d1ba0019ad22c395997464784699fe7b36e112484456ed2c652654ca64acc4fb166faaf4759c22c604faf1be8a9aaeff19063f877e480d7dfc5939567cb79ba47cd7b88042619bbf96452a7ca7726fbb38f32b718a35c75b51e62dd0a464bb651853a0cee692151e95c4f7d464c4e551d27b1e1fb37680218eccb30e46c3ec3be95cd10dcf8910a853dfa79edae1b24f048bf0fa7177e2f4d62f4e9fcbcdc7970d6cc8ba6b8d64c4d082c665ace6e7d92db3fb433b476e082f792e7d48398e2f3d112b427da9bf9a6a83dfe969d46dd12150de0e11ede6c4ff9f948abc507ac28563461ebbabdf8a9996a9666d1fa4423e161111011da47939bed1a038c6edd41a53331f3435ab446959fb9060f51a6e7a030cd3df3234116f190339fd3ce5957b0f149b0b9d14557811c8e80bac76732f89ca57c09f6f63ff908bccdb4fb473fd216bcba516a45a5a6a4be8bcc74c187da6d3a868dbe9835abd117a003d364e0fa5ea288529c5b896e258c0545eea6a84492f39d15af17a7d52a0ba6870445fed066ec3902b515e282451a93a94010bf09f9b897860b9a3844a4ba410768287602800f86143272fd39a3921894566136cea17eee2a30d45a86447b91939073be513a0c6aa019b6b63308402d03fbe97ab7791574eb278bbe3b13ad1ee138ab6862197baf9f679a9a65dc2f041820ee7400d9d09b5daf09ae702906837666a6eda22c11f2ea97a2fb0d2f2f678c3c33760349f1295a8f8e95d0ee8247068f6e8df46c875fe4603d4d6f9d7d073e09bd7b5e1184f1d3e6f0568fb589a267f6b6b8c5f5f4d3532c63098d8970c05af28d3bdf65c6debc038d135299164fc752c1dd26320cf20fe73c2bd3dc64ab31523acb78d3cc3e9f1acc4bb88b783759e4596a93dadfcde3a147817c4565c29b8f454d680aca88f3d8fa38eef65ea81c2c1f46e733492da8c38b6303aba3af7ad2980e1e25c913967aa3d9bd5cd54ce3ccc6ba16ef62609fb5d3989d44e67d6004d6f8ab608bb3641db0cb3e0d9ae8e4a15a753cca1e1f1233971a4a2b2baffc96c905907dd59e78660fe503e4d125d307bd3999f3c62f2f033739d3ab258af97e84d5a442c70e8d10cd128be9cb945e916995c6e9e23e973121f96c12c113618fd8505a43750c8a8e499480f0e3d44e25a4ab867ea3cc0517a3c6e804f6b54866c7baa026c42d1cc3f605ed4ffe18ad3c51a002fa50508d1c06a58047cab2f62d91e003f6e931b000f50b7eeaf0f97172dcb9e8e391d727f961d127df7574488653293e618aaf906232fc22a4fc14eeecc570a33b5fb7030f298f93d35c49d1394baf38ecc9c27fbfc74fca814092094ba6f97ca4e354bbd06105365588c09388ec664cacedb25335dd6d2d491ebebdbcc319cd6b3bedbd19c96113ab1246590fc4ff868ad3784905bca196ed82614e6a791973462d68bb2e0d2dd948eeab88d0ebb00c1def85cfd0c228e8fcabea700cb7b458470e78464c4523d757b602418052ef714948a6fcabca424a151dff2824613d6285ffb2f80d1e4f3fc0d70b6b4fa4d9311614077ad26cbda0db6d6bbaffc0f42562469243a365951ea0c466259d6ce096bef1120255080a22560ec0bdb849a20288a8e621014a8462e0433c7c325ba91d3ad3457cfaa83469338ebfd7600d5478fefd8b40f37b858697e40d104142a6a961e6d7453286898bba513512d9a631e6376d07d0b983aa9719c4d6ee2856d815322646508a757b38e54f9e54489373e5070a6cb7eed2b31fe5cfde20e38f7a4b34401c6f4a6ef3f80cfd172639cbaf95e3af78cb3108e2da5feeadf932ce2375ad4f58d78552d415579a2077f9ba5d38644a9618c8127b6c51a0204d6897472c616f5fb143dc9c0828ac0bec42935052e9249920e90be1ca15cb55ebe720004628606989a6f9d510c6b860a2247282a31b6e864b410840ae7872024e3aa4eda67dc780a9d6db484f9ca070d845e81d16bbf8c35ac8ea1d12cd7e4a639d0e00a9e388533025c8542f23bad663116f140cc99346ca25806936947509dfdb45ecfdd011b323f7d093fa244877e0127293fb04e0a3a6fa482f2e1f0a9b2e2385ade78033c076e351436bab9ef9bd5a4c4587b92815f9aa0152ccfac4721d3895d47566de778b407c37672cd2a3159f85775173437fb4e2a7215b34b8b137089aedc3e8fbb2528d1df19a22a8f88ebfdba3f9f5ceee280d3868455653be34c67ea42c3e6c95036a0bff130c32ea5b1acc4a39a535ea14b2637ef45d0834638dc7d7544a96b6e39ad478dc9bdaa8c447ab11472bf5086b0558984d48070b4a61d45217cc4a7f0ebb5dbb7d81f691efab5b3a445deac28cd4ab453e81c8b6800fb6832eceec5f0e7c9cd9196351deb667948f99d0be668f7452db9cf239e3d74fa990718bbdfb566e8ea7608fcdc84b318ea7ae024eaa13de6039a4ff47ffbed72ff5c3fdc2746e6dcab5c23765229c05aaac2f6fc2854b31e722a1d12b3625be6b216aedf82b31e25bddf99b47ab280591dd1e3a350e887a896256f22992253438962258b81682ad1bc165db7823153217e9304bdc09cd22ca7b350042edfe3c3573d44a623d3874080bb5c20da9eb6bc723348fa7ef8e3884b44b0a7ae5b14332492e0115b6ed8c9532b2c8051b5e514c8c1cf9a59950a6fa42d78378bdb40e1e9a42d924e981af5ba0178fd722c9ba563eea44999f65e1db1368b6c71340af53c138a6d4657c0f3fa94fb68ca7a7b2c9df2fdc1bdfcf9a084eea02e2c5bee288412d0862d700e9f522da6629b4e757a111c2dc1c4ddec88018f3c2f9b1f1f447fadf39041aebee27aea82cd8b7cdf86dcf324864ccaf26d29d7a09443c2df38237a8442089e01e64031c7b7eede9b26412f71a747d630f82cedcef5c63390ba022f173b3786f20619ab79c7d8632cf45917fcdd9d60cb9daabc7beac997eb3a08d5867301f7eace43d99a3e7fcb046754aa8de1ec6a34d6830daf5b4e21314f1d370d3992459461422d5d522c6b279a6f08b9710e0f883d868bbc7a6011de1b9656465e8e91303279f85950518a90e68ce7f479e15a5a67e0d77e7aeefb6327f89bd2a3d6b9e64e00cc37b928c4d8eaff36b2a6d43da96945afd383c1fdce2b1551e70df2a06c54550a8f6b67740a7d913c9ac6796ffff9e2bf06cbcaa9c8c0e2a38687142be0a0bd9d9344da43b6e379870a630ec024ea566806a476c6aa27a15dc6ed3bc21bd1135c20ca143b5263d82530199cc7856b6a286663d6e18c14137759c233bdfa433e206a282aee30f8dd72581847f2368cee3610fa4519f31e31513920230a41bdcf607c513729093b656fd9feb81e6fe45c753915a67d0ff07f22c4bf2af6a4dfe300fba0ee98f551d31c0c4e401e27b73aeea7a5c90e127acbabe96ac92b9461a652e0ca743057b11c9e81c0bfb8d8355dea2890b51f0b1a7732e6762e91b789620fbd04218cd4a754a41b02b5a93a598e26b116c3ea41bf14185c14f4599244556ca321379af9e3c6a92af551b38d09c5b294576f2def8db3853af32f73b9467f86f94a69974620d2e557ba658c3b8c49162ffd7c378c9fe3c720487370cbd0c1f4eab02186df0eecdf85266422422d0ac3001891b466ffac9327717f5dfdfa3c7385d14c006fe8734d4c6d365b697ff5d38cd090abbe7b33162432287a0dd116b2285f2b34bc495ca8ee473d426de4d20cd5471f9d3480813bbcd64a580c228c5af6c3a6516a8ede275f9e60506cf1cce1dfa0e75f66a4830acde63231fb6cf913ad3537b5191cf6cc6128fc6dcf1ded2770d8cf4ccef788cb3b05a60d070e63c3ae1665ac6e21ec15a0d8301f8ff0340aebdfaf6f5bb49d78c1603ea49aed84ebacb5df4aefa5dc11296779e0005b015fbfd2feb27cc470bd03870ee56d513d33d43d840985dd2ee92d50f8a5055ef75cf9bf053080a7051e1403ab498ee1f93501c9f84b29888abec3d6171311bb37024773668e25ac4ba80c3a462834a48435c18c14d0c614c545e82ec32036b577726c51835413c22151b28aeb7e8c1d7fa0775acae4895ee75cf2f7f47c89f263af2f94648a02a89f5da6b5e73d33af8665681cbd97b0b123a2886c7b2a943e50dfbeb3bbff16b04c5c6d4228d99dce8d5d0dedda2a6a16bf87c70cd6f3ca04be3724985b1be5d278303e83cbb32819fd5306f548bb7cf8bc40580ab64b201946b961b1defb83a8ff670ca6a11a454df9a7425bec34ec8fb3c08147f246a753d04f5f7e9644ed5ec6a01dfa8e194e65b0a906cb86f63c031ed11a9b560de646114e40d3e45539e25673c9533d0e1c7e60c7248a9ed00b4937a5634b6c8f238cdbc35771cd59efec9868396b2cc3040db9f75b6bdbc5c2c8e2258014154399bccb34a341ecef5a48687ef38b32f027422eaace2f4b1ed6c1f0af567d123ca53d152336d9b4fe693dc693a21033c91d2232ff9a5ab32005469f5407730001c86d50bcd048d7bd3a02a488a081937274418369befa5d3750e787bc28b5358311a72522f3349a687dea8265a830666401c42f29fe7b4cf4a59e03608e57a1c03213c5e0ec83c71cdc156d2b09e41f212899d4f16368f813c1c4c14189a73670673387cd925b203e6950d3aa7ecdcce8844a77394e8f5c651deb978451ca28412bf979b8bd4f71d57cc21f1c9575b7e92e245c8da20a67695e4f3a3f35fe7686048471958cf99a76594e8d178ec8fb15bfe09b4722eea4af3b953e8096db17224bced28c450ed83086857c6572c43a2a7939a26c990268bb182ad0630b6d41968f467b6eeaa4768db2ddee9653296f90d8d0a3068364075e0f754f115064e1181f94ab07e388ed7c3d54092fb93f7fcfa87720c299f806e3d2b0a593f48631f228ce7e6306bc3213e2a69ee74aba271df4d6e2333b4a85a87c29874454e17d29285a989af0ffa370b7015ee40f842d9ba5c5aa12bb5ef23166f39741e2020ada0d84b6669928a2a7f4c057d39f09b32e28285c2960bb926fe1e0d672ba42d9d4181c07253322721176c9c2388067e44965bcd446f8b755382a57ba6d74e64c11537a3cead349d04913d8c9d18103ab4d88d01b847f4d0141d96f7e2c73e11d96c002e8051a553ff9b7f584d81a7c105f15dcf5b8b1c4aac8672c2b077c91fe484b0c683b3a8f81eed17d021081b12cb93c4ac69878284a9131ece5c4e033d20e6a1e8c94c9dd917646906e213e561457029067f9cb585adc09ce9a0bee93a15f60943939ec15ba097f60a9d79cc3c2539d93c057752c975852d0d944954724ef059fd7938bbb99bb7e5474d14e2a96bd4d49049a10018387d1d4227736b224b24c576e0474ad227bc7fd399388f6b27ed6c0eddc6e054ebdbd06b6fe1acc3ae4d2613a969bdce2ed8dadd8fc1d14e351169af5993f12384abe7947228a32962d244c9056858acdc31accf94871bd20098d927f2a5759780cfa627e34378b9ea88fde412228a10935b318ed208979c4f618f42b3dd38a2bf1e8b3cba581161b51f9969af4c1261538081c18a52639db840f6beef94170f100e55309b49938fada440279f062865848cd803481aef6e5e424c5b6627e70c7184751d1d1586e061da9a9d665861d512207c58dc6c8330b2c54bd021a508fa8880f2d448022d93654822921814673d9667566a6c1c427b104e1576840fc0e9910188e4a87b19f03f944bcf4a105defbc8c86406113af1f2351e831620f2e3640b82baa2ab47036efd6f5e91b92e6d47b00fae5de520f9ef1910711f7b830593c58b95eadf09d05204f634db98f392f3eee63ce8b8f5bad4ad68d81bf717d7b2f95d51e8e1868f904c973e2ec9a3875862da80742c5879b71bfdfc8a8cd6cd3e5d03bfb8d1692e759bd6432ae93e196490c185babe2e559be2a7f13b699e918782fcf5a3d6817553b5913632a91cb0ff4359f0b6657e9267912f31cc0eb6fcc0dff45775671c065806457a87a56786339ee947bc4dcd5ae5b2d1a2b8b88cd55c255d987dc9db04b369285b08c9c9c079c237cf999e85c7912f1ab2cc6c1acc5313204a862e68eb7605842e50432e71ad23148aadc5c801d0fa3dc9cdb6df9cba7953d8221200581801997b0a9cfa9989dc5daa48495af9b8fef317c0ba1248fb842ddbd6241885e171f968ecdda06dcb8c30220b229987f37ba10071d1addc8a46afe078e50f4f173a4d135c90f995196cb9f6f9eba711470f278e9ac61b838bd0b750360694da1f55f0f61377a51b91fd190d163dc78c95a600850f40f971f2f56790a22de3c0a902fa05ec1e6a27e59dd1aaf283ff80a41b49b726cc9345adab0af1ec5842a10a3f1fd076f1a09c49885813a279367dca947d39bd2e7c95130c39afc85b22460af107af6d84f2919c875ce46a9d718cf14eb3a692f70bc813fe8d14b113684c349c22d952a3a9f50de08ad5772e7b45c4e7355bf75d51eda78d6d6c13563b2a964524f6b28517c6ea8cb08af61217bf04a75f612f2ad980fa46aa9f93cebc1362aeba4fff4a6f618832f8160f948f7fb1ab2ff4dc0996877c955a416f8518cffb10a3d4c226157432c2c22079b5246390334b008f1cffcf599c80e0b633144e537e8f708cb8b9e2d2ffade2b683fc558d2534ab6733dc9f19218e916cd47ae387f03af1e51be756c8d84517d65a78d43def9771dac8b67b20351f05a8d0b63b1f372b3839e624fbeb88cf60a9b0b52e73026fde24a515b9c5d4b7443e60713f28857c14491ae7465f6731b78a9a9a9f5530e779fdeb5d584e724f737335e322e2a5ec72a0873267683346270a0ed0a64739818725d027f932a49899c30502392e31f161c90ca5def291b8f3e72aa577a16617be8488fe073eda65127e77718a1cc5c558ef0c17f12b2ca8966bf166e3a5e6a49fba35bb2c0d6e9985316a78d782fbd69eec5a40903d8888fdfddf38533deb64f0aaedd5391d7c863d12c5d740b99062ee71a19be4fb2e1aa94d51563fd6dd6681c9a45b380be15b29378825fae22a34748fbbf122ed334de409901b94ee8ceda28395024ceee4dfddf6d6f1a59629279fcb65a124c24f2f9ead1bc808282ec829a08f6044196e34606221aaabbc3fc269817e3d5383d3c21457b80f5f05d4fdaefb18eb220ed8f1eee1f93413506870a07e77a1ca628d1f8c54dee1f77f1de8c738460715e7c7b43cabcd7fd258844f95fa36a382ff3a6cc9ab2cc2a2e79933c1e033d4049d1da880a9cde63ce0bacd41df31d7822f31abc3caaa013ebec5f5116056b11e4da8220cc1773d3e6e1e57d6489301f548d36c301296964669e831bbf62aa2113512295e931536b22f6c2120c50cc1846621df375113d66c99c8c4095643049b1457c465c522194ca73cccb6ed3d361c08de60f9de274ddbfcac84530901d2ac1e0ff15982d1206bf296cdcf0a388ee1af83c9bb012b48fd6d908b7fa9d9d462cfb4c5e72770ecee0bcb4825bbdccde382dac35c82d6bfcdbe46c2ea3f5a1f5491fe2ebe2aba70f9097593cfeaca1911d5e6aa073262aaa4c4ab284b9355e04d8e9eddd0b5163c1e218d68d0eb64b86aa061a4345bbf2b5afbaef29c21fee4e535a93500f18762086d9babe2cbe944055380a6d89c0262ab2cbb1dbd49a2a3a4c351e69d7beff83b201f51092acd7e4620a6331cef657722a314fd2a7f987f8284a69734cf492efb6efff3880b8579d803af99c7eb8c53e7d927beb44923b8797fbfd3a59a6cdd228f76bd332840205b444dabbf721429e5925aa9ce452363a36bd350208a19b91bd083363c50fdef9b9f6768742aef0ecfb027f17ac096202abffa1ad56b3a98a249b7884e5f48a7f343bffe0d4501ab4e40f8ad249131d928eded8a7a04c5701570e11c69eeaec4856509209d285ea6c502eb5ccd5ab0debe7565cfb9a575cfdbedcc410a5ba8b9a5ca01694e8eca130bf087091538c8a16c943363bd02df54c1fdd06c40cded2aa38c5e97ebfaa927840414f7b24b0354a8a182b1c08d504440dc7f3e3eeac2267afa6fe6047f4b0d993c81efbafa47099303a4c4c56f870d3575dd4d61f2c4eef3d797d22e3c77b4445b3458b74e965ad1606f5968e0b46ea49022e979a0bdc7367c53fea037a5dfa962416f8be40fc88cf704d568bfe7307ce3ad37f135c10faeb88b291e3e7f97a25a7863be45262729ad296d6ee3e200ea59f7614b35e2d42fc4c0f3c4d2bdd5df978e2ab8a548cc1616c52a940572fcb376a0b71d3469e1b63f38dfbbd893de2a6702fa4afd5f3819d9a52bddf392f3e4f9ab32ea4fc2cef0c8843066f7d1ea9a3695a19295c1e56a3e86593b0222c3e82f516c93a035950d1bbb5ee4c72c7e953b4a4af6af4c195f1cd06709ab2b9b56c6a732c4c9720e75762c7c1e9e72b4865f7379bedaaf094d647388cd2718cd4488e822ccbdf6b90d31ceadc529ca6c535995794a5f8add9de79dbfb29aaccda635abf86b724d7e21bc2143079266e6edaaab2edaef887543ed566754fe0040d7795daa746b8feeab9dc2bb3a1077750d2b40ddd0748e97c4a25960a86c0de8d326993a0be97db4bd972bed52ca7453e7c09150bdfcdc8ade82fc50c00bb48227a3d48132d89f42d36a9150af5d839453e212c4391e551cbceebe81cf877267b224b516feb8bfebdc58c80c3d1d49da12bb3bd9bef2d66a1bb030c8793da33b2d5a2bbdd3730efe593c325cbf71601f2be328c6fb0bd060008b4270ac21708c27391098706b2fc4322294f7a89031e96bdde3d795dbd0da7bb9a86a634cd162c8b95e0760ddc40927f32fc5fef783fea906817dc71867a86960275ba33ecd16a931d3fbc16eea1db943009985488c789a02873df7c8c48714c7afa60c1c5ee6f903bc7847a366e3563c99557cef97d5eb0ca74bb941b1542168db86007bad8262366c8048393c67e42252c389d38d96709d2c19e7469f683fa8638c76f8f3223bc42640ee3ad61e3a4b3242e1df3d994661882dfeb6dc6345c158a513e94d35388aa949f1b3405e7cda68e60711b7ee33e64524231dd2d3cb4b37cf092e6b23b0d58d58318331a1e05ca2b3bd5fe38dc29e350a9fad1842cb92f5a7425e4349e45a96f17ab67f209c9193ee0c8b7d9de0844b30f6c2325ec1bd82958b24a0c9d0441b2471624bc96a9863a0852124ed7320ce342bcb6884d8bb81fd8c1262f7e6eb4b08cabe2f24b257f069baf8583fc0cccfcf63563c5e7858c159f4730de93c3dbfdddf2e370ca4a32265895e5b19068fe190e781aab21594359a8e5b3e942d9982d38c01c6314c8899eb10f79f02d4f875e398a20a99107b710e010ff4a9d37bf7918e8fe88d756b1d1845bc8e36cd205ed108dd5634002311165c3e95ba0e0960ed9d5a6d7fe378be84bd5c88558cc8a4eecb73b8b49aab5ec157048db803c45f1e489c735c94f811919f131739db62398f38634c5bf5961d03d136b3f5129fff7ea0a459d548575ca1c69b537a5f142e73e9c9a78d00e9a1dc52890e92a7756c96b5977fed49516e078cb823a56d5a18406f3fc4290eb83cd8a6545eff462065505bf71a8cea5d2c1ca41a8aa0c7da9fe4fdf7e703eac484a3a9e005d0e328d47cdb9206fa9244645972146c624021ef7cd5831cf1e773bf3b981983b3a709f8c5f16f5ecb59b659c0d0125be66e316be080e8186922d19c58367bf6dbf511f90c475a2a5245621344d384992bb6435a4c15cc317ffe8b0a5f46d0608014870b28a456f44a1ff887c99e56536183a3c7753efeb1505090d3f1cf5035c6a8d84211eafdc9781b7575cdf37a7bc0dccc7b249f2799386a8efa6063269d6e48ee0a921b97f129b0c2b7d15129a73154d91c986744cf3417c96617412994cc593760ad97440dc26b61fb414f3c928603a2921ef2be01f02c87bd08c39d96347482d9bb693dbcaa118060303f8ff03402e9d56d5ee858c842444b03bec0b29ad411c9a237858e1d0745f745f34df17eff7bff6a50c6945c6e544b80857b7ea89862f7639c0745fbdd7303d7f861783a4d6052c90b0e677cf6c885c5606484587a8f5773f77671a8f788010b867a12f100dcab15b0c68d50b7a588613da326cf59e5436c83f8599600ce2b7037dd8535837c112b80b54f2faf9c0f84bdaeeac094ca6ffeca47ffa549ad726c54c759823e934c1e1494e2ed0ddd4f9f7262443eb2f2d53cff57e85e4e9c9105eac62ae979503150bd9bdeabe34e7d2f4bc7e8eb5dfcb264bb86ceddd884dc6b7216e42b5de0b6d930f51e4a203573d16e4d2082e63d7b09e2264221b10224889ea717a55f3ae740d78d3b2678563d02e28090e47d14440f2844eca547fa475645e814d3e226055798f803c26aec6e70709c9d1b207ea765655356b4f6baa0f6b74835a57ff25d21da6cca4c2eea6d87050895a464447b4d16b86a2abec4427e70d9e184131daf3c23d42529e049fe81de73821af2cb6dc901d2c4c4142008d6d1ad73aae2639dc54bda625447a8f33ac9d0c4d8ec1bd4b3a94a16e979fc1f8c8b08695985f0c03d77f86ecd722ec8004167d1c6674ec23e10f762d206821d8147f8ce6bb9e17c45ede3838a8d5a320ab934c8f48090d1c5f111fe1887978a1075e16002231182a9c3f10a3d87bd30c81dae0f0018960b52d9d8708b7d2891db40a12cbcdca20762f8f8cab0db6d9a211e96a3d2f0c9d4470e155967e8f25005824027f1c4188e94c255fb2ad1d7b7051726b4999b72edc8ae3da0296b5e3d30aa5f3aa090de3cbf9c470be710ca458dc1838cd64114880fabc762252824e20a0577b5511538282b04b5d26899691f258331564d9ac4ffbd8f61132c9f690b7aadc14b7a104039b0cc4959c203cde72e0bfc775e1147719952dbf84bb7464d854874626e88c329bf145ac746d0c76287ff477eb340b7521f501665c83b11dc68ccf22bdb456014462fd8aac5602bfdd48c66d16276f5ee5d56cf90b5e72e1d575ca6fd8dd4ed4370d2f3f85d9f42ef2910b902f2b93281a78e29e139a70d0cfcbcaecd626033d02303ae548e11f0e6f284421fbfcffdf091b746dbd049f3c4d634b534e7a5d9ae374399690fe4044709899f30d5afd4a3884174d1185cfae57b5fc675cd4c0a3428acbaad68de750b3c06fa7b99d9aeb2c4fa8aab3d5922926d320f63b4d83c83701b53b7738d3737b52eb91f885d749d7d3fc592cdf5435fbd31e1fa2166639b7293ee02ad63a8454a1f7b6506a04fffffef9d74cbd759cb0cac097340886ae5b4b806710443fd3f0eb8456ea1007f9ebb1ade6dc4e6ba5a3a1f234dd35bedb014a1486cd33f084ad23cdc6d0c639d23d56cd67c36d1afd2e1c293d087cc8b8447771aec8095de3eebd213434eb5c1bb83974b7fa31e116ad3ca655cc06693c4fc8733eb084a85ed94530f4fab6586a6d40695ca23778b55220fd8ab6543f7959b6a9b30f6f6f3b308eec7f31d1b578e0865e8251157cd0432817023989080d901615691045beab12eaf6d889e3032aea3087129f6174ca3a3b53b8aac7eb3dd8c19be96c161b3f921f93cf85d5b4206a856b787aab8cbca035b0e6bce154ee3721bc93b6a0e4f2220dbe1e8337f9ad6bdd89aace1a7245e3db04c997d8e99ed521f0b4712cb9ec0ba3be901d318e8378827bdf2d5c230eb65ec67d472acead57cc11b10c127d52418a108a998af7b605d01c58bc6de62844ccf20ecbb6edb29bb3c7d48d0b0a4ff226c256476f19cdba159731b974baec2667a697008759cb582c08ea7ad29521d683af10c76755f980175bfb81438ca6d2bc76c226878c3c33f96906aa5731aa409c470c42aed1bcfb46f41f5d2fa3381ab0ef1c9d6c96420855cf3c0fbcccd8481d4fc486e43c2a403e025701d03c7df23b48bfa9dc48725876f736ef2b7142feba6925d2567b30351b9102dd8ba8340d5f24a77df60cc07757f7759d62bdccea389546537bfd027302f6ef851004a3339b33b80fd22d97deb777e7766aad096e4fa88f63899a9f71eee827b09988cdcf792ff6f60a4e3e3179783f555d6c3b77c420bd7747e65087c7cbd2f6a9154ff38e493b40456c284eeb83d8de62c2292434a72f8ba384b62993a972e32c80fb1d38fe4f576e8400fdbef1eafe60885850d2bd2f5d02cbd824603cb0e17ddf91f1049ac4c7522827b598c4ca48ebf98d976d4f217e1780b214ca6d2d25137cba390bec5bc92a97e28bc0d0698b86f1751ef88189139584189e9db5f6f0f22baad340debe964c27ab0c5ec465ae3410e0ede71e1eb271274b0182a185c9040c1908198697d5873b7f7f2c8b48c2d5b8b8588c766a388b4dfebb2b07dbb0e78a96f4c4a0e990c8d7427bc5f68492ebf58d208805b36ddbc528e186608ea24a9983e109189472bfbdac8ca264c40f5f82b4ad06e01b0e94256dd68865f605783759ad1b21af419b833df8b119687d2e6fcf02c4710e5a2d0e3aaddef02321dc3074845e4c3312fa406910a283f62836613085e2485b9efb461d2ecad9d2c91f94d0c45241e2ba051167179e74f366388f22cf99a344769bbae9691aeb40e6c1a212055a6169b790b53c42169cadcddb3b410915ace49e33448e4e145916e1143b3c90483e8e2b8461623b190076c2fcef5b8662ea3d766241fea517e4e40427979aa18eda15c90fca1325e9f5c5d2e042145c92606059e28ea7c8dada103c432cd428fdfdb8588c948cf375d6bc05d6efe53ab507ae5bc25bb6b6419f1d2da4f7d3251a6bd8d4e73659a27fa7ff5bc27aacc6349942403ff14deafb0cfbe965981850f782fbd200e1a6d02120f3e70f64bf6818ec1a0448955168ca851e50edf933df61f6f3f577aeb33ae60396103312f732737b9d531c777bed31651a4f94427be51e32a81f0b0f3b03fb675f3c8513d6492f7a54eb56fbfd29c0ba2d02470b9b6421c99d648a54e8ceb96ce9417ef6866a095a8447932d0b16f4aa5438e842efa3ea5ad17d05c1ff739dc1dc39988986fe8b9403a075c3d037f847d94c22b04becc3539e97c67eef6c09ed473284312b3599d66123e31653903f4f7111bec4b1d847dda61b8f5a9fcc115257374f780691d6827e1c80af52e170814401228f969306b873c009dea1d1815ae33793b2979b59bb3dec4d674c89e091863d1c3180245b19e725f549a591650648dd8d3af0cb7233a5cc938133e86de8a1e17d6274a659bccd8b239e1db4251283cae2bf42372f3f757deda7d2ead7e4f68bab6162987278d680502b955d27f122fef5c4794ea08c48a83edc03b54b72aee770d5a06fd66a92ced9c61506b98f418c394953a95d8433eb9e515f87d57e490f9d236552e65289aae0e3c8f1bbe38b598a88dba079a7014115a44448c80e97754d0d8f1c434043b8ef51574141e418e93d8e733fdda573e7657708cd36791026cd780d85412facb5c859221ad046d7a06db2fdb001940bf84ae89904970999582b179dcce397f9d72e644825512c3e92c6a038e222dd5ad5f2a1497e2a1c72d716c748d3fca585069e8912b8d836bf5c3b0b582371c6510c076115f9e8c3740eb21fb64ff5bdb19dcc649ee8ddfc493d655c30d1d2d1e1d70dfe99e227e6c9ceaf586b5b7114c264092b40b3aa1dd22d418132864682134b24764551ae462c3805c4881ccbf3b79df6e44088cc908d9698fedbcdcb047dc57797ce73398b271cd1dd2fc306f2b68a83912e921904b2ba1d9936331e1c64b65142889345415c494fed65b1e1e9524592c3d4446c9309650c82bc531242e91796156cc4d20f6ab2c77238292037a6d68651509893edb58ee132a9e2f05389d94a5d70932560a5698cd03fb827031dceb785244b5b2630ebbefdddf0007d2ff23aac8dce2b0de6ad54d292f5db9f5e9f705d7863577b3919cd5d4d81acb46f66c1585ebb6b0d8fab588ab0eb12854c067f1e0b990caa5959876bdf20e14bb26dbc95c3b1ec9eb3ad92c9f1597e0fda3693d101dbd3ea38d18cd45a5fda77b0c9bbff04a5c338aa60acb8fa3a09d626ebd6cbc93bba7b6df0b59d3ce334e68c42a59d7c4061eb495fcd8ceb187c6126ee6787ff2d04bbc84bd4ccfbb441148ec0a9c6b23e0c80961d625cd5b5bdf9f9b46cbfb55f1b6bec778f75e348b037f733e0e5c7c14f3b8e4f84fc16cbe3f9b0f0102401db9a54beac9fd484f9536b0496f4b058bff6396420ada69821b41d3c3a4a24c82b49157218dc30b2dd3719710305def64665dcc8116a6240c8c28d16f11b1e571ae058c95c734e4f2f83c0be84e650111607c38a1362773b22a0083bc906b255a8eab0730565d33780180fb676727296dfb7d0dc3baf73021e8c5125f4dc6fbbe55ff3de7de3eb7798f13c170ac7e2c29ce6464732c1f252bb2e5f35ef0513acafdc2258d7ea6132c83a28646b39b398f92a697051ce8d87feeb87f6640882419804734f253d778dbc506a39b2506749cfd8938c9164855722b4ace70257c4f1569005e34bcd90a1041b55435d393ce857bc374c20be3ecc2631ec23b723fdbbf3de3028aa9e89366d0d27c40b41577fa40043156598fe2a361e47bb6153ea605d70bdaad39efd86c65b555c86f6b46b758b154d4df31e4f8aee7656f5c8055fe9a6cb69ac5e84b9644373ef0051b5bc78fadfd9b95381dc03ca422909700b6af79cf0a39b5e23be3baaf2715528ef2465c668255908dc7c2656649cda7222f0dfc3a1686cb77c4483f88d5855b0e2e013a6b7bcb89d9a06af9115f58efa0e6a536f3d53eab250b7c7926d13b40771bff2071b4f5d0a6dee09a18b247e0144f8a5d31237f5758ef8d32ac79f882aee015a3b6908e5ef38bd2a162b3fa12a04e17505ae02d8e4f0ffa8ce2b55f290d0ae94626159312731834584b4cb29cd4d5f832477252395c94923692521664c8266e8da0571882c6369de547ee2cdca36c7fa73425ce6d3c2cbe855b8e9b6cbe907eeae7875e647a9b7b5a9b12b353b6af03a60ae5f5eaa4801dfb0d9268a908c0678a3b00ba3428cccac6032f08d6fe203580b5466698c7120399a5c7ad59a156435989004053cabc48f0f8c4da8798bf786c13d1d82e19f751d4f0bc02147a03c021e3a5e538e8817e9ba889769764f48704700fd731f282ac689f6a627c6b448d6b1c0d376de7e17dec4871b6cc9997f16c5d0fdab58db6ae2195b884a5fb0811ead1d0963df1c5e4de03824cc2e98f3d6a97bf6cbff13174244613cce236ccc9c44fe5348e44c1d8c81a2a6ec18d9051048b490bc99110c3e3feab068cc022b58ce1414e3504c6b1405759a944d50f042f24f5ddb40eee2ad41235234bfb81ad27ed4dff718fb5a05724116774fed20ec0532f6d1fcc9680bc60980cdbcc9d93f9393735b990f02637f3c53fba9a3c57751fce0de0ebaa54c0480b08be12bab06f8c51e4811e6a0c1f6615865aeb35f952d68f11599ce5a0f263b098b1437f5b5e9b48da2cb303c97d4ecc7ca3d1737991c8e72fb02168f44c5ab873ac96b69cda41ecb82dbeb8c8f866936c671ae8567291689f14b9057636b8a9fd8b22929c4bcd9c83eb31a4e717324e306f404b77026b73b8c07cc9847be0a166ae5ea63c5dd0b3bdfdbf618c398d27b5746bea7bfbe5a26342300e142f5c54a25e4e46401f8ff0340ee7d9df5f53bd721cf32928cdb75ca76c892ba05f22e634bc13a6c8d4f92f172476b953e89763963a36264418b217160f602c8d5d5d543b747b8ff010405a8e37c58e838b933f71bd80fa14d847259c616c5677a7a450eb6c609af17352a52cee98cb281697290231f6c11d97633c6334a80324f2a04f550dba5e94235161e4bc5f64afecd3a2df70c4e6b25796e37a287dae10b75069e5f9b19525c9e43d63688e176b51b262732005360213f5c7b70e410ae59a3d550a3b7c2477445d26175c1e0cefc88513f8052f6f132bd45b86f32c81dc7318c0684c610a0057af7b4d713a2e071a083dd42812778411750f6ca930059fabcb5f6f5ea7c07f64f6abc1963b0cc7bf71e722881d82eb81fda217841c11f389c55357daeb5ab2768ef75d8fdd00e8c390cac9ccf73cf22e6786f6e1107b93b8b328e909992466bac1d62819462ba03621a6e33a1ea0d328e2a72e4476f3a2e82273e7496467e7583374ac56f6bde6b95fb489ee40617e6d700177249c3d9e7b744d95d21bea3818c60ea8527436b1a4d4522edd85032109a9f91b661844e750d4abd34a0c161883a104ff33cf4d2a38671e85a26aaa8ce3491b5eb85b988e3d260b6768ccbcb3f73ecb65dbc71923225d0728a9699b48c03449048f62b43d6c1f9b4d66f4ee763ca30ccc19f6341b4fee26f11e1790a34d2b702d5ad450b386486a03ad70901b08d98af7de92de6631e8d63db18ea21e04780692cfaea2bd2df3eeca0af08a6f809974e2b502c28075a63bc23a968d23c0f97661d09b5661fedf7d73858abd1cdab92113ccba2e7ccc28df3cf70f19620facdb38180eea883ad801bb18c3ac1993dab858e94521ed3438dc3618cf4e4b723e4b8c69810308be1835e4214a6f35361cb71e3239e027ac62c36b34d5ce5ad52687b85be3e50ea075f8f81ee3111315c7c9fbc4c4b176428c7d16a3130b983a3faeeb298374f4f0640f135df05a8083d2c26ebed0124b35433a23b9147b35a116bcce77ed981cc47ea8c1f626ab561c4c7e1f38fdf0af97e1982122790eaec99b775d4872361488c0750f667822b8f5555b1a1300fb1dd33965ea6c2ca8d24dea0d9db60ff67a654004e6b6b09e4459081a42642d12523b9531ba4c4f3b05d6d2710fb5d73e102cb417b0581939fe622584095188f5b441301a9573fadafb1d54ab4a0ef0b7c6e3cfee1ce621aabbe1b0ad6119d1527ca72deaa84597a47c91366c4a3934dee9397c9dc180fb4f3e4e9e844003fa9a595f48f505783c6b780c0f709615d66f7fcf57977c0dd2ac75be1cde71b03df7e2f7d9e7ee88562c386b31d39546322413c0db252632cbe39b1b58f88f1ec9b137cfbd38609b54a3b38f38c18f1fde299980b562f0ee27178605ccfa24302d50cd35443738a2ea18dc74f4a6f608dac072f0870c203a35cd45c38c98bd297805e3ace0a59a9f5b9dfe91e2497da6d27f368aaea4e5aae829b8989a36467c8807d0bd39700ce5420c21542b8538638573025df33ee1b1ddc0f7820aca09aa39ae8dc24d1640a72d8526b2258ce8c45bba4102006c6c14ed7bad60ad8c64c3a17bc9b10aa10970a5007932bbbcbacbfba328f8c0b4224a1e83ed28e5c30f66ef5c37cecefc21bdcab2eb5ea2aead3f99209a806af601a0f49fe43a478df7a179ef44ccf2a5fc27af7b1e937324d326bfcf86206e8c7611d8141f8696e0f36ae031f9f3289e3a29a9d595334f737e985d8d22bd86cb644750292246921b0046a7e42f86c2751086da7d632d0b034b632b3603790e0bc812d5831ad5fd032bbbe2404c86a4b51d36811034ec2063b9290b9307d1b5f7ca2c53b68d12a5f63af23790fecee81b3cf36d3601b539f70a0a89d6c38fabd21ec4709121fcd28eb469b2a4294880a8dee8c5d2fd9094336ea816ff9769b07ebdc7c5ef02c0d77c37c0d9a6bd18a3958ab34c59bec9745b180f2d8b6e08e059c2c00561e3a5a8d77e6370482ada49018f1deaa7751a0a2741a217f220fbbbc0eebb9a916a7f1c8495dc349ab75fe0a1422815749d9a9cdbf824eab01084376b729367943f4826c2ee5c2f4f40f797d38cb79cc4bbcbc14418b893595eeb99d51cc720fcc793b9feccffaf78e98ee6777e112ab3b7a1a8b73fb101023fc158002f34f5160af2219728545a43052374cd02640240e088011d61b2eaa0cf97400c0cc2085a8af791c9d596ca30d9129c9f695a4e189c785248f04aa05b42421a215517bf27b493038b743ad51d5c669682329bef57dae35ea0578fc917dbd8f60ece57d7abf25f66bd0b04ba80abe38f7f84164dcd662e22be0fd6d08a33918ed120dc77b68077b47f98950c5929ec29b2daa9164e51a855d3565e5467766c0f2a5b83894d4bdd5f17b2ec2e17ba105f71dbe07893e50a90f7e3476225f127bba063bf3584c57aecf7c6f6e4951af6adff34672a72a1830ffdc5004c015cf850a831f6558cdfdd6c01bbbcd84b83ea8aa0b66e3976050bf0400a3e7fcdf6f2940ed86da609b416d0c9e7f7bc8f48796c8da65f56a930949a3c7ffd83cc9a5c0bb9d46cd9b63d81cf7c82c5b48837460224f50ecbb4fce1ebc5b383016f2312c8d8d0fa15eb3d0e880f007081d9d91e75d13dc79e1f0a44f2e9cc07a2d7b954287d456014e7bf952929c8a22a70981215b32b04740e6c8c7cb1321b2fe1acae4c8f98265c859ab81a03008c91809fe506c994e433d586bccaa2152270b2d3c771ea82e4126a161a15c59a568d678b92dc872e7d70d1ea8d2ca46a37cfe02b82598002dd6270feac18a5283c01cd390e3b147ca93125e6db575efbf0fd05d441bca8b2abae58d501aa7ef1cd14fd3a39865349773eac64edf0a31beeeb074b81e965c395b0c1546d367a8a76bb8d95b450d3e3a9f468f060f7137638fe0052f047b42e498eeed8c35a37ba6fe378b1f2ca7a0c269467b6a958e26cd7714c59d40c2b93159ab870820963f77258b5bd1e3d2618d504d653cc0a7a20a2c810dc05039539fd15c0abbfb8477c7496d32f27e249588e2eebc43b5047832a81129cc37b77867363d37eccc6044b2f6ebbe18de754cb3c2a6e1b7f33079d15ab1e5e8cca72f807c9a837909292f395fb2cf90955d7f00ea26d1e6f0bac8bf7e310c2594d280350941835b2df9a233f54e85bc6f6e4fbdb6758361f60f9f4cf72d3ef6daae1a0c527eab6bf1e8b1b810b2ac66dc8ee8cdc94f09a135954377018d89dde40a6ce8f821440e8dcb773a7cbf62b79bd7f73059d9097e38ed52b9daeb98ad7dd8f4f03d3003cd342f2014d64edeb0a64924585486823b4689c87eadd8f01c472d8a94d44c9e28e030bb246c39dbb80751be496bb3accf97b263cb474f912c447d96b6338daf04796b0e537c9f797162b1f7607fd09f27d486ec1a831b638ee67b12f5adf3a4bbc794d5bb3497f527b4e4a843a39814768ab61c089267e8adf0d23c11a89ba59336ea16ef4ee8cc5a9f2b9ff31fac32a2bc653a422c7c9b135ffb7617c1abdbdd2c13a69be8a47ac2a48634da223a2c9de4a654114f449b69a93b320fd89ed8aa332cb58e79737432167e4006b9c363b0ba47f34c6004e0516ad293bdc47d05a680c2fa45de405f80d50aee8d12c4f7350cfca39ce9b05cc8c0fe71201584eaf90bafbd80f30b005c3336b21c9fc646b3662bda220777426b0db58d3abfd2012dff56fc4a8428084f67f4a9ee14b51561cf58dc51de91e65277c884a0f4ed43db343fe191c4ab416c5eae2cd427883e46a4f70999e2fcd319ac32653a0bd4f71716c99ac9bdd7d45bb7f09cfbceca322512faba2c6034ad821c0317ba6f858f212004e6d4803fd9c0ea711cb1f6cff91e00f7e368ec8029ce70a4eb9d4c880ff6e40700ffcd2365e9af83e5c5200fef87cfae69f06c85fda542872c5f1a3c0582455d1a50e54ddfce67ffebbeb9389657be6416d29a49cb82b6369784e1fa8fd6ea8eac690dce16be6936a6c3db1d03280e58be54a9e4ab19da135a3d1392b3355e3ca31776478a3ab6a1dbc50e2754e9c3d3c247b9466ffa1e99f4435f3ac73eb0bc62ffb5e4b04b8c855f1fc05f4a9011a0f3dfb1ce18bb893606a52e45038a5c80b72108e08b35f7e14caef3369b2d74236806183925655f1809f087d2749c9ef3654e84d5883220abaf1773132ce21a8c68c1d9cfe372cac9951545011c33bb72eacd0c2050e0b5bff2df7583ee484a45a99566955379391c4c20954c71e6db5a0d6799b8bb8de44e9e8d03988f602d783a837d292006fca43cfbd7ab8f4226b38202c19f73fbbf7395eda661a6c3e18d0b1addf6cec6069686007502e66f750f870a65b67f5e26e636a8a88c7cfc916569c6c88c4c9e3ffeb5dcd09956f8bb980afe6589732fdfdd67380439032170bd312494d58cb6e99c4f563be30b0ddaaa64e33a23a649938ccf001646c0c40a139e51a40c5adc2c6be9054d9bf29e7776c3708e8993561b40b761f359018030f42021cede5344e961442d63f648c7180a58505134eb658b900b38ef6932c3e80b48a6d169973b74f4e439632d3c83dde28808b51c934fe09ef37fc91fbc2a841c675140ee23894ae9ce43b62d625c29f100350d1ec827dc5f5380b5c18e46f16f45b58f2d05b571314643d5fa360d8dcc52605f533634a99a4ffcad6870b05754fba7c9ae70e573cc2d506de44693deb6fa0b7fcfc473a6e80658eb5a17cdbdd48a2421d5e32818cf9e62caf8f1158c67d39db791b260340e5d6b4ba762b57e04ed32fe6136aa1b9bc68977fa667fe7b085f0c501c217699b1e44de38fda7b61d7f0628363925d06214d5321e0208399bd4dc626ab4e10300614443a03480f7f30dbba2c55e839bf08686d9a7da02582cb49b33acaa35bce361576f3e03fc4b1294f0a2f2307411d341005f25b8fbb95677748339e8864408ed0de7c25013af4917af42330b627cc408180fe71b20c4f4cdbf60e011e0e9209e4808da6311bc18de32953503302d1cfd34996d33ec16da634bd3ef61a69dfae06a557e4222c704da19c6f4f2593c28e07cdcb16ba5cbf25a90a1384542f0ec0c919d48516c2884c5c9ee3b2b4ba9e6f5e2c202fd0ae58858617e9747a47e33c989ffc4224b8a0ff4789505a22c0524ef352f20a94a373d84922c939c283bb1f605e35e5c0eee55feec7cea3cacd08ba056c96c8fe203c02aa07db9ca78b22c91a7e214d53abec5afb0c3cd16a47a50295cc84b95238b329b44463be2fc317fa29854985d2946eb1d034d69524d488384a3e027e15077bf7373e2ff7d77b8d9167e11d31251f6992abe6a89ec4e21a513da5d404aa736094a932eabf1c94a922913cf6d74db178cb0d6b7d98710500e4e0bb3e8430f9d89eb5dfe25ab0657193b83a61dc05a6965e67c0167d3457f3fd5ac2cd28403e4af9082bd0354961423d3acf69a4c420ec35d11b9800439e9162b5f4e0895db8db7db069435ee763993b18ca328549cf1a9168e3a12ebb6a7c0808e38e4da9d599fd502446d680d1d411b1ad3918770bf86f37d54dfa6f6eeb25e4a3f82b448ddbee021e43750e012a593b35918749f5b8fedf8f2227546733f28ddb920f5317fcbeebc4c8339adbc127452fb458bb4b82d97605e29d3893cc809829654fc6ad1ef26240d9b16422b2092e8d20b158390468a27264fb629ae6745627ee00db05dd4e72b396a243405beaff1e9815ce2fbe4484f425441d96b68dad579c1e516fde5d8616b68f9820f2ea1f9f75e2692aa3fdf5decf45f61fbfe4010c970edc82413c608a82d16581c53ac73073d8789a4ea897c8ced2534b4c56f310c381ab09501408ee9725aaf26e439886f1515fe43fe8923697d5d3a0df5abb54fedcfdf2990e675cf1ca3fae742a0a8a7a77739cc2e156154a2cdee0650c521cb08a16363dff82aefbe5e24c6e28088b07d752cd0ddfaffcd406417b563b07b761be46ce01c9e6b58dea8f453076dd9f48a6ed816047192f513417cadd43ab7429b43932f3d1347d114c326f55272def8cc819d67d49d7000f4e253e655f8b9f16f2154944f8b16786861209a6cda6b49e006b4e02a3c6c56f88611ae8c8552c166ec11ce4aa13e994b3852e50a5891526f0a6c530af507cd0ffb49fbef9e99beab225941f36f90545d447a686bfb548c54e09a02c5186162fd684b369f9a24f47730713b62316cb28c8d8409117f66e07e6e9c6e6e5bf84ea10621744accbf496549eefc019036abfdefc75914461786a8a4797eb07bf0ec4765e55e09e5e81718a192fcc72d8efe52f1b1a98dc6b07b09eb62878e5e8e74adafc8fc7828a062cd7dd0da888084403a1dcdb7704acb41d568ae4c61606bdf4b5936aaaffbe7476dd5ed97aa2a61c524c08b9baa91da899c22bd28417607632c391a775018bfe8d1be0c98d5b78f19bc4bf1b6042f26c3f1a337ada770737b0a2c9ec7c0d4e1fc2bd384c371c79bfc27ddac3bb725ebf8309ed791b361975c900aa317e41929aed7360b4ef7467e84a9f3cb9422d408268f735e51ef797024d5308eb7f6e4e4211e677303df228ad03f8d568e6dd3a79fe141241f284609b23dc7906641a30b85d49003b3b081165f4c414e6aada7702fbd5003f2cdd146adfc91d0bc316d77e84d53b6419cb1bc7040380c7e46a40e714001c8d5e74c7adfce41245a27ff7f5af939ef3d19fe39d9bc5eec3533747fc82a3a50cd2858845e4e024a55cf8c4f8aeaf8dd342ee2c4127fcf14a5aa115f8897ad0ec7c0f923e4bd007f4e7539094e7579e44fd8d1ff04b0b8797ab254fd1bb97d24c8622b737a496b7f6ddf284504fda6fda0770e131af810d67f423d8eba10511394e5e27202eb33439b8756d4e8c9e083cc796bc3dc77d237999159c90dbbedd1ae302daca84d44d8d55277038cd9d16322527c344d79a988edb3ace77d33b2ae89ada4e94875f0f500cee5d1115c1c6e9d9fdecdc7898dcab14beee562e63224d81c4b91f84d8e74e319fb924346d69147ba13d0820e4e404df96bd003d9aae4328c5d30dc513b74b55976971af6ca83fb442fb56207d8a7925575ace384a156cf9102f5bd5109c32e5a373fd1efabe9a41542fa8ce4e5e07ce9d15883a17cefc6118637f4fb6a1e496d339fdd448ee5dfbeadc547abe786da632f678e99238fe4690a00e39fd376627157e7b0591be35d14017abee3b4f53e22614a783dcbd8bc7cd9aad21acc9c2971d666f185e123ec925f9e150d1938fce6e6b78a76c17e7a872c0e3275e135d09b1606b4818708095b14abbbae2262885c8afab95f6d26a12763eb483aa125b5046a3939cfec8bcc52160d0f24ea6cd96ccd7ffe395565c8a08e5c0e21a2c316d1fce544789fcd2a4494c2a6bd1a8f6c0f3942f4ae25468e13d151fbe4c0df4df4719b29e74baee3363b037bf155048e21e4df1364d33fead7b8365faa91954d1f7679d9b0e05ac72e608387f15e815bc29cda88202822284c0b3b6d0c288542665b67f70b3eb98c4a7a564f0fea7be79a69ddccc5809924ad142e05e8dcf5338b77255a2bfda9091a74e8dd7c614f81326433b2cca41b81199ac85713f214944c5d8ce2bb0fda5db5d23679e4a9479761386019b97e877dc9e6b7636e4a181607fd8fd34a0c95e6e25fae853ad2f55c7d20b8770918f6e344858026229eae645136f2815bcada7ebbd4a2aee056a4585f85d912650273a550704415afd9a141e8496667890cb59033e9687da1dc28b33d5c44dc1c99a93c57a3be7261c5c36b5c1b1f176849ef55cef8944998926b43399b2331cbd258a4ab84ae8adf9108ff4752046153465f7dfd624cb0ddb0184fd49a950b3fdb48e4b50964d10a5734f773e8137bebf84f56c6e7310eade856663299b9f0a04c88c61c0a6d0ef12a264ce9342ff377fc7debe231ec04c728feefcca90af6fb4602fad438f7f46b0003" + "6300f8ffc388d4a41e008dd0e173defe7fa9fab5dade8349f26f00220952a439517290354dda72eca43eea47d423f086852afc7a0552f0ef8089ebe1a4b0587bb3e8d50efef34bfde45bd1b20d805982d31afc68614a03f4dc771f98d10c18490633b680641bc84e1b495be4c8f7bd91e4917e939d667b9bb6ffdfb5b58efd53fc534a23dcfe4947150297ddce36012459986e6368f52d575b2ca8034e3e0bae9a697969f5953937d90b9200e4485691297573fe004ad3e029cbc037f843622852b2fec50f8998649d38df6960f7703fc0a5616e6b0e0d6b56648d680c64b3d97c975db0f957cba7f53e30276952775525ae7adc53c98f495df6d677fae1b297cced9b8bb797de64f7f5499a386a78d78135f679050abc12b3f90dce808b7d607e96a4c925a47f6136c97aba9c5fad8ac9f3c93c4dccc5fd3f601bc5bb649d24b8bf8bede86710857f5e7d79e9f3c5bb2c768ecd18fe4268bc618b5d8fb7be53d4cd4777e37a953f36649f8b29ce7bd982c1de07943545e771f78392ac155785e4ca0d98c24af24764b10b0e61b896c45521b61a11a47e3156104c47366bbc61f8d4337d1b3f40f455655911566bb3b8d849942367efa1fb389a2b5575535d608371f83fc3dc3e84e3f0ff354e2158591dab6c916c7eebb7c1376dd41cafc5b1a0328f4230a251aca51aea1859aff8619a42221ce5f568be99be8b6d1771f1d71fdfbd95aef3ac64a684e2d0de457a12600d55ec62266fe32c963bd4fcc13db816d6394e13befbae5a4a4028ac5997e9efbe4b1180ed3723ae42a71c14d1434f12cb5a9a47ee49632a53cb63d1b02f89498a9cb6e1228d22fdc3e6f849cd0e54463952648393c4fa8a25f07cee90f3c45eca4df64527fd71ea81a6b766542f7848da2d2bd6e20ee2aa87e4bb1f5b360effe61af00fe92af0536467d8a0ac499c62499e237c57d51151c5c60dc4e1577f9652f4177f76f9f1157f854895c237e6f76cd8ca9183b80a84bd38b220a7270e391edc83fbd831cebfdff21a3ff31d28300845fced707d97a2f71d1aead12903206fce7a576d41f4a964d91ea5772a8683d4f8543b9bec49aaac8c64430f5194b26fa7e033c1e187dfb566dba2f40d237a101c6e97ca88f3a73c38b8c0f7516534e6d0cf7c07471a8bd82d1073aaf75d28390d2ff6d0b839b268bcf3d6571dc3d38512b6870dbf09053e106b7638e78dd2d58519f361fcf620ce5f12c588fcc12569727d1cac7c8a8fae665a9375315b5eadd2c455461079d0fd1c92f50f49e30d59897db24e223fc5ec2f223fc5244dc4b55d7cfc8998b026eb5fdc57925fa6c9506de707368efec04ebe7248d6c9bb5873489006fad7fe18fb9693b5ebacfd4d9ab4414a7155b2fe21419072b24e26a59f6c5acb38dd3049d224b0b70af5955969a8e2ef564ebc7b445d7e5592f61fa10be9d4ff264da26f1fa5798b42b2fe4146430d3d3d16c279ac91abc56e4a13d1c7c69b81fdf94cb2de9355fe4d9ab41c1e8b7985472b8dc47d14f22c63f3681a84c9fa1719a9d49bd32472d372a046514545bdb90ec534390bb0e7f1eb4d1a7d9ba4c93ef3dfc195fd63cb8e6cec93345933e860c90f93ca6c32a83f2469d288cba8dc7294ca8a9f9f637dd506bfd34feb253eee843401fdfdf15ffe26b50c94fe1f27b9fceca1670d1be99aac78164a5d69476fad26036cf75d1285027f3faf66cb623eb53e415d8f442d559d5932848fe7b20da29c55810c6b6fad90012f00b61e2ca1655a386461310fa3a4f6da5db8236105459c1e5ab23da2322eb1812915278bd26bd4d17ff81d5972252b3452e4ccefb3587346214250819c92c798ea4105006243abdfff2742755eabf41a51faa6a550e8d918c848be7205ae54b192a630ac7b60e256a125d92f6cda706b7ddfb08b8a6095e5353ae16a8a845a4da6d318842c40574a52d6aea94fda27f3a964ab1007e31bc0e6994b587a63cb0c7dfcf46a6b4710b2897649c1e885ccb4aa3e5bddef829814de656de066df3b212efb72ffa2fceb3b0351f8364a235fedaa197191ab06f1117933bbdb3dd738f970d85b7fd2bcdfc5e1f77b0e2a610c8b8923c3d96fa9ec71fa6e84e8459d0b9b8f189d7f562f2c7586f1d13bc71145beb82cf2658a8da58630c7968e1ca43cd4630b2f7cd39033f8f0a375da2cb78c95bc0624fd4147f48c828414a5df797d138d2cadef0c6cf48fa539d2df63d3623a59ceb67bf047d250c580cf88db35e05756efa14b9e837cf2a6ff5c05d0379f17334dc032dcfe8f95e8bd45d792b78f9ebfdc440b75a220baa800d854701eb1c58969b0d97dc1a3a77a4260fb3756795f59beacb81127d92c5f646df033bc4e5e9ddbfdc3356eb716ccf205ee839fa75931fefd5c2c578b6961fb1b8922e56b1a87ff86d4fcf51dfc5926587a12254188c149ce826974c6b41476d1e4ae46d283829208dbfb038a71f83fcb75e538fcbf5aa84fc18e761672cdd83216912ea4e8c8e0bbaa9e1a00d2237675b934c4d49033705d61559ff44072f4cde5685c91185b5444df665138288dbc77eae4f7d85ac68e5d5937140efa3f9e36da4bd098b5964a46eb558394c55528f426189bed756047081a3c7be729981481f796cbf903735f3d5849512aa323aa202b1536a14e347ebc27ebbc9aa9b74785c7ca3419c0fe674de6abc5f26a3b8569b2170b6424f9ae3f5c8be96cb11de0f4f7bd2a9f4c16d32b34e38a974b2a6bdb30650ab1daa498fecc11a72091b75b3fbd9a2df0909ba41dbbf8ffccd562512cd2ad0dd05488080ceb06e209a8db9042c99c915c96642d87cc94eac47acdba0e2533aeefd678b1e325d898d0f67ece57cbd5d573e3a50c51a457fc13a5541a44231e12d2637c1ccea450d643828f9b2d769d589c89fb50d6ac71aacbac9d039d0248f982d7f7779ae3ce696432f0fb080ab2e5abb80a8e9fe2389c67371a888a2968c214e863839e012da314c6588ad6c3b45d7b2bf461cc86e370e63b26a3f77622afad5225b52508214b4564a1fbc0877d838163103e921d87337555c32eb2017b7126ef5204bff351ca697b23a88bbea1397186a148e3706e3b9b7525ee7c44f231717c6b5c4108be03b44acd6488b279864b31ac88937e9317e40c6a7f7a863582d71cfd8141151a71e4a09dceff5308cf3fb27d3a1740ca71b2b62bc5113b532559ebc093f99a234441f63a3e017b71e48ecac32e627eea5a6bbcf0ce7465f4e14faa88e60abce57206522c33a0241141e23bca4f815ef86d5c4cc18d444569991c6f16aa54e2562c5fb5266754d584c1db2254e15dc9540ada8c555619a228eb608e68f2c184dd61dd292af2911b7bd7b2bbbe6bf1526f99aa133d770a9f7f0a8e3cacc92921050c20d57c9a6ed58fc3594bb2acd6c7ca61deaa49faae466290d1faf14c169ae09f8dc964b548688d9d60cf328bd1167b21280bc1731051c6167012fc3f7ab4f5d14a55c7bbf4c7bd6c2f973b5d2c66fa85888a39cb7138efc4daf1a235610547d12fdb798aa12047f652bcd1fb13bb71f836cb17e370feb2b1206bf7e2781cce872726763d0a8ba30c6ecc3c6ca8fab939fc145105df8d4861edaa49f03c42311b876f072da10cb51eac115d1abc370a52d6e485f0720b4476155af902b45c0ce39a1ec6971def007603d85713d0f8c0659cd21c9f5491384607b27d02e2ac4dc7176c1ded1a0eb8bdffac73e962e09b5063a0900bd45ab88b5338080fc7e19ffb35095f2339cd01e246a80ad47cf30a647b15d5908b721c48133d606da8f551e198a2ede9061c96100f0ab4e5751ff3bd6beda3a6286b0a51e1033edfa1f1e5611cce5dab704c45053b46f599d0068e07927064e0fe6d9fe31505db5bf71b406b7f82443414cbda96af06f82e42aae3297a704347047cd96c099a6f72b3a12fd7e3709ee6579816e3f0ed06de218a9432bebcbfee59c3f7efee5f99f6c78fac51d19927ce0b6cba9355fcbc49c1fa6d9aaef0dde77cf8dd09f3f07fe66ab128962903bdd381f97e1a628dc167344e5700daddeefda6f860f500d4fb9965e7f6458d147dfede52a5b5b4c007c0b3b7c6ccde1b300768136db884dfffa2255cc03538def0e5fd3b2047b2dc320e67bf1f87b3e8157cd8e078ab466ec7e1bcebd3eb06eb2b29f331dd3021bc4acd18745618b07c5d2bc2c64b7532d7c8d86aafb311d83229e3248651bb1f03fe9a881ed3d96a1cbe1d703d22e26c647cb7b3ac6849751cce7548dc3b6caf3fbd89482db71fb7e3705efd98e46c22ab1e56f624c211a5378cdc48c2ec8abba862bbed3f3dd822d895be0b54b1585c7c4854c1f1f19ffe457d6c79481003951c7f66c861c7b9f2310c7cc0f8b7126ea985145a1019618e4fb2f91f2090d39602bbb2474b12148f6707a76c0e7546e2389c4b25c194e7981116135241703b43cd64635d52e0501030075ef9bc0af84acb6a29d66828460e759bb516f0d38bda95aa00c4d53059db8f5207d709259cb927c579c5389c9f084113898bf8bee3bd44c1634c87a5e9e366abd8f9eee017884fee9049de01607e20cf93ee9782a2f8fd4f55319b4c266f7aba38d7a7574faee4be2cdace9fb7bb5cad560bfebbfa389c299658f4ed389c3953e2141c4b169c25b45e199bcd1614b18467113073295467448f48e5c132e498681cce8a97492de703eb44e129085b6a13bb86de5fe71852827c0a0cf9e564830e6fab203185252866e05517990fc398b50ca84b613946fa39535cc51ab1f3fea05c77c83b227306025c72bffd5eacb84a71aabd6525cb69777e67bd215b7fc9dc7e643e8cc3b70f53178f0098196e7d5953c2373a8a721dc22dc0e690fb7d79ffeef2c3e6cdeb7c72d31aa9e214bdb03559bb8dcedee8e6ee761cce37ecca7a1cce6ff8680e30a87d2ad6bb0aecd054596f998de57138dfb9651a7a8d541e9257ffd5090175d21f978c4b71f00ff390ecc9da1d95878704bb40e2208e9a69412b2d5b718c919e8e0fe1e9d9f6962a587f42e9dd5e4c54910376f83412152a5f39c5448d9a54e5c8f8f117c264a2ac59c6542554e5c0dcf2f5ba18f3edec97067b4cdbe80ad69fc6e13c9a8714e6a3f447f40eabdfffe7387c7b339d4ce0bc6135788c3026a941b21941340e6771fc83ad3f7198d3d00b7c1e100e6849c1bc204ce5c4bfb6aee611e17a2ebde1d93f3e6f3ebffde5eaeaaa08bc2115752048ced3ab7ebfd7b64ab6feccddc93e440f8b3943c5d861df85973bd22aaacdc540bb1a8f6cfb71385ba69b702bf14db74b779f4733967fcbdad8d7a5bd8b354729b1ebaa7138efe509fc746f6e823816a1981d7272a9363214bb7bf683c7bca63800f8e7668decf7f0c566890341c555964969e23cf4e4a478b41f198a62320ee7d6764e10f9e03a883e202a4aa997ecfad446e266448f4f7dcb1f037139c5ad67a4ced1270e81f63e34f98dc8fb5bda2263310effba1a876f6d6494630a7fe4d066b04ecc8ec3b9989fb62ddcf7b1f60ede617eba8557478b8a61d758eba6ab5ecb13b4f421d32db803c93c18f88166f42987508bb2854e6d35f089021b1e35adf862887030087b22d5a51252c74fad2587d37a1a5970f1a1b039c3cefaf2a0d8f5b8017d7b4e9c884d675655ba0dc45155672c22add6bebad2b7627d8496ec2888d71c2f7c5cc83889728a4fbee218b4e6f51dda20252b24ae4c8fe3e5bb6e836f8370a4d0435cd9353b765153a847646ab45422f61d681750d9a624947be0ef5786ce8def9207e7b2eb13f4ed940bcf8f09ebb363e8f9ddb4585016c28f7d9c7dd1cb5cf4e555b76dd612f49ed7842fb37a625fe7c59cb671d4389c8fb380c2fc3c79dcf98f489fc3f3b1606a9451ada1e150b111dd004f22f0789002655abc06416b0a2d8794243fdb9ecad891857665c9aa46e4a95833baa9588f9794c7af263235a8291c59231bfc769a4f395fec9ec1ecc0430f7aa5b0efa4884ac3a1d29f111e405631250c82a7b5acd1765ab341df4a4b1aebae0dc6e1fcd61f691cbecd26b3b95281dae7fcb98e382173509b37b3dd6e3e8fc3f93ef8944cd2983f9663a271fda938c2ce8b947af6fb8e5ccca3f167da3bc5b88d9a6e5e4faf60fc2970397311261e717bfbf9f5b30a4c9b35b5e1d3ed031f190ef99fa1a93ace895439dfde7fceb3ab393ef56d66adad92ca74635850d1dba309a42a1a0987c5c3f6c2b2ba6e2c8ab962d4754700517992d8079ac804e2d2485b90972a653c62f673c18e63ea3ffc8358cbeeec70c8eeec03c4d63d1468137a9fc4ce4afc8ad604f3fcce76ca9ec8fbdccdba6c39fee54ea693895c887ebfe5d9fc240c3b6598068090a946f4d5eac1cb02f4fbc043f248ccaa86fa87a4c716393a14f6e7a88c0e5bdbf1e193bc17976e2aaa60063148f377bc8b4c8b8f3e30b7e22ab645f92824ab54507f9cf3dace95352b46477523898ae722930376da8891e99b9b37308a93d68a34716423661cce0f502d6ad93590aff0aa12573bcc2a39c09a752b8763d476b147d7480e47563c721bb7cc52c500294911add43e68a3d669d7341490da4d5996b2461fca0e303b10ad01794335dbb69218b77d7ac5c0a4442da4981b3e04f8dd0e3cb0369b8935a3663a0a87b889d3d5280ae7237a4646393e77ff8a6a0e5d9fd6ab38c2318571389378dc9fb696227e3bfee3bfd2338aad89c899cc7cb74f9b0f6c0ec47f5b592efefc368d94c1abdfc7cbb6966cae939e60d6da4ebbdf8a655fdbbdd053ed77761ebdc67d2d98eba2b7e4de76dad1f6d8d362f2fcaaaf4ee2d600dd2967871e9ccea97785dcc8dcf4ce3829c7ac3ae022a9c3ba952ce79b9e3096929ffb3cc35931e4bd46e375e09d0bdc4daddfe325a728d763e439e19001e87c54ac194a0d4798bc614a4b0f51ed1c0472baf7a1e11047f2a4bbabc70ea70c8d012b7fad13fce6d2376de09a5d2a4b6995493e90bf045af06ad9aeef4eea40fbccc10d24ba634e3fb8073742365f3c3ef7234d1bfc910d2bc3f93b5818db19e30e28680ceaf192757db77d95e25de364db8666b21ededb4ed1e8d10eb1cb02e30e03d3bf5d4cfee8f8c954039ac471ddb78a1ca86e90e7c2cd6f3cee3a6aef3475f7450472854099cab4134554b69f682bab3587f2578de30d910eacb88501350abf10ef22b46536dd6e76432cb743f85e0cb9c531ec6e9d2b19b05f87767b62fcd368c15da5e21fd764496cbf282b9274710c0b0ef7c98cb795dc161faa03a51d280adea964efb6e5deb9506fc75e7f5766d3d9724111168b1cef444a8a139a0614bd330bde728d27f003720876cae3daa8b314e23a47c072045f5685dfc35072d9a7bc77d5475428aa18440822786dc81995124f1129542cbcbae321a8184a42ca16ca67b896aac6af0bd628365e15f62351c2b1b0450e776e3cf9aca5101195ebbfd614441d4345000cbf61ea125be9be2e2455d81bb2c5a9ec4bd5a2f57cd526023d9ea8289a3672e417de3058c7490d6b2a4ba5a15ccaf585f34b887baab6311517f4ac00aa2a558d64c7e4f6ee13d2ec786c943ee58c93f0c14e190294f133fce32a6c523d6354d1ab680f9526055632c1a6365650dbe2073e4dee56c3069d52c531fe16c58b9ae27643818431497e82144b85dab35c2a8c1af6a74d38157f19bf3fb1bbfcfec4aec826f9d52e9bccb3d94af534bc3fb1bb7cbf4aea46e1c4de9fd8adf17fcf433b6ae6fd9ccc8bc5ec4a6c94340c4aa328a65d9b62925f61f753ba0e36d6168581a37dd0e719eba686b02b45eaf9d64b4a1f17e24d25a4459b013e2323c4c0d4dee1aac2db26ab9a77c100f0814be75df61f7a9f790536bc9fd3109601f59716700f103aca781a539c48ec1d14b37479b5cac82afc80ab4556e2765f866453c4c878d6a963c3118021f12e230e337567b28801f86ce7c42c3095fa276f312d5f6a8a44ca009fb7f70b5b3009949025657125e7d7e75e361cca2ef4592c14b3fef8d98e23a13784c5eadd6d245a63fb1168b9208028318f9b77168172d345b15a650313b7202f111ff85920e18068a05238ab38c9be309bcdf6598eebb6b57dc8b301bbc0749002f76b44cbc091b7256f93d90a2a6b0ebe8cd039c5229b4e9eca15414c572287cb9e8787290dbdfd34e441cd45bec01b92436751ad777bff299b7b6cc549c250d7f7e9d341969c1ffbcdc79008051ad8a0612ac64c992a6e80bec622618927f7d69f1e8ce951caecfec60f4939502bc5494cb45890588e0fe34f39400a346696f618a7745197e39dc30b301b1846faa5bbee04c85e38d5681e62d0408037207c39f8ce8cff893dfa9a1c1f984cec5ce9831fee173beb2bb45e236a0efccb8b3ac656d79797a7d3299fb22d96769a935c12674e8aabb259fc82f04c582e10aead2dea91b63fee0524675784dfb588be35896efd345fee8ca17d99e6cb7d9be6cb77a29816ab1556cd896bfbd05a2a638a69be3484c8f7b69943403725fce48b78004585366234459db08ed81f4d45bba8df85856310d10ae7d7bf58aa0b660f99388bb258532e88524b470ecea8c5e249b671c81d07fbeb6229f9f90caa23d08f2cdda9a54756cbd30f4c23e9621d82b9443990b96375a07369b20fd3c93c37ff7438e702c420c564872ad999222b40bd0c4e169081392043396d30541b4a75621cfecdbbc2e16ac8a0d238fc1b0f73bde91d35527e40c19ae2b426d6cf4ae0526cbdc057b04a21b1c03a9920ee54361eec93f27ef7e9137b57107a23eb0037ccc918b889b15bcaa6d7040e65daa820127db197b5d3d96a2275789cf6a2ded81abe65571d2ded2efddd133eda229b0aa035deb5ec6ebf6c6877599d73d4974d914d45915e686c8d8fc802b413e7b9e9d9b458a412e67daa19d3f90e978d4324de69de28456e86725c3b1323d5b0c9b4e1af9db755411ff66cdca6cc7d59646527bc33fec881acf5950cb204de170745b462cfaafc54cbaee8873727f74bdc65df74ebfeb088b15821e4b571b918b1ad2315ba28ea168d1529130213b0a86abca04436bafd7c47730ff34613f222f0a1c9282653142fd983e48e9244ba9d1a1f380cb49b70b6ec014d9f0e04c0a19c7d38a8d987039b45788f3b7dbe9a2cbf1ddcec83e5e2d3384aa22002224f26a200471c39f4683c63097f3c7d4f80b41ae656990f97ffe26408a25b18b2e32c2ba4979f20b9ac5ec867f7eb8efc32cbae965391c2e50da975d1052d7eedf0652657562f26cfcbf1923681ecd1ea57cb29c0cc490b9583ce3655213ab542c5244954f38bac2ecd7141027d961c1b39b0ed410e5d4b8980f88af78b1dd04f75d9345f84189591f5b0efa9e4bcf49763f469a7f922fbb07986b73ee26ea0fc96a238387f72a09def62487954cf3105e9d8e97cb823e52aee9b47d637aac443996e8c1cc839421fc01a96fb00f19cec83fc5d5d15abf91b7e5ebba1fae771da15c21edb37acd135806abb32641b8b8fa772e4c68e2b1ee589d0c5779d94fbbf30cc181ef71082442051daacfbcf6a3852662d3574f94fbff0acea28986c9e4d67bbb8a95ce9fccdc5b7d28999dd72a475eb152c7429e6302c8d3bbd78be5c4c9f13c75856053c85fe73cb1c1f4bdfc58c88d7880b140313c2280bc4c0b383960fecdc77064a7b8efdf57fa27b1035bd11d79a93c2edff6ee0a3f84ee32654dba2780cc135588c7e1b7ebfedbc389c4b79b3d9e2708b14179a939757886a4ae704e29616286eef829bc1ba0ae0f11195b1aa13ab5afac8a13c3410e79e10128492cdbe5c8a0e955b829d648650c9b193d9caa68dadcb02d1d169850fe89cd21edae2efff535122832458c399a572c2459ca9625c5871142fc051f364792da313298b2d31b99595f63cdfcc6ea2e0c1092918bee1ecede6856f1aef14357dd500dc4115c39818219791229e36260e27c2c7b6951f55b1fac28d9cd36c5d9a6f7b8e9e08c684848c2f68da09ce130051e0e2ff95793d85a6f7d1536aa2b51cc54f71d7ca505390d710af8fee486278a3e8859745ce5846234f6c5ef16a46ce646e9b7a397bb4b5887ed09c70398bceaf376dfb144718b769e22a08f41fc131e76f9fd948c5f5fd5d1a483b91e0779d1e5120ea635a08b5238727317c7721bae236c9109e1f1398ff2e6e15b3265ba0425c53295a4098563b592605ef05c5649751813318594c6eb2eb42b719bfef96627283eb223077228bd5727595232422e09196226bcc7f1988ca3670528cb2d4e20a5ac737486c794f868633bfcf6e79ed0346c5c5d6bf7a068fa45855fea98470ea89a7baa32a88230b2ccaa6e9f81eb1aaebcce25c45e7e4fb8e113c1be8d19cb549991acbaa34e994211c23a41881e59464b912d400ac83997f146b242125e4ed6f277d5d43512ca7bd07b9e4c80855a223aad934d0829147619212f4d4522e7c7f7a3fb8e5f72776590a2005245c4207198d2e568cdf724b0d86a4af1ceb7e2545a9d2b692f64be3402cfacbfb9424e6b9e9e1c2b760802818fccd14937c9178be82e2a2c88bff8747caa6c8e6598af90a967af2d3e9e96c85a9935e75c40d5b0eafbbfb2cb7aa741983662bd362fa630223b2b3bca7b6020d3fa30f6f539ce8ea1540707cd2f13150e35d45805197a9ef42e9402523655fcece27cfafdea8617ad1d7bced5ad7d404ddb0e06ae16906fac000f8ff03402e55adaaddd127799ea088a0e4ce7288ba20eb42f68a5a8a7883000f0b2a5ce5a6f890faeafcffdfcf5e5757ad18d4af90156e1f10794944323322f339297da673efbb2f346fa66f803ea6c0e8aabaea3cb075c11268b611cef87faa5f2adb5c832d30433a6cfb865d8285c89eaff013a0f5036b8faef8bd31f8533f9ca836c21d8c385fa290ea8f2c10abab43ac6ef1791c1c98a3fa8df834c48b6172612629276ec69a4723adc6c4249d9994c2aa49aef6e83697d83154b5ab55a65325226ac2b27eb9f61235e1f6a00752407e5f6b0e272d9e017b0a4efee0f8c79e9c5fffb1073f536f2031aaa9d73c25166a9e02fd5fb33ef6dc06e761385fd2c5c56a932301fac28572ae7bf39de10049c4044dd30244b8eb4c21f999baf774c8a2f835fe835764c7b0440f8c9c770d32ee6065df13825642d56d04e75c4b4833f3b411c0d6084753e1bf1facdfd8d66c790f44b9d675a323e08ac00649bf9102b1d72f93bd25a49c4e7749ff9348dd7877804d00b721e699904527a9e48f6159decfd170321e9971015bab9180ff1769f289d5476f41af7bde288b2f0dfedc94fa60515b488b83112e10a78956a0b61ee8066b506adb92cb45561af5fc9376ffa6e0bf489c060a44e286537b878b67b46c8616a6e0cf5e1f623d67d2acc4e268993c948c83b076837ffd95e939caf508238a08e53c3df1a75d4969256842a1b9145ae529a4519273815a199337633835c3cb6a754d69e5e9a9d7cb1234a9571d6c4852479999c984a8a72892fafbd9ba2924ed05c71afbaf54fd75069898e74cab95b01c8593929ce6dad7f6b5fbb9d4ec49abf385a1f4702550d99ecf95d2c399385182f5b9567a3883136587de88f170ac0f4f614d3c9c11b26199ae225a6cebebed2f77e433727f0fb37e036a333cc7292d7b5621ee30ae41691b2b58fd123c9f6dea68e36a4823fadf6612f77126d0e9824595078353b5b664650564f92e14fa5bd399a3acb63f68675cba800142b72018e778329662e56a92cd1ef2e763124d07129ffe97ba9e01aac2b32be4e6489bc06493f3c72d79ea25b045f9a0f60bf73d4e4cc61aa6f1dd16c58b4f9dd89f757f7ee5b6e43789c8cfa268ff8b186512656d1b8ad8485feea97d01b62ee4529c7e6b82032b97cf2efb1dd4167209370bd998bf97f1a89820b84c75f63c9360798784ccd3a841f56e869b4346e8dddfe7b5867ea19539ca083c71ef69bb13efe485ef05a182854c852116612b1fc9db8c824c456423f70915bcd639c80749878ee00157f0d8e6e11c96985bb1741fc56a853547ff034adbe07efb904f00c3dec295db843dc015b80886b8f9e040182316976ea080bd7a3d799b332b99646e7c46272fec2e00909342a4974b86fdb6a6a158d2b38cefd6c0dd4b7a47b84acb8e297a9b4bf6d4e93359977da5d58b7911fd0ca7f04353ddad9bc1c635e29b14b16bb099c2a2a3df6279f5ea6c3eb8bc9b8bf7522ceeb379260aa35e452c7eb2ab5767f363b8bc9bc37b0937c72e93d7b77f945121cdb41565f0c3c076edd06a26fc7c0fe56136de348efa9a5cdecd8511efe5afec87475959099dba1403343843953606903c4b541721cad275c222873df5aec1c3c635c208ad56878599272543435cd7d6c8e4186e774ef0acb1d41cc95dcf6d20536c1bfc0ef8fef4ff57cf4b70d2e5c85aa2a6530e6f7b83b16479e34978308f5e441cd15197dfba05860d68dd96a4d22a3375e05445b62a5c7a43ffcf40fb0906159df44d195d40b271cba52592bab7c01d4602a62573b2d50245a2ac2a123512d0eb1ac72586adb466cff2365b9f627b8b1c0825f097121269ad7914c7a5acccf84fbc782cd85c8311f4ddab44db1cc42a43ff41a0ddfa90c1c3053ef9c0870c1e424bfe218387eb42947d38e29bc9a0572812e057a258e72df93b5e7860778065b8d2bb6c0f98d6c63517429bd05a8b9d23cb9d68926c07aeb1cdc0dbb2268787f730b75c36d7aea4831bce20c39aa8c746c71951cb8cda7e8e31b37601542cff9c4760f44f5f08104671deb7352c1fb949b3169cb56562b34c90c49e6e5bd7d4a61afd3214bcb7c7527343788b2457911cf34ea59c10fa7f7ff05169fe7cd5dde05dcd98761addf6dd385c0da69a66e93ef2a890d21065603d1b4d752b856a5aa61a4f02b053416006cf0e3a32eb30a64eae508245b87231ed7366954468a3f4b5e31c45a44404d495585431173d5a1b3d710b779151c51204cff86e2ddab8b34c1031b0e3f01181fe10f680cda1b2b89de84dafcac4db4081f71b19f4cf8f6c91a108e795681f71eee0b724d55d60bb6025fa75fd6fc448893105a9d26589393fa05153df9766bd197b1e8865577af383b1e40b46c8c44baef4e6871b2c94d687e5df62ba8b78c597c74ce7aa8238a1c66cc780e329a10d503a08c11747f0746e674de80a209f99ccaef136ad6670c19c5f9e628b31710647c7b0f6051cac232c1c6ed1454b112c8438523952adba036fead2a1267e77b726eb1c890d699aa5c7ccd07e12a3ce864ddc7aff3e66320db8dd9e7b4b7e18a0ead7b2412bd62ca2b47dcc1d5e6a7e722dceeec54206442d9ef56b333fb986b37b584849722f726a2447187d5cdaa0dade064ea257a3f811b3431507752d2084e304be7a124eae79148da710d02c42eb55b82e9c28b187dd92272634240d1dcbee400c0b34f2d6b5b6642b4a8df7a4bb3b3788fc803686ca3aca61464bc65ce820bb567e4eb127cc673d08470fdd12a552fc386290b27884912f8c907c9765e73aa1e1fe62c99737cfc4c4b6eb61f1080ec1167780b233dc7ddbf7586ab3108af40cce4e97f0d8f366047852bddab5bca09d4623c21bb2d4f9a3870d329094149a7385aa03a173a4f788c4295a368c5bac878574fdcd5bc1c50a51ae043eb3edb81a63038d4deeb97ab41c5761a6e61e9ae8029ecd795e9c89e635f938449089ede76278042ca490e3f108f0701b26cb1587e2bd1a4ad196b087f2dec97f25ef48b82384a75475848f38d45878a9eaf621dba4ce98be3a33da8b43c4dd21b570ea79380fb4bbdac79b5fa784e02732b89edc68020928a688c91678f9c0efe168832e23b6b467892e8310d90defe343133a1e22221eae76d422901d5e05d1b20c61278a5b8795433c5b3355469a89016c1fba1dd0e9306ea4d563646dd6b49a656c96c6aa10cb360d02d7a1cbea0f3860da19d6243ea2c62249e4f301116972dda7c57e79e5fbd3ef19c43b12f2a39857c398964dce6f3764d1292d60e5f7a7df95aacf83e6783a4729418b8365a997f36ac70a990e0489bc7bcae0bd9cd3003441da70703b88890038156f0fb14137d7802f90cca74596e1229eb75d1384dfc2895a1e8084e277cd309a0b74ae97b5c76419ea723a885cbd8aeab52ac486941e7204616d78e8223841e08c2de3e51415d7183c9fc5faf09afbb6b9bfb558a55639ca60e812d4d471dc9a42eba06792dfb4b986ce8fec83d42abbe95c0762ae005745fb45accee1fac21d0a3903e245e6446813cc4702da9afc75603ab50b091ed0bc3ff0f4e8631a6220274ee0fdadf1ba617451298c366ceccd887114a661725bd29b3fd6584ce5d03c7001f258266015a939b67f5a5b4f4c825b5174d4e69437917cc1736f164bcb1a19b97d96cb400aa319930e38c2d1f4020be5a98307395cc2472c67bba2bbb0a9dcd26cf31a13a27cacdf21136c25127d12a5c7a01917087b6510e9375aa2c8a27cf654b1ee8a13a9329920a25b54d67cca0c30265b61998e463c903c1d817c16e36f678b093999a4b472117e26f6e04bb7dc2e0aad4c8da0b9108c26f6d4cf6cde7e04b9d83f4cdd9f183665a76b7e482cbc86e452eb27afd83a1c506db15e4aa08a993de849aa1c72fdf363b970c8f5cfb7ac994a331a8de911f4cf797ee171ae0cc54d9cb1842999b7985f9ee6860a6660ad0ee982e042baa4c2a18434b607f6a27309dbc8dab39fe61b4e885b82d861e5905fec7c3411f5184ae8e88ffea37f16121d6766929472862304aed0f82e000464f81887a71dd27ca00d4496506c4d0058602e62af5d2f331fb3fb127c39949dc8e3ab439f3b18c740b6d99cc37535651cb1e5c79d141286d7380e7d1c5d6280de7c5c66bd37775565f747004af46ae592f87d13dab7ce9636b903e036d85c0a54ccf0a2c83ea083b66e19e09a82a6a385933a2897c4b0945f183d4e2e7b1dfa89576c2deb10786417cf72f91509375f2c1523c455ad2fbbc3c568eb72c736e2d8d3623dd86db127837afcb06f79d0253a7c6b1bdcaf1ac10b957e998fbd727a4095926b13adf66c41e194a70381d15d04c0d48f1a5af2317489628e76b00e250f3a26c1b3b738788a481ca9da0f0deeff6b87a842a4d716cff0a65b064ec2adf23d38b8def9eeca14f2348b62a4b2de50795114233955e6b7b8133454926fe8a452a179a03ab7f28d9df4f80ba5b5aec6e9a3bf27af3eac8f7ed353ba918ace92b4f96e149d174c747238f3edbb84963cda41306290bcfb53db4dedc3514958f518826141165dddcdd5638f3c5146494c0e2a266b81e7133e6848f426895643860f4b3ac9a7fe608df9a32a38311d9bbe7c562e1560f2a0aab5ddd41ac1f374148a4704255326bb579405d9b80b08a24769ae9a23f52165e0243aee399119a28146038234d969399a1a82211ae6f251a26acdbba5b87fbae4693c398df20a786fd81bdae680b509fbd0188cef75723d3f87fe749a0f7ff22b6970036291f5a8f76fcec58a1f6464333927d754929a2f077d5081ec94d912e136a8c29cdea55d1d1acacd09acd6912f91b233011d4b55fc65ebe793e4483e0d09e5cd88fab8d0a77c936730c754bfb69c3083f97cfe0a981431c812ad9ba492c132ce3004f2dceec05e156c95d869cab6dd60073c218e50c7ce87692fd1be2167b3b8309c0ecfb5b0d226eecee8783038e212930c882c6aa59439466325d2e5c49e6f81fb29ce9368db438cb5bb05b7a5e41d1c470a28541beb6deece53383c7c7ffafd239919b3bed581f9b0b8e7ef12b9949cf2167ade296b4c0c3195ec54b8086354546962bcb9c6bb648b57e311ffe490871472e6e54d3c7d60cf418adda66f882b4504135c57ac117a6646b4769942eb9479b46976550e7ac7026732662663623ac7b56147b1ea9c56a126c8922f08c19b235c21177fd8202d293761272f9e459091c1c60b020902deb79c17d3e400697cb33c7058e7f81f2c750dd9d8c43bce0165b280725993cca853fc122b89f6ba4a6a25615fade71c0696de0ab377cf6f7b9ba0fe883a23145394f0881cee2941d792f45bc03118bd8cd799e501e8ddcf0f9616211d4d13488a3fc478f4d3cf2ef513e9bc3a1aa131f6e74d29a6e6d7ac60140e25adc12d5c5bc6991ef15fca5b451be639d5b916e3a2134782fb1a2b72cb7d6d19c7d6a0ff36f65ad116794d74ae615ccc209fef91c74333196678873c0eec4e93d3a7579beb3c9a2485ac4f8b1d575e1dd655c94fae27c3a850c2fa543c7e248ec2c44c0cb734b94286ce030389036cb2df889fcee4dd24553dba3457d798ec95593bcc549611f975ebd0d4e7c21aa63c9a228aadd36dec9ee675b57f7fb18c32d4ce5e3c87a256e93e45e3868af47a9f35dcd718e9f2c5b2e913a5f380df3b4d3726b180236270d43a3c6cd05a04679676e2157a9afb912b58e429cf64143f7ad74471d6be326726b130e3c3e671c431e4b2fdc662ab6029ad6044482dc112b23915eb37810f7dffac1817b3a9802b8e3066a35fcc7b4dc88f0adb5b55cb235263648d77ea56ce96b0225fd6f8ff0340fe74d95bb56f9c9fc43b41580718bc1dec71c17e5feb1ce7b3916dcd0a894802dbb98b36932a7dfbfdeff7565a259809131380e22173892953d906e4dc007e0293aafc674629cc3a2aa57bef7bbff34ef58e428c50cc292143901304dd3dbbce11d9506540906d88eeffef691db5928471c0f946b6fd035fe7b9807a0da55edffaaefaf6bb0218a5c3c00b2ff1bd6ffa987a40c6731459123cb8eb6cd0f2757d6b6d38eac66b4c3d7016350acaa662e8d7eddaa681d543858dd47329f4dc279bc6542ba301adf221b2b675b61d2e113786f5dbe32230b6ce7cd3c6306ac721fc1ae73d0a6c33be5f54abe376b271c6ed562d647cfcc974ea1de1b998dcbdfa7f4288a49285659ba7633548a6fa63a69ca77efdcc1c40b518990d1ea7f51a6f665b727ca61dd93571ec1e1ea7e4663333888c1b6560d8e0715ad2ef7db3124e1c0c874f2e923cc7154f5f16696186b2640c4e08d3f8d7cd4db420582b8ac92891e9b1cfbb1e7324d5aeb9ed0fb057673b705d86d04b469dfbf33855bf32088305c5e2e05d6ab31d8af22f6a69e77711ac4eeaa17a8b6059af5eadeb6efdbe0f8ba2b532cc9df9e0431410c36cab404de524402fc6cb9d6dd54f14d2d6cfb5c20a6fb676d6753d762f973e41f857a63735727405a8d6a5f21c486480f40c3b1895a2c40033a90561461f69de56418b49c578e4305b676277f063fe606418b241089ee275f0f0ae7776ac40b08a213b05868fa8aa1b85d07990189698bc4b45d79ddf268f2934ef4270cb7fc5172769463e4399a974e6e4fdae415477c7151ff9a33aea3de3d00592c40c0124d8c2cbd32799a64c3442c91b90f4d4ce55d315bd04caa764de15376f798e93a8c90b36420da451b8e07692650857e4a1d9e88fe299e10ab495014d14120c38803ceb8e4eb7b04e354fac937a8d719ac4d3cf6d8dd7848d746aaf6a4c71b708475ca154571f7b9c6771f2393cdddf0da8eb0cb26ab4e11e2ccb28b854b86ac66eaa3e9744294a0eaf7de11685eb2a004e3a24e8a1725a7292c8885a55dc24ce8fe26cebbb766c54e06485d55cb64fb777724d8d07b6c93065efc234d39d0c237a276034c952e7c7477abe1e49b249f8871968092c5fabd2fd43cdf6728e798d478dd9fd325bc2cfccd5ab9fbb6b331afa5e6457e883758f05e67611053e898af14c8b0fd1798258533b755cdaaa86b4204db63e2e573b19eb57c94e14a1f3c4b915962b86a57edbee1b298089c605d71e9632c5401e1ebd908edcd8cbfb9234669f63570572fb23c901b58f40a4717ea28f5df73aa89b236a2dcd21ade24a9e9c0309c132beedb0362ef923e6b6ccaa200459948947c42582c5d3b3df2a54231d10dab53bab2f076dabae375141a4a2e12253bd60cd6b907150d522e47a82e1391d6259833ba1329deefe1ae225de44343cfc0f9c4dbfff8686bd3a2b0d1a5bbe6e16bf4e5011d0dcd73e2105f152ad13f5c9f0f479237898af3ffdf36f12333068ac3f1d92ae961e3bf0fabba3c44e7a9d34bbbbc91522a73708392df55d294a89c8ae782c06c0ae29c87af47054f0429116d0dcead04a4ee51af54577494a6321032f7d982f8a135733a908d165c4160bbafb7ffae7bfa284d1c701ef88c29ab2148cc9cccd683fc20f2eaa499081eecc14603722a1f21695bfe0c9eb5ef832ec3ebecfeef4eba781d4b20f47e9504db4966d8b3f67b906abbb139fba7862bf2b738af61aaaf33a048249d9132782f3b5ac6cc2a9afa3e5eb887d097c10348f39a1078a68cac602bd79639be22257b332e713890eab20fb8ce12861eeacdd93b9d292f065d7659cd252e556c7b7006e5fd4d65addd1a7bed4ebaeecd911631903e509aef12053a95f5c993c858d53778815da2130a31f05b7d19083c30dd15a5c227d020c898497071fa4c3c5f94f4ae86c6a3bc8ca75019d2c4cb39d5071b25ab3ffe561b9f6f2d6717482c5a4aa4a9b0ec22c50233ceb1b9f09f5dec9a673d64f76b6910674672cb826f156ab465d6c62665214e770f0bcbe69e5f702926df5f95364f586dd32cd66d4e9f1f3aa0a6b34210cc27691dc7860966705ee150568215906527d54545e22bc46857501e482c897732a585f17b9e83de05b74ea99cb1ceec283f6132464ab022c2abbbc503604af0faac19cffbfd9fcee7e0d5a6d1dbacba3f27f4ea83bdc3d226fe9b44235f9f5f46b3a30faa7b794b8ce91015dfd23144eabe269b2382df0a7e8cd6b9265b72403cc3afd57715d62e0db237809cb6e0903d0fa9b4ad2349de52570a52e85c6eb6151fb1b794abb3a87a48d75b9a63c1636883d8e87bb2daf00337d71ce10670f976ac640b893e3f1eb4958ce6b3c2f4346a8746642bc8ac55f1d429c2af16d6cb47f65499a80706e21f787ed259b9a444a5acf4982ffbbbc930eaaf57a0e84de19bfba7d1af0d3a359818219d2fe7b432a78a9f7c083532734f1d15ce296cb1559541f97c557bda0afbe00a346ccc0034199f3613fe4cd8a81a2a9f49808ae5f74b7588335f0fd20f8cbd5ae8d8cae72ffe97d56617ef711b6f38a3272115c45c3f6037a0186c72071d501e7526b50105b388745c13eb3ec861d5d5f9e1d8176074d4729ff1254b8f850f42de757bcb8fa356ce44b616ec322c38b6538e62d24d61d8afba61e41f79a31a3e4b73fea56caee26458752559c9e6a24c705a1533b8500c892e5772e668983e38ba37557d09969e432c1f22994ed3661c532b96d8f7a8b2c4ed2d40b466b9e1c5f6452a05fb29c7ffc4a6a98d491fc506651362d4dc05d207ebc01926b576a201d246491facbb1e77cca8181d5dec6eee71874599952edb7ef7b6e1d86347be49034060cb675dd6e5a41ec119160fa97309b5288ac050662cd3b6b77fdb66dad259fe30ba09abcab5691411314dbca257313f5988d0f7e39daa6228528c9daf84657f589d1d1f3355f54ab605315aa2c27cfc1397d6141933c692d942f8f553fa643b829a88b4d3eec8e8c4ba38882085aed0a2b485df2d0a76250330d95968010388ab1e65e94ac73b3930ec2ac0d86fc282cc60b1e6884c96934b9db0c6e85159d9809c59a239a1826a3780723e285565af4a68d43088ddb0209210e6206a2e9a5755dbf69cff97fae193002a7868261a8d6fc61cd7490e472119fc0ad4d45b2f2b2bfe407d9b6480461bc8c43cefde4527a61bc803849611334bb6089ea23a9e0a1b6d66cd4ba9d8d076fa45397f7a0fcfc9ec6fdf57b19bd78fc61f7823190b04b95991fe54c504d0ecebe9300b4ce4dcd1567435cebec3b315d0f6614b431f722094f284b54eeb60cc55e1305b129ce0e1e95ca2685e380891faf30e969d01665a97e9c07d53e9de04b4102ddd88b05808f327b4546cbaa71db8acc5d7a8ff92a5cc984f8016b3efdf3bf2911b10b680d8eb2a818ef2436da01f5558458903d86dab82fc3f4cf669b927c529a388c9d1a10827169ffdb6f9aec0a48458edb239088664de8c7880097281d81a2a5fe566d355f1368241c9175f7d1f6140159469482a0db5c086da932bbf9e564975ec3ef001af2a55dc30fa3a33a1c7f18c19fbf20481508cab4ec645bcc1fe764e15c3c8134cd33ec41edceb9a0e9a6641381d8a620938109ab5e8793843eb24ff5ed25cef6817d2c9f21472e43e110d74f68c0a140ad8b9c044889b7dfa1016c1af845ba6c5dc3efe06f9609556cfffc25aabb7cddba90314ffe13fe762f2eb1898184acf9a314e4517870b677881322e6a5dafab991e2fd7124ebc55cb8f1ce62228fbbf8876508e55ebec911c5a7854e73060de252e9e991862a106e7b2e9e62780a5ffa460cd5bb76a09d763612a7c13a669a8c17988b3da7c180c09b5000048109936f91fe5a31ccadf704858191b350a85e06ca00eb2883d1872b22d0e821812e66210f9b3bcaae68f187b6e838006967d34c1cc97b62bdba29cfed36755dbd91b9b390353ba8e0a96b0733f47654dacf3a7e05687afbcbe461cebb5f27d9bbbeb870f45628bedf0caa51ed937c64110b62646b83b38604cb3e7592ccb676223e8f43ab237f16e4f5b0d5706931badeebe6e9f6a9e8aee472110bd8e810788a90cc4a13d29330364b9ab4e12b70426271fc48452e14e356d002ed5f06d4a82fcda85625aea36f78659bc9169c61f59b978d97c543f301d3c11699c56bfce95bc9c9d04baa65c02fa3ad111a669efae32fc503c2abec1d6a6033af048e406e00e3d76275057a362a4204a54c90b0333130084397d68e792679fa61ea0b020f22cfb8740af4d1476078242e6dfb220daed3e9f1f66060f7016794fd6920d48457e856cb9955903810f6be0ff3b7493b1d41af018f9cd27842ac98d6ac3f5b855f58d133eb9d4d6b7e81d0630ee428a489fade02faaace40da18e625d55c13bc94f0fd5b9fc6f5b273631c0793f9367ca2c7c431d8e779d3c121e1a928c9c03e7b6a6c6af29ccda0211234dbb5037197545c1d9493b4fd732d445a6d7e2d1ca92e16832a970fd42e827f6e64fe81bfc29e151b933195c7afdf89f4ef1e249227e08fc1ea7e16d2bb697dd6d19d29e78fc1b0d5c1903db13f43294d67590fae7e0b7ca29e4d27f4cc64e26cc97a0fa0f4428c2434fda9cce004229cd074b0362107ef4eb3fe880709cdf82ef87ff58e5d32f4f48c693ef77808e44fc9226e1a6854a60d4c06317e206c979ff16fecd0740d3c52cefc3f8006f2f3ccbe626403ed8f99deffcaac207a76a75fe39ed83612d2120798eba261363cac3aacfe0a10969584f1fc8e80f6b846d90c3f8119a2fefc8b3c6739e7ee0c8698dbfe9e31e3f91d7996a41e10f2329d1f45a4d75165ca4044caca36607751e443e15a497a0e9a06580800b735638e90b8acc8751827e13e4f10505fb9320cb59d750c8716c3a8e936d2b3d75dabc319db00478754b58299bacab86876ed99dd3f868f4b9ed0c70543d64074cf0d2bd6b4060832458d54d314c40344ca00aba2ab6f07559ba05d2b56b20e2f5675068baadeefdabd5a2183a0b8d3f68dbd758597da7b5c9200770a71afe3482e1b9d651cc3f98840152800aaab23609eb2b925efaf654042692783fcc9937ff525287380bf3887e0ae40ed9d90ad41e587bbeb83ddef411928fa43ef0370ca1378a06fda1a283aa734a41170cad3fafde481a1ec7e2e43750d83bbcca604a85d65647498d46d517f3ef0dda449d7199175470aa04a94720656f5a971361985f28fc0d3298cb6fcf7b6b664212e4cdd94ecb205b1428923383332922db8616ec647b803a587b659c974f6cb12be8a2a2e8fc7914e193dff91a679b260eb929c0ce519ed12966cce953e49cc6502ce25d37a4ff77c0eb0556a307ce5fccef661b157acba12c558b897d3851eb6c8fc719a5236a3ada3b1b09ebecb1bcca2d7012f24181207b0e6633baed901cd3caf6d250e616f0cec1e189df999c75299fa20dd01c6a31ae150f9618fee1a7be297b5b38dbc1ac83c772d6638a22a32ad8fc158f0caafa21d0ace61d6d874688f476e949c22ad81266df43b308a8b63a47e15d23958a0d707fc2ba16b1f0c7a4d59200cfcb444cfc706a73ddaee50a79e50196ef05247454757007d1b2e09b54c67fd613bda9260ae8c219f791df1771fa97c1dbd8366fa122c8958bf3b66596bed84d57a8d4bd2789c461fc66cb8ee91bad40ea3b4bfae87bdd91d257c3a59cdfc909a1cabfe6d4e195f82c92edb5ff01a23cfac0e3a07848e360b7c5594073e332790e5dd5643b293e7e57b0adb2069caca4782dac650dc4084e71bfcd54422b3a94cf487b40ace01f9bd04b5269c84221524fed612dd42dedc958142a477dc8e87a5ad8f9d348f04d72d5535d0cdce1b8aa3fe86c59409ca4a11f59baf0e1451fd71829750a72b6347b2be2f057263f2674c09ee2ed6010a6130d452dbf6414f429794c9a3fce40f9736063f70051556169e9d175eb800940947aebcd92008a5bda8e112465d17185b228bf9e79588be2d7a90e030483f03e3541629c31c2776613a3c84529ba72191948bba7aa2b182135810af852c75251fb7ded50ee887aae71adead5e7076adeb0ded6cd58e474ee606186c728a3f9b52a67789a033ba50215fb48fe461df6b7d01bbdff33b4668ef965a2aeec89f2a1681031f2a7d3644dc113bab70cee6dc50b406e26c4f1572cd496a34257112c375d1db3cdbbe6b42dbf7455597262b3cd7d46fb0f3e43a62c17368b984b4191a5cca7590a4cbe962354f9765ca7cfb2b9396ecaef0e960f14b22bcd8689fe528cd6608a66c1e80df7b0e25c8a420d7936765f6a09c861c0d7bc803f5c98d5bed73094f185d66d0166bd7f02ed1aee31b1689a094c34ab8ad685111d7b5112d260267b4fb59435e369a208e48ad7ea96dbb3ef7bb570d59658a8b7d0e4b519e28ead5991eec547bd711641f1526eb9c541457114ade5b6a89836cc0eb1ed14b627ab03985b4506f5b150e35cf03f90a16c22886c41622600b3af4fbb091b41f43c2de20026d4f84f53407da2ecec122306dc6bd2a4257d4f5cd3e3e1ac998ea59ce308acb6a80f2f0bb10ff50819d7ab38d7c5fce54d8c7a372890d49abc35f19f624a2e4d7dc45eb4429b2c760898dce294ec808a77500e16d207003e473e20e6c8bf95321757c8b90988f59a8850a0c6c56aff8e0716da32a515602959e819b2b701e7c7fdc495626e075b4130620b5ae9c60e623ce549d3015c14bc6c6d485bcec680c36a4132e04773726d3bbe7e343264ef59f8f6c14d0ddd30122a1f34aa9c622a459298ccfb09fb034883c6699ee6e5a4b1ff3a4e0b6348384d4cadb5cf714d1c246646fcbb17f3c18cf781dd226ab3d228ca183b2808cd768ad0ffac2af0fe9d0dd8b2acdb23994692434beb275ad01ef5732f709ce83cc9c411832aab07f4eefe5be2760972b47921b733819a7c8af00a177636a80a4b43d0613fa42888f6e3e0464e0e6998e530d99a8115356f592353d60566bbb04e35b6fdccf731a0194a51784456ade525820d4761199229409755e88a4e099580aca2d1d8a8c2ebeb517ababc9dabbc4267823eb45a631c63cf3a2ca06c69b808df8713c3992c194d05319c4d568323d57406f72fcfc2a1c39082f920a761783fafe5a7eb765f44c96c3f78888190997ee68ade1244fe3d98b8d798a5dad4f3105b9e35338c33e6f369ba6acae2ee488b5557840865eb13ea2ca622d57dcb8f758f134262ff97cd07b50e1f22e0511331dbdafeb9357c3cc795a90edb70565ae88b3c9ba9f517ede70164ed2a38a00e31c69db2e0594e4c3b67a15a72689a9ea36953b8e5206649d06827ad8d25e7fdd89c86baaddfd5e1a41bdd6db54514627927b55a08bca9568d7a168969cf2f68d7681ae23495d12b0a4062341eb4db56e5a6a904264aff1ccb6ca8b346dfc19af5b1f6eafe2427194ce7def7b5d6c9e92168625cc4791e1681babede14234bbafcde9314709df93eda8cf7dec401c33f2138beeac86d8bac304b77ec213c6632632ca45f97f839ccd788c47397a6477426e9f8c69d0e784010dda730b58b48b075147cf21e36314cc8bbbcaf27b25a3efa3adc3af773da3ef4f27cba82f1da0f3d7e49cf31ecba8644fca21a7aae6691f8ba62c519e90512a1445a0d3b4322a704ca40b0f1a06a06ecc96103511b946088302d34c793d51cca0ba190ed469683c0c465a3790a53d6cf858ca06cf8a090ddd94c7c1d5f292db943ced63a4a9298fa4c5b21e4294caef6da53100f8ff0340ee4dd77bba4e3abc27d9d6b8936ad8dd1f763bf0f9294db607ac604b5e49b41c6ec7f87d4b4bee40815926eca0919f01fb55d5604612d0ee0a681d2f06a75455dd330aab4b21207367681f044e819a1bc1d1e8427cdcd0cc367a57fd893ef95ac978088d1690866f1f1eb5260087d0431f1f9fdcc00440a208d4350eb85c800a08f6244ca69f5df160a5f8f239f5d5532b7543dc90f9271c1e15f7d23a9e172918dbf6b77c5cf24db55af31ce7fce6f585d76ece3f7f7a069fb74f90237c8c2b8e238ca22ccfb3d9988654605493da2632d219752169489d21fac37cb0c65c595b737672e1b7b5e40edea07be2388f626e324cb1acdc516e8fe125128f8340985b03c4ea9c12d44810956c9a20b934bc51e54ba325986c20256f925a8dc7fe9d97343b309a9f542e6c07b3c756fa56caf25d0c401b3ee7ac7ca7349ca9becf03aeffae72df4df651d34275551b4238695e2873487bbbce35069d64b6e8fca0a9a2485ca1dfa8b4a7be575a43bee9b32d791cbb1d06833a47e6537a74f1ec85235890d72ab173c7ec147c8327d3a08e0b5e5feab473590f07a3639597aa372d8e65a8775a56dcb44fb269456c6bd9a1144aa4df20597dd64396a1c0aa3c0604db7f18c2a42dd523224713d5c982fe2733e60d153851f53748f002e8a735632fd106ec1ef2688507a373a297b2dc099354362add2e219fff4468995927b942eac1e2d262ae38e4d4f398554ff4e90ea5bae71865bd2f66be95a4c6815c71d8f61162f3fc84c3c8914592e6926ee762c8a45ff52c0968194cadee2b604372a0e7e81b9b400378190e14a08ee2cefd50b33ff41f9ac3da6c2a0fd529b333c947dd70dd93b4cd6ee9b341e1db5f034d08f77037be7db458f15875cf7685ed209d6b3572084dc555dcfbef75639aed5bc56045b23fe198def0563178dabc7f01f926b83f79553f61a3eb2bb584c6c04416de30985af5041d26abfbfb7d0af926983d58ea48a0ce25440f71340e20aa9c2ae4c41e608f0153d950dc07670c20853447f7a79b7146183ba36fcc203bca379a9b8fbab0c4f78b0d4875630471c360b9a357570df7780c3cf9c4e76b096b36ebaecc87c99e08f6bda9cb9283e4ae4dae8d79821307231020c0c7f69eeea2cd5993bb17dfd18b872aa03553ef08ba0d78c1cfa8b689e4e6d98644290c9a236cd462c07abe3d830763496a069595b56a186c15792d878fcbaba07117ea89153a6dc782914041a47a0fa7a2907cb7f733e97e08f6ca77c73a5026ac7bb34760b2809ffad02325ffbd4bc4a780a5d16ccedb751b33c02f997a7c4261329f6f1fa7b786225e011747887d0bbff276fd2fc0d97f8281df3746efaf0ade94d467d2f0b85cdc3eaf6fa1fab0babd7dba7dde5c219bd74920c4d02980eb1641ca8588e67cd1491fd6bda9c3412a1d5e5c1c4f2bf733795cad4c37ec1b288ef13c72f20336597e4d183ac11be932f228e61dae8b58842a1d460cfcf1fc576b4021ba5c0da4bdf98051695c3196885119c8cabb9080fef8e194ff674f309e6b80427ec2ffa12c4de344c9237bbb7656d416375d4965e8373cfedc00f873bdf0e78b83455c1671c157e7ffeb061322baa513f829c211b74c473374a41a9984ace6a331c898cc67babba50f4faf45381799330d4014596aaf284a6eb89e694b5528421ef00a5dbc4255098f58e8d3502c22856cca08b74b9b4e590837318d867313a59177a993a1724f2e80c7d7d351a42e4e44b3a99e8b9822813272e99509a44a57ab5a324f4fb76a67568b382b89054d2fad7f2d627ab05cbecf1b2652b3806d427aef49a1270c813d54aac7a8096071417b65bd57eb92e1ab130d6812158c727b89bc61f5e52683a8dfac1e95bdc984bc96d12e921af99f0dad9f557977945feaa46924252eaf451a1da7a865d85b6fc03ef6749a252baa1349e470c326a671655c21845a96cb471da3ec7988624cce820526794701f5055c9a8184ac480bb79d938554c3aa7c184be8a5da97c9c0d202402e03ab11156e2af977b8fef99ee4201184827145d310b5d7508e6d30cb0a06a489dfcb962436500a780938e86d7f957bc2f86d94cf5df3eea6e8e70d3c8b62ba311b46eefdd5dbf16f6ceef17cc84f4b273126464db5e25010dbcfa36bab74e02ecc5024203eab0c8b108465b4c453cbb4bf811d49df91edc9b9f0fd4cf670358dd2dbace252856f7f9dae5874ede16acc9420f13a6b5288b46c44005f1ca9af2fd52b4dd272148d8b579f1eb6350f3015802ebb8b416a3ac5844319e56fdd9bd9feb01d0cc809e6dcd1761ede59d64ccf207bac82067988e96628208f8eab539f8383a6f335a03ae51ff6383a98fc20a228ba4c0169ab7131086085a928b221439d92588d5c67b55a30f899fa5eaecf72cfe0510eb56c173ff39f9e1e3f2e08035a5215fc9ac22cb0b71873bd2a9605354b929961489dde388ed65cd490547a1788238d6c62dff3830d93ca572140f802d08f8d2f4d742a440f2704a39c0a4521a816e7533a6c2181777d76c1476b962b4a4b2880c9c2060eb1d90bc6e8df848a2d04ce186629a340404988405839264574c94d0a5c49b21e4e522b4acc6ef803ecebd63c849c87e8bef1ea01ddaa0e1d03dfe5e8e91a1675d2b6974a9cb1e359ae4fda2bce081f5d5854046ef380d78295b6cc281f10624a0d2cc92173ff4728b23cddf704ac740acf512538f545ff55d4a32a0835cae02046b36e302ae8870c0dcc9c997148b3b4dd9818ca99b02174294f5e2b77952ec73475311b08f020bed4b8a1b025525f8d840d57bd62c4b828e31e48245c8a759369ea9e20da9273bd8d2f07134c23316dd8ec5cd8be5556e0472365fbf0ce595d5b4431e58832c361a601daba0049d828f0c1aa0795dc10d6189e2495a01f0f51780bf1529935ffd184b70207f186006edf8f6a0a5d74d7fb359e0444f7d8266f4083da28f38ae3a000222147d6660cfa71ac12b44bbc122fa12445cf8a161706ec1f1ac06768f5b7d40c275135c2e4d0ccdca5a2b29dbbbb4ccac1f32abb077ecef08c5e66e5606c359590f38c03d04ea6b695f3255711970a10e031a1bd377510dd3266dc522fffb26a2d71921593083a83bb6010b66d401f1b9544a4d1b84765c8dc9c15ed67722b42d35f8751354df8d054319b6cf5d8cbe30bdd771ef3d1c4b2945f3046798ee85e34398b985cd073aa46da19e33201ae92111cc7cfbc33b621c71766e300b43d92788b12de112e5d8d8822164511422233a890a62b45dc9a3ad0be317811a299f18628e9991abcdf2ecb9765c0e5150bd3d2ee16539207011d837e28d2eb2af3c1d550da376e8d6bb48071c00d6b7b8c371c1ed8c0bb276438cf3ba787bea1c286b8f11643f2f60c0d3cab61ed7db799dec75069c14cf840d2e9553823db29a8a53c927529b30bfaee1b87a8db94df004191dad79a2bc3dce8164a50a0cb47bc268384188470e08a4599c569dadc72bd291b1f80c7ee905342bca2e97c05a47e847d56a3eb3396c367496f5d5e89f110805f39d5717486cd45227e8f96134c81d03c4e316f1cda0c75504660b4eb187bb301888b245c5916d47f631f321ea184629bdb0160cd358f87e6a9656b56e2f68fb9fde5c3474ae67f4e9ee747928d33253895e5e8920cf8b3cf6f7fad521e8a0c71ffa6bc91d4abae1ccaf21c9267973caf284d4524502307c8ee11d11179a18762f23c4b7fbcc05be0d3c97b7451c2a3567ff5f2efbde7f3b55cadeefd45d66e13e4bfbddff36ff8eef222bc7956381123ee88cbc42321a98548f0228424ea4ae4f217950a45f8af1c6ac945900d29ea9ba442d1cbda85d51205bfdf0a53863a848b205b44bca15aa298c1a71c1d44908d2fea2ca28c5211926361b544b135b6c465f802178894693a86baff132c77512dfb69af3d8ee1f9a36ca8a3b21fed1d4c9ee450cb22076d977d22890290834c67ed9c5f2d5148725b14b2ce99d564c0e9daec02e22f9a609a2148da9629ebd5b6b205d2a19ff30955da0306693fed8736f1f0dd7e706a1e020d2d20ca3208c1ff8636ae31a774d241a908182ee122ec3289cba8b448473a30351c23c07aece3c237671a2641b8172eb52ff0e50c0caa5034fb42e58908e435c8a23866c61b18ac47a9df98bab32106d5344167189cf7009f8ec1cdd1371d83d3fe4185b3c06c462e04d596cef12360d14eafc3ec25ac38624c70764c15a8e203e7f339900ac56f4661d070bb124492b0c96df08fc6cbaf2d037f40f56543058d5a9328f67884e82b823fa03692cba4115866914bf8e7189f94563f009791886f84ba3e5b211bb324bbeab434ff94c83f99c86c39c51f7a2f2d4676e1c21728a7a6bc4320e357f23fa9519af5b0705a10464f72bb14c6d704124825e450473b3277d8226c9248a1e33d3f81a85bba4977957daa2b452307585384cb3d96dcbfff416013f9e1fbd7e47f4ff0b403054abfd70397acdb285052b515cc00fbcb527732fc661f4d5109d0b8c660f54ee34ec00816a00c40fb26585ec024579d8782411abe15cc7f6e13e63f6f56108b05fad1734a7373058911615ba2fdd48392cfa57064e032153673511d81432dce169ff84577c656cbb049a4e29b20386016fd6666863e7f660693561d5a1199a3146512d7701a36619352dd8586a33810a2d7f06c997f44c0341bd45a13d2286e6634b46c345a201a210a66e65b504d0b8c995e101cf560a9be5bf087ee79084d9f4e2a3f34d33e231b4d7d3f7819a7ee2bdfbaa61badf1135be7da3db3e3fcc0b2b6b15addc6b828b7dd4b4366998bc0681814719317ab2c7769eb209bb059f38b96b2273c3a3effd519afe21185e269241d2349a90a2b3708ad89032c6336adb66622ba10c160aa80f63b34632fa21028c8e8329e09289cb6c9784034a3bb3336ef00dd640c956f75273d2c9e44d2d5e9bafdecf09cc10a98b3f378802e2b7f6f11505416307e9da7ed49995369a5bdbbe077b2a0ae557d60ce827ebedf49f97aa040f7691197c13d40f7a68633b58ed1c546d99daf777b4aaf7612eff51dd93fe6252f93d2d97cf2de33ca38dce441c776fbd55ed18e33509793e1d7cfb274905285960eb2eb0a23c6a12b2ebba283ac961ba875ecca151de4ac3118a3c436a247290416c02216afe82037867a77c81ea3d65c0c09cf9c3d5e4a78856e0d85c3e810868265764587c902b62804205f6f03a0f41093197c3ed54d48498aa956a1ad3bd7556a1521ef6c26edbad295160983b862b27a7c7999c51caf9a9c42a40d7faa95c1d4d58cc0f8329fcb81095b32c16510c27e0076c6f8d12a3cec01dabc4e61df6469ed6dde7fedbab94506cf2432d4741a6f8a67cab3b71ae2e664fe746f15e2c31ca4af24a839a646666db1e4ec91a62b689f318c607af1e48fcfbf7bf7fc1ffef87c8a03821b6f8f720ae4c8d70f0e13b30d396585fb4294537d8b2aea0cb91af42b0d4731b71b544e8a0647b1ae529ecaf22393d8f27d1c4635555fe78410f483f8fb71590f2866ab467d0748da9518cd28518eb94d987b0a1c254fb31826abc8dc264c71e6ee98cf5b6dc2a11ba185365e54f0d9e21ad167bc91620e435f8151514132e6cef6b56a323c7af9ff44a51e2977511697ad974c6c6e9051997a37534e2bec30b5e4338873fe3d9866aad9f8e2b32efe8d2b61cbd09514a0433107866ff61db5f6380c6443a98fb5725994f64d44293cf4859b8e6eb67aac7aecd5410cad3e756a063f911fe90a4594ce610bace98a45962096ee0deeb68cffbca3e19c161dd61643668227594cce522cbdf9b65b1a7d55ca39f5949ed7aed4a81f93f7748137d0c76e9445d35463b1500a5a5d17ee9fc0940ca3c457a5c2d31259af9e45db319c412a50f89e371d4c61029416b6afe9643394da21379354b2fe31188df5565efb7615acfa8845781964db47303297e6b096bc0ea6f531cdd996ebfb092f7e6a609e940a203dc3c2c79a3af8bf924663d52f75be0cb4feea1eb11e628232b5f53e56663fbbdf0ca0973b20c6486c248b6d8f28eb78af0859ae9d5636dfddf039e756887cf2a78ccb1a31a6148a327271c2494bc138c19bef0ed75d38a36dcaea19946862d75a6f31381f1ca7a287d333f8bca3409ccde74e72c5228bb3349b6e98d98ec7c5a95bb86643d03b21918e8469241a29a3b333a141f4c22945c944e85fe54a6b7ae2fd0bf076afe5ce1b7ba537097e5571ff6903f8ff0340fe9f6a55b57f37eb9d402014a74ac99ee0f146cf052c7dd9ec20d00072b8dc145714d5f9f16bfda75f52ab56ee068c8f0a1b111b1b1957a7aa444f4f8b7920defcff1710aaeadec6990ffc1608844317d4112acaae15d31d460942c51f32e5ffdffc73d856ad62429807ee34dd5d790b46e3f09a5f83f7c29c9929beb9c22ad5191e452d3b618202e0baf7afe55185fa52972a0456d357a853e3507ee3b5455da455e2975487bfe45bc0b331e701f2ee1a21a7c531433812fe8797dfd256e723618fe5944062ede1a729e2f90be8c8498c88ecac871e4b3d9f493d20a838514009b562ee0a9712194f39cbef22ab3908c2ca1a3b0c4c308ba5677619ecec11ae09a75139db743038020dcbf398412f4f38e815c4a1aefafb55a17d91d51779fceada19af8af3633fb71dc61ee7ce9db5d86d78d79dae8e80c40c53e116d3eb700944d1cc45cd2a14003ea45485bf137b96ddd83b27462b6af251af0b9713bf84bacac34f939c3980285c6c113892837b0c0b07563cc0776d81190c456950c3a406150d92e2c7134ff8f049fcd8088bfb21e5a3f81ef2f7d121bd61c9e3f08d68c8e89d152fb0df5dc067b9652cfc72644cf4150677815817126347570e6b45240d9fb624a209ef6cec8cb8a5915ce6032757ea87ac13fff79445958b298f8be53f3ab1c12b07744351545f99786b24d24b75cd8057f76ff06e07f0688d74c56f8ced82bf672eb8100cbc0b64f485b73874ef2c7451bce8718c874f12a104deecae141e1161e14b7c00ca95f68ad6369e1ee133a854c90f24836d9f7cc8fc4d2a0525f9d40f214b87f2b9b55b030150ea9450061b3855570cce46f50819b6878e1000de7170d82b4cf58c4914512f6803abbba37206fb6d71021dcd55b683f97ae31bfa7862e7d1145a2dee067621f79421889d7a38f858b8892d20cbbc956f0a67fb974ada76c5e83a59d18f5d8770b0729e7ff4255834ac5225d7ecc8b4d5907c022ecbd624abc646cfea1b3983c85596de556341a7cc28756c8bb937a508ffafdc8a6a09c13aec8e0ce612b2c6c9579a689d429a45b536d13f17e71c24339ebac6233edfcc4a5f828582fd618dc78c20fc4aa3f2519be6ec6b5b240b1c851ab97b44f9bb4979cbb4044492ea1c00e9cf3aa1fd411cc782165873fd98aecde3d2eff00e17baa0983a32569feda06d8c5f3d262387c83828d966d4ea7c433055f9cd0a83b19c24659a3377db2eddaae3eb01446d2cbf6c2e5dbab9451c48303ccd52280ffe6d82563d0e4f33265ae2c5189ec88e68848a189d7874cdecfdacbae9026d8642cc6bc637ec9e1b0c9c7207d127495398502477f5fe562355aeb23578c611346da35f39a45493661d223754f2614ee40b58a12e60e509abe7a76d9c9d97cce78342812208a62ed871551bde14ce131ccf6ae2775449608a804c92c063d6fa6274ec3f72740e55f5ad5b9b13e916dcb3aeaf808f8bc7a3d8ac91a8bf7e1e1045f064085c29e3e1aac6612f948720059d0221ff6ff9b12ee70fb5fd1022f8094e28ac6e736558a34f1d8fa5dba84adff4ff93d7aa3d379ad12d76e022f45180452f85013bef8356908d6f8460a1291cee1d01776b39fa59b81c4a4945a2b9faa154dcdb4f6d4106789b279c31f65e57513802b204c692b6706f476c041cd108d69b1bdf32ca7385bd85f219433f077d32a40eeddc48134bd384b4556d7bd83b687db579e86c77ca19af191cfd8967648947ea99844c6b0ecd5fe1ae56dbcdbe5cf1517c0e414cdca573263eed9ac7df2b252c5508d2844cf714c1f6f3cedcab242227cd7d40e08be4af8f4ed66c9b3361229e09544d9d7747771bc16999e4cd718c158a041cda28b917a9dd8fbec9ab44c2a77bd4d2e07ff3c5112763b82f4fe89f3546fd6d0cf0138e413f48c7c9efe8acb744dddaf954be61c6c9771ce7f38356bc0ddb5fbf13330edfd1d9d7e1695d66e58d16a7c5f2212033cc0767bf66db1b35ef2e88b7c35ce16dd8155bd8915f9c19665429d90c0fd0aa5746ba7d72e49c556550982da217289de5d036604d741e81b11d4600bab3ab56bfdcfede1cf6d23dcbb2b1f5001c6036d0f3dcb3490c2785dbd3e090de43efe0b19f37ed060e65e862fd7f19d0c5016ad70b243d0dec63fc2954d97a74ee85b12dafc6e80b544d3fc68300c995310c360dd79d564e4abcdfc6b207ab85e66cf61249bba5de723c9d259a2a6d9dcf79d1b4b3490eeee89cd0b646fc7e235f4b4afe4ece4158e5304b0ee3c5df05d732e4e40fa4ae026b3e38b878cf3c6555c569e1c187ed83fd04334402df93fd4693ff5381b242d1e624ca44ae6b2a935f24aed40115d5e65d7d0c0fdb87b858daa5c22075ae8d4521ff393f3541aab96cb96b25a4011961574bcd5771c3d6f8e060ca453c0f16752602088463fda0901be60fae3c68fc470d50c14887e81583a5a98c5d8751b1d03bada3b302fe741c1c49f4194b1f03bc62963e2e63b0508f24b9af879fe1c1b441a42823b2a4ff31af5fb62f669dd7cfd813bcc5cfb414a815e2f3f347aad3c4daf5b8ff8a6958ae1efd38707a9894456a47735aa6433227cc223c86da1875b57085db2a924432ddaaaa92919941ae8a49a74fd6fe8ade5a9337fd1ee14575a9ea86ab64dfe2cba754752a8de5d7cc447dc6f7faa225f0a23861f2738666dcfb6025af2b16a47bde6763827a1c2fd0eb6e24de69af0f6d13d55f4d11249093b542c136cf9351fe8d986a46fc95b2b8511fb32ee85f5ea0c230f31ef7d261b0ed05f26850667afab0011d9c4feeeee346523ba72e7430c84cb368950d7a86b400eb468f8e7045b788c8dfde44d3fdbe52325101c34d32facc4611da2fb72993cec7f96853efa031ee8a069b23ed584c67089cf004e2b06adee7663299f274111e0a67e321cb4d0b10fd46be9e87421f6f12d6d5a7619c97d9be2c1422f5cb4704a9fe329fbc53037f41124254692936929249324f2cca240cfdfbc99bf0749615db6cf935f7d9d18181c4bb61821aa0a86ec31666817206b72646152a6acbf484e3b6051e48649465bfeaf6d254b38f50130faf1b388540a683d29fac0648601330162d6db5e90b9547448c92a4286ccf50104d7b05852f083fca5808203b55242c2600716d191b37ea3bc5f0636c5788127aec5048f873c9131a9f81e56432dd838e3f70824079f7e9755fb53cf6d3eb38317f0b4124321a9013848f80a106334336afa0e3d6e61d20625ec65dcb42ce19a2bf4fc330763269e6a48c5aa7e1efcedc1af5ff8850b66cc5e500939e03397c2450f150f0f98aaaac3c20852fc508d0ac43f21dbab09d2175860e9f55798301a02d2ad24eb0a242c1f02528461d8d5459014fdd760c13dc47ba14b07f8bf6b751f161b145d66d4624cddbca104c0dbaa4172bd82904d0d08933b183527deba069806e9598abe2ff15ce714a81e96d3e86de53784832340fa3893c06b7b444cd7983239060a4a2220c8353892150384a9eab6c4e0b3a136316922190f2ff96be38eb127f462facd44ae8894a1efb712c5edeb34c748a4eecb0d73e289669a7fa28ad50c145482dfd493a89f2d713a5d15986239fd9168011210fb996e9527b860f0eb13421d143fe7454354f00b2327125cc25c2fd24e7b554662cd92730b9a3c131cf5224bd178cd7bbb4c6c1612b567d291b2035822021417ef3a380c61738986ee0e72579123d1d1a58d3de5c35f5e611a05aa314cacf1606fbbf4039ab4489b1e21110b8dad52960d506194d1b51840a7ed09dc9d490fbbb09cb85c6d438b09f3d9fdda8554092ad471336330067e9f9ec31272a38e27a1d96b322451133fd7281996c488608240eaaf6548f949a868974c6df1d3ecee7e7f38828950bb84eb15b5447d081e4a071c0cfcb691ea51a20581ac3e21b16c7592ede4df2e5a348d13ef5373209407fbb426a0db02588671969129d6da98f042dc5901e584e78c89ccc18cd6c1389df0e2cbdac0db2ae33224ad12409f83069c2dad94135495319e93b10414be2db2aa6cedd3f3f7a75e7a0a8d265d99131210bf279b234e59e37e397d2d8b36324cc334d31aa0d1b379c64b61d87e45323f04debdc57fd52e9d05441f05c1577a40ea3a32a05a241bda683f9668920f2153116395a637a969d940814711fcc76fc4e97b584376111b79c5738ba1526a54f39c7b607e73104473af33e4ed71bba516b52dd074968aa8cf7581c5e892171c508ce363f0aad5939395d2ea9440f45fa453a9411d84d7cc912f9e180e7c422da438ce22380428f5106d04b9ada2384c4b98dc45feb8416af6ef521cc470de58a21f008ae191911a538d1c4b1a8353c343a65e44e4a6e0fd2f4bcc6e0d6df611790e4007143c057f444be316bd2f8da8ef46beadeb4b6c05b4519cb2a666cee10119049b84d2278588fbec06571933a08a31d1cd1ccb9c9881641e42807bc0bab5c8aaf38cfb645fa3341d0fde5574f81baa8cbd47802dce25177e4e1f84b4a9e035225c14d17eb606eb17912668df91389851a468fd5339eb94248a4bd7018c302fb89545b33d3c7291c1f9871782bcfeb796dc6b23a358fcc2f80cd132b2561c5d0b12aa67d3fd21bea874119bb7d546f37080d1a6f5d00b9182313883b8a356569958a5d712ab8b81822c1856acc007e48932796a00148a5d595deee30b4c4cd1f98fae00aaa543bea58c0a34982a0d836ca9216d0429c46f5e07c54264d431b0e6f15b457f78c0d7ee8a8db96d4e603abce52789b248a3040131ca2acd7d1781e14de6eaf7723c1808d92880a1989a6589fa447a52a806ec00450c727757fb0d0aef9449e3f42ab67d46a6d6d9b114bd1559d906b794db614173a58b0d1c5c62b292cce96f86e54d6c0acf90d8c259e8f6d5a43c6415bd97a7a714a960cc8889e6adfcf5bfd5492a2cc9b4a88b465bccb6bd13635ab78d9e5c985ba4d3fbf9ce46bb9fdb43abab82eeca5967430aba8d5611cdf897bd6610074d46d749fda6daebb1e3a1eb80700ff94b36abaeca7b0b06664b85a9b75703f9ec9bed7c7fb97217d2cfdcda7cdc9e62a63b39f8267d385d69c73dcbf374216980d59aec7659614952dc7e855caacc88d9f7c348d4f1b573455128fa33129e41ebdd7122f3fb368e1dae7548662484d196d2b578da0f55cc47ca72597503071446fcb0378dcde2e3fbc7751574ca4e2b1a4c1f12de552dae23ad534abd44dcf1b8af536308a50b892bbb6ad463893180d6a0bfebf0b1c79256377a490bb9b05e3577c99146330d2d2a756f641922d186cd9e73e194458b5bcb105872b2539c1e73508086fde1b61b8f395699534a49949f4b0aff4fffffbdf30e341caac602e7ba574fbc0a9d4722fb5ec6b442f6d98822c4e18f61a2de73c1ef5b0010a7762c4f3eac887a2ee671cab47607d311e761bdefbc0c2981b5f3477a252256818efee3a4a92b5d199e0e5abef48bfe6b1e45916c8862a6083a8d9689c1f4d4d4a9db1c045f05f45efcd2cb172ae0cc76e30a6e1efe993d6ea61ad8ca08c384ea8ddda6915e933deeccb4ebf38e3646a0ba06736fb3ccc38ac052198be775167459ad50618f99d4af89d7578874c05b048b87607e10526845b5950f28a73c750c8e3167523a74474163a0439ac6ef304210d44154a2fb728dbcb522898baccbec8aa4a80bcadf3ee8c5a35edcef8e4449b0f4672d1bf43671d0868be9aaeb7938228fb9e5931f63c5be0769730e16de37450455c107b1f04a0f92c5d2555ef8f7f581eb47967598f9333100d4b714a256bce879cac65b8b89fc74c3a01949e04afbbf7b525ea2dbe57d3675e66f81a0d59ab66b353f7c9a5fd9312c14851967299955d29dab2eb8aa2cc445dd6524470822d4757c281f8d95bee6171e6540397d285ceba7647b671bdd5672c8a61718c062e5408e85eb3b754ab3e27a1bf7cf7b41d3d5e8f6e6f36e39c81e627074b6e83e5decb3d4fa97333094f9fd62cdbfc46be16161fcd43a76dcefb346858d77bf86cc09faae93b65fca3fe9f5630341c1c7dfad9e1812307974ffddba7f9bf9786dfa74729684a68fd34d0f2184506d46d3dafdaba31900cf38bd7d879017421e9ff258dc8781ef0ad19173c7865a5cab54e1109ff0d551d97669da02badd40ca842771dbfbda03cebdf04612ab22e2bafa4b3dfccafb8c81e4b50beec1e57659df90d953f10e61e7099c407aba017036cab2dd84e7c5d514d0bf6b019b38761801ac834b4e40243ec8fc5e09cb069f175fe4a788a18199dbe6499505f94b106ed9164728946f2fb84ab770afbbb258676342cf77ca2357c28fd8c7a5e6358fd7f5de27d885a946911563fabc5b9cf13564e88d5ff5715df44c16f82c74484b37fc45c0f3c161ef7386f5c31085f44328e1586c2728c32b0ce9b78d839384e48c8bb655e4de6ff63c2da21826c7f8c2514321fcac507a0007c21c7c3d3c5c227dd28811e0cb84561c3304f709e30965f31c2b94fd6e36833a8a377a1c9dd383aa1125d053ba9214f5283c55f2f3364edd805b2a3b4f41b49d830de0c002d030bc885dbe8991d3a679518abb957435ebc9b80912a16ac0850ca70f79020ea77d0306f90b479d00feb009db35dc7030ad5db99cda746e38161bcc417c2a8efedfa189976eacd0d6e0d19bfaa8bfd621dad1dcb2fb3be01aecf7ee3ba26cdaa5c545101409e7cd2872395b01c3c815b92e319f7981f8ba1cd43e8dfd41c2010cb09e13d6eff2f2b99b1bd4d52ee64d57f3f85483c01cc6d9f8a1365656ba898fb190843f7acc17d96bd6241fc72367903c7fde72d49628781c1e4d1593cecff36552dca523e2cf92e9805985e0c4ac7cd01a0b49f650d2ca60b6a6aeab17ffe984c726846618c68cd2388d2f98402b8a6daf6769d904fc2c7a06b261e5749b92ae45d08f0441c9571c9c5e5a55dc8e9985279160847900f1da4f787fc007246b3843eef7934bf243963ffe7c5554db989d67b0133a066dec301f094e5a45efc28f77d52b9bd0e08ceab61c63fcc43fa7ebd24c39a5fbf89ef8369a85acda22f130f1c6771aa387030e0bfda3cc64c3c31c56b66d1db38e3d8e1159dc7ebc932df1dde12af1f01c09f3c9991d1e8b526c3fb23d38ab3001cb224b91e0b6c64eb8ba215f1163f1331e6851b6f46f6595af52d29d48704fb79caa2ce2014f1faee0753ca62effbd9418d3e14dd1715590ffd79a9bca5d2643d70a42eaa9f7e180f24491fa5716791d064dc0b3e4c221e1bedee73e8ab6188cd5d4cc71dc2d409fd0d472dc733f7b8ec7464f0f022714f90c150e3c3fcac6200202fc6856f2cdb0c5dd182c578e4368ab445ff0d18af0ae7f2b39229012d92ea13241bdd2b3b4632c5d42f790f3e4f7cb4c574ee71044f53157bd8c316cd070f67169610b9efecb3c76269bf3e44e07b020a3d40a0f96aa03c5b0c8f9acdb93010f5d6e805dd56966af04232050b4780bb61c4b850bb9acc69dff771ac1e8cc117d9e6a3ed5455f4150e7b841f2127c8c619fd9742b70038d9a4ada43e96ddec3e353e2d653fcba9f4397b731645961479f94b2e738d938613096692b25e0a32c76914e2efff41695155d27138935953d423950f8b0cf8ff0340fe54575fb5ef7c09662ca1a7e04075dccc6db43700978230026bbe91762d9970d536c52fffef9bf5fbdfaff2f80d081319e581d40a1370b111ee56d5130d4b3d1302aa57af3e2f11ea908bd4ec2365ffbfd873a2266ad745e621bafa3dada7b5a14008db3bdc37926de5218a23d9d76ea93cb50a93bf6d095236907fcdcc7a57e95598c26ca398b2dc4556e6aa9eb1b2055191a4f58d484656ae184bd9ba28b1c13e9e6de614061a4ccb4e45dc40f2f42de4bf40d30dcba750fdcc1adbdb448ca61040183674a264d964fb656f8c29de77028c96be3c069c1c8e0782df80dc981f9859efa0d2abb721030fc158b9ba07a0a23b5bc3e46a5346b4b444023f83867416c7ea069ac53d289d3e1dffc2d910ccec72723604738be408ffa13992fbc33d59fc735a16494db915e71bc70d2483eb18cc73870c89d66d841c24d7583e915e00568ea13e4e9139c3d6aa497b2a613a512b3304eb8c3226e3a9009a06a03954ee291d8203035df5052356a89186ddc8371e5a1aa35c7b6a761b92eb3b125ca5b7cd8683a32c58a21c428553895908f5ebe9fb2a5356bf2bf1debd07bd35d22d393ecaef8e53b02e253a145b1d89d6f3ee8dbaddb0e3e18caf1183fe55a3fcbe41ff4078b139a2017fc4fc0e90321815efc750a4296332f39615c24a44b139698a07d50442c632f14fca331b357f03276db44ce0a2f95d7e889f22b341d48ff5f5f7d216a4a3ec38af67dd36c5143a5a3044c3fd16b9d0fdfa0a64e53bb47507f5a4aac913cbcf8568149502fdd0054012e1b34e86886ef5c4a8bb116dd04725a3421884647c9aece201af40ec92c1f99424a7a02b448b33a3f09e813b192cc1d92c8add05e3568dcb98a4de929d3e8e44e34bafde263e85234b3f8d92a0e68d684287e945c3f3203a99e3a4f66aae18331ecb3090f3bd53a62e0f56ad13ae98e5b7325a4debc1d07881542cd6039ad80fbb7c0d5c7c90acaeb4632c81f0f0aa8ff5a81b9743bfe3e95535488e4e1cfa957f3745969b185f1e1a5999d3d7c75298cbe4e899fbe90ce863588f058d3af2eeef854a1395a0b976a84dd15616a29f30f3c2b338870ffb34fb77d29840413147bad37b9396d8c4eab15f7c877927e8782dece0e73c472cfd3c34fafb21bf4f39864f831038d3f97478ce0688bea11ff5b6637dcae0efacf4333befe2df56bc95dea670073f175258d97e1d52d8b8a9f39c75a17ae7231ba461c35367a77f9ad46103762f39dd9d5e0897f7a1d7b4ffdd4b29d826b71cd252944c20bea24f7e686089105a7751bc970e39ffd8c4d10c901045d7116792f392135bd4bf0460ec0c7fb807f6588ee98bb6c13cd9221174054d7bf8ceb0ade909af1983693469999037cfb0e8919e6970e7382fda483eed42b2b2a83970d844e3a99241908d73aa62ed10e4756302af3fd2f48714df3ab6408b72a349ce2f074d47440e566660ba818358ccb85a1cf96e464023ae9d8fb3e6c7ca3804a9f51106c143735e94ebd7faf88e8fff524a8c211bcdc44c0c8e2c6821486a5291de77dbf398bb782afc1c21dad5b19de5486d7369e7c70ef12bc8af06c38587676aff612ec45271a79a9865e49d36b67a9ec93b9c2ac599c658291e261844e14f69d18b556803ceead205881ddd1ae6496fbba5829a0af49ad65b7066ccba2b118f3b9a571767e3ec1e0d6dad6903c64565f7fd08d800836b8b9824b2dc3a0d07859c5551d18de49749c9642a1737f728b8ab0956630d5116468db5bcc93c051e895098f3954d34e5d8de5547b42e27a4c89a1f0a9ad150890be732a795fe384a2d96d839fd2cbcae4a921afe720a3f12cf1116fd486a79fbc91f49e70f3f12f76990679bb8507510f0e49956dc1a1aca92dbf0e56db8d21e3599b668eed38e83f5a52c3c1aaee0642074c316fe3ca45846d6ff23e7481913af4660a1ef82b55ae94a17cbb130bdb00d90aaaf83fb6bc8f415ce8ef0658d13de2678c14a46a8d7f824aec614b7c9b0248b11dea73855b9bac00df1e95589394e2fd53ab6f7afb0c5598c2fa3d788e02f2d105e75dea613285519304a78f9affa7e7eb704e98129146b9439ea82efe38c4bc2144131aec1ccd33ab685939ab74bc41786a6920c084df8c58b6e7dcbb776c20b5afeef9fa3f12ebccbe41414a7f9caae8d085aaed26de5db82d8d9e30f18735b02d5faec7a6521d85b253930566ba00a669229e6764aa52ff7e4aa6272ef2ee18aa5d9595dcdcdf5cd0b2304eefb889e69ac8373a524535c6f6ebf645651b0415d441ea246a396259879f66b7a76c94258e2b9bffed5342d81b0841f654fceb4634192486291d910add644528dcfd8a2a55b8057c41e18a0c0d7095180fae3f5eaeaa3a415d816416a52c7812c45e66ae8167f61b16628c59834de4b0feaab4c8a90b98dae466e6b7963d41bdd03acbf0233ec9ff60ecce3609feb0dd311c2a7210ded64dd5b99ec335bbfa8a6b5eeccbaf13646b5d5238c236f5610138d8e7c8cce80c9842073853a582f0c239c6367f29f3531660492630d1f2f33008cad73de8e0feca59e48a422ec1d077ad90e99d40cb622ae21343f375eb0328d35262873595d2f743c83540fb15f1f35aa58d03505599394a741defb237c0f5bba49fcb8cb3464454682c277959bf8e44581a52c440df935099db8b2a566c97cf56e6d084edfaf4bc129fb986027471ca6df067f9fea60f19eb2b7131574982bb8683a3246b43a2ddf151755966147d8ef3ae734a3de77ab9454e864b9416525be99b00cea3a8459b293f5939948a7f9b3d8700de1abac18a9c2a833ac09941d1b0d3d1bb48d3d54bbdc019ce5206edb0d5f236cd1814776c292e7c9c2e83d3280b816219a69433d1961abbfc1c3024476a38c711bd03801acab2968ce265160294af956f509cd52b5afe712652ef7f76209feae4e564e02cd291da8e42c258b57396496ed22ef75972495eddae941edb8f23d058375a2b2ae1ea2c90502e5016d2f8f03b382c7fa5677ce02a8002fefdb6e467005735da6fd0215f5c6f6313dba85096e81029fdec01d6cfc7455023504591b12d91ff60f0f4c7ebc61164abd540d3733c334f64799ab2e12e443e1ac839400dbe1031ec4e987ab3237abb8285745e11e8c0667849e2d182e6abda5f5b7ac838f0b73bbf254dbf1f46bececc07349c4bcc6bd4bc99ee502beb8ab3d8e542defbf4ec4b6d4ddbfb67e87ad90ebc03587eb2e188a22be0e3ae057b0a1f84bcba5d0c5d283b468c6305fc12a0bd0c9afe783e7a77fc1f9034486a5423368d09ed50d9b624d881ff7b2083456fb072678cf15249c234f40c48d9c91c5b8424d8347531208bb835d5d0f4232c604f46285a6d4b8ae91e76bbb0b9219f60cd289c2575eb653bb5e5f2b8741f8d7e9ece360d7936eb323f9eab4d9ab2e7f9253a8ce6a881defe4455eb0ac2834777fb23aab49fe3eed9bacafac4c88c43a6284cc222646142e6f0f99a8c27ffef0ed829977b67902fbed389f856757c17a14ee624f4132fab10b4ad008d51c46ff4e46d5595d3e01d8f40a855fe686e10ac3112ff499ce1f92deace202c5e9b466d36dba345a61c452ddede0ff26946f193b2b36226f9160aa27ac8d440484bb8d76e192707e28b5f0718f9e296aede5c3e1408f8967a8b69fa942198a1185eb1feee2054a4ed5cd104251d7994a9a56c75d87fc3b75774f068bc1f962488a2c0d7cee37718fa24139004ca37bea6dd8506999966762cd4ad7d6937b68a6e68ec90017415a197910aae506a50ff0c98f52ce482b6b2b22002cddb690532175ba8797623d33bfb999de8ef4bb4496033e7ed75a22a85a7de4ca7e23f9ceb06865d2dcff6a41e5eb78ec8614a2dc2aa8ce52246e02a605e775739e4eb62c12f5558a19c88b23832a067660e79748161cfae4be5ffc40937bc7ff99e0af92847398e322859ffe62fd0692d1c37a0dba6fb37cc56521d5989ee63a449e6502bb3759330152d796a32c01dd5ab336bf0e4b545591ebdfc238ae4a60a8f5a6a81e3a67943dac52527563ca8498b3228d6eed41a9965965cda93659e4d90a348a54df79605fbb329516714d0a9eb312a0582cf7349ed2ca7d162b00d516c0d3cb01006987d8bbd60f7f26fad4f7ae2539a8ef54a12b4120f3c73e1df2f784956ae8e9171a7068a12a7a0d7fbe72fd1e48ebc0511f6551202b55df06675499fa8315d3b183efde292fe77109fb731ec74f7023e58e15cf3241d91367bf7f850763fd828e025e4cbf6cb3606ee69dbd1c23a9580d6f12b9ad64175ed20f9644d0278f86f277f1079c3904ae187296455bdd65398fada7fa0b967b03b5cef823ed5f039bde98eef40242cd1c59460eb34f9c4f6482ea4d2666e2301bf01933229892eca8a15106d2b760f870091f30307ee25293de9a0ef9cb0029e4221705428c79a02e69e19becc889427b92188e62c8516dd6a78e933faf06612569fe91da3a5bebe3ec72f2fd6db234c7b8050be9f0c5a6a67079baba08409d7456a292593191d436c4420b4495fc27bf3808f2d5453fafc8c01d5dc9f4a7ea920db6441b982738f55607902acb9b025459ee4a2a5a5e8200149c858a63fda0e93b1d59a24a967e28ac549daca007ebe523663e2337eaf903af1dff8c26e4c8fe57a034dfaaecb68d524bc359e28e2e94c2c26fe24e1fff595bfeab256192101f9076547c23fe9ed81a787efaef935d92baba2355553f3ffd5f817160824651b1b9435daaf13ed1dd443a82c563b6a0e9824b1e8190655511f85f391c0ef4302457e695df6c03776c72fb14ac9270f8fb5f668c614a6a8bd1b3e6333e34211827b6ec43170896cbb4e36b04a506a14610b7377e6d7c6a282290844da97994712d03503f1183a55d14a552f58d1a7c5749f1dccfd1e4267c64fc364033b4da738f64ccd2e24a9117c5046ed4cb6595bd28af3b0ae6303ca8e2e18ee10bfe5991a209a5affe23b6eb8875c153c95362ec23303abbacc7d60487a62be125be969ad8c7772cb0f0b2d1bd1300201d39cbd93e1c6035fe4c8d0ac6ae6e9a0cb9ff15cf38caba6014a65061b104676622ca57b2dbc67faaaf20cdbaf98912e4818cd40429602bb8ec348b2471b98068549b2e873587f423caa22c726e43d8108f264637ffc760dc8bb056816079d91765e03fd9781d3c6a050d48564b0cfc8f61d4270a6dd9c32ea11654cbb129df1bf793a7dc9556a8fa94ee4d3f788bf8d12e6711303d90c3b46239facc3cd475b3afb44d096854f89cbc71445973c0e6152dded2bdfa249a243da91fa2849c179029d8667b6feb9d8167165ae4de8b8e5b43a6e7b11b28da977eecb4c8796bf70cc4be2afbe324ae1e91751d6a1722284d87be710ef65a4d0b00c630a528a9da8ec3a38e120b478ff7bc25d978b7f3500f80db1ed69bd3c08a92a971190f29fb04ad97a0caac58e6dee52de15153be0ebae14b57d072c4a9766b59d89b4daba3b698f2a7dc95082f48c70fb9189f725872fa84e21205570af32cf924649738fa16c684d29994a5fa2d401b36fa5b09224f0a3428ff264a6027ddc89c39f578bee58a17ba78a44c605fdfd59e68e3a8a02452447f10421a2b797ea7377ba3ad2c2b557cd19a3412c0b2b94f241585aa99aacafb3736091f54c089bca9462cc501329d786f838df0dd0af5e67d12901872cf23ad6ad366c03f14e028b3689887896e00f8ff0340fedfebfabe7eefc9366502a12551ff6279d5327d8b6e41c59163802c24519fffff4b4d960e43413a0301f4def73ed0680424db40769a77517a7bbfcc68248ddd81b7d6d4025ba724002e041a394d4e3a4039410124fe18e6d7dcc76ed3e6671a8288080fbcec3418e74519754c11e157324b1866059b43f8a6c5b891c1bd1ef0085cfea7952972372994ee074f244e38bd9a22a1087bc198e8e9819d4edfcbe0dab4ef4fa8a4aa1a9421e25f95d6cea069415f92a2f28c5eb25a10817517eeaad658c1eb392fca33fa3d5bea47b517dbecec39a198bc657562fd58bec754ba5e40e6221f8384a91be54bdbc90b26c6936b96a12c4818eecd4f0c334db1602f2a9756d8be8bc7a78096f812e7c391794816a02b7eebe3fc09b68f8e0f8fec39e17f0f321ad6c98e97f7618f1baa1c41636d45a2e32ead39b74b33efd4c4d3dc9ca14e8d267e4e9ab61883c23ae804bc4cfa05a4ccc76344ea2baf61dd89cb7699aff472e14c1694c5ac9af1669d3405cf645a28dd6e8e07c39c4c2e1c5041a6975aa8ec2f438d92a8db72122a9eedfce95c2da8cbf47249a94c7290d4d3045370d03ba55bde03122d9ec06859fab8ea3cec0bd7231e99980b5f5e172b5ce70750771f71c7c1574ac1633f3c9ee7c8767a2693ed8897db8c83159287399b5b5a502e588f74f7268f19eb0908d9f55b3a1b6243f5da8e675039943147d0c4ceec3c00b092924c722403f1bbaaf4bdbeb4d13983764f952ef16dba57b873a6c59465ba578e726c4f0896e04b17ef157e5b7f7dc594658bf70a67c15c37db648a7327b563f15e710563053b70ab45590a2a82db66fb8e7d97bb6fba9cb8e4c3dd770cd74ba6ed2cbde0672a4a24d7bc6d43a2cd31a5579ae6b777bacd075f551c05c7d460149f7194c788cb0191bf78be81e46248b4d9c8e2dac366bad6b1e596168112c7aaf5aeb214f02fd09d76e3c0040bb143e2c5c9c13175e097862b01701d41a7c227ec9253ad7a1f76491391168a5cf4c4b4d9e666f79bbf2a8f8230252719ba6c9f6cb7bd8148afd76ec9f6d49044e6af430b494e1acfd3ac612b83fe1214eb8c88fd7526f1be731c03c573188cb3b21c379266930be51e878c43b7614b9f889c828b52602d1fd95647a865711a7549364aaffaaab523fc501ebccbb2e516cd8a7e605acd95cf0ee588a58e024cf751043e056fbd41f0fdeeeab63ed9e41e16c64cf02cfc440859fc81684899040910530bcd64b1be43a98205f0fd58ffb58dd8f0bed86a1d6c9604c283702b02030416febbd909b691aec0618dd6872846b9256091a8a8a3538682f9e91e2ef951eb6e6ff6d3138c11ecbb1165921c81e7cba919671c98c01206094f2e7bb3062119c8296a3aa9260780c1d6040992a7fe68e144814890094aa0446592a004da338ec7826e37f29cfaf3bc57f5eb7902a362d97a0894988383612791c27865c16e8141019013fd5adfec1d5075039a45d68a981a21222a98283b0050898db5865547b8a9a920ed68c899373389906382ceba2628ee0cea5c64189e7986d5ddc342b9c78ccf7559e4ac0c627277ef733985c1e6c1bee7d72d593e62b9565efc0d9b17b0aa41b360124b98b2cd6ec3eca10bc7c5c0415b796e297530c79b3e4a628bcfd5e75a6bbe0604056ab13ac6900746a8da4ee3b3c4d31172c06fb69baa92a69ecadc5b9c96d8cdcd1d806193876cfeb798ead4f31f7d6d0e9102605003632265af098b84e66ef5a17173737120fdfdbd28f502d547d03640ece6f747a5225e061e09f2d1c6cd9ec4674de974434b5127463b9a93b0e60271b634cb386889842224f72c533e117097d3781d7a98fad6cc7464aee169717c561799fc48505cf91f00311665cedd112daf69b1cada0fd170aba219e4a939be8296f2d5b01ac5047689d3a559595f8269084369bc7c256ad7a5de3285c09c22a7058303bdff7ad60055d94e545faa103761c164f7423a6a3df008057e9681eb6eaada9ff7a30dbac6ed31538fb8685c36e668ae6bdd4c36fb12b93fde7c87abefcc47a8bfc58fd14a6b76c046341caacc0d96ad1aa594d6a5400bd91954a40183b48d2d4bfdef6e59e7eab1c838bc45ad00b592fc453ae60ee07c9c6492c60048a4c08fea02c00a20407ab12fc61d0db4448baf6715814ab6351fb961a6823cb1ca2861c131f7de264446fe236ef195e25f91ad36f3c5f2df59f53c2736e6bcd0e9d7346e6a2d9662d7994c48547a7c526447a79aa043bb8de3aabffe8c91469d2e490052acfb626289e10f0ca8e0bf23138c7ed456655a5e3bfe32221747a5ce36a137997622e012c64c048747a8264e8aa4cc91d2d8580b727f295ed07fa8b2ea877799f3bdc27166afa8afc99256b5d52326b0f6bd8a0f3be26dee0b08294ab12c09b879e01dbbc851e6cacbb5bfe22aafa9588fb121bbe2202db90768f35acd3ae470dfc665a05956cad2149bd0c2b4104b583aebb468c9c8b86db6e273f2206617ede07684b70e576e68375f429157b0ce2a69159398be319bf999caffb6f1a560f664c82b1c481a3a57e10d548a59ecfd6d97644f61131e0bfe0482d2a4a477d22830e1635d458bdb2012463100109aba39414bcc06fad63834b035a2c00aa09b29de6905c951739b972fffdaf72a9185a54d225e978ff7ca49ba4e2685abd32399224a3f78ce38f51aacd24d51b19892955013d4a30a0034acccaf186f9af2750ccf268177e2b9cda93703d1aa6557a0c7ef6c63c3ab9d9ebf021f403f069493cca34a9a77568ba2a0cd6043b5253e0c1f82700517c9f81f884a6c3e8b1c5cdf194ea9095f30235d0f0c751fdd26bcdfafc99a4e1aa94da0d67f2b29057209e04631f7af0baa94f87362f643fd9af413f4e2642719ec7b606046dc3061e3a4e103a20135c58fbd40be9a56a7ffea361f6a3d7e1857e8ca79d75bd9582ce088cb81e97c806501f82f40379b6828861a1f00ce44fba847459fe9e8f56aa0a8e6c4cf89563526c9ef1e1b4ef375189e117f44636070c345b765ec941f2176e03af0ecc1abbeb5ef4fd5906d38d8517bcf5f1f3178af5e177f18eb0a1ebe808b53f4d3d9f79f7dd8c4ad02c026647f943d22c0686c7f2b641d6dc5cec0794b2ee98b96290034267c81adb46722b4debc2e109a2415477896cc386ce5440f8cd1b66ba2b328bb0a5e23297b71855c89fdc5c6190d711a9685bd21a046247a01219e31d478f29b5b1dd827fe3982b744c2c0eed7cdcb5ce632209fd0dd436bb7edfa5ea4cbcda1c02404c98cec595f7d75cfcb3ff77c2442d51344e4910ca4a6a3d09cc8835da860fe09dd1226c7e801f0f9822fad7b10f6ab99f5b9a9b508e6d63a8f87d0034cd09fc70820e4993f0afb2607a4ffe7f14bb165ee446812fb72dfaa7b11fa38290c461d0e5f9781ce79ed595b58fd3eddfa3e6199e4ad4ac57b9a45a00f273bc70920f4ac0f5d409fcc2090f6024bef9bb80fa8f098615897b33b6b150eb9ae5b9f4e3a4813d01672a98d188e50ab9b0ba99c5c3ad41de665592c24fd571104107a095aaabf68cf796568cfd6570e8f6260cfa4c8043c7545de8984668b59035824c5a6aee673151195eff2209937621aa04b2867f1a64349cd642a3368586617740b88aad4ef41764e1240c8b82d56be819bd0b5b27c0204765fb8d1aa09ba5618c0debec3037c39786f4d3a79364de68c5b4407c7aba055353a88f744a1348e0e4166b59cf4d3f766b93641dba8498ce614769d2259219b1d9353b1b360c0a3ea0b5c5e26e2caf243db4bcaac093fdc07ecbd4662b7cb5f8297afa6f7e45cf56a1ddf686f4c51eb2ee62223d1f000bbdbe36a8b599ade1c8d4f7468c8f4a5685a0c309076ff72052ccd6c0535fd5e37e7acc8f34bcfa8ea3a237e5561c82095b4f471d242faa1a085093ba8434ea8d92d9bea7c61562f110ace64c2a6c921db33acae59a9fa1c91eec8f43ec5e0d85c78eff836e024c725ffa66e4e1faae4d31fe24feee6507abef3ba3967b4a0c5d61fda9072c61207e4aee4b77795a7bd9eae2369e3f30f4d894658f13971bf67191a1b00a11ace5e9e11639807a9a3963f8029cd0e0f838dc357b953305ee6255381da5a778f58858b9cdcad0bb30b7123be903ee2ae29a517347ac4e3b7aa8deca29a62740ac5014d0aa552089b6c668913fd8483865f314973854a8829730df037de9a90ca20c47c80c4b6b1d650680aeca88bc645e488b35f07a71eac3dfb84f681e3d56379f72ef1bb84cb7eda2ef1d6995d021b0f91b73128cf6aa2fefc809986f7186d564ca84b62b17743ab31d91cfa0a18032dbd19f85679e0c972dcfdf88a25046cd0f9db2491f7cc61ac089aed27ce11dc6dafd9c4cce268a6be7247545ba122af7e0413ee9d9cfc937b1ef23a103abc792c03bd1fb73bef3208ab72294eedeb9a5ed24fe3cdda1e9fa2ad847141a5ea46cc465ab33c6563f8bdba045469359c107570763558ddf214e84315ea3b495d1b936c3adce80b5b6ca7d732ea88a53366c63945f91b33fd7046984ba6dea1be2932ba2fd9c823d72fc0c6e5a828c2a5d0b6f828c230334e71d4f696de94036a9a9f4989c887fd249563486ff0bdfb64db4773db49ff9eb2e626f6856e0fe1b293a75e28283b8d4d4c2b1d2a6fc2df0deeef694a42cb7d7e14e69296c389559210c318aa4b8fd08ff4447d50f0d16d626701860cd16ed316ad1e7e1425588d33f0263e4dae7a429f663ae1e9761b439f8b530d2145858907aca997f69ae6d743afc7c8021f84c7de0b263ac509d31bc3a75a23d92c85f3710e063e648e8313d1b938ec21a52d651054c14aeb6054c810b881d0eed98310a6325d248ed554e56ad1fa8008229db88c19404b85c6c0ff648e6d2773a2469e36f1b4155957328290b23a7df7f8b020f5bb4294e375c1325aa85ad5ff0cf64d6a7a386d7e186e1bd1875ec3e82e71b1ba7c450adf54af5298a5307b78f82fad977f6af679f6a60aadd61191122aaca144e25753e9e7a9a748f540412b1807ced74af94102098cb01225bcde62023c4a84168e2b17c741605b28ca6f60bc1c71a4ce56e97ccd985467cee516588a68b324868bac5295f49cf54d044219c09edd9d7c1a0cc81088bad0ac6163357067ae68f03a9d7bc5ea01adc3735272847f0f0c56cf4bebd74e09076db6ca71f9c8e41db9f2eeac339bb8d27da77b2e2e179ea26eaba9cb168c5a3ac751de707d47f3b12f3820d48a1d4d65d09989d59597c3d804aaf39f2294f251dc86bb44e263ac3e093cd9e555e08cd88f8b947ecb9b21d8b82c0a6effc96eb90f4c049b67be1e9cd3e5e1f9dcbea2d3ebc76b59ebde17cb408f1adb7bb406c1105392b424d59c4a4686cd4dca75994770f24f8ec99279984ed772ad9f617e741400d372661d9e2dfdb07cc035525ff9bac5f26a8d59604ddc6a674f491ee5cd6d8defcdf7aeb5f5b049a464eadf8060b290d2f8bbdd8863d9009625fa5bd6f9c6ee2bae7fa8155084f50d7b843dab35561ca2d67432c687a93966e754d0b8a449694cfcc071acc7bfb4fe60467e944aeaf533a9206c9c733ebc13892b442c53b7b61009ddad0ea6d5b517f434ab3e5c67715f8df6a6f9122854b9b4ed964abe073bb3bb572e1d4d836ea6b48ba48ac80ae96534bc009476579d4d26b6b4794eeab6acececa3baec6d8dc1b650e4765703f4fdd45e4ac2dc602fc044319215773af4f470a1e9730cd47854b6d680076b3d559cfc428465c5d68662e76fc59d3cefe9aadd30679cdcefee3e2c67a24056827d792326e6d1fb586224f7a52310946d5042d945a8ba2dccc4aab72194fe0fd7aeec22c43dcbff62ad98f5112201691fa2028b34f088939d568b1a9b5f1d15aa12f6088466fea81310bc1c112275e08f720662b70d6dcf8d3eaadfcfedbbaac1abdaf897516aa80ec336d15a93fa921a029c28e8d1c7edda1d42bb1fed4dc5a2e4e43a7de88be216b36f36d6b9718ae757f7b78845b31107a5a6c9d73de139bbc15a6516652748b63180befa30f19c95440967b7e35f92cf608595dbdcff2f89b64e2459fda11f3d158634d545fa3d20a7b0f1fef969f15569ebda044355459bb7c1a91e2f49419953adb3e8c341071d6a8b47b702667e56a8be9e6a9dbddcfedae5ea78bc3fb1bc10999b5c05e1c6eb2918cda9ab83764b8e50710e1c1df4f911daa26c826a0ef28163ed872dfd1507e52ec08a243eb84ac092705bbfc23bd8fe6e7ea8705cae30dfbbeadfd38e77b3eb0df6d516f3978c7e882c605873768e34823b4b008c1ea44ff5b6705bd3b65e671c94f2efb27318de4d6fb4b97c867159bb60ea1703d17cf563a3920047cb08b91b228db20aee3b1def305f0cd57078d8b3dc7ea1cfd5b3fe6154f70ce2f2dedd2dde0cdbc48f91a259636ec327b68d5f526f0e9d03cabf96b4b43023d2de70ed424f689a49c80a92a015b40a99b5b4d6f52d29ae1137818f15e4e5e07224d30319da90b2319d02e99f61dc47a674fd6b8c78b59b2a3488e64bc36c620bbe4b9d8bb56f9cb61e4bc36d520b5a6f5b5cb33e618a7b39d359e7edeea272ef53302a644db676deee740efa329bb36d340dd8bd030bc10f02344e59fafe9efdc138e55a5decee77ab63afdd79acdad644e540c0dcaf0fa5d8f0b721f875b30c79723d699fa821974e3978692cfcde458d2a0ee2da691976c399c79078fb801c9f95b97493bd3600f8ff0340eef76af6f53b49aed8ef010664b9ddd77ad3b69482a4b13d310602c88eaef9f173fdeb0bd613185b5be1e6cc8c581254dab705a4997b73936c5ef6fd2d11c85f2d488b241f49b546d2329cd4bbae9ddc1a20447419365f0136f8f768fc0da5a1591222f1f6b6851c8d51cae15319437a41f2aeccc21ef5392327ee8811a3460cd2c0a4818caa25ba0c5de00deda8656c4b049674e81473b16c1296bdb6fcd3560ff5ff686c722cabb55f03092d2153df80dc33ca69859ba30f61fa4e051a25485dd7402d46e39fc4b54a740039f78d7d63dbb0c438d29c42412a1d25416d9a7214c37b1cad1a8d1293f7a8adeade8714b7d3ac9ee60d73e34c784d3910a5eed10ad10b87a1fb72db419941b1a4924d9ede2d60a6f919926bdd7fe90dde98a772e2ba79054a6a4563e2135c0a506cacdc465c085bfd913721db465b034cf490e71a8f7e098541c0dd2614b6c295d5365d8a47765de041a44c38564b11c9e3b75d6160701773a8d7322ead7c7fd1775dd1b3403bb6376b4ac8901140800de9a4aedbf9a835590bd5c00850e375bbb9d85b9328a1b5bcaa703bbea811b8747d9a94e8e117b681b5545320f29aec139cf7acdd297ac58c91e5de4000b6c247c5a6f842bc936dac719bf672b05dd55fb5b71dc1274ed0c262613b13b1e4a28283e2b48735427135a277fbc97f6386d02b9ad2b49257880789ea3a2e46015d96821beae35cbbb4f0acdf848043dad08443c6533e706f94077acf874bf0550c5b8e72982c999ab51242846038d6b2444070a3e0a552034a9201e2e4f57f1118799bb03fb7d4c1bd195076770540b51ba6aeee9354e58e6411835eac3f99e2b6ddd0c6506312cd3d4e718bf1eac8e1f1eddf622b853671d9dc723683ef4f82881d145f434fcbb2d400367c28e8e323364c5058b25ed158ce634f14b052827ced7e8481e78fdf6fbe7d51297c39b461ffeeb724ccb0a384cf1f4149a97b2c8f5402aeac0fa15b8f8b2ddcbf023b8c08a18dcb006d25a63170f054ed5ab7eed53506f4e3d3dc243dc5a415ea16b1c16c6004944451e5ce424df1e603b2ced6ed0616a8202a9b2332c786d65f256c08b62cba052dd8cb085a9155d73065c4d9c7520ee2b957ef84b9e365603b94bb9609060caed9f8cb86fa1d63a3b7c946c360422b9c0f84e8138628889598f3da974fd167730d89fe21dacdb16e8f4725b8bcefa7486fd29ce8bd390b6d3afe56ee439be8943c436b80ec49b86d856e627dac7d4b0adc4d800ad74519a11b80436172d93aeeb7bf572575d68cb24083f0cee74a06afffcc938f326aeae22bfdf74c40e2e54e71773edd6544bca47f23cf2be3f85968137b078c1d909bf0e1b40df0928941cfcaf2993988c772475c5697ea52fc7d97de3760b275e9bd7d5cfc7c06576da3f58efe1f4e7faf091b572289c0d04c52b6d3917a4e0b6873553eb0701d7423bfd46fd83d526d160b6f361be5666261b231f2683e83bd821ceba74a5f008512df80d9086fa0847f45fd7723417b99527f17d121d0b80ec3935435dc281756a108990371e42015d000cb4aebcff684c9cf7ad9bab82e44cceb448ade0545fb81f706e812a62a40462004a41fae6eaf2355d4282de49b7c3f1ab98cfb2f41fbef4f7fb4916ea3dbdecf58eff0b9e62864fb180f6b10c840652bdb75971c92cb57329ad381dabbad4702c50276f9577a5582650e0b54a05f4c2b756969d74268bcd54b7919297dd253b443b133b1e3133bd4ae459c01781707b777ef01a6bb0115676cf349df2736425a224539f7717a5a4cf45e851e92975896ac798708406a02872ef8c99aa859648426102e473807569dcd1084b54146ca5dc820a68146de19a245d0ac49b47262b3a73c242a35081556889d3e5b5cce96f2225a4b5eeaee401aeae3e49af51d7b5396002dfa59137342c18277628a0a4766eee3f454e962bae48e226cf7cb389884df099b8cc4ab261e79ad4c95ebc37a8988900236bad46795ea13a8c59ff56669bec1328b3dabcd5a1b5f84ae587cccf65ea044060c3ca191bf52f82f8976d663b291fba7b6e24acec3a1b8d4b503e0bd02c605d665b1e42d0397acd123186adecda728bc689d853ed9c4c9a412239c15d516cb9eea6bb9da275aae95f168e0c5395f9cb3c529c5d340f15dc0268b84d21bf2b13ef2c1d5cfabb886cc450cd7e4c22181134959fdb196939e5f4b31e5d12c893228810db85920cb4b32a0720a341ddc492cbc55cb583713e582e511c41200138a18f4eb84c944365953a9944ab5a43e934610c1ef88cd290a0011a17d9a7c454fd51ecb9c5a652c6cea22d353598c2625f0c42ffc47bd0b79285a6e18b9088e22fee0b8c828924912981f5cb132898196e5a64428f699c1a7c2b412d21a838e45a41e7fb53445407b0b4c02456a452a8163ff0003325b9e1139f39dc4b2168a26a304a8680cbd5890a8c1074fd567dad8cd9b07989fcb7b289aa66d5159ccc8b33db93d82df6aae1a7aef7b7875762ae0c400d50db2643c3c95033521db783f140c46ac0b80bca115a12d865192cc3c186d0aaa994518207c6a031e2f129a490aad17bf7a4bc7f98b66686e521ae82b606f569bbade9f66cc7aa05ac6c067dcecc4e43b007c0aadcc682aedcc677db6de7e9eccd4781727c75ca49dabdd432ac9dc083097ba5629dfd6b3ca5b5caf0ca5bf78bef1b1417df64b3785a5d291d269c28be1568c5a09b621f22dba69b79745a406f7779344d3a40e550d19a576eb313cc9126bdf2e113009768c32a957378d573250152b37cde06cb93ef14eb1aef0f7d20cfd0a9436de6985337bee05fcfbd7f1ed999dde16fdde331bcb31efed26d3523292a0ae0b9fd19fe98c9b51d9a67a6f712da81775376c0f44a8129e6c956544a8a769004a26a276172b01ce7ce39154c192a02e75c8b35643dd083bdc508033586bac27cc130815f891421e1a936b7fc51b16ad75f6110a9fa1d84506b6662b0842ca7e881a5b549228177431d08dd2cda0fb26df5289f63b37b2efd6e1a9b6ddf1af5963abb03f283055b231d669337f4fbeb93576cb2b051a8bd49b28ef89d92d9b90ab2d9a177837f8d7052fb82a9cfeb6ea54132844470747afcde0df292933fe4c1ea4bedc480e9710d94e1129b1528bb6620857a64cf972be4d468b76743130c625b47ccd47c8aba9c33435823e6e20ed675cd047ec40174ae512554b75df1a5d0687a51b4c499acb20a9d2c6087b724eb92a1c3c3de15f0c0a38a797dee0cb63467daeb5d2d36b94cd1865732ab54ad9248ece3a49c2e9ac8b4eecdab6a5564c848ef2d664dba0195d8282daf65199a75ee3db8aaeec2da7ebb94f761e3f39c1dbf8054fe7f4eebd5f2061a8bf08749e725f53997aada7bf1e4b1ba8835a58ebc2229b844b17ab6233a3314d544102018c3414ccb0872097ee9a604d77d95f714ed01aa162c4210598f3da187dec55e369f6796ea112899b33a05a5cefb56133795444c08dff41cde8491971fbe273fa00d7b123f451023709b20446645ef9dad2a1c0ddecccbcaeb3d8589b4ce5124a0fcb48954c7a98d6e542c653558cd88e0c35f996038f1bf3ec1e1797963480ed4d40a5040b696a27cfb085fab694a572c0ba35a157a54703645629dbc9c696bb51a883c95c48262641f26d5872922a901f81b8fc618e9870d93af3c0c1bca11985156c04236dd86e49a78fded8941eb372d77ba0c5023a68c2708fa77d4bf53ab437b05a497d6908daa16ec677c96bf23c26118fd7db2aeb97c25f3c8e70ec5495e6066f6752714adcf91db71ff305d676fa6e29578e1b6d426db3ba0662434102eb1f54efc2c57f263b42c6d7e838cd8b167053130153438fec43a2c1ede0333429c392076b853488d458ba5b1844923b806abc81cd01e687a03c9194c606fef4529693620d8573b641a848b3364e3270d5f3764a64c58471288b199456bcee300aa95d95ff52be3ce04d73be552e44a8b4db886cdd8fd3e35139c428f9c32281051049f74e8a3ca625d483a2d3e8dde73799089a634c196212df887a33f1f5835fb9a6356d548d3986f41417a5cb621812077addcec7a6418103d2efe95941f83505b19344ec6b7a6849ecbef9b41a28f3cfa21f20eb47a1d159c629b7af58e7a397cf9ade0f945fe122eda68b3a270d711ed99cc6027f8eeab3a0cf4c67b998875f238e7fddc6ac914efe0bbc2593578bf5908b1e40e36ecfd840ae311607cb631ec39596559fc103e1627fa19281a49c2652bec063d64d6a48124ad975f59cf8ec61b242af63929fc21fec5f84e7f0ba9c97abe806d5d60ceffc1ced667580eb5d667526a4764f55969e834a75fa976c6f56a82537d7f42ecffb6c589dbf519525cb93fb86c4aeee608092308f7c58a2865964d918433ccba1240746e40e106688efc250cee1c47f19f135e4079f6c2845318f512d768e6a89d83ff4d2f7e3d417bf0d0d687d576e95d284ddacb88746791b097fca613765b771ea7de43c544d8d15ed3a3ffe7ae29410af24b4012ea4e89758fc1857699474e91ae0c43d8ceb604d256a3d84cfb51292948bfa3d34381eb1d4f696b621cfa81d7a4ce619538e304ee73a5a3ae34dde0e75a00ff66ab56ad9a1012c4550696d03c6c3141186f51c689ec5382346ab747c74a2fdefcf4a43d2e2de568fb5e650f46721395fd3823be9699bca6569e3054894feab8aedf0a83e32b19a4a35e45a837e2ca2285e5abfbab066a4b033b3d6562cdd70d7b7334c495d27f7decc32e39f5ac6ce3cf0054ca0a442deec6cb6b883f8b127095afe5ac5e39a1807eb5931e532ae063ffd14bcdef35f08989d8d10a72def1a9f4217e3d440e84532fa217a071522deb74611b9a820a83472c3c6e145fbce1d227db7ece10750814423177461d9eecd2b791687199da69d1659268503377a4a0b0a9ef55e519bf07d46faa811cf52e1f2a71038c6b444df13454bde42e1c2234d2b0698fa9a8d9c6fd18e11262770de5048be4b2808ef5c02af7a924b79bf2083f0d969a4b28df8363b3f48c2d73192d09e2e0e169eebe7b99438dbeadc55a7aa33538181c75961acf1f31bd950d691c96fc1218864155925386e5c19b1a10830d58335e241189852b40194e550a6a056b3b9be64a12a345a34a6ecfdb834b04b405959c43b1a7608ba2a17af7b59f8c54081b9a4b0ebbca0f6d186083044485095942e16e9a4c66b3d5162c4372381f4b93bec3b367bcdea71950d450f656f5a5339bdbe77b007aed8207915dce733160872e3a3c412749d0351ff06b054acce88caa3c746a9fd40500c2e3bb88b0379a53a189f5d04ea29a771a0a143c0ae8bb0bf5b17151959ef5a42d9d91e4969a9df0a642f7a8b33b286e04d0b219df0fb12a1cd085d9aa4ec422ca6b2f28232e721e4daa99c7313b3528792c554ceedd1b2e34eea9062bcdfb1a7d18b7464caf6eced184ce55853b931a2cd07760941aaa46e8c3009ac604f0a74894b8058c7ac521692062da6bf53eb8289c65ab42950a32990afb34bf6d1a0faa7bf08c0f8a8c51674748faf51acad3d4fed9dfbdc4fb135beb5483e92fcd821897645d3914887ec3b7c957d752fa654fcf0f0b197bd65d1570bda48c1c0ef7dd7c48b53fdac3ad4898533ba9d9c97792e040df6093dd5de810c621f355afd5063993458dccfba1b4e42c18d6b2ffcaa978d570c3afab776f0f927fa767b707570763a0635566a6e8128ae6cec8bab28971dfe3ae36288e7ea32d535b23249dc08376b97f8509584b6aa56634faee8abad5203d0052b6500f8ff03402e9be6ebbb49678ec5eac0fdec94e65c6a5d40079a0389208163bf5a7b52a8abb33a6844a2e4ebee114b81034015a29e9e59fc7b0024836053573e8956916677ff3f221d19a152b1612e92337b5ddb75620499406be9ce52474309d439f93504b69c5e3c862994aa1c21ad50554a5078688f423c9a9577b1bf57d8794db4a7a850ed7265cd2cf052c8fbb7b5595c2761fbbd69b0d0d3bcce7aae5de68d07a8e3b9d7835d14ed259828da4c2fbabb2428eea8205b3f934b066e6ed4710020aabc2f21ed1b0d2c425b53603e815c5ffe224538850128b4c2f8e61a42bdc01ee51a9a7a984a2da155e61b4ed2eee909a5946ff016ddbd09b681b0b6f967c2fe85365cd530cd5b576f60b1f24783cf61ff02bb65716a4cbddc34ea2346312e004ba87bf2f600fa5c5714555c068da4f8b99d41b9231d71fd94c311f4df912da3ff39192b6b558dff57cc301ce8ca2bd95d17a949b20aeb18fb97763196039d7e9b3025c3cfd09806e51de43638928ae7087e045d6cc58c3e952ec7065384dddea3ece25659acf8cdfb405d9a0da9913606ad73f19d89212e0b47abb40a992ae67ffa1c1a8af5a2bf37ec2266f9477a5dfd3cf0eab32dfeeb9c466a9359cc3d6958abc7b55117075449266e55e21f1e704e965d8cae827c288ffd427d6b6157f78352accde45a7761d6a2bbe3075da46738aac3a12c7a0db28992b2bc3f85b189decd7fad9f8bd5b5e6ef51616d228265e630044c2440bca30c286b5903ece1455457c81408edb540be26850f57bff6d1191a9be4e71f19cfb050b2f85a88c2dd736c7242c781b549555520615822bdd686650215a4924919159b5c201894ab1e8c4da43ea1587c6249072c69fb4123ab910b2ac29636e1108f6e6724256ae58ba2aa218c0fc2ad407f276f89e6ca108e70545a0efdbd8e4a08dc57bc05e9effc4c5094790fe2925194a46eb5f5d2b75b0f28149a05ac1381f5da2b2f8d02d2ba5f4dd7c2141f93ab1b8cfd093e41487c25b37a2d4b81a59d0a563472448d3e45d1be24345d1afb2b5d044d235e3392506b2f2e41aa4bfecfd251f7c01f8989d21a77bc92b2d495a83437b14b778aa4e9811c2c8f5a6d5af12b3799015131f84f51293d867f40e38884dd09594eec4084617b014e36aa61c5c8df376175c1e2cc5c17b20afff9f504fbcffa0b78b8bf3967e75aaa2ecda07fc48563d64e9707d4a5f1e392d41847f836b0d52b08f8a337c7736ce6b83c5cca974c11f87af21d087d6ff53c90e66eed38e2d14a7ee8e9dbca4eafc97a7c4836f563563dafb9420380fdcd520a2015c5d2496b1b18832bb86bc2ecf2d97620dfdb31f437f7e6bd4d11177bbdd838d8192025465a080b99791cdc97712b472a53171810ac2f6236e3b0a8a10cf672cba5569ac554a3627255d3e70a0855e46736ca87b5aa1b4e731eed3a80c0514d8493292184e01685a99ec598e2ef2a040aa84b057685b628f03370200e27261438cded1419d035c3c326379965439958e72cec485ddc18cfbdc29c809cf7a89dc19a79c4361a9750c504032449440c8fa68bf9d30bc4cf477b48cea92a667d115f580a8731a75acf8f213cdbfe7453a077017a55be56b0c9f98beb7c444b89eae2b6e7a5111230395cf2f7888e3b6ccb91f03bebdf847292b5352b9fedacaee9e313f681467b179966cbb00a712ebccbf7c8e84e9e833b4ebc304af80116eeb7a929d5473e4853f13bb7cae326a49410a8b6d818a1519d960a33c5978b3f2f7f91e2393c83ed0fb02dee65cfec68ce0a76677969cf5ae8d0537c38cedfb857ad92ca793f27e7430d2e28efd89a33b6ee9f03b9a86e2ae76ae7e7bcd5fb7105dd8837a7ad280b0d1e30895088aaa91f93d71e14c831e8150325a1ed316743cc4583418069d1eb4b00f2e2fd315dcb57ff8b9b22e29a58b304554d32ebcb8f73f40be22d300001ae0c0a7480461e86f4cadd6401f615aa8219efe0942c3b7059ba219d59fed0448a8bd3e19f7270b008677c5fd33d08cb103a646a9d103b17243fd2d2762cebac1782c8c3134f4d15f52d28875e918b93796a6f2355cbf0c802e66145a2ac27cc0cfc4ad51ee77b731a9b00ea5cf3f71682c5f5218a6f74bfa708a2823eac34e43466ee10a3991de31a07b677a4ff579411a31cc26dcf02a5d0eb96b8881cd0f9cbe76da791ed101b88e4f90ec960ce3217bd48b316d62a6f2de0cb603da4956333665da756eb8a0608262278007334f219fc7eadb9998f5251c86d3a44809a9414ca8eec15f973829fd57be3104e6dbb89a1e92306c4d8ee5f42e75e5e141049098b45bed5401eb814d8360d85519472da0b9b07f7374edbf55890e92d531651d132883ea211d9cf2a3d47e52726ab416e3f4c54cc105121aba2c24551eb2a3054ba9e07850af6f5fc4c403ca8d096bd0175ad6b0a594bf65eb77bd345115bb70b8112ea1d024859be0d7118cfc87e1ca82168ab7f07ecf7618d782f2c17c881f7335836d8cd21531be8dc67142b360d4b7b91b5ea3c06ae5de1f3d51c122fa11d6a25160da2c1eadc0be4f36f161b3985a5445a1768f168c1dd55ce0f078d553a0c9261e763288eba3c3ffbc0f5e41e421c44a1e44ff4aa32fbb35ab9ee16188c05c86f361c5f47a91c1bd668975ccda91a01c07f9dcebf5b96bf816896a6d51be7c364164b9bbcb057c03d5558820ba798299c8a042e917984fa809f54cb058888341e46af67e4ccc542f0fb3848564c24e098f60b039ccc4f37cc30d64f5f1708ecd666fae1065a37be104c78a6327528b2d72be0620a4a05296927ad795285388a000754444175d052b7834f4999887ac5c825504c7f394fc5f497f3544c7f39666978b90ff5f377211e535a28e01ec34d1754ff691a49ef1cec12a70a04c502ee74f3d72283d6fb8fa3c1306717e9485117f59049254b9a2a2e1a59bac6a7289ef1db375ace5ac91a36757eb69f2cdd288b5467441b147f1a0ba47f05904ea1488a5be0b68724d5cf58c94cf453953d2c2a655f3b50ea037f8fe4ce96e3cf156c52387c03ce8a2ab4448ea96ba3a8685ff9bc0e54e06145a0bb20aa8529b23f0001146fbf2c0547108522b27f884de06d6538538009d18ae67c0990b38ed499015eb1349cb722c28909400d8d9fb17ffbe28804c7490c1227cb42367b783d2548e80eadd07cc7fbe3f3a75de8fd5c1ad62ad79d51c8f04d4d7c9845152984e4f38987869c1d7399f2109cf607c1f179fa45e16691762bb34f3d4aa4716a19f9c9d77c7822f1144530e12a71059cb0831d69ab6396608c8c82688ba3b6158c95ceb60ca6765c620a405836773db24da6851aa9c65c885f560d197d57e3ea697151649b1b65db8fd5018fdb7b4929620db06d87ea009bda64e958acec1ce11d9c9836e5979c570bd1c6cce5aef751ad8d105fbec3ce8310645adfbb163f8265e1bacfa2982351d35020c10608c8c09d0a240f69c8166332f14b2dc449e9464d357d3423e21cd09cf111666a2e828b093ee17616319612cf07d0bc07053ed2822e2c9a8ec4d2fa7b1fd2607d804d1602037967a39abe01e1aedfbcb0fb103e6538afc597af311d3bf88e54552f6ea317709ac0383c87a7f636e085aa05a295754d60056fd793a76f13f09be4df95d32f10f7716f30dba8c83fba09e60eb03a740ff534da98d08298dffce49cef7793c79868394351f5f3768f797b31b80e8d0f7b3637fe80c67eebc32e61bbd0f4ea181a66ec2741e416e20170783938807640c91af9179e790c741f6409acfed40f1fd2e07cef5c5c2c8dbbc963eb0f34c1ddd07fb78d86b6814946f2e399b96f73c97ab8ee333425eb37e3a2c18d179c7895da99c17a8075461af087cb3ebe78f281205a483f7c5a3253305eb26add40d1eef7cf3c2a60c5d2f668b26559494861c9d698e08d126f1d40e64fee7fa69229615bbd917c82c607f62d4a75d19d0801a49ab7d78679b46986e33a51b32dc69b31ca45066e511b78fdd9a6adb6d9a50963af08bb8f15e491320af7778ecd43aab889ed7536301f52704421fce60fa66efe609055c84c2391da53228ee6152b64e6bc44cdd413ab1d432d3ed612ec6a2bdebccc6338dfc5246b36d091d674e863719de7f10c64ebeabb623bd889da47242b4fba7b9b45386f58f3bfb578974040f5a86bb30433046a7f3dcd0ebe18b9ab1619d814a95a28cf12c35427e681d00d64d26f06908cd72eceba499a90497e7ff5c7cfdb6e421a6340c23e840efb390994627fd8cfdb4f8b37d329b62f304ff6b34747d353dbad5116c9dfa9ac1933aa36b23646964cb03a7b1b622bfc91841c37a3e0b8f68d2ba61b23bcfcdd7a1d740ef340ca77f0b0a16833255be7145a9b5bcf22cb59b116adbc91d800b8121e5e46964d809708aaf2c3eb3a890b73b0ec3e78ad2f265b33c32cd6cb1be36ade022e72576556f82f9b0c79fde840661329af3eb9f3c4b70b50774124d561f035925d5407830206aec2381dabea2ae3ddb6f247ab065757921b4e603b82905d712bfc27a3dc650548871fdde283c5b5ea8fd787a886b03b2247d1829f4b63853d8e460d8d3c2d4ee912cfa699baf7fe452fe32090793100f8ff0340fe575d4eebbfd2adea9e0e5c69ed630bd0c396c0d29de365cbb06558b20ff1ad69bcc333a1b0331cc09ea4056e20ad3549bb6bfbee7ea90da5341a184089bd77bfa39fc0a00c8f0d51b1f6f7489c698c25408c23f76c2d553f4a1f4f8b0f367a2370fc27a748ed34e45650138e94bc9be784ec8f11f540af167b510b3b83893953246cd1f0136b0e4ed5c9cd8b7c454deb7e1c620295c220078506254cf8ad4b5596dac3dd0066753e4444921688a94f36fb0ac8f888ea2826a5566e6bef807e6c940742b5b7cd61e2e372a757bb7720e681c62e33fd4fc195a9613f6eb9334d6c82291f6f14a8d024e06d868539922cf0f4d5eedd481e6e35e46d41fe20525c9ff59a483700f5e115ac9f9d0d36a4804601e07fb497225264611825094ee7b2b641abd7670ba041940e79c113d90d12f41228f668adf2fb99df65be4929614902173ba46f7147f4fa2118ea6c66aff8cbad6da6b59d48aba9cb9cf8c3346b9d1baa814d5d9536c5dd11aef0a87ea9d00dfad9aca9b451839da6d0748a1ba4facb3d96f53f10325c8ef048a3947b26209b58d020cb53ac221158f262176379aa4984a96823026429da92e2cd2c9835961479fed4fc5e47e9273392f46c8c611896fc48f2e17fa3c4667a789a5f2f26e8754eb5c4fba82cc03d0734f1f5003e66c45b524e05c379a787b1f0e243c6295e7714965e369f387089d7e67fe6986bd42d4db0db230c6b5461dc64d7ce270ff9bb3c1c659bc6d77f9c29ff5e3fcf6be9d7a420f76eb7c56f594b68e63b847be289f2a849b195993f6f0ba2052e129c3ff8ef882497e3408f677d43794edd70b10bcaec5c7007f1d64f8784ee74227e2c88f83eddf1b471219fdf98c7c94786598b926502d13bb1c8a23d53263b9b5a7a3337692e1c1ea727e67a0b08473ee2b3fe452140db2998cb4fd714a22388b75abb8ca744355e7328e1f18978fca36da2a81cc1801ee96173ed452960acfab6d7859ecdc99f1071dea78eb8336d5804ade71660d05fd497d006d007eed9b652fb0c20ca57d527566d4648d2a2487ab77486352b3e51ae529f9d7d38939c52e0d483ec082a48f3ccf1f18959c489728cd00816e1cc08cfe82c0b6b2d00894b9817c187534500c453a2f0625540c4c67667ca10eb6fa734bb598ef9c7adaf0e01335714cd98839cd20120c146c0b4a626d3c97ae428b0d211fa3e64c352c6d63547db55a7dfbde51edd3bf5cecec4fc03c5accfba6138a6586474b37542ced4302dece55b8354a65f3308a5958c153a17a39e81ff4e1205d9622f284b96b16c7dba8ea4c61a264e6a154b5c6e44aeb734cdf72b2f1b494d718815241f85936d5b8e78b761a44976720f525aec4a5c9fbb7484b825ebe0e98a62452a5a79976c77d7c7c0d687aba0a6fc654140813c607bd536ca7780efb7b41969a3bd8a7da32b3a50f099674310338c3163cd71ff3053daf6d99036815a32af8b9585c0817c52d9b445f279f0384c3064cf3d1b828329595610a1bda0881f9e4542df2e65e31c0a8a3f35484a5a2c938b9166f1c4bd7b75d42895b285916def5252fa32cdff1fa378652db6576228403787fc7e1d2ab797376aa9e80bfd1b62c94c0d98235ce7ee13a4c94a862a25cb9dcb0c49328aa529932349646995c0e4089fd2ae10b8ae279ac111bc3c3eec9610c66ce8a8fafc79910e64e00e63230e28b03b4bb473fe16272bbe176312bbea965f259033789394b81040089940183f7ef76c813392d7e92600ca28b77ddcccddec16f14ca310f2362ccdf4448e52105f642e53a2dbdcd9b5cb1540b5cccc565792f4bbd38e744c926a6c68c8c5c37906ba9012fec26c435a3c5054cbb2e93314fce425c9545679b94aca443dfa182ddad6ce6c7292b9ccf809598ab932a81def3b4b7c2aa16c07cbf52cf7713899f0a952ba12ba77d36a601f6054eb5d89fae4a3621de99dce6a83f356737e71036d33fd296aa38e6f22e985350383f1648a0011b44e160d463bd88ba9216efa01f56111405621c8fb128eead2ab4e29d994c0556141e2d984af346b27c3691c8ff748431a6b843f1bd2f8474fcbfce4abb3ebdef78b81d2f80ae7ce9da72cae35e5f1da8465423f810632b9d2cf9d0d3472279e601a02405726c09b3b93df0e7ae5085c43c6defeb30e9eb04da07b0a4423a6eacfb051066955bbce1912a1b5921c39f98c6acad2fb6344b1d7a7dfd535b18d5d691fe8b4fcde4e9ea471ef60b60141306e254dae49d995c90758e61858a9e90fe6cdf2c0e3fe5f4cc0a3a50929944f6b2a419d594f58753cc1767232cd6713240fa7a44175fa25ffe212cbffab5322b28d63419f063ecbfa750e13cd6adc75168645149086347c8ae3230e4997e633020753f72b24368e2f2b7926b36fd4959e8561d7d82b30828f055a0502ead4983ec1b030f7883f1d4ec193761e73a90a0456380e11c5e09ca3d3e12330d8cffc9c7f0f569656e524601fd3ffc64262cbda767176fa03c38b3f6aa9071bcfaaf932b55ebc27769e67dfd0e78002116e2da3a0483d7a1d962d43a4a821afee88354a9d2c7eaa45b909d0c8cec43181249f43adddfb1abf03769b53e3ad9d9bc950ca35fb8ac5d9e2ed37c6dcf13c960029b6bdd0a94f092b6aa6e21565e39569a196c62e6ccd1eb329ca4888a587e549ecb6cde4bf121093502691e78c6a7d4f136516a7b46c6b5d90a5b313dbde5e17e1da6e4974febda1a8a498c7cf6cabbc4509f81a89cccf16e46026bb5291c7a1648156e4df49098b170379656f3920ac9700731e9ca46fd3dcd2128b1803d2ca33fa2805db26996cecf2b66fb2b8261d86eb6138152594588c16a6a163df822ab998fa0c0bf07cbf5fde069d44b1b10780df521d23c81caf63deb235f0c9de00f14cfea9e3fc79a492c58dedcdf4284668e0a9e428951b9ec05d3d45d978642c55a9eee64f685dc9ce05fbfcaa085c44d0ce9b0f8951bf6f704150b34e27313d3a9c45cf0053b96f72417b075fe041e744dc65dc762bd3b5b69ebf9ea86b312fb6638b27624f0f3bd8364f38d88011440d0158833c519bf28b67ed745ce43ab02e2b6a6c83c6cba726db430627c94b11f86aee8564d35209166e1085e6238a29b7cbf802f67a90e9220f2b9241f62e266627f279cfa22913bebe4de9642d5e2ad7599ecf70415193d7ef1d525535190973c7e363e34bb3d3d6da960f55e6fabba33ca8ee921907481f589a8c32961e5e524d69209c711e6d31dd1190a043954c6000c0ff20cd47a77ba300da5a6dd903069f82631cbae09c51b8768dee920e5b5d84245db8a2c5275d5d9d908e33a0bbcab7b4e0b25ae7285629cc17db205e4073a04af0cc110c76cd163e1b6e1efd023de9c40e1d08a693977da2e5596311e42fbd0584887332c3b10263d7810de089f5f40ce08ea8c60a346887cac17c8835aa1b550c87d20f8018030faad4b88438082d80fc3900eee8ebc217daa55f5e10e3e0ed629b4c2ce2ed14064f549944b8d02e5dd9fc1c681f01f58c9acc798e023885a24612cf6b373d07aec0e52f93bf981d9e8d0f8567a01b78128d59687b1800cd8fc422342f6b33261d41109df1a477305256a10f54dcb98007d8117c08031c96cb882e171446f4899101ce43c0310748f433b4dba289616216d8e078e079e789e479bca3d569ce2a2192e7a8f321175916898413b9568a6cb12df440f28864c23dec829e55e78597d10d7150a15a6c41d506daf4b06ff0aefcb49b582cd76ce8b2c1266d98c1cad262d447a521f5a0702348e0b7ffb68e272935ec94e4675286f062b9b3e8b9c1ca0a5e38264ce470708d17ea3fb385d1527e89bba41557546cafca9eeb3af1e5ae337ebfa9f7db8388d38a2c498409dd6b4ecb7b2ff29baeeefbca4113052a573b63faff7f0b0d7a5b77c0d2f72df9fac6455fee9538ebf848e58b0da1d7b699a73c84626cac61200b4b72540ca35f4df79f69534b6e17c47dbab2ded80ea32be21dd7ea99ba707d90d3d9a601be2516a82094aecbf3702b70733503da76d933112df970e747d9644d74c72ef4a4b48ca32aa6308e71c50005c3a676943c31cbe819dbb8b4a439955be2c99c7afb8277017aaf0e49d0fb63bfa5ecc3ffbf7ffe89e4ec3ecd52c5a3b7642339600668958f2dcab8c4e27409021b8b26619d48903acefd149bb44ae943e978db871d3c302345c030e2787a8424ca9edece2da606b46975b777994c0dc230eff7b9c104fdc9b16f00348fee3e1a078ef3f202a8a77e9cc6dd93f1caaa0778ea74b841050f3d60750091d575d31e333bda51aa9f281a851ad7df656e0ca254d2fdff3a2d5040233c06911f51be1e4ec8caf2c337aebaf45d539b261225279c6daaecdd80fd400be9d01d6573200feb616da01a37bb4e55eddc2502b878f463c2e3c4d249ef3da94617f0758406a37ae81c8da29af9cfbcbc70812758054b1b8b91f982a478bd87657dd2e2439c89a35e374972da5e183a9f24d71b27eaca05e3d4f0d82a10274e31b87d5a91a6220aa820864cbc9eceb58335ad35f65da0ab3bfbc377b3cda404c0599f4cd2ea6b432fdc251add0d438ea99fd4a54efda4ec119a3ae4e98ba35b62451b0a1f34558000e8a8bb5c434becac6bb1b860dbae874ed7b19099e30c1de3d664afd0383b77035107777bff890855ee7202eb70306633a78dfcb4a5f0bfb7ea48b6c02ae02529aca8b151c3bde1df8c47bbbd9901d3fdfd7e22f9e4b4ace27c2985d5a02cb7b55f11499a68cf3b1a2c55cf5caaee1d9c364863f1e31d11bdf42c1882bcf2528a86b290dbb663577fc0b161484177566edee71d27980d3159dd80fb74886965e3575132c00066a04e2e5693287f07747387e65769c522af936571c79fdc28c04e1c37af30b709891e0510fb90150a835d647d87f6f33ef6eae9eed09bb93d998fc06457387e70fef7c1e368ef2ecd9f41e1c24afc458910b15f292686a3dee455b260654d65963b2934c2984792174a72de58983aab1323e3bf64704db292a5497c94c095fc4c69251de4ed2648bb4ce0ee474d176cbd697806ec0877ce72d53628d937bbe41e6ae6c487f943550a37f1b49f280fc3e4cf87699caf58f415906eeb3b687740de384836b6bbb5ab1d0f8c72a2e54faa93568ee788a945c7e1fd12b4219f675485334edec392c55bc84df69621e796eb919f6fa9c3237d300772a89f10876000f8ff0340aea5daebbb49ae7a840ca871f9c957534a4168153346424771f3fba69580dc333304c67bd8111ac1fa550d34d285d9710ab1baba5ad2a67071ce21241423346406d490489a5da700b86d885a5d6fff4e716216490846149fa284ff7d60d884760d754b1388259fb8870d4b1a29f8bcdd3ae1dfdb1fc6ec0aac9743d0b557bfd37e57bb168b6af7e7c2aa14ab88859ccc3d3c2c33b87ea11fff473392beb4aca86bceae7fef6f4f3bc2d60e8ac4da0b200fe568fb2b42cad4389a529ac8815878de668237f6f456c4389f1d9b0612c6ff3f437d065465efb767646529a4bbf425d030547000888178993b12e3e1bb0082d3d5071c986af4ccca0e8887fbdaa93d0449d9f765f8045b67259902331909854992b98b244e2b8404912a7600031472bcdaef14d8631e6e6ca32016e8ef28d887a05c7a651333bc0791be619611da3c38c86de37b110c4999e39bea44e4778c4a60a9fb2a876de52bc61fabe18412700b70cab35288dd4e2bf174d500d5a8439346d7ea0c4bb2cfc24c4ffc0b92a11f0d2db83e0b967ae910a51859eddf1d1bfbbed375657cdfb2a0e246b80c22637c4106513a3ecb89530bfe0c01d2343a0018160aa31a4987af6c6e511d54bf85b23d7a38b5b954d21ae551159d01f4d2a4b04a87cc6c298b5b13086e038c1c4f880df911439b7e82b7f267e94058d6ea1ee11b04273cf6ff759303f62b36cd5add63652fe2b946bfcc73ef54eb783bd33256bc986796e0944d1261ea7f2556085631774fba9e232c0b1a465c49e5d8442d1a7bfbe4351c55d1992495f6ab0334b94be2c305f94e7804e2caabe0b4d0774861ba8012771e2f434c73d4e579b298e778423f069bc61e13d3aa485c4fa3e5782818a2e1440450a6f6f779fd4657810e5fa1196f264db0681697c59774ee2659a4dbba9c6651a8d40f2dc6fd4b29cec9f7913931e60790e19117a16c4bc5554ddb9c04eb7444510d8f1c3b2917eb74934b6cc3b9f88f2b7961df066f6f2d83f59d353538ac02a9fdd6ec062172cf78deaca1d82d95b41027605b4c8aa1f0bf4599168328221d7dcb49d394699dfdff99c46d5a99e762e9f6c5ef4b2a59862d30fb6a049478a8c01ad22127924121efeb34163642dc4bb9a32855533a1f701a0910fe4619553cb9e58455f90a6bcb120a129716232beeeca96e131021ca6e0d02fafb955e3919d41cec00bcd64003edbe44d93e17781e05b603517d064b7e5358f6d93f4282df28b578a82aaddadf45463f9ec8b9058317314b57c135303b6936d5f688170014fc8338993f6e6c8c1c162cefa0353f73edfdf9e84e6f200ff5e6edef48cf7329c56b71ea7b26e57dc06132270575cb21b53f9533246ba034f6a6d443668221875e35eede91e29a5c24801d51d3c6b815283a34e293288cd971666a294ae9b726428956245cca42d0a0e9f9c75eb6db078b4092d8f85dd8e2e89973d58214c4918bc9e049cb4dd4270b0c1dfb6882ca3feafe5390db446d529ee3e73e3148eebf58f09f7c2d12ce722fec7891c0bef37e42c280502487e1bf49847fb9e85da57d710a672e8a66a307b46fcbe4310e1616824554e510c12a14130e474b7472ee8a8e6de41f3ac3ae4fe9fc4d89c03187bb63eb30d79a5b5aa04e4a95fc2a3d70e4e4695ac3a03c725ad339f2234449885ce895d47847f7385eda108779d4ab54ae4e0f4ee65a6120f6ab635f6b931ac17d5bfd5d22eef4e7a457e97895b29ccd4f6d7f6e94892a09424f8d42ac2e9de7381ca2276921110c31e7ab9b521d9db1c19abc970a86911df345c196452114cfa65b766c81aece3a666a5c36ad772071afc666be26fb28d65127093d07be6dfc97b1efd47439e5bbe58bd7755afb6a985a2e592ee577d645085c7ce476f0b2b8af361cd850aabf1b3a5002d3ffb204786ac3454c494c44651130f146045dc728fc7ee237b58919ed4cc600ceeeaac3e843ab95c63c747eeab69f6e9e13e2babecf6a9b8b48d57891f92e4a0ed05ac28de14d2261f23858fa98897ae96b6ef1fc0f6e43baecab33a75fec7b1422fccb08891f4c5e8da285a510ff319a3ecc25ecc4f134667cf0835338e8a045ec010a54fea79cec5d8870ebb3a65f76e607838f8d960bc079f972cfe8119c5c6939a15b5482d6a275ef53f6eb5cff5ea8f8a8539f4b50b62357d4b3f0bf407d7e90e2a01d8c21b0dc2f4e185afdc0dee97f8b2ed8df25dd152d7dd00d89887ad868d2cc873c28ac9791569bef1efb3e842b62490efacf989c347953eebd937a6a4d6f67f9ca064f393b3eb1b3f515fbfc2ccf8e4fecb273a7b382bb0ac2dc5202f67e556d0cba63eb2a1d627053c331f501a8ba63e1280c5f2dfe7f95b4d46dabe5bfaff13099c48357b3631b27135f5a1a1910a59796f539d72e867917cd454d12ef726dd7fa2f72c8e3c9a4a4be8a2b498738e8e145627b0e11ac55420a102685e15d960f8db2dd70f3a71a5887d23182745baf24e08eb84cbf0a09c8e362c2d3bc42ba8ac0d34f4f495c395af8264740c3991a495124cbff220c2afd7e6d5a9b49f40428bea72ab04e61f2e7a66c8b5bde447e2fa5d93c3a43f8c5f2ba799743a224222880cb7af2b91c31fda5edb87bde95a7948a4c6ca0926e27a5ef856c0cf3fd24380e7454d0d5ca8b277849eb8b89a894ead48fa22b04bdf037bffb328363fb9109d937aee4d036b1ccb98be6c4987e1f5c5ccda61619e4df7e4a84dcf6c6b45bcb4fb7179b93eda2f8defb8218faf4871f764d0978cfb638ce376e1ab86fd2d46f830752013b6ee692cc704bc26e5f341dcb7e89d8d513efb629665dd153f34a6025a94d34f64f58f1eeb1f2bc48b68c0ed143df3477dcee3c9d1803e0cc1fde7b1e51b5c17d139346e94588e565f19f5647d2c76e93c59f1fa0851ef26793c828129eacd3fe0b3add37d12c313857eb2dcda920abb55ff06703a36c89d47f2647ead1a2b422a66f6a561673a136f9e9165080638998a0b0607875da00e0505223f9e6c63a1cb3e8f98c166979147cd829a46416b4d828430d458c44accce8c013f0d689008452b15dc6808ac445f0b466fbeff108b519a592601ddc866333e8a44f1d979866d233f6642e5ec8db9e7558f67cc100d86f1ef9f959038c8146285a1a86a20960cfb91f9c1fa6b32c5b5af68a4fe08c76073eb891c3de331198d159729075150c13e104e4360096c97f5b4cb3a0b47c583d4ebaa954077bc1bd54c248581c4472082421b463c93f5a23152b90b4b01174b7d91f6805cd03400ebdb86e77cabffadef523503943f2a546f64d7a8c1ad3b1ea2478a1ff294139977e519b2e366156c42d4c286d81ed930d0dbde973b3a4f51d9b2f3c2bc6293414165f6b681cd6c8859f0bfa766cb587fa2a977ed175d85adf6de0fb2be252fe97fc5114deea5ce2f26496b359300b16447fbe525e6968ac1c9b74363ff38cd033972a15322bc23906b7c884e66338262e7e1e88dfadf92890382d5df9adcc17838b977426d6d120cfe356682dab037096118a04469b503e43dfd08ea762358a29345499918cd77b95b0044eddebed7a36d86148fd2178ac407b89ddb66a1d6a185dfa257ab2b21df6b392a7b50a12d609e6af0f72dbf9e222716f7a0d627a2e019588fe8946c5c5568108f6503e51c058dcc52df8e4e3132db8adfeeb162002317c21cb7885cf998c9eb925429fcfd788ef06463e5c15f8a5848089b699b53c4c4739830f4b148f5ae8be8a3347294afcd66ba431703a0848680e7baa1d7168e24ab379a106ceb000d69b5f2fd56e922994875e3b8f451ec49203a11c3e12961fa3e1bda23d59846d0605eb59db35459192bde0fe5e36e6fab8f99b6ebb2ecf090a1bda2b46630246e44909a774576c7aee662c4fe7250782ba88ad293465b118c77e48a26e71146d501571cd137d01ef8fb38b13c55b8ad43833406b07353a506a119c27a08c73473e3c7d99e781c035b4bbf0cf9760ab4d6f2f728e0000d561c42b8da50d091e813e5d01e8b05306d3dd3a12953afa32b8d2f9fa200255ff6effac54e11d4ee089beec67cc888a8dbe68bc8d72413727894660e1b863b38d6b93dc5a9bbfda1896c7a0737b07e7a8c85dff4d4525db1b76a6676460c84c0e76528f02a4f46b9cc800a9ff1a68944ef229bd3dbf445f72156c7c72c7063b3c96777ce19d1d331a4a8505c62caa5e01969da73dd5b397de45b6a9dcafe3b470820178464e79d67fddc5e9a8bfee9779a81e6dc97e7d27bf2ee6ad1599cd5bd7d0dba0cd415d3b3f315fb54ee0e48945a68ee9ca9b3d94f0849779dc6dc9846a65ed39a952db88796a028ca6106cf0ba0eae8807c23948411478721680096e2ea094b3ba36f6e806cea09eaaba742695c4cfef5a6ce1ef8bfe02de94697b81e7c32fec1d878e8799c4ede703a6da8a9aba7354b0706671a17a4580376da4eaff95fb6e46be9cabb4b3ed602acbef28aa63c33ab8c32b7e84f69126e28b88dc461757938c4e65ecd259dc1b5e758352e813199bb9dec08966472827de3b9b333f5bc629d37edfda6d4fc17e90b7e3dcfa4d3fca30472da7bd6e87ea1b3a41673dc20e73cb934ef65cbedc8c2c796a500c97fd4a70693daa691f31a0ab26812b6b771bb0c835baf0aa3516d5a706875823998f58490fcac94ef7a4482597da10451437984d52b85d8b6b8809c5654016e846133aafbb46679d84532c485056471adf38b704280160268d4d3cf062a5da52a7ce381ad7e8462ee27226e4bc89818bc3e471d28e414dc5582693f6035fd88fd682b7d04907cd061e8b32459e3856a82d154ceb625800392840dee8de53554170b7fab5d7d1c46299a0d85ac9b83ef3df62e8dc7c1aa05bfe6ee43a9a482e034f868b584a159e845a230e77166be561df364d47a902a1381c329d1f13ed6c639df59ffffb54bc02b9fa3dd42a91950040c61414571bb2d6c6a325a839956655f0527883cd4103a153c00b0d9c1edc083294225b9dc5fb56a910c40b491a25928f9cf02cc009c713508e3176a81a31823f7e918d6e89d0d2b9bb70390635a0cec9eb9b387743df5c26b80641907bb85637d2a16658cdbd45f51df6f3e4b2b5b545562c66c638c02d1a600d0c912a74c62eef38e2d16be4fd1a7c8247e405fa71db2a0e31581411182715534468e136125ba19578396f2fc18cf232468c88f758e9a5abf15cbd483b1e4d2e5f00027650be274074219eedcd601894c0b9676016bc8872b1ff2d46c6b8a075da47b89be77989e738c5a0c0c2b15ae9c6cf43b545cfebc1693fdc0015accc63b8081a3a520810c9c1fd3e2048f78101d7ab2bf0739392776b2523bc6decea5c2dab1214e71c61e4ce8e22378453cca7ac9ac7973dc7faaf2755e7bf58f6ff983f569c89fbe5c426ba4333d39a91f70b04210bb524a256dfd041becbe3983600f8ff0340fedf4ffbbe7eefdb6ae68802f6ed664a755e2b999c1d1432b241ae8b189f876bffe94b56a3aa3168e440c492d857029e24b3f8e088d09548d6d9b2d075f227ff5e89e4f5541d0a63ba0c976def527a8a3410b106f612d894774d5fb6108ef3d46f83288815c40cdd20adb24a6b7fc77e5cbd767788db7fd35577408c2c91dc3d4fbcf5d0a298c2412a1b6d312bbbe66e4828270f57d9e354b6cdcc3c804a8f1a08cc667a71955a3ca3173df8b782bf1b83f1e159f2ac143430ae6f1615c73528de2ff37d3d46cdfa5455dd8e56478e62cb36f49d44366df2bb10e7d438d98189e381b7f47b3c9126e483e7928dfa8e05dd315f6fee8ca011697c0a51c63bf02beb3e8c4d721020350bc505c18081a34bc395ebfb983a61944c73ce5305adc00f1f2a43685cbb77145db8a92660aaacc6c7a1d3774e0d528ec03660a7d88b4c7644ab2465bad74efd4f167a44921adf689741a8d2de6f10c29a7e6138d0e6395c7c7275b8f1749faf23a8807a86f47913051c4f145a3d7a06d7fe55c53aecfb20ff8663a7b00facbcad18348ab474ab8e4514faa64ff2e8362a27ae4e4273e6614697c54f1b0234523938d19c89d846d19ca5caa28a9d586cc37812b518888fb8ac8ada12be5918a2e4cc200db5b19ebbfd790ac4b749473123258778421080d78db24b59577a82efd5089c72360849d210a10de75b13765e0b7e21e5c5cdc2876fd43812a165954de0e5d65463093dbe5ef3fc5ba8eefe08e35255d5fc834d94af520bbe3c8e28ba8b9dd578d6dd965faa1522c6df198253d815105dc6743321defac14b496ea479eca593611ca2c29d47b4792075919c99977ddeb333c38d9f0bd22876c83d3bd3cb3a7f1fd482e415049a7d484711c1c32e625199f5569f64ba5349f1dd7b14d2f9417ccca7c78f384fe4661fe76bb6da928b37af4965db26b0ec7249be53d8d8eab1579825b909556dc931ddfb618bd78006831c40497682d351cb618488cb4ffcdfecdd1d8a062fe1e1a1a1cbd55f0813ee0ac9d402135c0a92d97ca0ac1b6baec283fc4b3769b3720a55f0082d36030cb4a7902ddc26b2af7718212117819d0ac6273526186a09bb28be7e7d0b465839756254a1742886a819aec89eaf0251c8c0894592e4b8189e6868864544eac41aecf8a30af09440485d57103831660c83783955456a854c384c492bcc239e250a6c570f40246f8a5887000b4e4b099afc1011dbfa0e59988e0225995ce49b0f4704835fa7751aa82c539f30d9833959004c1e601e9ddb1cef07413f889821218eb58710e473c06f00ed135b88bc8b62ebefb5a8a2563d70d7f1b2f91d28592dc5a7634c8f19aa0f1e085b4b0db104e7e0d5f39abd2f51b58e82a36b17ccb9cfa8ec5d3e1d4e3c8d682555462a98d424d68bdb770e5a12233432dfad3c28cf168d5ac16617dfb207ac1a707fa4de170045fd45e0fbfcf66180ce59a2c4087f4a01fa1859e01ae765af56b2b7e6c042e7d301008bba2154b8ca23ef1cb3954d45cb420e37e08cf197c4c330e50f194b5d105d265aa2d82411c002d6662c26a3ad686080a192e072ec9b1ea59c013ff6e45f368fd7769d26493f14a8daee787dc480320389738f1fe46a6a2b22c809491c0311670d3312e238642de560e730ffb9ca6d9866d9913a906e8e24ac4bb402a8c50c33a8d922d361641cb8686c970b7c48074f3fb40af33efd209725ea7fcfedde2805c561bc523d8578c125db2408f155a38ec9edb2c314e02bfd1ae15fc4230ca859183c549c37485a99dda43c4438c52da5d9ead3a981034681022fddc9b921bb19c310b9fd9f1f3d746eeeb430ad8c6a16f64c0fe5d97757955070ec1335e9bcc6c124e2a2f902272fa8b26b70b4c2a4e0c2ea464ada66033aa976878ecde46c5e6ec28ff3975b05a709ca203eb8415bd82190497e171c15f1bdf202fe04a6e26bffae4784f7c18670ce671335c3516b43588eeb4a208cc0c52109a61989e31b012facc273d0d4161b866ab52215d8cce8cc4ebe62ca992568fdc5b15796c1d9c8542192535aa95fe3267922a5db6e3ba1b13e9653df86539c8c0749062f5d2682db414b56aa0df661130407a52439a05b8493bebc452589e71270fefc3b20c003a4c5d1202ee8a0fb8b866d92538eb025c8ef5f0450cb451f74bd0f5eea8360be87001669b83db0a662c71839b348fee8775874c8177d4c2e396dfb717be84c6d9ee8b4b3f90227beb7329456b6a1430b9b18b6e42fb83d0aa72fd4a91adff5d14acd4c0fcd610aa431a5135d9efcee4d0897efde1c9460b3e1347069faa3214d2b280b14245bb88618faea186c07b2821279e9699613cd8ac40c70637bac111e319c6d50edaccab715d39cad06872b3017f0d0f1214646202e26c4abc37cd47a50ebc0ee72a43e5a4bc409654ef8e9163c1a1e5d03e36e78340de25ae2f0fe466da1c3355609ebf409b4d8173a830aaa3d2a457d77abbc50ffaaf88d1e94f7b89b5185c2193837849fa5e93c8311962414d4aaaa0b8d26e1a921a05675b5d7aa298f4ad4ccaa9f19f3a5a18e693aed43fdc3bce9ab2ee9f3375ba9ab2cf6388e2b8926fcf4e396677f58ba2185a48ef0effd105af81bceab2a23a37b526a58b4915050cf851c8b2da6307e8427747b0af4b21bac5a08ddb4fe3ddf0360394a1017c452823d3deda87df4644f7e00b0f34cee34fd6d1aa06f5eb5fa6ae7625c5be10429b6668c0491b528bfb09e7c253a7593c6c257dd408a36da49c48a5002cf6cf7203ad56f09a26f7d24a306b4da6811d753df3fe841bc7b931c7365b1d5adf3ab99cd515815334ec98558278207f21e250ee401dfd505ce6ae961e1bd3c61d4e32888248e5f3a2fa327454bfe37e804ac05b11bc2a9df4a80e72929c94914b6e3f0b71abacda913266375cc17185052db7820eee15d0f0f0db435b4fe80fc32b98c5f10cc8f6247dc5cd06d4362d246f46ac6ffe3ae08ce316edbcb2f4bcc91e752115858d05c9e3b3d896f008fd2ab1dfb9fae17ee05a574d6334166993786dc8ecda0099a43655ab776799689bb67417734190ac2428575c66e26b06bc404d6b914c6ed69dd0be349bcd960135d3f6c1474570ddb0c9c40b9a75766541518ac4206d05840e1e795dc994220763dedff1c7296a630d93a1872ac5c9ee58b2a482022aa90dc2acc403c4fbcff3487a87f7832c621b322c474363116b3e7a50a19b3846920e36c2a169852857d6ef98ab3a2bc20a26ad1aa8482260c2805083182d50d563da2a443d440cc8d8740d3a3d6c33abb61e4e1420969f23064dcc3670500c22283aa547e40475fa02501b082a74b002725d2bbb50f690fbb3a64136ede0771a4120d36a1a5bf89a67ef2dc34ccf50c67440c5ee9cd93ce6504b79ce7a0e5774e685f61be18c8f5bf74da058a78040d4f11a1ae883ba8ab57b47fdcdd237ab8d06240eba96ca0ba7fa7452ffff3c648687a1a2fe97121163df99292e95ba787a55e0b67073b89ddb40f8a422378037118d725884f93be9b9328a65b56b8c7ccb14ca4350cef86ee0410dd8992d07c9f9f2d60c4645de195cf084bec16dfa5f60cc60d725fb46b1bfbf27b3bd39d8b2beefe6fbbf050f4719ab8d5fe4d9c3b9157cefdc3f5ff28d1a11ba625d4f3afa231f6684fbb0062ed2a7db39992bb7f0710a13e7e4db5e17f354513eef50aef7f61213fa77a5d3680f98a19b50cb4790a06453d4ba40a4357431faa7a0b458b9dc0a2756ff19bac1aa488ec975a6c8ce652e1026ea19487892488719905af7a2c132977d749cd4ba88a8b227b43cf3dc0eb662c814e5cf7857733bc914ea632c0d77361f681a79bfcc57c25166af303a43f28d88ae955f901a908eaef27e8f9e393986dc22e5d33f2c1fe7e267c758c34a8c11574242e0dc6687e0bcb8fb424e6cb98c1ab77985715e7bca56fac2d10a070ec117bd8eff282a9aea619f157627952662081287fa5fbebdb3ecc3c858004f6ad9d70cd65f54cd26a59af3b072d9a117557cc5808597044d6a3d3063e055f1335945b4e4d117c7893ffd0cad9b5dac64c4d578e18ae9f95b2c8b284475af5e7f5366e45acae34afca2ce148a12eb89a5500c4237b20b8dc5c920416f6331744340d90f04271eee33fe39a9c11773756072cab74832904f2c5199fea9617e53513250b932badef8f1484220a3f537aad3b8c158d78d769aa37769a71829db5a6f5890d30b3f58f6679a0545fb729889af9e511dc89bccacacc1b8116de23da2896b2b1dd3150c6d5f564ab8dcc0f68d1e22f66e2f9461cb493481fee7ae189a7002d25c1273d0d59a340e2ac06da223abba7458aced98c9d9c0ea66b1cbec7ca4158891317cddf1b0a08829991ad8c9603056df1ba69f3aa7570788db587bc662d89a4b8272d59129e3a8900980a9221b522f9f9aadae99597dc7a7c3a3715fe362853dd1fefbb99df894515274654ca771dd79741188d56e878587dfff785212ccb2cf237252eb9bea55966b3d9cdbf41b3cfe5024b46a62b4c726656dbb56a68cda91700969e989dde4158d21eed7dce9ad5f7d888ef11cc9946168745fbe334c018c763896ed8524ddabc2a60998b2f3fc24b04355b2c6dd780519814e086d6056964234eb27e1ce5706e39fc96c503d0ec9566e144b7f0d3dd8f19ec9a7ccfa5cb07cc0a9c1a9a1b962e661e73dbe4b8303d8e36ff030c4fdf7ac788b104695e9ce44799f44503bd5c8c09af8883144a55ad8000e3bc8b24fcc8268885856f83788fb09d249600e6c1b1f160ca7616b1633fa59b47a394a576996d541265412ab623a79513326d3b07b601765a52b92c2504beb067df07335392dcaa54c3b15996d9d04eb9f1cdc5950814188852c28616e5499181e1f30740dd8d400d11db1a3c345541773290658d14dbaeb3dd266037139ab0b41d30d316ffb5a5094b37ad4295394ea0917c285dbc287152b288244d891b7e83cfefe781e03c06e65c61b0625a258ba2136be08d644897f4169c985ed8d07629094f74f42007c81622cf487177a0fdd5d3586977eb028daa67b8c205683c672ebca2ee88a051a4d81214060b52ec8c24bd2fe2384769417613787be0d0e8d637781c4cc7ba9e9a17d261f0a814a535b4488f360058fe0040367536adba3d7280d722ae1850886c17fffdf831d7eb36a4967b77879835f1cc574424315aa446729869a211099d559deace696f0714a863c0565d8b341c42d8bb2a8d95431bb4f48eafd9b1eb70e4717b182c53e23f2174503e2ee96070784264251c7a513b7e73c798e9ffbb33d9c403c5c3ac3b030f63e9d4d11a455e3beb99dba2543cdc81c8599f82697ff6c2f47f3b4b294dbfdf40758dbca2a1c3ca80ef3375e31727da6ef1bc999e0eb8311078cf10ced5136db7b03b00d41ff67c55d2037f7699255112705395c333bf7c4d9c0801e9efc68d8123dd4cf94a3aa612df53d0eadb2fc81950481d9c90321740fcf1e5c54d77f2a0cbae74f87419ad807dbaad83773be999dfddf9d7ba0b60f2770eb5913ecf41669ec1c03e4d01f466050e68f19225dc46562fa4bbcb3e66c5d5eae73e15c7fa338321281f6bece1863d75a846a2c43523809972e6762fcde1fac6bb337f30c0777758b0bb3ce18021fae6a74401365f5c5929d8942ba76d1ef31cb3a491d9a60d007bb167fcb44e737b976be8f15d96f9561a055c4d9885a52c1890af88b1c1ca964450bea689407223b4df1ce7ec7d015cb82f90a2c581d24cc6f13d39899d20b5dfc9f3a12291322a814c2800c39c44e8bc22417ab046f9fec02af8b798d21038e39568139c644b6429d37495a7714d8365188e4f6f8594d9c98a254e77a15cd6b1f4543b0f323667b96375d019c7742a982ce6a6ad5284f8a9203dd1e1d12ba85b657d3dc49bb661eafaefa13ecaf5026873254151d6abc996f7aec15b847dac35f761b7c800464c54abf4510d59cf8201ba26bc88f9fa2e72630459005ef4632503b5c211fa0255dd7a63afe7f33f0708dce375c0236c3ac9df0b82eb018432ad5c7b3dfddb202dc5a974f5f14c339c4be6cf410bb73d9fab1982771487b9407f0823346884431a32809e90a8248e5725d16029b4e39d7e1f8b2a299f55baa7d0846ee491ac84abf738cc4bdde97bb39b7150ab8f6988a57979f3b9e055cce867be8ed62d963428c4d1950b77d834c37f9fa7fb7a038e41b1cb1aff48fc6875a5ed5e3662d7c462d6440dedc0b5fb403375cbe1b5deabda06aa86dff12cf7249c942ef6788aee1bf0ed6292ddfdcaad173ee6e987f386cbff122bd910e856238b415819bafe1b03" ], "rawHeaders": { "access-control-allow-origin": "*", "cdn-cache-control": "max-age=300", - "cf-ray": "9358ea26bac719db-LAX", + "cf-ray": "93ecb9839aadf20b-LAX", "connection": "close", "content-encoding": "br", "content-type": "application/json", - "date": "Thu, 24 Apr 2025 22:07:38 GMT", + "date": "Mon, 12 May 2025 20:39:18 GMT", "server": "cloudflare", "transfer-encoding": "chunked", "vary": "Accept-Encoding" diff --git a/src/api/providers/fetchers/__tests__/openrouter.test.ts b/src/api/providers/fetchers/__tests__/openrouter.test.ts index 4874575b3f..c05649078e 100644 --- a/src/api/providers/fetchers/__tests__/openrouter.test.ts +++ b/src/api/providers/fetchers/__tests__/openrouter.test.ts @@ -13,6 +13,7 @@ nockBack.setMode("lockdown") describe("OpenRouter API", () => { describe("getOpenRouterModels", () => { + // This flakes in CI (probably related to Nock). Need to figure out why. it.skip("fetches models and validates schema", async () => { const { nockDone } = await nockBack("openrouter-models.json") @@ -66,12 +67,12 @@ describe("OpenRouter API", () => { supportsComputerUse: true, }) - expect( - Object.entries(models) - .filter(([id, _]) => id.startsWith("anthropic/claude-3")) - .map(([id, model]) => ({ id, maxTokens: model.maxTokens })) - .sort(({ id: a }, { id: b }) => a.localeCompare(b)), - ).toEqual([ + const anthropicModels = Object.entries(models) + .filter(([id, _]) => id.startsWith("anthropic/claude-3")) + .map(([id, model]) => ({ id, maxTokens: model.maxTokens })) + .sort(({ id: a }, { id: b }) => a.localeCompare(b)) + + expect(anthropicModels).toEqual([ { id: "anthropic/claude-3-haiku", maxTokens: 4096 }, { id: "anthropic/claude-3-haiku:beta", maxTokens: 4096 }, { id: "anthropic/claude-3-opus", maxTokens: 4096 }, diff --git a/src/api/providers/fetchers/openrouter.ts b/src/api/providers/fetchers/openrouter.ts index 24db5f4093..27b6c3f9dc 100644 --- a/src/api/providers/fetchers/openrouter.ts +++ b/src/api/providers/fetchers/openrouter.ts @@ -1,13 +1,7 @@ import axios from "axios" import { z } from "zod" -import { - ApiHandlerOptions, - ModelInfo, - anthropicModels, - COMPUTER_USE_MODELS, - OPTIONAL_PROMPT_CACHING_MODELS, -} from "../../../shared/api" +import { ApiHandlerOptions, ModelInfo, anthropicModels, COMPUTER_USE_MODELS } from "../../../shared/api" import { parseApiPrice } from "../../../utils/cost" // https://openrouter.ai/api/v1/models @@ -72,7 +66,7 @@ export async function getOpenRouterModels(options?: ApiHandlerOptions): Promise< typeof cacheWritesPrice !== "undefined" && typeof cacheReadsPrice !== "undefined" const modelInfo: ModelInfo = { - maxTokens: 0, + maxTokens: rawModel.id.startsWith("anthropic/") ? rawModel.top_provider?.max_completion_tokens : 0, contextWindow: rawModel.context_length, supportsImages: rawModel.architecture?.modality?.includes("image"), supportsPromptCache, @@ -90,11 +84,6 @@ export async function getOpenRouterModels(options?: ApiHandlerOptions): Promise< modelInfo.supportsComputerUse = true } - // We want to treat prompt caching as "experimental" for these models. - if (OPTIONAL_PROMPT_CACHING_MODELS.has(rawModel.id)) { - modelInfo.isPromptCacheOptional = true - } - // Claude 3.7 Sonnet is a "hybrid" thinking model, and the `maxTokens` // values can be configured. For the non-thinking variant we want to // use 8k. The `thinking` variant can be run in 64k and 128k modes, diff --git a/src/api/providers/gemini.ts b/src/api/providers/gemini.ts index e4547df91a..d519d5e629 100644 --- a/src/api/providers/gemini.ts +++ b/src/api/providers/gemini.ts @@ -3,33 +3,18 @@ import { GoogleGenAI, type GenerateContentResponseUsageMetadata, type GenerateContentParameters, - type Content, + type GenerateContentConfig, } from "@google/genai" import type { JWTInput } from "google-auth-library" -import NodeCache from "node-cache" import { ApiHandlerOptions, ModelInfo, GeminiModelId, geminiDefaultModelId, geminiModels } from "../../shared/api" import { safeJsonParse } from "../../shared/safeJsonParse" import { SingleCompletionHandler } from "../index" -import { - convertAnthropicContentToGemini, - convertAnthropicMessageToGemini, - getMessagesLength, -} from "../transform/gemini-format" +import { convertAnthropicContentToGemini, convertAnthropicMessageToGemini } from "../transform/gemini-format" import type { ApiStream } from "../transform/stream" import { BaseProvider } from "./base-provider" -const CACHE_TTL = 5 -const CACHE_WRITE_FREQUENCY = 10 -const CONTEXT_CACHE_TOKEN_MINIMUM = 4096 - -type CacheEntry = { - key: string - count: number - tokens?: number -} - type GeminiHandlerOptions = ApiHandlerOptions & { isVertex?: boolean } @@ -38,8 +23,6 @@ export class GeminiHandler extends BaseProvider implements SingleCompletionHandl protected options: ApiHandlerOptions private client: GoogleGenAI - private contentCaches: NodeCache - private isCacheBusy = false constructor({ isVertex, ...options }: GeminiHandlerOptions) { super() @@ -69,78 +52,25 @@ export class GeminiHandler extends BaseProvider implements SingleCompletionHandl : isVertex ? new GoogleGenAI({ vertexai: true, project, location }) : new GoogleGenAI({ apiKey }) - - this.contentCaches = new NodeCache({ stdTTL: 5 * 60, checkperiod: 5 * 60 }) } - async *createMessage( - systemInstruction: string, - messages: Anthropic.Messages.MessageParam[], - cacheKey?: string, - ): ApiStream { + async *createMessage(systemInstruction: string, messages: Anthropic.Messages.MessageParam[]): ApiStream { const { id: model, thinkingConfig, maxOutputTokens, info } = this.getModel() const contents = messages.map(convertAnthropicMessageToGemini) - const contentsLength = systemInstruction.length + getMessagesLength(contents) - let uncachedContent: Content[] | undefined = undefined - let cachedContent: string | undefined = undefined - - // The minimum input token count for context caching is 4,096. - // For a basic approximation we assume 4 characters per token. - // We can use tiktoken eventually to get a more accurat token count. - // https://ai.google.dev/gemini-api/docs/caching?lang=node - // https://ai.google.dev/gemini-api/docs/tokens?lang=node - const isCacheAvailable = - info.supportsPromptCache && - !this.options.promptCachingDisabled && - cacheKey && - contentsLength > 4 * CONTEXT_CACHE_TOKEN_MINIMUM - - let isCacheWriteQueued = false - - if (isCacheAvailable) { - const cacheEntry = this.contentCaches.get(cacheKey) - - if (cacheEntry) { - uncachedContent = contents.slice(cacheEntry.count, contents.length) - cachedContent = cacheEntry.key - // console.log( - // `[GeminiHandler] using cache entry ${cacheEntry.key} -> ${cacheEntry.count} messages, ${cacheEntry.tokens} tokens (+${uncachedContent.length} uncached messages)`, - // ) - } - - // If `CACHE_WRITE_FREQUENCY` messages have been appended since the - // last cache write then write a new cache entry. - // TODO: Use a token count instead. - if (!cacheEntry || (uncachedContent && uncachedContent.length >= CACHE_WRITE_FREQUENCY)) { - isCacheWriteQueued = true - } + const config: GenerateContentConfig = { + systemInstruction, + httpOptions: this.options.googleGeminiBaseUrl ? { baseUrl: this.options.googleGeminiBaseUrl } : undefined, + thinkingConfig, + maxOutputTokens, + temperature: this.options.modelTemperature ?? 0, } - const isCacheUsed = !!cachedContent - - const params: GenerateContentParameters = { - model, - contents: uncachedContent ?? contents, - config: { - cachedContent, - systemInstruction: isCacheUsed ? undefined : systemInstruction, - httpOptions: this.options.googleGeminiBaseUrl - ? { baseUrl: this.options.googleGeminiBaseUrl } - : undefined, - thinkingConfig, - maxOutputTokens, - temperature: this.options.modelTemperature ?? 0, - }, - } + const params: GenerateContentParameters = { model, contents, config } const result = await this.client.models.generateContentStream(params) - if (cacheKey && isCacheWriteQueued) { - this.writeCache({ cacheKey, model, systemInstruction, contents }) - } - let lastUsageMetadata: GenerateContentResponseUsageMetadata | undefined for await (const chunk of result) { @@ -156,7 +86,6 @@ export class GeminiHandler extends BaseProvider implements SingleCompletionHandl if (lastUsageMetadata) { const inputTokens = lastUsageMetadata.promptTokenCount ?? 0 const outputTokens = lastUsageMetadata.candidatesTokenCount ?? 0 - const cacheWriteTokens = isCacheWriteQueued ? inputTokens : undefined const cacheReadTokens = lastUsageMetadata.cachedContentTokenCount const reasoningTokens = lastUsageMetadata.thoughtsTokenCount @@ -164,16 +93,9 @@ export class GeminiHandler extends BaseProvider implements SingleCompletionHandl type: "usage", inputTokens, outputTokens, - cacheWriteTokens, cacheReadTokens, reasoningTokens, - totalCost: this.calculateCost({ - info, - inputTokens, - outputTokens, - cacheWriteTokens, - cacheReadTokens, - }), + totalCost: this.calculateCost({ info, inputTokens, outputTokens, cacheReadTokens }), } } } @@ -257,22 +179,19 @@ export class GeminiHandler extends BaseProvider implements SingleCompletionHandl info, inputTokens, outputTokens, - cacheWriteTokens = 0, cacheReadTokens = 0, }: { info: ModelInfo inputTokens: number outputTokens: number - cacheWriteTokens?: number cacheReadTokens?: number }) { - if (!info.inputPrice || !info.outputPrice || !info.cacheWritesPrice || !info.cacheReadsPrice) { + if (!info.inputPrice || !info.outputPrice || !info.cacheReadsPrice) { return undefined } let inputPrice = info.inputPrice let outputPrice = info.outputPrice - let cacheWritesPrice = info.cacheWritesPrice let cacheReadsPrice = info.cacheReadsPrice // If there's tiered pricing then adjust the input and output token prices @@ -283,7 +202,6 @@ export class GeminiHandler extends BaseProvider implements SingleCompletionHandl if (tier) { inputPrice = tier.inputPrice ?? inputPrice outputPrice = tier.outputPrice ?? outputPrice - cacheWritesPrice = tier.cacheWritesPrice ?? cacheWritesPrice cacheReadsPrice = tier.cacheReadsPrice ?? cacheReadsPrice } } @@ -291,23 +209,17 @@ export class GeminiHandler extends BaseProvider implements SingleCompletionHandl // Subtract the cached input tokens from the total input tokens. const uncachedInputTokens = inputTokens - cacheReadTokens - let cacheWriteCost = - cacheWriteTokens > 0 ? cacheWritesPrice * (cacheWriteTokens / 1_000_000) * (CACHE_TTL / 60) : 0 let cacheReadCost = cacheReadTokens > 0 ? cacheReadsPrice * (cacheReadTokens / 1_000_000) : 0 const inputTokensCost = inputPrice * (uncachedInputTokens / 1_000_000) const outputTokensCost = outputPrice * (outputTokens / 1_000_000) - const totalCost = inputTokensCost + outputTokensCost + cacheWriteCost + cacheReadCost + const totalCost = inputTokensCost + outputTokensCost + cacheReadCost const trace: Record = { input: { price: inputPrice, tokens: uncachedInputTokens, cost: inputTokensCost }, output: { price: outputPrice, tokens: outputTokens, cost: outputTokensCost }, } - if (cacheWriteTokens > 0) { - trace.cacheWrite = { price: cacheWritesPrice, tokens: cacheWriteTokens, cost: cacheWriteCost } - } - if (cacheReadTokens > 0) { trace.cacheRead = { price: cacheReadsPrice, tokens: cacheReadTokens, cost: cacheReadCost } } @@ -316,77 +228,4 @@ export class GeminiHandler extends BaseProvider implements SingleCompletionHandl return totalCost } - - private writeCache({ - cacheKey, - model, - systemInstruction, - contents, - }: { - cacheKey: string - model: string - systemInstruction: string - contents: Content[] - }) { - // TODO: https://www.npmjs.com/package/p-queue - if (this.isCacheBusy) { - return - } - - this.isCacheBusy = true - // const timestamp = Date.now() - - const previousCacheEntry = this.contentCaches.get(cacheKey) - - this.client.caches - .create({ - model, - config: { - contents, - systemInstruction, - ttl: `${CACHE_TTL * 60}s`, - httpOptions: { timeout: 120_000 }, - }, - }) - .then((result) => { - const { name, usageMetadata } = result - - if (name) { - const newCacheEntry: CacheEntry = { - key: name, - count: contents.length, - tokens: usageMetadata?.totalTokenCount, - } - - this.contentCaches.set(cacheKey, newCacheEntry) - - // console.log( - // `[GeminiHandler] created cache entry ${newCacheEntry.key} -> ${newCacheEntry.count} messages, ${newCacheEntry.tokens} tokens (${Date.now() - timestamp}ms)`, - // ) - - if (previousCacheEntry) { - // const timestamp = Date.now() - - this.client.caches - .delete({ name: previousCacheEntry.key }) - .then(() => { - // console.log( - // `[GeminiHandler] deleted cache entry ${previousCacheEntry.key} -> ${previousCacheEntry.count} messages, ${previousCacheEntry.tokens} tokens (${Date.now() - timestamp}ms)`, - // ) - }) - .catch((error) => { - console.error( - `[GeminiHandler] failed to delete stale cache entry ${previousCacheEntry.key} -> ${error instanceof Error ? error.message : String(error)}`, - ) - }) - } - } - }) - .catch((error) => { - console.error(`[GeminiHandler] caches.create error`, error) - }) - .finally(() => { - this.isCacheBusy = false - }) - } } diff --git a/src/api/providers/openrouter.ts b/src/api/providers/openrouter.ts index 1eec393021..39694c8baa 100644 --- a/src/api/providers/openrouter.ts +++ b/src/api/providers/openrouter.ts @@ -8,7 +8,6 @@ import { openRouterDefaultModelId, openRouterDefaultModelInfo, PROMPT_CACHING_MODELS, - OPTIONAL_PROMPT_CACHING_MODELS, REASONING_MODELS, } from "../../shared/api" @@ -94,7 +93,7 @@ export class OpenRouterHandler extends BaseProvider implements SingleCompletionH openAiMessages = convertToR1Format([{ role: "user", content: systemPrompt }, ...messages]) } - const isCacheAvailable = promptCache.supported && (!promptCache.optional || !this.options.promptCachingDisabled) + const isCacheAvailable = promptCache.supported // https://openrouter.ai/docs/features/prompt-caching if (isCacheAvailable) { @@ -191,7 +190,6 @@ export class OpenRouterHandler extends BaseProvider implements SingleCompletionH topP: isDeepSeekR1 ? 0.95 : undefined, promptCache: { supported: PROMPT_CACHING_MODELS.has(id), - optional: OPTIONAL_PROMPT_CACHING_MODELS.has(id), }, } } diff --git a/src/api/transform/gemini-format.ts b/src/api/transform/gemini-format.ts index be08d7ff7b..ee22cff32a 100644 --- a/src/api/transform/gemini-format.ts +++ b/src/api/transform/gemini-format.ts @@ -76,9 +76,3 @@ export function convertAnthropicMessageToGemini(message: Anthropic.Messages.Mess parts: convertAnthropicContentToGemini(message.content), } } - -const getContentLength = ({ parts }: Content): number => - parts?.reduce((length, { text }) => length + (text?.length ?? 0), 0) ?? 0 - -export const getMessagesLength = (contents: Content[]): number => - contents.reduce((length, content) => length + getContentLength(content), 0) diff --git a/src/core/task/Task.ts b/src/core/task/Task.ts index 05c9785452..0f5029be9a 100644 --- a/src/core/task/Task.ts +++ b/src/core/task/Task.ts @@ -132,7 +132,6 @@ export class Task extends EventEmitter { // API readonly apiConfiguration: ProviderSettings api: ApiHandler - private promptCacheKey: string private lastApiRequestTime?: number toolRepetitionDetector: ToolRepetitionDetector @@ -225,7 +224,6 @@ export class Task extends EventEmitter { this.apiConfiguration = apiConfiguration this.api = buildApiHandler(apiConfiguration) - this.promptCacheKey = crypto.randomUUID() this.urlContentFetcher = new UrlContentFetcher(provider.context) this.browserSession = new BrowserSession(provider.context) @@ -324,8 +322,6 @@ export class Task extends EventEmitter { } public async overwriteClineMessages(newMessages: ClineMessage[]) { - // Reset the the prompt cache key since we've altered the conversation history. - this.promptCacheKey = crypto.randomUUID() this.clineMessages = newMessages await this.saveClineMessages() } @@ -1493,7 +1489,7 @@ export class Task extends EventEmitter { return { role, content } }) - const stream = this.api.createMessage(systemPrompt, cleanConversationHistory, this.promptCacheKey) + const stream = this.api.createMessage(systemPrompt, cleanConversationHistory) const iterator = stream[Symbol.asyncIterator]() try { diff --git a/src/exports/roo-code.d.ts b/src/exports/roo-code.d.ts index 59ca2fe240..3ac8b366f6 100644 --- a/src/exports/roo-code.d.ts +++ b/src/exports/roo-code.d.ts @@ -198,7 +198,6 @@ type ProviderSettings = { | undefined includeMaxTokens?: boolean | undefined reasoningEffort?: ("low" | "medium" | "high") | undefined - promptCachingDisabled?: boolean | undefined diffEnabled?: boolean | undefined fuzzyMatchThreshold?: number | undefined modelTemperature?: (number | null) | undefined @@ -242,7 +241,6 @@ type ProviderSettings = { supportsImages?: boolean | undefined supportsComputerUse?: boolean | undefined supportsPromptCache: boolean - isPromptCacheOptional?: boolean | undefined inputPrice?: number | undefined outputPrice?: number | undefined cacheWritesPrice?: number | undefined diff --git a/src/exports/types.ts b/src/exports/types.ts index 8d1a02e979..e19e2fbcdb 100644 --- a/src/exports/types.ts +++ b/src/exports/types.ts @@ -201,7 +201,6 @@ type ProviderSettings = { | undefined includeMaxTokens?: boolean | undefined reasoningEffort?: ("low" | "medium" | "high") | undefined - promptCachingDisabled?: boolean | undefined diffEnabled?: boolean | undefined fuzzyMatchThreshold?: number | undefined modelTemperature?: (number | null) | undefined @@ -245,7 +244,6 @@ type ProviderSettings = { supportsImages?: boolean | undefined supportsComputerUse?: boolean | undefined supportsPromptCache: boolean - isPromptCacheOptional?: boolean | undefined inputPrice?: number | undefined outputPrice?: number | undefined cacheWritesPrice?: number | undefined diff --git a/src/schemas/index.ts b/src/schemas/index.ts index 8f37eca244..fa3fef0bfc 100644 --- a/src/schemas/index.ts +++ b/src/schemas/index.ts @@ -109,7 +109,6 @@ export const modelInfoSchema = z.object({ supportsImages: z.boolean().optional(), supportsComputerUse: z.boolean().optional(), supportsPromptCache: z.boolean(), - isPromptCacheOptional: z.boolean().optional(), inputPrice: z.number().optional(), outputPrice: z.number().optional(), cacheWritesPrice: z.number().optional(), @@ -348,7 +347,6 @@ export type ProviderSettingsEntry = z.infer const baseProviderSettingsSchema = z.object({ includeMaxTokens: z.boolean().optional(), reasoningEffort: reasoningEffortsSchema.optional(), - promptCachingDisabled: z.boolean().optional(), diffEnabled: z.boolean().optional(), fuzzyMatchThreshold: z.number().optional(), modelTemperature: z.number().nullish(), @@ -629,7 +627,6 @@ const providerSettingsRecord: ProviderSettingsRecord = { // Generic includeMaxTokens: undefined, reasoningEffort: undefined, - promptCachingDisabled: undefined, diffEnabled: undefined, fuzzyMatchThreshold: undefined, modelTemperature: undefined, diff --git a/src/shared/api.ts b/src/shared/api.ts index 17d2b14dd4..afe994fbf7 100644 --- a/src/shared/api.ts +++ b/src/shared/api.ts @@ -496,7 +496,6 @@ export const vertexModels = { contextWindow: 1_048_576, supportsImages: true, supportsPromptCache: true, - isPromptCacheOptional: true, inputPrice: 2.5, outputPrice: 15, }, @@ -505,7 +504,6 @@ export const vertexModels = { contextWindow: 1_048_576, supportsImages: true, supportsPromptCache: true, - isPromptCacheOptional: true, inputPrice: 2.5, outputPrice: 15, }, @@ -530,7 +528,6 @@ export const vertexModels = { contextWindow: 1_048_576, supportsImages: true, supportsPromptCache: true, - isPromptCacheOptional: true, inputPrice: 0.15, outputPrice: 0.6, }, @@ -555,7 +552,6 @@ export const vertexModels = { contextWindow: 1_048_576, supportsImages: true, supportsPromptCache: true, - isPromptCacheOptional: true, inputPrice: 0.075, outputPrice: 0.3, }, @@ -690,7 +686,6 @@ export const geminiModels = { contextWindow: 1_048_576, supportsImages: true, supportsPromptCache: true, - isPromptCacheOptional: true, inputPrice: 2.5, // This is the pricing for prompts above 200k tokens. outputPrice: 15, cacheReadsPrice: 0.625, @@ -715,7 +710,6 @@ export const geminiModels = { contextWindow: 1_048_576, supportsImages: true, supportsPromptCache: true, - isPromptCacheOptional: true, inputPrice: 2.5, // This is the pricing for prompts above 200k tokens. outputPrice: 15, cacheReadsPrice: 0.625, @@ -740,7 +734,6 @@ export const geminiModels = { contextWindow: 1_048_576, supportsImages: true, supportsPromptCache: true, - isPromptCacheOptional: true, inputPrice: 0.1, outputPrice: 0.4, cacheReadsPrice: 0.025, @@ -791,7 +784,6 @@ export const geminiModels = { contextWindow: 1_048_576, supportsImages: true, supportsPromptCache: true, - isPromptCacheOptional: true, inputPrice: 0.15, // This is the pricing for prompts above 128k tokens. outputPrice: 0.6, cacheReadsPrice: 0.0375, @@ -1717,18 +1709,9 @@ export const PROMPT_CACHING_MODELS = new Set([ "anthropic/claude-3.7-sonnet", "anthropic/claude-3.7-sonnet:beta", "anthropic/claude-3.7-sonnet:thinking", - "google/gemini-2.5-pro-preview-03-25", - "google/gemini-2.5-pro-preview-05-06", - "google/gemini-2.0-flash-001", - "google/gemini-flash-1.5", - "google/gemini-flash-1.5-8b", -]) - -// These models don't have prompt caching enabled by default (you can turn it on -// in settings). -export const OPTIONAL_PROMPT_CACHING_MODELS = new Set([ - "google/gemini-2.5-pro-preview-03-25", - "google/gemini-2.5-pro-preview-05-06", + "google/gemini-2.5-pro-preview", + "google/gemini-2.5-flash-preview", + "google/gemini-2.5-flash-preview:thinking", "google/gemini-2.0-flash-001", "google/gemini-flash-1.5", "google/gemini-flash-1.5-8b", diff --git a/webview-ui/src/components/settings/ApiOptions.tsx b/webview-ui/src/components/settings/ApiOptions.tsx index 52fd1c0d3b..a8b4deb73d 100644 --- a/webview-ui/src/components/settings/ApiOptions.tsx +++ b/webview-ui/src/components/settings/ApiOptions.tsx @@ -48,7 +48,6 @@ import { ModelInfoView } from "./ModelInfoView" import { ApiErrorMessage } from "./ApiErrorMessage" import { ThinkingBudget } from "./ThinkingBudget" import { ReasoningEffort } from "./ReasoningEffort" -import { PromptCachingControl } from "./PromptCachingControl" import { DiffSettingsControl } from "./DiffSettingsControl" import { TemperatureControl } from "./TemperatureControl" import { RateLimitSecondsControl } from "./RateLimitSecondsControl" @@ -469,13 +468,6 @@ const ApiOptions = ({ /> )} - {selectedModelInfo && selectedModelInfo.supportsPromptCache && selectedModelInfo.isPromptCacheOptional && ( - - )} - {!fromWelcomeView && ( <> (field: K, value: ProviderSettings[K]) => void -} - -export const PromptCachingControl = ({ apiConfiguration, setApiConfigurationField }: PromptCachingControlProps) => { - const { t } = useAppTranslation() - - return ( - <> -
- setApiConfigurationField("promptCachingDisabled", e.target.checked)}> - - -
- {t("settings:promptCaching.description")} -
-
- - ) -}