From 25c59817b5992a3309daba55e64a7fa2085d1335 Mon Sep 17 00:00:00 2001 From: Jeremy Meredith Date: Thu, 2 May 2019 16:58:50 -0600 Subject: [PATCH 001/262] Update Drive Activity sample code with bug fixes and updates. The v2 API sample was updated to use the new "drive" elements, and versions were updated to point to the latest client libraries. Bugs were also fixed for both the v1 and v2 APIs. --- drive/activity-v2/quickstart/build.gradle | 6 +++--- .../src/main/java/DriveActivityQuickstart.java | 10 +++++----- .../src/main/java/DriveActivityQuickstart.java | 6 +++--- 3 files changed, 11 insertions(+), 11 deletions(-) diff --git a/drive/activity-v2/quickstart/build.gradle b/drive/activity-v2/quickstart/build.gradle index cedfe72f..964f2f41 100644 --- a/drive/activity-v2/quickstart/build.gradle +++ b/drive/activity-v2/quickstart/build.gradle @@ -11,7 +11,7 @@ repositories { } dependencies { - compile 'com.google.api-client:google-api-client:1.27.0' - compile 'com.google.oauth-client:google-oauth-client-jetty:1.27.0' - compile 'com.google.apis:google-api-services-driveactivity:v2-rev20181113-1.27.0' + compile 'com.google.api-client:google-api-client:1.25.0' + compile 'com.google.oauth-client:google-oauth-client-jetty:1.25.0' + compile 'com.google.apis:google-api-services-driveactivity:v2-rev76-1.25.0' } diff --git a/drive/activity-v2/quickstart/src/main/java/DriveActivityQuickstart.java b/drive/activity-v2/quickstart/src/main/java/DriveActivityQuickstart.java index 069ac381..30f9d1cb 100644 --- a/drive/activity-v2/quickstart/src/main/java/DriveActivityQuickstart.java +++ b/drive/activity-v2/quickstart/src/main/java/DriveActivityQuickstart.java @@ -54,11 +54,11 @@ public class DriveActivityQuickstart { /** * Global instance of the scopes required by this quickstart. * - *

If modifying these scopes, delete your previously saved credentials at - * ~/.credentials/driveactivity-java-quickstart + *

If modifying these scopes, delete your previously saved tokens/ folder. */ private static final List SCOPES = Arrays.asList(DriveActivityScopes.DRIVE_ACTIVITY_READONLY); + private static final String CREDENTIALS_FILE_PATH = "/credentials.json"; static { try { @@ -78,7 +78,7 @@ public class DriveActivityQuickstart { */ public static Credential authorize() throws IOException { // Load client secrets. - InputStream in = DriveActivityQuickstart.class.getResourceAsStream("/credentials.json"); + InputStream in = DriveActivityQuickstart.class.getResourceAsStream(CREDENTIALS_FILE_PATH); if (in == null) { throw new FileNotFoundException("Resource not found: " + CREDENTIALS_FILE_PATH); } @@ -200,8 +200,8 @@ private static String getTargetInfo(Target target) { if (target.getDriveItem() != null) { return "driveItem:\"" + target.getDriveItem().getTitle() + "\""; } - if (target.getTeamDrive() != null) { - return "teamDrive:\"" + target.getTeamDrive().getTitle() + "\""; + if (target.getDrive() != null) { + return "drive:\"" + target.getDrive().getTitle() + "\""; } if (target.getFileComment() != null) { DriveItem parent = target.getFileComment().getParent(); diff --git a/drive/activity/quickstart/src/main/java/DriveActivityQuickstart.java b/drive/activity/quickstart/src/main/java/DriveActivityQuickstart.java index 0c59333b..ea0f22bf 100644 --- a/drive/activity/quickstart/src/main/java/DriveActivityQuickstart.java +++ b/drive/activity/quickstart/src/main/java/DriveActivityQuickstart.java @@ -56,10 +56,10 @@ public class DriveActivityQuickstart { /** Global instance of the scopes required by this quickstart. * - * If modifying these scopes, delete your previously saved credentials - * at ~/.credentials/appsactivity-java-quickstart + *

If modifying these scopes, delete your previously saved tokens/ folder. */ private static final List SCOPES = Arrays.asList(AppsactivityScopes.ACTIVITY); + private static final String CREDENTIALS_FILE_PATH = "/credentials.json"; static { try { @@ -79,7 +79,7 @@ public class DriveActivityQuickstart { public static Credential authorize() throws IOException { // Load client secrets. InputStream in = - DriveActivityQuickstart.class.getResourceAsStream("/credentials.json"); + DriveActivityQuickstart.class.getResourceAsStream(CREDENTIALS_FILE_PATH); if (in == null) { throw new FileNotFoundException("Resource not found: " + CREDENTIALS_FILE_PATH); } From 2c30e0eb56a5ffc881d29b8cd6935f8a6436b5e0 Mon Sep 17 00:00:00 2001 From: Jeremy Meredith Date: Fri, 3 May 2019 08:45:34 -0600 Subject: [PATCH 002/262] Resetting Drive Activity v2 back to 1.27 Google API deps. While named revisions (rev76) don't yet support versions past 1.25, there are dated versions which go up to 1.28. (See https://repo1.maven.org/maven2/com/google/apis/google-api-services-driveactivity/.) --- drive/activity-v2/quickstart/build.gradle | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/drive/activity-v2/quickstart/build.gradle b/drive/activity-v2/quickstart/build.gradle index 964f2f41..1c756882 100644 --- a/drive/activity-v2/quickstart/build.gradle +++ b/drive/activity-v2/quickstart/build.gradle @@ -11,7 +11,7 @@ repositories { } dependencies { - compile 'com.google.api-client:google-api-client:1.25.0' - compile 'com.google.oauth-client:google-oauth-client-jetty:1.25.0' - compile 'com.google.apis:google-api-services-driveactivity:v2-rev76-1.25.0' + compile 'com.google.api-client:google-api-client:1.27.0' + compile 'com.google.oauth-client:google-oauth-client-jetty:1.27.0' + compile 'com.google.apis:google-api-services-driveactivity:v2-rev20190423-1.27.0' } From 0c6a21d5bfe1118bd56e5ce819cfe3931a946c71 Mon Sep 17 00:00:00 2001 From: asrivas Date: Sun, 11 Aug 2019 23:48:23 -0400 Subject: [PATCH 003/262] Bump up Editors quickstarts to Java 8 - Ran Intellij Java8 inspection over files - After all quickstarts are updated, move up required version: https://developers.google.com/docs/api/quickstart/java --- docs/quickstart/build.gradle | 4 ++-- sheets/quickstart/build.gradle | 4 ++-- slides/quickstart/build.gradle | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/docs/quickstart/build.gradle b/docs/quickstart/build.gradle index d7a7f09d..7389b86b 100644 --- a/docs/quickstart/build.gradle +++ b/docs/quickstart/build.gradle @@ -2,8 +2,8 @@ apply plugin: 'java' apply plugin: 'application' mainClassName = 'DocsQuickstart' -sourceCompatibility = 1.7 -targetCompatibility = 1.7 +sourceCompatibility = 1.8 +targetCompatibility = 1.8 version = '1.0' repositories { diff --git a/sheets/quickstart/build.gradle b/sheets/quickstart/build.gradle index 08d14122..ade2b272 100644 --- a/sheets/quickstart/build.gradle +++ b/sheets/quickstart/build.gradle @@ -2,8 +2,8 @@ apply plugin: 'java' apply plugin: 'application' mainClassName = 'SheetsQuickstart' -sourceCompatibility = 1.7 -targetCompatibility = 1.7 +sourceCompatibility = 1.8 +targetCompatibility = 1.8 version = '1.0' repositories { diff --git a/slides/quickstart/build.gradle b/slides/quickstart/build.gradle index 2b2da024..8d86e30b 100644 --- a/slides/quickstart/build.gradle +++ b/slides/quickstart/build.gradle @@ -2,8 +2,8 @@ apply plugin: 'java' apply plugin: 'application' mainClassName = 'SlidesQuickstart' -sourceCompatibility = 1.7 -targetCompatibility = 1.7 +sourceCompatibility = 1.8 +targetCompatibility = 1.8 version = '1.0' repositories { From 22f022f970495a63f6fed043311f32d1cce3c45f Mon Sep 17 00:00:00 2001 From: Anu Date: Mon, 12 Aug 2019 11:57:33 -0400 Subject: [PATCH 004/262] Create Output as JSON Java sample (#71) * Create Output as JSON Java sample * Make OutputJSON runnable * Add class level comment and region tags --- docs/outputJSON/build.gradle | 18 ++++ docs/outputJSON/settings.gradle | 1 + docs/outputJSON/src/main/java/OutputJSON.java | 93 +++++++++++++++++++ 3 files changed, 112 insertions(+) create mode 100644 docs/outputJSON/build.gradle create mode 100644 docs/outputJSON/settings.gradle create mode 100644 docs/outputJSON/src/main/java/OutputJSON.java diff --git a/docs/outputJSON/build.gradle b/docs/outputJSON/build.gradle new file mode 100644 index 00000000..401c8edd --- /dev/null +++ b/docs/outputJSON/build.gradle @@ -0,0 +1,18 @@ +apply plugin: 'java' +apply plugin: 'application' + +mainClassName = 'OutputJSON' +sourceCompatibility = 1.8 +targetCompatibility = 1.8 +version = '1.0' + +repositories { + mavenCentral() +} + +dependencies { + compile 'com.google.api-client:google-api-client:1.23.0' + compile 'com.google.oauth-client:google-oauth-client-jetty:1.23.0' + compile 'com.google.apis:google-api-services-docs:v1-rev20190128-1.28.0' + compile group: 'com.google.code.gson', name: 'gson', version: '2.3.1' +} diff --git a/docs/outputJSON/settings.gradle b/docs/outputJSON/settings.gradle new file mode 100644 index 00000000..53938545 --- /dev/null +++ b/docs/outputJSON/settings.gradle @@ -0,0 +1 @@ +rootProject.name = 'outputJSON' diff --git a/docs/outputJSON/src/main/java/OutputJSON.java b/docs/outputJSON/src/main/java/OutputJSON.java new file mode 100644 index 00000000..d64769ad --- /dev/null +++ b/docs/outputJSON/src/main/java/OutputJSON.java @@ -0,0 +1,93 @@ +// Copyright 2018 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import com.google.api.client.auth.oauth2.Credential; +import com.google.api.client.extensions.java6.auth.oauth2.AuthorizationCodeInstalledApp; +import com.google.api.client.extensions.jetty.auth.oauth2.LocalServerReceiver; +import com.google.api.client.googleapis.auth.oauth2.GoogleAuthorizationCodeFlow; +import com.google.api.client.googleapis.auth.oauth2.GoogleClientSecrets; +import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.JsonFactory; +import com.google.api.client.json.jackson2.JacksonFactory; +import com.google.api.client.util.store.FileDataStoreFactory; +import com.google.api.services.docs.v1.Docs; +import com.google.api.services.docs.v1.DocsScopes; +import com.google.api.services.docs.v1.model.Document; +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.security.GeneralSecurityException; +import java.util.Collections; +import java.util.List; + +// [START docs_output_json] +/** + * OutputJSON prints the JSON representation of a Google Doc. + */ +public class OutputJSON { + private static final String APPLICATION_NAME = "Google Docs API Document Contents"; + private static final JsonFactory JSON_FACTORY = JacksonFactory.getDefaultInstance(); + private static final String TOKENS_DIRECTORY_PATH = "tokens"; + private static final String DOCUMENT_ID = "YOUR_DOCUMENT_ID"; + + /** + * Global instance of the scopes required by this sample. If modifying these scopes, delete + * your previously saved tokens/ folder. + */ + private static final List SCOPES = + Collections.singletonList(DocsScopes.DOCUMENTS_READONLY); + + private static final String CREDENTIALS_FILE_PATH = "/credentials.json"; + + /** + * Creates an authorized Credential object. + * + * @param HTTP_TRANSPORT The network HTTP Transport. + * @return An authorized Credential object. + * @throws IOException If the credentials.json file cannot be found. + */ + private static Credential getCredentials(final NetHttpTransport HTTP_TRANSPORT) + throws IOException { + // Load client secrets. + InputStream in = OutputJSON.class.getResourceAsStream(CREDENTIALS_FILE_PATH); + GoogleClientSecrets credentials = + GoogleClientSecrets.load(JSON_FACTORY, new InputStreamReader(in)); + + // Build flow and trigger user authorization request. + GoogleAuthorizationCodeFlow flow = + new GoogleAuthorizationCodeFlow.Builder(HTTP_TRANSPORT, JSON_FACTORY, credentials, SCOPES) + .setDataStoreFactory(new FileDataStoreFactory(new java.io.File(TOKENS_DIRECTORY_PATH))) + .setAccessType("offline") + .build(); + LocalServerReceiver receiver = new LocalServerReceiver.Builder().setPort(8888).build(); + return new AuthorizationCodeInstalledApp(flow, receiver).authorize("user"); + } + + public static void main(String... args) throws IOException, GeneralSecurityException { + // Build a new authorized API client service. + final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport(); + Docs docsService = + new Docs.Builder(HTTP_TRANSPORT, JSON_FACTORY, getCredentials(HTTP_TRANSPORT)) + .setApplicationName(APPLICATION_NAME) + .build(); + + Document response = docsService.documents().get(DOCUMENT_ID).execute(); + Gson gson = new GsonBuilder().setPrettyPrinting().create(); + System.out.println(gson.toJson(response)); + } +} +// [END docs_output_json] From 34846383a327169acfc5c33248751c5c039abe5e Mon Sep 17 00:00:00 2001 From: Grant Timmerman Date: Wed, 14 Aug 2019 17:01:15 -0700 Subject: [PATCH 005/262] fix: Remove Drive URL from Slides snippets --- slides/snippets/src/main/java/Snippets.java | 25 +++---------------- .../snippets/src/test/java/SnippetsTest.java | 5 +--- 2 files changed, 4 insertions(+), 26 deletions(-) diff --git a/slides/snippets/src/main/java/Snippets.java b/slides/snippets/src/main/java/Snippets.java index 1b8512f8..07c0a342 100644 --- a/slides/snippets/src/main/java/Snippets.java +++ b/slides/snippets/src/main/java/Snippets.java @@ -121,29 +121,13 @@ public BatchUpdatePresentationResponse createTextBoxWithText( public BatchUpdatePresentationResponse createImage(String presentationId, String slideId, - String imageFilePath, - String imageMimeType, GoogleCredential credential) throws IOException { Slides slidesService = this.service; - Drive driveService = this.driveService; // [START slides_create_image] - // Temporarily upload a local image file to Drive, in order to to obtain a URL - // for the image. Alternatively, you can provide the Slides service a URL of - // an already hosted image. - File file = new File(); - file.setName("My Image File"); - FileContent mediaContent = new FileContent(imageMimeType, new java.io.File(imageFilePath)); - File uploadedFile = driveService.files().create(file, mediaContent).execute(); - String fileId = uploadedFile.getId(); - - // Obtain a URL for the image. - GenericUrl getFileUrlBuilder = driveService.files().get(fileId).buildHttpRequestUrl(); - String imageUrl = getFileUrlBuilder - .set("access_token", credential.getAccessToken()) - .set("alt", "media").build(); - - // Create a new image, using a supplied object ID, with content downloaded from imageUrl. + String imageUrl = "https://www.google.com/images/branding/googlelogo/2x/googlelogo_color_272x92dp.png"; + + // Create a new image, using the supplied object ID, with content downloaded from imageUrl. List requests = new ArrayList<>(); String imageId = "MyImageId_01"; Dimension emu4M = new Dimension().setMagnitude(4000000.0).setUnit("EMU"); @@ -170,9 +154,6 @@ public BatchUpdatePresentationResponse createImage(String presentationId, slidesService.presentations().batchUpdate(presentationId, body).execute(); CreateImageResponse createImageResponse = response.getReplies().get(0).getCreateImage(); System.out.println("Created image with ID: " + createImageResponse.getObjectId()); - - // Remove the temporary image file from Drive. - driveService.files().delete(fileId).execute(); // [END slides_create_image] return response; } diff --git a/slides/snippets/src/test/java/SnippetsTest.java b/slides/snippets/src/test/java/SnippetsTest.java index dac1de60..ec2a4ce7 100644 --- a/slides/snippets/src/test/java/SnippetsTest.java +++ b/slides/snippets/src/test/java/SnippetsTest.java @@ -15,9 +15,6 @@ public class SnippetsTest extends BaseTest { private final String IMAGE_URL = "https://www.google.com/images/branding/googlelogo/2x/googlelogo_color_272x92dp.png"; - private final String IMAGE_FILE_PATH = - "../images/googlelogo_color_272x92dp.png"; - private final String IMAGE_MIMETYPE = "image/png"; private final String TEMPLATE_PRESENTATION_ID = "1wJUN1B5CQ2wQOBzmz2apky48QNK1OsE2oNKHPMLpKDc"; private final String DATA_SPREADSHEET_ID = "14KaZMq2aCAGt5acV77zaA_Ps8aDt04G7T0ei4KiXLX8"; private final Integer CHART_ID = 1107320627; @@ -70,7 +67,7 @@ public void testCreateImage() throws IOException { String presentationId = this.createTestPresentation(); String pageId = this.createTestSlide(presentationId); BatchUpdatePresentationResponse response = this.snippets.createImage( - presentationId, pageId, IMAGE_FILE_PATH, IMAGE_MIMETYPE, this.credential); + presentationId, pageId, this.credential); assertEquals(1, response.getReplies().size()); String imageId = response.getReplies().get(0).getCreateImage().getObjectId(); assertNotNull(imageId); From c0ddc847cd14a7560275ec64896600279cd47067 Mon Sep 17 00:00:00 2001 From: Grant Timmerman Date: Thu, 15 Aug 2019 10:32:02 -0700 Subject: [PATCH 006/262] fix: Use JDK 11 (8 is broken) (#84) --- .travis.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index ca28a01d..c8b5032d 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,7 +1,6 @@ language: java jdk: - - oraclejdk8 - # - oraclejdk9 + - oraclejdk11 # Use a Build Matrix for subdirs (https://lord.io/blog/2014/travis-multiple-subdirs/) env: - DIR=adminSDK/alertcenter/quickstart From b8d12b7e4c05e7b847a88444466a2d2b315451e4 Mon Sep 17 00:00:00 2001 From: asrivas Date: Thu, 22 Aug 2019 15:10:12 -0400 Subject: [PATCH 007/262] Update Java Quickstarts to Java 8 --- adminSDK/directory/quickstart/build.gradle | 4 ++-- adminSDK/reports/quickstart/build.gradle | 4 ++-- adminSDK/reseller/quickstart/build.gradle | 4 ++-- appsScript/quickstart/build.gradle | 4 ++-- classroom/quickstart/build.gradle | 4 ++-- drive/activity/quickstart/build.gradle | 4 ++-- drive/quickstart/build.gradle | 4 ++-- gmail/quickstart/build.gradle | 4 ++-- people/quickstart/build.gradle | 5 +++-- tasks/quickstart/build.gradle | 4 ++-- vault/quickstart/build.gradle | 4 ++-- 11 files changed, 23 insertions(+), 22 deletions(-) diff --git a/adminSDK/directory/quickstart/build.gradle b/adminSDK/directory/quickstart/build.gradle index 9c8b0578..d6a9fc0e 100644 --- a/adminSDK/directory/quickstart/build.gradle +++ b/adminSDK/directory/quickstart/build.gradle @@ -2,8 +2,8 @@ apply plugin: 'java' apply plugin: 'application' mainClassName = 'AdminSDKDirectoryQuickstart' -sourceCompatibility = 1.7 -targetCompatibility = 1.7 +sourceCompatibility = 1.8 +targetCompatibility = 1.8 version = '1.0' repositories { diff --git a/adminSDK/reports/quickstart/build.gradle b/adminSDK/reports/quickstart/build.gradle index d830286a..eb8e50bb 100644 --- a/adminSDK/reports/quickstart/build.gradle +++ b/adminSDK/reports/quickstart/build.gradle @@ -2,8 +2,8 @@ apply plugin: 'java' apply plugin: 'application' mainClassName = 'AdminSDKReportsQuickstart' -sourceCompatibility = 1.7 -targetCompatibility = 1.7 +sourceCompatibility = 1.8 +targetCompatibility = 1.8 version = '1.0' repositories { diff --git a/adminSDK/reseller/quickstart/build.gradle b/adminSDK/reseller/quickstart/build.gradle index 4794cc62..5c64d3d8 100644 --- a/adminSDK/reseller/quickstart/build.gradle +++ b/adminSDK/reseller/quickstart/build.gradle @@ -2,8 +2,8 @@ apply plugin: 'java' apply plugin: 'application' mainClassName = 'AdminSDKResellerQuickstart' -sourceCompatibility = 1.7 -targetCompatibility = 1.7 +sourceCompatibility = 1.8 +targetCompatibility = 1.8 version = '1.0' repositories { diff --git a/appsScript/quickstart/build.gradle b/appsScript/quickstart/build.gradle index 7d89965d..dfa909d7 100644 --- a/appsScript/quickstart/build.gradle +++ b/appsScript/quickstart/build.gradle @@ -2,8 +2,8 @@ apply plugin: 'java' apply plugin: 'application' mainClassName = 'AppsScriptQuickstart' -sourceCompatibility = 1.7 -targetCompatibility = 1.7 +sourceCompatibility = 1.8 +targetCompatibility = 1.8 version = '1.0' repositories { diff --git a/classroom/quickstart/build.gradle b/classroom/quickstart/build.gradle index c2023996..517a3543 100644 --- a/classroom/quickstart/build.gradle +++ b/classroom/quickstart/build.gradle @@ -2,8 +2,8 @@ apply plugin: 'java' apply plugin: 'application' mainClassName = 'ClassroomQuickstart' -sourceCompatibility = 1.7 -targetCompatibility = 1.7 +sourceCompatibility = 1.8 +targetCompatibility = 1.8 version = '1.0' repositories { diff --git a/drive/activity/quickstart/build.gradle b/drive/activity/quickstart/build.gradle index df305da2..d031b8ac 100644 --- a/drive/activity/quickstart/build.gradle +++ b/drive/activity/quickstart/build.gradle @@ -2,8 +2,8 @@ apply plugin: 'java' apply plugin: 'application' mainClassName = 'DriveActivityQuickstart' -sourceCompatibility = 1.7 -targetCompatibility = 1.7 +sourceCompatibility = 1.8 +targetCompatibility = 1.8 version = '1.0' repositories { diff --git a/drive/quickstart/build.gradle b/drive/quickstart/build.gradle index b4cdf6f2..1a6964bc 100644 --- a/drive/quickstart/build.gradle +++ b/drive/quickstart/build.gradle @@ -2,8 +2,8 @@ apply plugin: 'java' apply plugin: 'application' mainClassName = 'DriveQuickstart' -sourceCompatibility = 1.7 -targetCompatibility = 1.7 +sourceCompatibility = 1.8 +targetCompatibility = 1.8 version = '1.0' repositories { diff --git a/gmail/quickstart/build.gradle b/gmail/quickstart/build.gradle index c61e4733..e073c032 100644 --- a/gmail/quickstart/build.gradle +++ b/gmail/quickstart/build.gradle @@ -2,8 +2,8 @@ apply plugin: 'java' apply plugin: 'application' mainClassName = 'GmailQuickstart' -sourceCompatibility = 1.7 -targetCompatibility = 1.7 +sourceCompatibility = 1.8 +targetCompatibility = 1.8 version = '1.0' repositories { diff --git a/people/quickstart/build.gradle b/people/quickstart/build.gradle index 117dcb26..69a500f6 100644 --- a/people/quickstart/build.gradle +++ b/people/quickstart/build.gradle @@ -2,8 +2,9 @@ apply plugin: 'java' apply plugin: 'application' mainClassName = 'PeopleQuickstart' -sourceCompatibility = 1.7 -targetCompatibility = 1.7 +sourceCompatibility = 1.8 +targetCompatibility = 1.8 + version = '1.0' repositories { diff --git a/tasks/quickstart/build.gradle b/tasks/quickstart/build.gradle index ac6640e4..1e4b111a 100644 --- a/tasks/quickstart/build.gradle +++ b/tasks/quickstart/build.gradle @@ -2,8 +2,8 @@ apply plugin: 'java' apply plugin: 'application' mainClassName = 'TasksQuickstart' -sourceCompatibility = 1.7 -targetCompatibility = 1.7 +sourceCompatibility = 1.8 +targetCompatibility = 1.8 version = '1.0' repositories { diff --git a/vault/quickstart/build.gradle b/vault/quickstart/build.gradle index 707bb37f..1e7b2e97 100644 --- a/vault/quickstart/build.gradle +++ b/vault/quickstart/build.gradle @@ -2,8 +2,8 @@ apply plugin: 'java' apply plugin: 'application' mainClassName = 'Quickstart' -sourceCompatibility = 1.7 -targetCompatibility = 1.7 +sourceCompatibility = 1.8 +targetCompatibility = 1.8 version = '1.0' repositories { From 281c10c87f4d64ef471499d96843555dc1584e4e Mon Sep 17 00:00:00 2001 From: asrivas Date: Sat, 24 Aug 2019 00:04:22 -0400 Subject: [PATCH 008/262] Java 8 Nits Used the Intellij8 Java 8 Inspection to clean up Sheets/Slides snippets --- sheets/snippets/src/main/java/SpreadsheetSnippets.java | 2 +- sheets/snippets/src/test/java/BaseTest.java | 2 +- slides/snippets/src/main/java/Snippets.java | 2 -- slides/snippets/src/test/java/BaseTest.java | 2 +- 4 files changed, 3 insertions(+), 5 deletions(-) diff --git a/sheets/snippets/src/main/java/SpreadsheetSnippets.java b/sheets/snippets/src/main/java/SpreadsheetSnippets.java index bccb1a1f..9b37346f 100644 --- a/sheets/snippets/src/main/java/SpreadsheetSnippets.java +++ b/sheets/snippets/src/main/java/SpreadsheetSnippets.java @@ -125,7 +125,7 @@ public BatchUpdateValuesResponse batchUpdateValues(String spreadsheetId, String // [START_EXCLUDE silent] values = _values; // [END_EXCLUDE] - List data = new ArrayList(); + List data = new ArrayList<>(); data.add(new ValueRange() .setRange(range) .setValues(values)); diff --git a/sheets/snippets/src/test/java/BaseTest.java b/sheets/snippets/src/test/java/BaseTest.java index 6db7e518..34ff8dad 100644 --- a/sheets/snippets/src/test/java/BaseTest.java +++ b/sheets/snippets/src/test/java/BaseTest.java @@ -34,7 +34,7 @@ public class BaseTest { protected Sheets service; protected Drive driveService; - protected Set filesToDelete = new HashSet(); + protected Set filesToDelete = new HashSet<>(); public static void enableLogging() { Logger logger = Logger.getLogger(HttpTransport.class.getName()); diff --git a/slides/snippets/src/main/java/Snippets.java b/slides/snippets/src/main/java/Snippets.java index 07c0a342..c1c07907 100644 --- a/slides/snippets/src/main/java/Snippets.java +++ b/slides/snippets/src/main/java/Snippets.java @@ -1,6 +1,4 @@ import com.google.api.client.googleapis.auth.oauth2.GoogleCredential; -import com.google.api.client.http.FileContent; -import com.google.api.client.http.GenericUrl; import com.google.api.services.drive.Drive; import com.google.api.services.drive.model.File; import com.google.api.services.sheets.v4.Sheets; diff --git a/slides/snippets/src/test/java/BaseTest.java b/slides/snippets/src/test/java/BaseTest.java index eec4c1a9..99e97610 100644 --- a/slides/snippets/src/test/java/BaseTest.java +++ b/slides/snippets/src/test/java/BaseTest.java @@ -29,7 +29,7 @@ public class BaseTest { protected Slides service; protected Drive driveService; protected Sheets sheetsService; - protected Set filesToDelete = new HashSet(); + protected Set filesToDelete = new HashSet<>(); public static void enableLogging() { From c0509f08d22155ec8e33d9f30623c6a0d7189ffc Mon Sep 17 00:00:00 2001 From: Luis Sanchez Date: Fri, 4 Oct 2019 14:08:26 -0400 Subject: [PATCH 009/262] Update google-api-services-docs dependency The current example dependency version does not include the APIs used in the [inserting and deleting tables](https://developers.google.com/docs/api/how-tos/tables#inserting_and_deleting_tables) section. --- docs/quickstart/build.gradle | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/quickstart/build.gradle b/docs/quickstart/build.gradle index 7389b86b..cded13f2 100644 --- a/docs/quickstart/build.gradle +++ b/docs/quickstart/build.gradle @@ -11,7 +11,7 @@ repositories { } dependencies { - compile 'com.google.api-client:google-api-client:1.23.0' - compile 'com.google.oauth-client:google-oauth-client-jetty:1.23.0' - compile 'com.google.apis:google-api-services-docs:v1-rev20190128-1.28.0' -} \ No newline at end of file + compile 'com.google.api-client:google-api-client:1.30.1' + compile 'com.google.oauth-client:google-oauth-client-jetty:1.30.1' + compile 'com.google.apis:google-api-services-docs:v1-rev20190827-1.30.1' +} From 410d7ec2ed2b20db9b52e06430f118f085026b6f Mon Sep 17 00:00:00 2001 From: Jorge Fuentes Date: Thu, 21 Nov 2019 16:53:12 +0200 Subject: [PATCH 010/262] Bump lib version google-api-client:1.23.0 has transitive dependency with guava-jdk5 (2014) which is not compatible with newer versions and is the cause of assembly errors. --- sheets/quickstart/build.gradle | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/sheets/quickstart/build.gradle b/sheets/quickstart/build.gradle index ade2b272..cdf07781 100644 --- a/sheets/quickstart/build.gradle +++ b/sheets/quickstart/build.gradle @@ -11,7 +11,7 @@ repositories { } dependencies { - compile 'com.google.api-client:google-api-client:1.23.0' - compile 'com.google.oauth-client:google-oauth-client-jetty:1.23.0' - compile 'com.google.apis:google-api-services-sheets:v4-rev516-1.23.0' + compile 'com.google.api-client:google-api-client:1.30.4' + compile 'com.google.oauth-client:google-oauth-client-jetty:1.30.4' + compile 'com.google.apis:google-api-services-sheets:v4-rev581-1.25.0' } From 39fbf48f5459e0ce1ea708841763a2a203897665 Mon Sep 17 00:00:00 2001 From: Oleksandr Soldatov Date: Thu, 12 Mar 2020 02:56:17 +0200 Subject: [PATCH 011/262] Update DocsQuickstart.java (#97) fix minor typo --- docs/quickstart/src/main/java/DocsQuickstart.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/quickstart/src/main/java/DocsQuickstart.java b/docs/quickstart/src/main/java/DocsQuickstart.java index 4943612d..cfc3900b 100644 --- a/docs/quickstart/src/main/java/DocsQuickstart.java +++ b/docs/quickstart/src/main/java/DocsQuickstart.java @@ -68,8 +68,8 @@ private static Credential getCredentials(final NetHttpTransport HTTP_TRANSPORT) .setDataStoreFactory(new FileDataStoreFactory(new java.io.File(TOKENS_DIRECTORY_PATH))) .setAccessType("offline") .build(); - LocalServerReceiver receier = new LocalServerReceiver.Builder().setPort(8888).build(); - return new AuthorizationCodeInstalledApp(flow, receier).authorize("user"); + LocalServerReceiver receiver = new LocalServerReceiver.Builder().setPort(8888).build(); + return new AuthorizationCodeInstalledApp(flow, receiver).authorize("user"); } public static void main(String... args) throws IOException, GeneralSecurityException { From 6563898d309a3b4722b2e5e0806bab27c97540f9 Mon Sep 17 00:00:00 2001 From: seongwon Date: Tue, 2 Jun 2020 10:06:11 +0900 Subject: [PATCH 012/262] Fix #94 --- sheets/quickstart/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sheets/quickstart/build.gradle b/sheets/quickstart/build.gradle index cdf07781..731bc7c9 100644 --- a/sheets/quickstart/build.gradle +++ b/sheets/quickstart/build.gradle @@ -12,6 +12,6 @@ repositories { dependencies { compile 'com.google.api-client:google-api-client:1.30.4' - compile 'com.google.oauth-client:google-oauth-client-jetty:1.30.4' + compile 'com.google.oauth-client:google-oauth-client-jetty:1.30.6' compile 'com.google.apis:google-api-services-sheets:v4-rev581-1.25.0' } From e83e2f22b40d4a974c118436360c1d8a551be937 Mon Sep 17 00:00:00 2001 From: Steve Bazyl Date: Wed, 14 Oct 2020 13:02:49 -0600 Subject: [PATCH 013/262] Update readme for rebrand --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 672237e0..c2d18faf 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ -# G Suite Java Samples [![Build Status](https://travis-ci.org/gsuitedevs/java-samples.svg?branch=master)](https://travis-ci.org/gsuitedevs/java-samples) +# Google Workspace APIs Java Samples [![Build Status](https://travis-ci.org/gsuitedevs/java-samples.svg?branch=master)](https://travis-ci.org/gsuitedevs/java-samples) -A collection of samples that demonstrate how to call G Suite APIs in Java. +A collection of samples that demonstrate how to call Google Workspace APIs in Java. ## APIs From a688d84ccb1ae5c1440a8fc3372bda8005caae25 Mon Sep 17 00:00:00 2001 From: Steve Bazyl Date: Wed, 27 Jan 2021 13:57:47 -0700 Subject: [PATCH 014/262] Rename gsuitedevs -> googleworkspace --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index c2d18faf..df42de15 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# Google Workspace APIs Java Samples [![Build Status](https://travis-ci.org/gsuitedevs/java-samples.svg?branch=master)](https://travis-ci.org/gsuitedevs/java-samples) +# Google Workspace APIs Java Samples [![Build Status](https://travis-ci.org/googleworkspace/java-samples.svg?branch=master)](https://travis-ci.org/googleworkspace/java-samples) A collection of samples that demonstrate how to call Google Workspace APIs in Java. From 76805f8c5d448ca0519c6b64b4cbeb6333884708 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" Date: Wed, 5 May 2021 17:59:33 +0000 Subject: [PATCH 015/262] Add renovate.json --- renovate.json | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 renovate.json diff --git a/renovate.json b/renovate.json new file mode 100644 index 00000000..f45d8f11 --- /dev/null +++ b/renovate.json @@ -0,0 +1,5 @@ +{ + "extends": [ + "config:base" + ] +} From ac56a087240db04312f1b2c73a4b4913680ab33d Mon Sep 17 00:00:00 2001 From: Manvendra-P-Singh Date: Mon, 6 Dec 2021 07:24:40 +0000 Subject: [PATCH 016/262] gmail quickstart to Java 11 --- gmail/quickstart/build.gradle | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/gmail/quickstart/build.gradle b/gmail/quickstart/build.gradle index e073c032..db3dbb6a 100644 --- a/gmail/quickstart/build.gradle +++ b/gmail/quickstart/build.gradle @@ -2,8 +2,8 @@ apply plugin: 'java' apply plugin: 'application' mainClassName = 'GmailQuickstart' -sourceCompatibility = 1.8 -targetCompatibility = 1.8 +sourceCompatibility = 11 +targetCompatibility = 11 version = '1.0' repositories { @@ -11,7 +11,7 @@ repositories { } dependencies { - compile 'com.google.api-client:google-api-client:1.23.0' - compile 'com.google.oauth-client:google-oauth-client-jetty:1.23.0' - compile 'com.google.apis:google-api-services-gmail:v1-rev83-1.23.0' + implementation 'com.google.api-client:google-api-client:1.23.0' + implementation 'com.google.oauth-client:google-oauth-client-jetty:1.23.0' + implementation 'com.google.apis:google-api-services-gmail:v1-rev83-1.23.0' } From 258c0540fad69f83ee74ab2ad023f21a4222619f Mon Sep 17 00:00:00 2001 From: Manvendra-P-Singh Date: Tue, 7 Dec 2021 15:21:26 +0000 Subject: [PATCH 017/262] Changed quickstarts to run in Java 11 Changed inlined functions returns. Added class level and instance variable comments. --- adminSDK/alertcenter/quickstart/build.gradle | 10 +++++----- adminSDK/directory/quickstart/build.gradle | 10 +++++----- adminSDK/reports/quickstart/build.gradle | 10 +++++----- adminSDK/reseller/quickstart/build.gradle | 10 +++++----- appsScript/quickstart/build.gradle | 10 +++++----- calendar/quickstart/build.gradle | 10 +++++----- classroom/quickstart/build.gradle | 10 +++++----- docs/outputJSON/build.gradle | 12 ++++++------ docs/quickstart/build.gradle | 10 +++++----- drive/activity-v2/quickstart/build.gradle | 10 +++++----- drive/activity/quickstart/build.gradle | 10 +++++----- .../src/main/java/DriveActivityQuickstart.java | 10 ++++++---- drive/quickstart/build.gradle | 10 +++++----- .../src/main/java/DriveQuickstart.java | 12 +++++++++--- .../src/main/java/GmailQuickstart.java | 12 +++++++++--- people/quickstart/build.gradle | 10 +++++----- sheets/quickstart/build.gradle | 10 +++++----- sheets/snippets/build.gradle | 8 ++++---- slides/quickstart/build.gradle | 10 +++++----- slides/snippets/build.gradle | 10 +++++----- tasks/quickstart/build.gradle | 10 +++++----- vault/quickstart/build.gradle | 10 +++++----- vault/vault-hold-migration-api/build.gradle | 18 +++++++++--------- 23 files changed, 128 insertions(+), 114 deletions(-) diff --git a/adminSDK/alertcenter/quickstart/build.gradle b/adminSDK/alertcenter/quickstart/build.gradle index d044218e..b30fc6eb 100644 --- a/adminSDK/alertcenter/quickstart/build.gradle +++ b/adminSDK/alertcenter/quickstart/build.gradle @@ -3,8 +3,8 @@ apply plugin: 'application' apply plugin: 'idea' mainClassName = 'AdminSDKAlertCenterQuickstart' -sourceCompatibility = 1.8 -targetCompatibility = 1.8 +sourceCompatibility = 11 +targetCompatibility = 11 version = '1.0' repositories { @@ -12,7 +12,7 @@ repositories { } dependencies { - compile 'com.google.api-client:google-api-client:1.20.0' - compile 'com.google.auth:google-auth-library-oauth2-http:0.11.0' - compile 'com.google.apis:google-api-services-alertcenter:v1beta1-rev20190221-1.28.0' + implementation 'com.google.api-client:google-api-client:1.20.0' + implementation 'com.google.auth:google-auth-library-oauth2-http:0.11.0' + implementation 'com.google.apis:google-api-services-alertcenter:v1beta1-rev20190221-1.28.0' } \ No newline at end of file diff --git a/adminSDK/directory/quickstart/build.gradle b/adminSDK/directory/quickstart/build.gradle index d6a9fc0e..058eb0a4 100644 --- a/adminSDK/directory/quickstart/build.gradle +++ b/adminSDK/directory/quickstart/build.gradle @@ -2,8 +2,8 @@ apply plugin: 'java' apply plugin: 'application' mainClassName = 'AdminSDKDirectoryQuickstart' -sourceCompatibility = 1.8 -targetCompatibility = 1.8 +sourceCompatibility = 11 +targetCompatibility = 11 version = '1.0' repositories { @@ -11,7 +11,7 @@ repositories { } dependencies { - compile 'com.google.api-client:google-api-client:1.20.0' - compile 'com.google.oauth-client:google-oauth-client-jetty:1.20.0' - compile 'com.google.apis:google-api-services-admin-directory:directory_v1-rev53-1.20.0' + implementation 'com.google.api-client:google-api-client:1.20.0' + implementation 'com.google.oauth-client:google-oauth-client-jetty:1.20.0' + implementation 'com.google.apis:google-api-services-admin-directory:directory_v1-rev53-1.20.0' } diff --git a/adminSDK/reports/quickstart/build.gradle b/adminSDK/reports/quickstart/build.gradle index eb8e50bb..e4946ce5 100644 --- a/adminSDK/reports/quickstart/build.gradle +++ b/adminSDK/reports/quickstart/build.gradle @@ -2,8 +2,8 @@ apply plugin: 'java' apply plugin: 'application' mainClassName = 'AdminSDKReportsQuickstart' -sourceCompatibility = 1.8 -targetCompatibility = 1.8 +sourceCompatibility = 11 +targetCompatibility = 11 version = '1.0' repositories { @@ -11,7 +11,7 @@ repositories { } dependencies { - compile 'com.google.api-client:google-api-client:1.20.0' - compile 'com.google.oauth-client:google-oauth-client-jetty:1.20.0' - compile 'com.google.apis:google-api-services-admin-reports:reports_v1-rev46-1.20.0' + implementation 'com.google.api-client:google-api-client:1.20.0' + implementation 'com.google.oauth-client:google-oauth-client-jetty:1.20.0' + implementation 'com.google.apis:google-api-services-admin-reports:reports_v1-rev46-1.20.0' } diff --git a/adminSDK/reseller/quickstart/build.gradle b/adminSDK/reseller/quickstart/build.gradle index 5c64d3d8..c07d181f 100644 --- a/adminSDK/reseller/quickstart/build.gradle +++ b/adminSDK/reseller/quickstart/build.gradle @@ -2,8 +2,8 @@ apply plugin: 'java' apply plugin: 'application' mainClassName = 'AdminSDKResellerQuickstart' -sourceCompatibility = 1.8 -targetCompatibility = 1.8 +sourceCompatibility = 11 +targetCompatibility = 11 version = '1.0' repositories { @@ -11,7 +11,7 @@ repositories { } dependencies { - compile 'com.google.api-client:google-api-client:1.23.0' - compile 'com.google.oauth-client:google-oauth-client-jetty:1.23.0' - compile 'com.google.apis:google-api-services-reseller:v1-rev70-1.23.0' + implementation 'com.google.api-client:google-api-client:1.23.0' + implementation 'com.google.oauth-client:google-oauth-client-jetty:1.23.0' + implementation 'com.google.apis:google-api-services-reseller:v1-rev70-1.23.0' } diff --git a/appsScript/quickstart/build.gradle b/appsScript/quickstart/build.gradle index dfa909d7..00206b7f 100644 --- a/appsScript/quickstart/build.gradle +++ b/appsScript/quickstart/build.gradle @@ -2,8 +2,8 @@ apply plugin: 'java' apply plugin: 'application' mainClassName = 'AppsScriptQuickstart' -sourceCompatibility = 1.8 -targetCompatibility = 1.8 +sourceCompatibility = 11 +targetCompatibility = 11 version = '1.0' repositories { @@ -11,7 +11,7 @@ repositories { } dependencies { - compile 'com.google.api-client:google-api-client:1.23.0' - compile 'com.google.oauth-client:google-oauth-client-jetty:1.23.0' - compile 'com.google.apis:google-api-services-script:v1-rev175-1.23.0' + implementation 'com.google.api-client:google-api-client:1.23.0' + implementation 'com.google.oauth-client:google-oauth-client-jetty:1.23.0' + implementation 'com.google.apis:google-api-services-script:v1-rev175-1.23.0' } diff --git a/calendar/quickstart/build.gradle b/calendar/quickstart/build.gradle index 2e580223..ad1e25df 100644 --- a/calendar/quickstart/build.gradle +++ b/calendar/quickstart/build.gradle @@ -2,8 +2,8 @@ apply plugin: 'java' apply plugin: 'application' mainClassName = 'CalendarQuickstart' -sourceCompatibility = 1.8 -targetCompatibility = 1.8 +sourceCompatibility = 11 +targetCompatibility = 11 version = '1.0' repositories { @@ -11,7 +11,7 @@ repositories { } dependencies { - compile 'com.google.api-client:google-api-client:1.23.0' - compile 'com.google.oauth-client:google-oauth-client-jetty:1.23.0' - compile 'com.google.apis:google-api-services-calendar:v3-rev305-1.23.0' + implementation 'com.google.api-client:google-api-client:1.23.0' + implementation 'com.google.oauth-client:google-oauth-client-jetty:1.23.0' + implementation 'com.google.apis:google-api-services-calendar:v3-rev305-1.23.0' } diff --git a/classroom/quickstart/build.gradle b/classroom/quickstart/build.gradle index 517a3543..da87f9e8 100644 --- a/classroom/quickstart/build.gradle +++ b/classroom/quickstart/build.gradle @@ -2,8 +2,8 @@ apply plugin: 'java' apply plugin: 'application' mainClassName = 'ClassroomQuickstart' -sourceCompatibility = 1.8 -targetCompatibility = 1.8 +sourceCompatibility = 11 +targetCompatibility = 11 version = '1.0' repositories { @@ -11,7 +11,7 @@ repositories { } dependencies { - compile 'com.google.api-client:google-api-client:1.23.0' - compile 'com.google.oauth-client:google-oauth-client-jetty:1.23.0' - compile 'com.google.apis:google-api-services-classroom:v1-rev135-1.23.0' + implementation 'com.google.api-client:google-api-client:1.23.0' + implementation 'com.google.oauth-client:google-oauth-client-jetty:1.23.0' + implementation 'com.google.apis:google-api-services-classroom:v1-rev135-1.23.0' } diff --git a/docs/outputJSON/build.gradle b/docs/outputJSON/build.gradle index 401c8edd..74b22343 100644 --- a/docs/outputJSON/build.gradle +++ b/docs/outputJSON/build.gradle @@ -2,8 +2,8 @@ apply plugin: 'java' apply plugin: 'application' mainClassName = 'OutputJSON' -sourceCompatibility = 1.8 -targetCompatibility = 1.8 +sourceCompatibility = 11 +targetCompatibility = 11 version = '1.0' repositories { @@ -11,8 +11,8 @@ repositories { } dependencies { - compile 'com.google.api-client:google-api-client:1.23.0' - compile 'com.google.oauth-client:google-oauth-client-jetty:1.23.0' - compile 'com.google.apis:google-api-services-docs:v1-rev20190128-1.28.0' - compile group: 'com.google.code.gson', name: 'gson', version: '2.3.1' + implementation 'com.google.api-client:google-api-client:1.23.0' + implementation 'com.google.oauth-client:google-oauth-client-jetty:1.23.0' + implementation 'com.google.apis:google-api-services-docs:v1-rev20190128-1.28.0' + implementation group: 'com.google.code.gson', name: 'gson', version: '2.3.1' } diff --git a/docs/quickstart/build.gradle b/docs/quickstart/build.gradle index cded13f2..b65a16c2 100644 --- a/docs/quickstart/build.gradle +++ b/docs/quickstart/build.gradle @@ -2,8 +2,8 @@ apply plugin: 'java' apply plugin: 'application' mainClassName = 'DocsQuickstart' -sourceCompatibility = 1.8 -targetCompatibility = 1.8 +sourceCompatibility = 11 +targetCompatibility = 11 version = '1.0' repositories { @@ -11,7 +11,7 @@ repositories { } dependencies { - compile 'com.google.api-client:google-api-client:1.30.1' - compile 'com.google.oauth-client:google-oauth-client-jetty:1.30.1' - compile 'com.google.apis:google-api-services-docs:v1-rev20190827-1.30.1' + implementation 'com.google.api-client:google-api-client:1.30.1' + implementation 'com.google.oauth-client:google-oauth-client-jetty:1.30.1' + implementation 'com.google.apis:google-api-services-docs:v1-rev20190827-1.30.1' } diff --git a/drive/activity-v2/quickstart/build.gradle b/drive/activity-v2/quickstart/build.gradle index 1c756882..a53c5b5a 100644 --- a/drive/activity-v2/quickstart/build.gradle +++ b/drive/activity-v2/quickstart/build.gradle @@ -2,8 +2,8 @@ apply plugin: 'java' apply plugin: 'application' mainClassName = 'DriveActivityQuickstart' -sourceCompatibility = 1.8 -targetCompatibility = 1.8 +sourceCompatibility = 11 +targetCompatibility = 11 version = '1.0' repositories { @@ -11,7 +11,7 @@ repositories { } dependencies { - compile 'com.google.api-client:google-api-client:1.27.0' - compile 'com.google.oauth-client:google-oauth-client-jetty:1.27.0' - compile 'com.google.apis:google-api-services-driveactivity:v2-rev20190423-1.27.0' + implementation 'com.google.api-client:google-api-client:1.27.0' + implementation 'com.google.oauth-client:google-oauth-client-jetty:1.27.0' + implementation 'com.google.apis:google-api-services-driveactivity:v2-rev20190423-1.27.0' } diff --git a/drive/activity/quickstart/build.gradle b/drive/activity/quickstart/build.gradle index d031b8ac..6368959a 100644 --- a/drive/activity/quickstart/build.gradle +++ b/drive/activity/quickstart/build.gradle @@ -2,8 +2,8 @@ apply plugin: 'java' apply plugin: 'application' mainClassName = 'DriveActivityQuickstart' -sourceCompatibility = 1.8 -targetCompatibility = 1.8 +sourceCompatibility = 11 +targetCompatibility = 11 version = '1.0' repositories { @@ -11,7 +11,7 @@ repositories { } dependencies { - compile 'com.google.api-client:google-api-client:1.23.0' - compile 'com.google.oauth-client:google-oauth-client-jetty:1.23.0' - compile 'com.google.apis:google-api-services-appsactivity:v1-rev136-1.23.0' + implementation 'com.google.api-client:google-api-client:1.23.0' + implementation 'com.google.oauth-client:google-oauth-client-jetty:1.23.0' + implementation 'com.google.apis:google-api-services-appsactivity:v1-rev136-1.23.0' } diff --git a/drive/activity/quickstart/src/main/java/DriveActivityQuickstart.java b/drive/activity/quickstart/src/main/java/DriveActivityQuickstart.java index ea0f22bf..c28cdd13 100644 --- a/drive/activity/quickstart/src/main/java/DriveActivityQuickstart.java +++ b/drive/activity/quickstart/src/main/java/DriveActivityQuickstart.java @@ -20,7 +20,7 @@ import com.google.api.client.googleapis.auth.oauth2.GoogleClientSecrets; import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport; import com.google.api.client.http.HttpTransport; -import com.google.api.client.json.jackson2.JacksonFactory; +import com.google.api.client.json.gson.GsonFactory; import com.google.api.client.json.JsonFactory; import com.google.api.client.util.store.FileDataStoreFactory; @@ -35,7 +35,7 @@ import java.util.Arrays; import java.util.List; - +/* class to demonstarte use of Drive Activity list API */ public class DriveActivityQuickstart { /** Application name. */ private static final String APPLICATION_NAME = @@ -49,7 +49,7 @@ public class DriveActivityQuickstart { /** Global instance of the JSON factory. */ private static final JsonFactory JSON_FACTORY = - JacksonFactory.getDefaultInstance(); + GsonFactory.getDefaultInstance(); /** Global instance of the HTTP transport. */ private static HttpTransport HTTP_TRANSPORT; @@ -97,6 +97,7 @@ public static Credential authorize() throws IOException { flow, new LocalServerReceiver()).authorize("user"); System.out.println( "Credentials saved to " + DATA_STORE_DIR.getAbsolutePath()); + //returns an authorized Credential object. return credential; } @@ -107,10 +108,11 @@ public static Credential authorize() throws IOException { */ public static Appsactivity getAppsactivityService() throws IOException { Credential credential = authorize(); - return new Appsactivity.Builder( + Appsactivity service = new Appsactivity.Builder( HTTP_TRANSPORT, JSON_FACTORY, credential) .setApplicationName(APPLICATION_NAME) .build(); + return service; } public static void main(String[] args) throws IOException { diff --git a/drive/quickstart/build.gradle b/drive/quickstart/build.gradle index 1a6964bc..5df459b7 100644 --- a/drive/quickstart/build.gradle +++ b/drive/quickstart/build.gradle @@ -2,8 +2,8 @@ apply plugin: 'java' apply plugin: 'application' mainClassName = 'DriveQuickstart' -sourceCompatibility = 1.8 -targetCompatibility = 1.8 +sourceCompatibility = 11 +targetCompatibility = 11 version = '1.0' repositories { @@ -11,7 +11,7 @@ repositories { } dependencies { - compile 'com.google.api-client:google-api-client:1.23.0' - compile 'com.google.oauth-client:google-oauth-client-jetty:1.23.0' - compile 'com.google.apis:google-api-services-drive:v3-rev110-1.23.0' + implementation 'com.google.api-client:google-api-client:1.23.0' + implementation 'com.google.oauth-client:google-oauth-client-jetty:1.23.0' + implementation 'com.google.apis:google-api-services-drive:v3-rev110-1.23.0' } diff --git a/drive/quickstart/src/main/java/DriveQuickstart.java b/drive/quickstart/src/main/java/DriveQuickstart.java index 33b6ae9e..b9df6ab6 100644 --- a/drive/quickstart/src/main/java/DriveQuickstart.java +++ b/drive/quickstart/src/main/java/DriveQuickstart.java @@ -21,7 +21,7 @@ import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport; import com.google.api.client.http.javanet.NetHttpTransport; import com.google.api.client.json.JsonFactory; -import com.google.api.client.json.jackson2.JacksonFactory; +import com.google.api.client.json.gson.GsonFactory; import com.google.api.client.util.store.FileDataStoreFactory; import com.google.api.services.drive.Drive; import com.google.api.services.drive.DriveScopes; @@ -36,9 +36,13 @@ import java.util.Collections; import java.util.List; +/* class to demonstarte use of Drive files list API */ public class DriveQuickstart { + /** Application name. */ private static final String APPLICATION_NAME = "Google Drive API Java Quickstart"; - private static final JsonFactory JSON_FACTORY = JacksonFactory.getDefaultInstance(); + /** Global instance of the JSON factory. */ + private static final JsonFactory JSON_FACTORY = GsonFactory.getDefaultInstance(); + /** Directory to store authorization tokens for this application. */ private static final String TOKENS_DIRECTORY_PATH = "tokens"; /** @@ -69,7 +73,9 @@ private static Credential getCredentials(final NetHttpTransport HTTP_TRANSPORT) .setAccessType("offline") .build(); LocalServerReceiver receiver = new LocalServerReceiver.Builder().setPort(8888).build(); - return new AuthorizationCodeInstalledApp(flow, receiver).authorize("user"); + Credential credential = new AuthorizationCodeInstalledApp(flow, receiver).authorize("user"); + //returns an authorized Credential object. + return credential; } public static void main(String... args) throws IOException, GeneralSecurityException { diff --git a/gmail/quickstart/src/main/java/GmailQuickstart.java b/gmail/quickstart/src/main/java/GmailQuickstart.java index 4aee4cfc..f6d1e569 100644 --- a/gmail/quickstart/src/main/java/GmailQuickstart.java +++ b/gmail/quickstart/src/main/java/GmailQuickstart.java @@ -21,7 +21,7 @@ import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport; import com.google.api.client.http.javanet.NetHttpTransport; import com.google.api.client.json.JsonFactory; -import com.google.api.client.json.jackson2.JacksonFactory; +import com.google.api.client.json.gson.GsonFactory; import com.google.api.client.util.store.FileDataStoreFactory; import com.google.api.services.gmail.Gmail; import com.google.api.services.gmail.GmailScopes; @@ -36,9 +36,13 @@ import java.util.Collections; import java.util.List; +/* class to demonstarte use of Gmail list lalels API */ public class GmailQuickstart { + /** Application name. */ private static final String APPLICATION_NAME = "Gmail API Java Quickstart"; - private static final JsonFactory JSON_FACTORY = JacksonFactory.getDefaultInstance(); + /** Global instance of the JSON factory. */ + private static final JsonFactory JSON_FACTORY = GsonFactory.getDefaultInstance(); + /** Directory to store authorization tokens for this application. */ private static final String TOKENS_DIRECTORY_PATH = "tokens"; /** @@ -69,7 +73,9 @@ private static Credential getCredentials(final NetHttpTransport HTTP_TRANSPORT) .setAccessType("offline") .build(); LocalServerReceiver receiver = new LocalServerReceiver.Builder().setPort(8888).build(); - return new AuthorizationCodeInstalledApp(flow, receiver).authorize("user"); + Credential credential = new AuthorizationCodeInstalledApp(flow, receiver).authorize("user"); + //returns an authorized Credential object. + return credential; } public static void main(String... args) throws IOException, GeneralSecurityException { diff --git a/people/quickstart/build.gradle b/people/quickstart/build.gradle index 69a500f6..c91051c0 100644 --- a/people/quickstart/build.gradle +++ b/people/quickstart/build.gradle @@ -2,8 +2,8 @@ apply plugin: 'java' apply plugin: 'application' mainClassName = 'PeopleQuickstart' -sourceCompatibility = 1.8 -targetCompatibility = 1.8 +sourceCompatibility = 11 +targetCompatibility = 11 version = '1.0' @@ -12,7 +12,7 @@ repositories { } dependencies { - compile 'com.google.api-client:google-api-client:1.23.0' - compile 'com.google.oauth-client:google-oauth-client-jetty:1.23.0' - compile 'com.google.apis:google-api-services-people:v1-rev277-1.23.0' + implementation 'com.google.api-client:google-api-client:1.23.0' + implementation 'com.google.oauth-client:google-oauth-client-jetty:1.23.0' + implementation 'com.google.apis:google-api-services-people:v1-rev277-1.23.0' } diff --git a/sheets/quickstart/build.gradle b/sheets/quickstart/build.gradle index 731bc7c9..1e8aae5f 100644 --- a/sheets/quickstart/build.gradle +++ b/sheets/quickstart/build.gradle @@ -2,8 +2,8 @@ apply plugin: 'java' apply plugin: 'application' mainClassName = 'SheetsQuickstart' -sourceCompatibility = 1.8 -targetCompatibility = 1.8 +sourceCompatibility = 11 +targetCompatibility = 11 version = '1.0' repositories { @@ -11,7 +11,7 @@ repositories { } dependencies { - compile 'com.google.api-client:google-api-client:1.30.4' - compile 'com.google.oauth-client:google-oauth-client-jetty:1.30.6' - compile 'com.google.apis:google-api-services-sheets:v4-rev581-1.25.0' + implementation 'com.google.api-client:google-api-client:1.30.4' + implementation 'com.google.oauth-client:google-oauth-client-jetty:1.30.6' + implementation 'com.google.apis:google-api-services-sheets:v4-rev581-1.25.0' } diff --git a/sheets/snippets/build.gradle b/sheets/snippets/build.gradle index 5e599ff9..2f64b589 100644 --- a/sheets/snippets/build.gradle +++ b/sheets/snippets/build.gradle @@ -6,10 +6,10 @@ repositories { } dependencies { - compile 'com.google.api-client:google-api-client:1.22.0' - compile 'com.google.apis:google-api-services-drive:v3-rev45-1.22.0' - compile 'com.google.apis:google-api-services-sheets:v4-rev30-1.22.0' - testCompile 'junit:junit:4.12' + implementation 'com.google.api-client:google-api-client:1.22.0' + implementation 'com.google.apis:google-api-services-drive:v3-rev45-1.22.0' + implementation 'com.google.apis:google-api-services-sheets:v4-rev30-1.22.0' + implementation 'junit:junit:4.12' } test { diff --git a/slides/quickstart/build.gradle b/slides/quickstart/build.gradle index 8d86e30b..279e0126 100644 --- a/slides/quickstart/build.gradle +++ b/slides/quickstart/build.gradle @@ -2,8 +2,8 @@ apply plugin: 'java' apply plugin: 'application' mainClassName = 'SlidesQuickstart' -sourceCompatibility = 1.8 -targetCompatibility = 1.8 +sourceCompatibility = 11 +targetCompatibility = 11 version = '1.0' repositories { @@ -11,7 +11,7 @@ repositories { } dependencies { - compile 'com.google.api-client:google-api-client:1.23.0' - compile 'com.google.oauth-client:google-oauth-client-jetty:1.23.0' - compile 'com.google.apis:google-api-services-slides:v1-rev294-1.23.0' + implementation 'com.google.api-client:google-api-client:1.23.0' + implementation 'com.google.oauth-client:google-oauth-client-jetty:1.23.0' + implementation 'com.google.apis:google-api-services-slides:v1-rev294-1.23.0' } diff --git a/slides/snippets/build.gradle b/slides/snippets/build.gradle index 300684f4..71f55203 100644 --- a/slides/snippets/build.gradle +++ b/slides/snippets/build.gradle @@ -6,11 +6,11 @@ repositories { } dependencies { - compile 'com.google.api-client:google-api-client:1.22.0' - compile 'com.google.apis:google-api-services-drive:v3-rev45-1.22.0' - compile 'com.google.apis:google-api-services-sheets:v4-rev34-1.22.0' - compile 'com.google.apis:google-api-services-slides:v1-rev294-1.23.0' - testCompile 'junit:junit:4.12' + implementation 'com.google.api-client:google-api-client:1.22.0' + implementation 'com.google.apis:google-api-services-drive:v3-rev45-1.22.0' + implementation 'com.google.apis:google-api-services-sheets:v4-rev34-1.22.0' + implementation 'com.google.apis:google-api-services-slides:v1-rev294-1.23.0' + implementation 'junit:junit:4.12' compile fileTree(dir: 'lib', include: ['*.jar']) } diff --git a/tasks/quickstart/build.gradle b/tasks/quickstart/build.gradle index 1e4b111a..d1a6fd75 100644 --- a/tasks/quickstart/build.gradle +++ b/tasks/quickstart/build.gradle @@ -2,8 +2,8 @@ apply plugin: 'java' apply plugin: 'application' mainClassName = 'TasksQuickstart' -sourceCompatibility = 1.8 -targetCompatibility = 1.8 +sourceCompatibility = 11 +targetCompatibility = 11 version = '1.0' repositories { @@ -11,7 +11,7 @@ repositories { } dependencies { - compile 'com.google.api-client:google-api-client:1.23.0' - compile 'com.google.oauth-client:google-oauth-client-jetty:1.23.0' - compile 'com.google.apis:google-api-services-tasks:v1-rev49-1.23.0' + implementation 'com.google.api-client:google-api-client:1.23.0' + implementation 'com.google.oauth-client:google-oauth-client-jetty:1.23.0' + implementation 'com.google.apis:google-api-services-tasks:v1-rev49-1.23.0' } \ No newline at end of file diff --git a/vault/quickstart/build.gradle b/vault/quickstart/build.gradle index 1e7b2e97..274e6d48 100644 --- a/vault/quickstart/build.gradle +++ b/vault/quickstart/build.gradle @@ -2,8 +2,8 @@ apply plugin: 'java' apply plugin: 'application' mainClassName = 'Quickstart' -sourceCompatibility = 1.8 -targetCompatibility = 1.8 +sourceCompatibility = 11 +targetCompatibility = 11 version = '1.0' repositories { @@ -11,7 +11,7 @@ repositories { } dependencies { - compile 'com.google.api-client:google-api-client:1.23.0' - compile 'com.google.oauth-client:google-oauth-client-jetty:1.23.0' - compile 'com.google.apis:google-api-services-vault:v1-rev8-1.23.0' + implementation 'com.google.api-client:google-api-client:1.23.0' + implementation 'com.google.oauth-client:google-oauth-client-jetty:1.23.0' + implementation 'com.google.apis:google-api-services-vault:v1-rev8-1.23.0' } diff --git a/vault/vault-hold-migration-api/build.gradle b/vault/vault-hold-migration-api/build.gradle index 25933cd7..ef33dd66 100644 --- a/vault/vault-hold-migration-api/build.gradle +++ b/vault/vault-hold-migration-api/build.gradle @@ -3,8 +3,8 @@ apply plugin: 'application' apply plugin: 'idea' mainClassName = 'com.google.vault.chatmigration.QuickStart' -sourceCompatibility = 1.8 -targetCompatibility = 1.8 +sourceCompatibility = 11 +targetCompatibility = 11 version = '1.0' repositories { @@ -12,11 +12,11 @@ repositories { } dependencies { - compile 'com.google.api-client:google-api-client:1.23.0' - compile 'com.google.oauth-client:google-oauth-client-jetty:1.23.0' - compile 'com.google.apis:google-api-services-vault:v1-rev8-1.23.0' - compile group: 'org.apache.commons', name: 'commons-csv', version: '1.1' - compile "com.github.rholder:guava-retrying:2.0.0" - compile 'com.google.apis:google-api-services-admin-directory:directory_v1-rev53-1.20.0' - compile group: 'commons-cli', name: 'commons-cli', version: '1.4' + implementation 'com.google.api-client:google-api-client:1.23.0' + implementation 'com.google.oauth-client:google-oauth-client-jetty:1.23.0' + implementation 'com.google.apis:google-api-services-vault:v1-rev8-1.23.0' + implementation group: 'org.apache.commons', name: 'commons-csv', version: '1.1' + implementation "com.github.rholder:guava-retrying:2.0.0" + implementation 'com.google.apis:google-api-services-admin-directory:directory_v1-rev53-1.20.0' + implementation group: 'commons-cli', name: 'commons-cli', version: '1.4' } \ No newline at end of file From b35d59535c96e4f77d751a8b6409b2107a686773 Mon Sep 17 00:00:00 2001 From: Manvendra-P-Singh Date: Wed, 8 Dec 2021 15:14:40 +0000 Subject: [PATCH 018/262] Changed inlined functions returns. Added class level and instance variable comments. --- .../quickstart/src/main/java/CalendarQuickstart.java | 12 +++++++++--- docs/quickstart/src/main/java/DocsQuickstart.java | 12 +++++++++--- .../src/main/java/DriveActivityQuickstart.java | 5 +++-- 3 files changed, 21 insertions(+), 8 deletions(-) diff --git a/calendar/quickstart/src/main/java/CalendarQuickstart.java b/calendar/quickstart/src/main/java/CalendarQuickstart.java index f173a632..8cdde63f 100644 --- a/calendar/quickstart/src/main/java/CalendarQuickstart.java +++ b/calendar/quickstart/src/main/java/CalendarQuickstart.java @@ -21,7 +21,7 @@ import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport; import com.google.api.client.http.javanet.NetHttpTransport; import com.google.api.client.json.JsonFactory; -import com.google.api.client.json.jackson2.JacksonFactory; +import com.google.api.client.json.gson.GsonFactory; import com.google.api.client.util.DateTime; import com.google.api.client.util.store.FileDataStoreFactory; import com.google.api.services.calendar.Calendar; @@ -37,9 +37,13 @@ import java.util.Collections; import java.util.List; +/* class to demonstarte use of Calendar events list API */ public class CalendarQuickstart { + /** Application name. */ private static final String APPLICATION_NAME = "Google Calendar API Java Quickstart"; - private static final JsonFactory JSON_FACTORY = JacksonFactory.getDefaultInstance(); + /** Global instance of the JSON factory. */ + private static final JsonFactory JSON_FACTORY = GsonFactory.getDefaultInstance(); + /** Directory to store authorization tokens for this application. */ private static final String TOKENS_DIRECTORY_PATH = "tokens"; /** @@ -70,7 +74,9 @@ private static Credential getCredentials(final NetHttpTransport HTTP_TRANSPORT) .setAccessType("offline") .build(); LocalServerReceiver receiver = new LocalServerReceiver.Builder().setPort(8888).build(); - return new AuthorizationCodeInstalledApp(flow, receiver).authorize("user"); + Credential credential = new AuthorizationCodeInstalledApp(flow, receiver).authorize("user"); + //returns an authorized Credential object. + return credential; } public static void main(String... args) throws IOException, GeneralSecurityException { diff --git a/docs/quickstart/src/main/java/DocsQuickstart.java b/docs/quickstart/src/main/java/DocsQuickstart.java index cfc3900b..f8321a67 100644 --- a/docs/quickstart/src/main/java/DocsQuickstart.java +++ b/docs/quickstart/src/main/java/DocsQuickstart.java @@ -21,7 +21,7 @@ import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport; import com.google.api.client.http.javanet.NetHttpTransport; import com.google.api.client.json.JsonFactory; -import com.google.api.client.json.jackson2.JacksonFactory; +import com.google.api.client.json.gson.GsonFactory; import com.google.api.client.util.store.FileDataStoreFactory; import com.google.api.services.docs.v1.Docs; import com.google.api.services.docs.v1.DocsScopes; @@ -35,9 +35,13 @@ import java.util.Collections; import java.util.List; +/* class to demonstarte use of Docs get documents API */ public class DocsQuickstart { + /** Application name. */ private static final String APPLICATION_NAME = "Google Docs API Java Quickstart"; - private static final JsonFactory JSON_FACTORY = JacksonFactory.getDefaultInstance(); + /** Global instance of the JSON factory. */ + private static final JsonFactory JSON_FACTORY = GsonFactory.getDefaultInstance(); + /** Directory to store authorization tokens for this application. */ private static final String TOKENS_DIRECTORY_PATH = "tokens"; private static final String DOCUMENT_ID = "195j9eDD3ccgjQRttHhJPymLJUCOUjs-jmwTrekvdjFE"; @@ -69,7 +73,9 @@ private static Credential getCredentials(final NetHttpTransport HTTP_TRANSPORT) .setAccessType("offline") .build(); LocalServerReceiver receiver = new LocalServerReceiver.Builder().setPort(8888).build(); - return new AuthorizationCodeInstalledApp(flow, receiver).authorize("user"); + Credential credential = new AuthorizationCodeInstalledApp(flow, receiver).authorize("user"); + //returns an authorized Credential object. + return credential; } public static void main(String... args) throws IOException, GeneralSecurityException { diff --git a/drive/activity-v2/quickstart/src/main/java/DriveActivityQuickstart.java b/drive/activity-v2/quickstart/src/main/java/DriveActivityQuickstart.java index 30f9d1cb..685f8648 100644 --- a/drive/activity-v2/quickstart/src/main/java/DriveActivityQuickstart.java +++ b/drive/activity-v2/quickstart/src/main/java/DriveActivityQuickstart.java @@ -108,10 +108,11 @@ public static Credential authorize() throws IOException { public static com.google.api.services.driveactivity.v2.DriveActivity getDriveActivityService() throws IOException { Credential credential = authorize(); - return new com.google.api.services.driveactivity.v2.DriveActivity.Builder( - HTTP_TRANSPORT, JSON_FACTORY, credential) + com.google.api.services.driveactivity.v2.DriveActivity service = new com.google.api.services.driveactivity.v2.DriveActivity.Builder( + HTTP_TRANSPORT, JSON_FACTORY, credential) .setApplicationName(APPLICATION_NAME) .build(); + return service; } public static void main(String[] args) throws IOException { From 8f877ae1a1ea2e273a1d8a26e23fb2e7b3b31ee3 Mon Sep 17 00:00:00 2001 From: Manvendra-P-Singh Date: Thu, 9 Dec 2021 14:42:58 +0000 Subject: [PATCH 019/262] Updated dependent libraries versions --- adminSDK/alertcenter/quickstart/build.gradle | 6 +++--- adminSDK/directory/quickstart/build.gradle | 6 +++--- adminSDK/reports/quickstart/build.gradle | 6 +++--- adminSDK/reseller/quickstart/build.gradle | 6 +++--- appsScript/quickstart/build.gradle | 6 +++--- calendar/quickstart/build.gradle | 6 +++--- classroom/quickstart/build.gradle | 6 +++--- docs/outputJSON/build.gradle | 8 ++++---- docs/quickstart/build.gradle | 6 +++--- drive/activity-v2/quickstart/build.gradle | 6 +++--- drive/activity/quickstart/build.gradle | 6 +++--- drive/quickstart/build.gradle | 6 +++--- gmail/quickstart/build.gradle | 6 +++--- people/quickstart/build.gradle | 6 +++--- sheets/quickstart/build.gradle | 6 +++--- sheets/snippets/build.gradle | 11 +++++------ slides/quickstart/build.gradle | 6 +++--- slides/snippets/build.gradle | 15 +++++++-------- tasks/quickstart/build.gradle | 6 +++--- vault/quickstart/build.gradle | 6 +++--- vault/vault-hold-migration-api/build.gradle | 14 +++++++------- 21 files changed, 74 insertions(+), 76 deletions(-) diff --git a/adminSDK/alertcenter/quickstart/build.gradle b/adminSDK/alertcenter/quickstart/build.gradle index b30fc6eb..cdc190e5 100644 --- a/adminSDK/alertcenter/quickstart/build.gradle +++ b/adminSDK/alertcenter/quickstart/build.gradle @@ -12,7 +12,7 @@ repositories { } dependencies { - implementation 'com.google.api-client:google-api-client:1.20.0' - implementation 'com.google.auth:google-auth-library-oauth2-http:0.11.0' - implementation 'com.google.apis:google-api-services-alertcenter:v1beta1-rev20190221-1.28.0' + implementation 'com.google.api-client:google-api-client:1.32.2' + implementation 'com.google.auth:google-auth-library-oauth2-http:1.3.0' + implementation 'com.google.apis:google-api-services-alertcenter:v1beta1-rev20211012-1.32.1' } \ No newline at end of file diff --git a/adminSDK/directory/quickstart/build.gradle b/adminSDK/directory/quickstart/build.gradle index 058eb0a4..e15faceb 100644 --- a/adminSDK/directory/quickstart/build.gradle +++ b/adminSDK/directory/quickstart/build.gradle @@ -11,7 +11,7 @@ repositories { } dependencies { - implementation 'com.google.api-client:google-api-client:1.20.0' - implementation 'com.google.oauth-client:google-oauth-client-jetty:1.20.0' - implementation 'com.google.apis:google-api-services-admin-directory:directory_v1-rev53-1.20.0' + implementation 'com.google.api-client:google-api-client:1.32.2' + implementation 'com.google.oauth-client:google-oauth-client-jetty:1.32.1' + implementation 'com.google.apis:google-api-services-admin-directory:directory_v1-rev118-1.25.0' } diff --git a/adminSDK/reports/quickstart/build.gradle b/adminSDK/reports/quickstart/build.gradle index e4946ce5..5ba0c3a3 100644 --- a/adminSDK/reports/quickstart/build.gradle +++ b/adminSDK/reports/quickstart/build.gradle @@ -11,7 +11,7 @@ repositories { } dependencies { - implementation 'com.google.api-client:google-api-client:1.20.0' - implementation 'com.google.oauth-client:google-oauth-client-jetty:1.20.0' - implementation 'com.google.apis:google-api-services-admin-reports:reports_v1-rev46-1.20.0' + implementation 'com.google.api-client:google-api-client:1.32.2' + implementation 'com.google.oauth-client:google-oauth-client-jetty:1.32.1' + implementation 'com.google.apis:google-api-services-admin-reports:reports_v1-rev89-1.25.0' } diff --git a/adminSDK/reseller/quickstart/build.gradle b/adminSDK/reseller/quickstart/build.gradle index c07d181f..d8f6bc70 100644 --- a/adminSDK/reseller/quickstart/build.gradle +++ b/adminSDK/reseller/quickstart/build.gradle @@ -11,7 +11,7 @@ repositories { } dependencies { - implementation 'com.google.api-client:google-api-client:1.23.0' - implementation 'com.google.oauth-client:google-oauth-client-jetty:1.23.0' - implementation 'com.google.apis:google-api-services-reseller:v1-rev70-1.23.0' + implementation 'com.google.api-client:google-api-client:1.32.2' + implementation 'com.google.oauth-client:google-oauth-client-jetty:1.32.1' + implementation 'com.google.apis:google-api-services-reseller:v1-rev20211106-1.32.1' } diff --git a/appsScript/quickstart/build.gradle b/appsScript/quickstart/build.gradle index 00206b7f..6cca05b5 100644 --- a/appsScript/quickstart/build.gradle +++ b/appsScript/quickstart/build.gradle @@ -11,7 +11,7 @@ repositories { } dependencies { - implementation 'com.google.api-client:google-api-client:1.23.0' - implementation 'com.google.oauth-client:google-oauth-client-jetty:1.23.0' - implementation 'com.google.apis:google-api-services-script:v1-rev175-1.23.0' + implementation 'com.google.api-client:google-api-client:1.32.2' + implementation 'com.google.oauth-client:google-oauth-client-jetty:1.32.1' + implementation 'com.google.apis:google-api-services-script:v1-rev20210703-1.32.1' } diff --git a/calendar/quickstart/build.gradle b/calendar/quickstart/build.gradle index ad1e25df..4df9dda7 100644 --- a/calendar/quickstart/build.gradle +++ b/calendar/quickstart/build.gradle @@ -11,7 +11,7 @@ repositories { } dependencies { - implementation 'com.google.api-client:google-api-client:1.23.0' - implementation 'com.google.oauth-client:google-oauth-client-jetty:1.23.0' - implementation 'com.google.apis:google-api-services-calendar:v3-rev305-1.23.0' + implementation 'com.google.api-client:google-api-client:1.32.2' + implementation 'com.google.oauth-client:google-oauth-client-jetty:1.32.1' + implementation 'com.google.apis:google-api-services-calendar:v3-rev20211026-1.32.1' } diff --git a/classroom/quickstart/build.gradle b/classroom/quickstart/build.gradle index da87f9e8..003f253d 100644 --- a/classroom/quickstart/build.gradle +++ b/classroom/quickstart/build.gradle @@ -11,7 +11,7 @@ repositories { } dependencies { - implementation 'com.google.api-client:google-api-client:1.23.0' - implementation 'com.google.oauth-client:google-oauth-client-jetty:1.23.0' - implementation 'com.google.apis:google-api-services-classroom:v1-rev135-1.23.0' + implementation 'com.google.api-client:google-api-client:1.32.2' + implementation 'com.google.oauth-client:google-oauth-client-jetty:1.32.1' + implementation 'com.google.apis:google-api-services-classroom:v1-rev20211029-1.32.1' } diff --git a/docs/outputJSON/build.gradle b/docs/outputJSON/build.gradle index 74b22343..7a1ed8e7 100644 --- a/docs/outputJSON/build.gradle +++ b/docs/outputJSON/build.gradle @@ -11,8 +11,8 @@ repositories { } dependencies { - implementation 'com.google.api-client:google-api-client:1.23.0' - implementation 'com.google.oauth-client:google-oauth-client-jetty:1.23.0' - implementation 'com.google.apis:google-api-services-docs:v1-rev20190128-1.28.0' - implementation group: 'com.google.code.gson', name: 'gson', version: '2.3.1' + implementation 'com.google.api-client:google-api-client:1.32.2' + implementation 'com.google.oauth-client:google-oauth-client-jetty:1.32.1' + implementation 'com.google.apis:google-api-services-docs:v1-rev20210707-1.32.1' + implementation group: 'com.google.code.gson', name: 'gson', version: '2.8.9' } diff --git a/docs/quickstart/build.gradle b/docs/quickstart/build.gradle index b65a16c2..ce6efbf9 100644 --- a/docs/quickstart/build.gradle +++ b/docs/quickstart/build.gradle @@ -11,7 +11,7 @@ repositories { } dependencies { - implementation 'com.google.api-client:google-api-client:1.30.1' - implementation 'com.google.oauth-client:google-oauth-client-jetty:1.30.1' - implementation 'com.google.apis:google-api-services-docs:v1-rev20190827-1.30.1' + implementation 'com.google.api-client:google-api-client:1.32.2' + implementation 'com.google.oauth-client:google-oauth-client-jetty:1.32.1' + implementation 'com.google.apis:google-api-services-docs:v1-rev20210707-1.32.1' } diff --git a/drive/activity-v2/quickstart/build.gradle b/drive/activity-v2/quickstart/build.gradle index a53c5b5a..0ae0460b 100644 --- a/drive/activity-v2/quickstart/build.gradle +++ b/drive/activity-v2/quickstart/build.gradle @@ -11,7 +11,7 @@ repositories { } dependencies { - implementation 'com.google.api-client:google-api-client:1.27.0' - implementation 'com.google.oauth-client:google-oauth-client-jetty:1.27.0' - implementation 'com.google.apis:google-api-services-driveactivity:v2-rev20190423-1.27.0' + implementation 'com.google.api-client:google-api-client:1.32.2' + implementation 'com.google.oauth-client:google-oauth-client-jetty:1.32.1' + implementation 'com.google.apis:google-api-services-driveactivity:v2-rev20210319-1.32.1' } diff --git a/drive/activity/quickstart/build.gradle b/drive/activity/quickstart/build.gradle index 6368959a..147b79d4 100644 --- a/drive/activity/quickstart/build.gradle +++ b/drive/activity/quickstart/build.gradle @@ -11,7 +11,7 @@ repositories { } dependencies { - implementation 'com.google.api-client:google-api-client:1.23.0' - implementation 'com.google.oauth-client:google-oauth-client-jetty:1.23.0' - implementation 'com.google.apis:google-api-services-appsactivity:v1-rev136-1.23.0' + implementation 'com.google.api-client:google-api-client:1.32.2' + implementation 'com.google.oauth-client:google-oauth-client-jetty:1.32.1' + implementation 'com.google.apis:google-api-services-appsactivity:v1-rev20200128-1.30.10' } diff --git a/drive/quickstart/build.gradle b/drive/quickstart/build.gradle index 5df459b7..5a86fe3c 100644 --- a/drive/quickstart/build.gradle +++ b/drive/quickstart/build.gradle @@ -11,7 +11,7 @@ repositories { } dependencies { - implementation 'com.google.api-client:google-api-client:1.23.0' - implementation 'com.google.oauth-client:google-oauth-client-jetty:1.23.0' - implementation 'com.google.apis:google-api-services-drive:v3-rev110-1.23.0' + implementation 'com.google.api-client:google-api-client:1.32.2' + implementation 'com.google.oauth-client:google-oauth-client-jetty:1.32.1' + implementation 'com.google.apis:google-api-services-drive:v3-rev20211107-1.32.1' } diff --git a/gmail/quickstart/build.gradle b/gmail/quickstart/build.gradle index db3dbb6a..4142d13f 100644 --- a/gmail/quickstart/build.gradle +++ b/gmail/quickstart/build.gradle @@ -11,7 +11,7 @@ repositories { } dependencies { - implementation 'com.google.api-client:google-api-client:1.23.0' - implementation 'com.google.oauth-client:google-oauth-client-jetty:1.23.0' - implementation 'com.google.apis:google-api-services-gmail:v1-rev83-1.23.0' + implementation 'com.google.api-client:google-api-client:1.32.2' + implementation 'com.google.oauth-client:google-oauth-client-jetty:1.32.1' + implementation 'com.google.apis:google-api-services-gmail:v1-rev20211108-1.32.1' } diff --git a/people/quickstart/build.gradle b/people/quickstart/build.gradle index c91051c0..ef620f9a 100644 --- a/people/quickstart/build.gradle +++ b/people/quickstart/build.gradle @@ -12,7 +12,7 @@ repositories { } dependencies { - implementation 'com.google.api-client:google-api-client:1.23.0' - implementation 'com.google.oauth-client:google-oauth-client-jetty:1.23.0' - implementation 'com.google.apis:google-api-services-people:v1-rev277-1.23.0' + implementation 'com.google.api-client:google-api-client:1.32.2' + implementation 'com.google.oauth-client:google-oauth-client-jetty:1.32.1' + implementation 'com.google.apis:google-api-services-people:v1-rev20210903-1.32.1' } diff --git a/sheets/quickstart/build.gradle b/sheets/quickstart/build.gradle index 1e8aae5f..fa80f645 100644 --- a/sheets/quickstart/build.gradle +++ b/sheets/quickstart/build.gradle @@ -11,7 +11,7 @@ repositories { } dependencies { - implementation 'com.google.api-client:google-api-client:1.30.4' - implementation 'com.google.oauth-client:google-oauth-client-jetty:1.30.6' - implementation 'com.google.apis:google-api-services-sheets:v4-rev581-1.25.0' + implementation 'com.google.api-client:google-api-client:1.32.2' + implementation 'com.google.oauth-client:google-oauth-client-jetty:1.32.1' + implementation 'com.google.apis:google-api-services-sheets:v4-rev20210629-1.32.1' } diff --git a/sheets/snippets/build.gradle b/sheets/snippets/build.gradle index 2f64b589..56829c60 100644 --- a/sheets/snippets/build.gradle +++ b/sheets/snippets/build.gradle @@ -1,15 +1,14 @@ apply plugin: 'java' repositories { - // Use 'jcenter' for resolving your dependencies. - jcenter() + mavenCentral() } dependencies { - implementation 'com.google.api-client:google-api-client:1.22.0' - implementation 'com.google.apis:google-api-services-drive:v3-rev45-1.22.0' - implementation 'com.google.apis:google-api-services-sheets:v4-rev30-1.22.0' - implementation 'junit:junit:4.12' + implementation 'com.google.auth:google-auth-library-oauth2-http:1.3.0' + implementation 'com.google.apis:google-api-services-drive:v3-rev20211107-1.32.1' + implementation 'com.google.apis:google-api-services-sheets:v4-rev20210629-1.32.1' + testImplementation 'junit:junit:4.13.2' } test { diff --git a/slides/quickstart/build.gradle b/slides/quickstart/build.gradle index 279e0126..cc5e201b 100644 --- a/slides/quickstart/build.gradle +++ b/slides/quickstart/build.gradle @@ -11,7 +11,7 @@ repositories { } dependencies { - implementation 'com.google.api-client:google-api-client:1.23.0' - implementation 'com.google.oauth-client:google-oauth-client-jetty:1.23.0' - implementation 'com.google.apis:google-api-services-slides:v1-rev294-1.23.0' + implementation 'com.google.api-client:google-api-client:1.32.2' + implementation 'com.google.oauth-client:google-oauth-client-jetty:1.32.1' + implementation 'com.google.apis:google-api-services-slides:v1-rev20210820-1.32.1' } diff --git a/slides/snippets/build.gradle b/slides/snippets/build.gradle index 71f55203..1279246b 100644 --- a/slides/snippets/build.gradle +++ b/slides/snippets/build.gradle @@ -1,18 +1,17 @@ apply plugin: 'java' repositories { - // Use 'jcenter' for resolving your dependencies. - jcenter() + mavenCentral() } dependencies { - implementation 'com.google.api-client:google-api-client:1.22.0' - implementation 'com.google.apis:google-api-services-drive:v3-rev45-1.22.0' - implementation 'com.google.apis:google-api-services-sheets:v4-rev34-1.22.0' - implementation 'com.google.apis:google-api-services-slides:v1-rev294-1.23.0' - implementation 'junit:junit:4.12' + implementation 'com.google.auth:google-auth-library-oauth2-http:1.3.0' + implementation 'com.google.apis:google-api-services-drive:v3-rev20211107-1.32.1' + implementation 'com.google.apis:google-api-services-sheets:v4-rev20210629-1.32.1' + implementation 'com.google.apis:google-api-services-slides:v1-rev20210820-1.32.1' + testImplementation 'junit:junit:4.13.2' - compile fileTree(dir: 'lib', include: ['*.jar']) + implementation fileTree(dir: 'lib', include: ['*.jar']) } test { diff --git a/tasks/quickstart/build.gradle b/tasks/quickstart/build.gradle index d1a6fd75..9694c0ce 100644 --- a/tasks/quickstart/build.gradle +++ b/tasks/quickstart/build.gradle @@ -11,7 +11,7 @@ repositories { } dependencies { - implementation 'com.google.api-client:google-api-client:1.23.0' - implementation 'com.google.oauth-client:google-oauth-client-jetty:1.23.0' - implementation 'com.google.apis:google-api-services-tasks:v1-rev49-1.23.0' + implementation 'com.google.api-client:google-api-client:1.32.2' + implementation 'com.google.oauth-client:google-oauth-client-jetty:1.32.1' + implementation 'com.google.apis:google-api-services-tasks:v1-rev20210709-1.32.1' } \ No newline at end of file diff --git a/vault/quickstart/build.gradle b/vault/quickstart/build.gradle index 274e6d48..f529a705 100644 --- a/vault/quickstart/build.gradle +++ b/vault/quickstart/build.gradle @@ -11,7 +11,7 @@ repositories { } dependencies { - implementation 'com.google.api-client:google-api-client:1.23.0' - implementation 'com.google.oauth-client:google-oauth-client-jetty:1.23.0' - implementation 'com.google.apis:google-api-services-vault:v1-rev8-1.23.0' + implementation 'com.google.api-client:google-api-client:1.32.2' + implementation 'com.google.oauth-client:google-oauth-client-jetty:1.32.1' + implementation 'com.google.apis:google-api-services-vault:v1-rev20211101-1.32.1' } diff --git a/vault/vault-hold-migration-api/build.gradle b/vault/vault-hold-migration-api/build.gradle index ef33dd66..d0466b63 100644 --- a/vault/vault-hold-migration-api/build.gradle +++ b/vault/vault-hold-migration-api/build.gradle @@ -12,11 +12,11 @@ repositories { } dependencies { - implementation 'com.google.api-client:google-api-client:1.23.0' - implementation 'com.google.oauth-client:google-oauth-client-jetty:1.23.0' - implementation 'com.google.apis:google-api-services-vault:v1-rev8-1.23.0' - implementation group: 'org.apache.commons', name: 'commons-csv', version: '1.1' - implementation "com.github.rholder:guava-retrying:2.0.0" - implementation 'com.google.apis:google-api-services-admin-directory:directory_v1-rev53-1.20.0' - implementation group: 'commons-cli', name: 'commons-cli', version: '1.4' + implementation 'com.google.api-client:google-api-client:1.32.2' + implementation 'com.google.oauth-client:google-oauth-client-jetty:1.32.1' + implementation 'com.google.apis:google-api-services-vault:v1-rev20211101-1.32.1' + implementation group: 'org.apache.commons', name: 'commons-csv', version: '1.9.0' + implementation 'com.github.rholder:guava-retrying:2.0.0' + implementation 'com.google.apis:google-api-services-admin-directory:directory_v1-rev118-1.25.0' + implementation group: 'commons-cli', name: 'commons-cli', version: '1.5.0' } \ No newline at end of file From 72c0ffa9d77fbb0501aea7adad68fb3d938285e0 Mon Sep 17 00:00:00 2001 From: Steven Bazyl Date: Thu, 16 Dec 2021 17:04:34 -0700 Subject: [PATCH 020/262] Enable lint workflows + delint --- .github/ISSUE_TEMPLATE.md | 18 +- .github/linters/sun_checks.xml | 361 +++++++++++++++++++++++++++++++++ .github/workflows/lint.yaml | 42 ++++ README.md | 4 +- sheets/snippets/test.sh | 3 - slides/snippets/test.sh | 3 - 6 files changed, 416 insertions(+), 15 deletions(-) create mode 100644 .github/linters/sun_checks.xml create mode 100644 .github/workflows/lint.yaml delete mode 100755 sheets/snippets/test.sh delete mode 100755 slides/snippets/test.sh diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md index 9841d4e9..38a3c6e9 100644 --- a/.github/ISSUE_TEMPLATE.md +++ b/.github/ISSUE_TEMPLATE.md @@ -1,12 +1,16 @@ -(Please fill out these details before submitting an issue) +# Summary + +(description of issue) + +## Sample Name -### Sample Name (i.e. Gmail Quickstart) -### Expected Behavior +## Expected Behavior + +## Actual Behavior -### Actual Behavior +## Specifications -### Specifications - - Java version (`java -version`) - - OS (Mac/Linux/Windows) +- Java version (`java -version`) +- OS (Mac/Linux/Windows) diff --git a/.github/linters/sun_checks.xml b/.github/linters/sun_checks.xml new file mode 100644 index 00000000..5585111e --- /dev/null +++ b/.github/linters/sun_checks.xml @@ -0,0 +1,361 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.github/workflows/lint.yaml b/.github/workflows/lint.yaml new file mode 100644 index 00000000..eb5e90a1 --- /dev/null +++ b/.github/workflows/lint.yaml @@ -0,0 +1,42 @@ +# Copyright 2021 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +name: Lint +on: + push: + branches: + - master + pull_request: + branches: + - master +jobs: + lint: + concurrency: + group: ${{ github.head_ref || github.ref }} + cancel-in-progress: true + runs-on: ubuntu-20.04 + steps: + - uses: actions/checkout@v2.4.0 + with: + fetch-depth: 0 + - uses: github/super-linter/slim@v4.8.4 + env: + ERROR_ON_MISSING_EXEC_BIT: true + VALIDATE_JSCPD: false + VALIDATE_ALL_CODEBASE: ${{ github.event_name == 'push' }} + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + - uses: actions/setup-node@v2 + with: + node-version: '14' + - run: npm install + - run: npm run lint \ No newline at end of file diff --git a/README.md b/README.md index df42de15..189f8f47 100644 --- a/README.md +++ b/README.md @@ -19,7 +19,7 @@ A collection of samples that demonstrate how to call Google Workspace APIs in Ja - [Quickstart](https://developers.google.com/calendar/quickstart/java) - [Sync Tokens and Etags](calendar/sync) -- [Command line sample](https://github.com/google/google-api-java-client-samples/tree/master/calendar-cmdline-sample) +- [Command-line sample](https://github.com/google/google-api-java-client-samples/tree/master/calendar-cmdline-sample) ### Classroom @@ -32,7 +32,7 @@ A collection of samples that demonstrate how to call Google Workspace APIs in Ja ### Drive V3 - [Quickstart](https://developers.google.com/drive/v3/web/quickstart/java) -- [Command line sample](https://github.com/google/google-api-java-client-samples/tree/master/drive-cmdline-sample) +- [Command-line sample](https://github.com/google/google-api-java-client-samples/tree/master/drive-cmdline-sample) ### Gmail diff --git a/sheets/snippets/test.sh b/sheets/snippets/test.sh deleted file mode 100755 index 49d2c9e8..00000000 --- a/sheets/snippets/test.sh +++ /dev/null @@ -1,3 +0,0 @@ -#!/bin/bash -export GOOGLE_APPLICATION_CREDENTIALS="$(pwd)/../application_credentials.json"; -./gradlew test --rerun-tasks # --rerun-tasks forces UP-TO-DATE tests to re-run diff --git a/slides/snippets/test.sh b/slides/snippets/test.sh deleted file mode 100755 index fbe3fff3..00000000 --- a/slides/snippets/test.sh +++ /dev/null @@ -1,3 +0,0 @@ -#!/bin/bash -export GOOGLE_APPLICATION_CREDENTIALS="$(pwd)/../application_credentials.json"; -./gradlew test \ No newline at end of file From b8aad560e523a6a257acb014a84909ad9d5bf537 Mon Sep 17 00:00:00 2001 From: Steven Bazyl Date: Thu, 16 Dec 2021 17:08:21 -0700 Subject: [PATCH 021/262] Remove stray steps from original --- .github/workflows/lint.yaml | 5 ----- 1 file changed, 5 deletions(-) diff --git a/.github/workflows/lint.yaml b/.github/workflows/lint.yaml index eb5e90a1..aecee5dd 100644 --- a/.github/workflows/lint.yaml +++ b/.github/workflows/lint.yaml @@ -35,8 +35,3 @@ jobs: VALIDATE_JSCPD: false VALIDATE_ALL_CODEBASE: ${{ github.event_name == 'push' }} GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - - uses: actions/setup-node@v2 - with: - node-version: '14' - - run: npm install - - run: npm run lint \ No newline at end of file From 3e4944eb771116f87ab36ddcd6b9314fd8d52922 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" Date: Mon, 20 Dec 2021 20:18:46 +0000 Subject: [PATCH 022/262] Update github/super-linter action to v4.8.5 --- .github/workflows/lint.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/lint.yaml b/.github/workflows/lint.yaml index aecee5dd..659b0c58 100644 --- a/.github/workflows/lint.yaml +++ b/.github/workflows/lint.yaml @@ -29,7 +29,7 @@ jobs: - uses: actions/checkout@v2.4.0 with: fetch-depth: 0 - - uses: github/super-linter/slim@v4.8.4 + - uses: github/super-linter/slim@v4.8.5 env: ERROR_ON_MISSING_EXEC_BIT: true VALIDATE_JSCPD: false From 5bc9700c1d1bbaa807238f79e0a2c1b1e2a1dbb8 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" Date: Thu, 6 Jan 2022 01:30:59 +0000 Subject: [PATCH 023/262] Update dependency com.google.http-client:google-http-client-jackson2 to v1.41.0 --- calendar/sync/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/calendar/sync/pom.xml b/calendar/sync/pom.xml index 29f97014..4a0019f6 100644 --- a/calendar/sync/pom.xml +++ b/calendar/sync/pom.xml @@ -81,7 +81,7 @@ - 1.40.1 + 1.41.0 1.32.1 UTF-8 From 70fbe39ca34c590e1d2c6680c0500e6cd850c846 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" Date: Thu, 6 Jan 2022 03:28:40 +0000 Subject: [PATCH 024/262] Update dependency com.google.api-client:google-api-client to v1.33.0 --- adminSDK/alertcenter/quickstart/build.gradle | 2 +- adminSDK/directory/quickstart/build.gradle | 2 +- adminSDK/reports/quickstart/build.gradle | 2 +- adminSDK/reseller/quickstart/build.gradle | 2 +- appsScript/quickstart/build.gradle | 2 +- calendar/quickstart/build.gradle | 2 +- calendar/sync/pom.xml | 2 +- classroom/quickstart/build.gradle | 2 +- docs/outputJSON/build.gradle | 2 +- docs/quickstart/build.gradle | 2 +- drive/activity-v2/quickstart/build.gradle | 2 +- drive/activity/quickstart/build.gradle | 2 +- drive/quickstart/build.gradle | 2 +- gmail/quickstart/build.gradle | 2 +- people/quickstart/build.gradle | 2 +- sheets/quickstart/build.gradle | 2 +- slides/quickstart/build.gradle | 2 +- tasks/quickstart/build.gradle | 2 +- vault/quickstart/build.gradle | 2 +- vault/vault-hold-migration-api/build.gradle | 2 +- 20 files changed, 20 insertions(+), 20 deletions(-) diff --git a/adminSDK/alertcenter/quickstart/build.gradle b/adminSDK/alertcenter/quickstart/build.gradle index cdc190e5..5cd6a28e 100644 --- a/adminSDK/alertcenter/quickstart/build.gradle +++ b/adminSDK/alertcenter/quickstart/build.gradle @@ -12,7 +12,7 @@ repositories { } dependencies { - implementation 'com.google.api-client:google-api-client:1.32.2' + implementation 'com.google.api-client:google-api-client:1.33.0' implementation 'com.google.auth:google-auth-library-oauth2-http:1.3.0' implementation 'com.google.apis:google-api-services-alertcenter:v1beta1-rev20211012-1.32.1' } \ No newline at end of file diff --git a/adminSDK/directory/quickstart/build.gradle b/adminSDK/directory/quickstart/build.gradle index e15faceb..4ea5ca58 100644 --- a/adminSDK/directory/quickstart/build.gradle +++ b/adminSDK/directory/quickstart/build.gradle @@ -11,7 +11,7 @@ repositories { } dependencies { - implementation 'com.google.api-client:google-api-client:1.32.2' + implementation 'com.google.api-client:google-api-client:1.33.0' implementation 'com.google.oauth-client:google-oauth-client-jetty:1.32.1' implementation 'com.google.apis:google-api-services-admin-directory:directory_v1-rev118-1.25.0' } diff --git a/adminSDK/reports/quickstart/build.gradle b/adminSDK/reports/quickstart/build.gradle index 5ba0c3a3..80e4d79b 100644 --- a/adminSDK/reports/quickstart/build.gradle +++ b/adminSDK/reports/quickstart/build.gradle @@ -11,7 +11,7 @@ repositories { } dependencies { - implementation 'com.google.api-client:google-api-client:1.32.2' + implementation 'com.google.api-client:google-api-client:1.33.0' implementation 'com.google.oauth-client:google-oauth-client-jetty:1.32.1' implementation 'com.google.apis:google-api-services-admin-reports:reports_v1-rev89-1.25.0' } diff --git a/adminSDK/reseller/quickstart/build.gradle b/adminSDK/reseller/quickstart/build.gradle index d8f6bc70..11603c02 100644 --- a/adminSDK/reseller/quickstart/build.gradle +++ b/adminSDK/reseller/quickstart/build.gradle @@ -11,7 +11,7 @@ repositories { } dependencies { - implementation 'com.google.api-client:google-api-client:1.32.2' + implementation 'com.google.api-client:google-api-client:1.33.0' implementation 'com.google.oauth-client:google-oauth-client-jetty:1.32.1' implementation 'com.google.apis:google-api-services-reseller:v1-rev20211106-1.32.1' } diff --git a/appsScript/quickstart/build.gradle b/appsScript/quickstart/build.gradle index 6cca05b5..4990f03e 100644 --- a/appsScript/quickstart/build.gradle +++ b/appsScript/quickstart/build.gradle @@ -11,7 +11,7 @@ repositories { } dependencies { - implementation 'com.google.api-client:google-api-client:1.32.2' + implementation 'com.google.api-client:google-api-client:1.33.0' implementation 'com.google.oauth-client:google-oauth-client-jetty:1.32.1' implementation 'com.google.apis:google-api-services-script:v1-rev20210703-1.32.1' } diff --git a/calendar/quickstart/build.gradle b/calendar/quickstart/build.gradle index 4df9dda7..1c1455c3 100644 --- a/calendar/quickstart/build.gradle +++ b/calendar/quickstart/build.gradle @@ -11,7 +11,7 @@ repositories { } dependencies { - implementation 'com.google.api-client:google-api-client:1.32.2' + implementation 'com.google.api-client:google-api-client:1.33.0' implementation 'com.google.oauth-client:google-oauth-client-jetty:1.32.1' implementation 'com.google.apis:google-api-services-calendar:v3-rev20211026-1.32.1' } diff --git a/calendar/sync/pom.xml b/calendar/sync/pom.xml index 29f97014..50ae2e8e 100644 --- a/calendar/sync/pom.xml +++ b/calendar/sync/pom.xml @@ -61,7 +61,7 @@ com.google.api-client google-api-client - 1.32.2 + 1.33.0 com.google.http-client diff --git a/classroom/quickstart/build.gradle b/classroom/quickstart/build.gradle index 003f253d..c3dd8ad2 100644 --- a/classroom/quickstart/build.gradle +++ b/classroom/quickstart/build.gradle @@ -11,7 +11,7 @@ repositories { } dependencies { - implementation 'com.google.api-client:google-api-client:1.32.2' + implementation 'com.google.api-client:google-api-client:1.33.0' implementation 'com.google.oauth-client:google-oauth-client-jetty:1.32.1' implementation 'com.google.apis:google-api-services-classroom:v1-rev20211029-1.32.1' } diff --git a/docs/outputJSON/build.gradle b/docs/outputJSON/build.gradle index 7a1ed8e7..9a65d38a 100644 --- a/docs/outputJSON/build.gradle +++ b/docs/outputJSON/build.gradle @@ -11,7 +11,7 @@ repositories { } dependencies { - implementation 'com.google.api-client:google-api-client:1.32.2' + implementation 'com.google.api-client:google-api-client:1.33.0' implementation 'com.google.oauth-client:google-oauth-client-jetty:1.32.1' implementation 'com.google.apis:google-api-services-docs:v1-rev20210707-1.32.1' implementation group: 'com.google.code.gson', name: 'gson', version: '2.8.9' diff --git a/docs/quickstart/build.gradle b/docs/quickstart/build.gradle index ce6efbf9..48c9c11a 100644 --- a/docs/quickstart/build.gradle +++ b/docs/quickstart/build.gradle @@ -11,7 +11,7 @@ repositories { } dependencies { - implementation 'com.google.api-client:google-api-client:1.32.2' + implementation 'com.google.api-client:google-api-client:1.33.0' implementation 'com.google.oauth-client:google-oauth-client-jetty:1.32.1' implementation 'com.google.apis:google-api-services-docs:v1-rev20210707-1.32.1' } diff --git a/drive/activity-v2/quickstart/build.gradle b/drive/activity-v2/quickstart/build.gradle index 0ae0460b..7d0a08b6 100644 --- a/drive/activity-v2/quickstart/build.gradle +++ b/drive/activity-v2/quickstart/build.gradle @@ -11,7 +11,7 @@ repositories { } dependencies { - implementation 'com.google.api-client:google-api-client:1.32.2' + implementation 'com.google.api-client:google-api-client:1.33.0' implementation 'com.google.oauth-client:google-oauth-client-jetty:1.32.1' implementation 'com.google.apis:google-api-services-driveactivity:v2-rev20210319-1.32.1' } diff --git a/drive/activity/quickstart/build.gradle b/drive/activity/quickstart/build.gradle index 147b79d4..32e034a8 100644 --- a/drive/activity/quickstart/build.gradle +++ b/drive/activity/quickstart/build.gradle @@ -11,7 +11,7 @@ repositories { } dependencies { - implementation 'com.google.api-client:google-api-client:1.32.2' + implementation 'com.google.api-client:google-api-client:1.33.0' implementation 'com.google.oauth-client:google-oauth-client-jetty:1.32.1' implementation 'com.google.apis:google-api-services-appsactivity:v1-rev20200128-1.30.10' } diff --git a/drive/quickstart/build.gradle b/drive/quickstart/build.gradle index 5a86fe3c..b83619da 100644 --- a/drive/quickstart/build.gradle +++ b/drive/quickstart/build.gradle @@ -11,7 +11,7 @@ repositories { } dependencies { - implementation 'com.google.api-client:google-api-client:1.32.2' + implementation 'com.google.api-client:google-api-client:1.33.0' implementation 'com.google.oauth-client:google-oauth-client-jetty:1.32.1' implementation 'com.google.apis:google-api-services-drive:v3-rev20211107-1.32.1' } diff --git a/gmail/quickstart/build.gradle b/gmail/quickstart/build.gradle index 4142d13f..0dae0ebf 100644 --- a/gmail/quickstart/build.gradle +++ b/gmail/quickstart/build.gradle @@ -11,7 +11,7 @@ repositories { } dependencies { - implementation 'com.google.api-client:google-api-client:1.32.2' + implementation 'com.google.api-client:google-api-client:1.33.0' implementation 'com.google.oauth-client:google-oauth-client-jetty:1.32.1' implementation 'com.google.apis:google-api-services-gmail:v1-rev20211108-1.32.1' } diff --git a/people/quickstart/build.gradle b/people/quickstart/build.gradle index ef620f9a..6b72f13a 100644 --- a/people/quickstart/build.gradle +++ b/people/quickstart/build.gradle @@ -12,7 +12,7 @@ repositories { } dependencies { - implementation 'com.google.api-client:google-api-client:1.32.2' + implementation 'com.google.api-client:google-api-client:1.33.0' implementation 'com.google.oauth-client:google-oauth-client-jetty:1.32.1' implementation 'com.google.apis:google-api-services-people:v1-rev20210903-1.32.1' } diff --git a/sheets/quickstart/build.gradle b/sheets/quickstart/build.gradle index fa80f645..d5b89b8c 100644 --- a/sheets/quickstart/build.gradle +++ b/sheets/quickstart/build.gradle @@ -11,7 +11,7 @@ repositories { } dependencies { - implementation 'com.google.api-client:google-api-client:1.32.2' + implementation 'com.google.api-client:google-api-client:1.33.0' implementation 'com.google.oauth-client:google-oauth-client-jetty:1.32.1' implementation 'com.google.apis:google-api-services-sheets:v4-rev20210629-1.32.1' } diff --git a/slides/quickstart/build.gradle b/slides/quickstart/build.gradle index cc5e201b..36d3ef1d 100644 --- a/slides/quickstart/build.gradle +++ b/slides/quickstart/build.gradle @@ -11,7 +11,7 @@ repositories { } dependencies { - implementation 'com.google.api-client:google-api-client:1.32.2' + implementation 'com.google.api-client:google-api-client:1.33.0' implementation 'com.google.oauth-client:google-oauth-client-jetty:1.32.1' implementation 'com.google.apis:google-api-services-slides:v1-rev20210820-1.32.1' } diff --git a/tasks/quickstart/build.gradle b/tasks/quickstart/build.gradle index 9694c0ce..d1d434d1 100644 --- a/tasks/quickstart/build.gradle +++ b/tasks/quickstart/build.gradle @@ -11,7 +11,7 @@ repositories { } dependencies { - implementation 'com.google.api-client:google-api-client:1.32.2' + implementation 'com.google.api-client:google-api-client:1.33.0' implementation 'com.google.oauth-client:google-oauth-client-jetty:1.32.1' implementation 'com.google.apis:google-api-services-tasks:v1-rev20210709-1.32.1' } \ No newline at end of file diff --git a/vault/quickstart/build.gradle b/vault/quickstart/build.gradle index f529a705..c7428927 100644 --- a/vault/quickstart/build.gradle +++ b/vault/quickstart/build.gradle @@ -11,7 +11,7 @@ repositories { } dependencies { - implementation 'com.google.api-client:google-api-client:1.32.2' + implementation 'com.google.api-client:google-api-client:1.33.0' implementation 'com.google.oauth-client:google-oauth-client-jetty:1.32.1' implementation 'com.google.apis:google-api-services-vault:v1-rev20211101-1.32.1' } diff --git a/vault/vault-hold-migration-api/build.gradle b/vault/vault-hold-migration-api/build.gradle index d0466b63..83db2baf 100644 --- a/vault/vault-hold-migration-api/build.gradle +++ b/vault/vault-hold-migration-api/build.gradle @@ -12,7 +12,7 @@ repositories { } dependencies { - implementation 'com.google.api-client:google-api-client:1.32.2' + implementation 'com.google.api-client:google-api-client:1.33.0' implementation 'com.google.oauth-client:google-oauth-client-jetty:1.32.1' implementation 'com.google.apis:google-api-services-vault:v1-rev20211101-1.32.1' implementation group: 'org.apache.commons', name: 'commons-csv', version: '1.9.0' From aef537cd9ba4a95a2697856682d5f7d842be0604 Mon Sep 17 00:00:00 2001 From: Rajesh Mudaliyar Date: Tue, 11 Jan 2022 14:56:19 -0800 Subject: [PATCH 025/262] Added pull request template Added pull request template --- .github/pull_request_template.md | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 .github/pull_request_template.md diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md new file mode 100644 index 00000000..1acd3625 --- /dev/null +++ b/.github/pull_request_template.md @@ -0,0 +1,18 @@ +# Description + +Please include a summary of the change and which issue is fixed. Please also include relevant motivation and context. List any dependencies that are required for this change. + +Fixes # (issue) + +# Is it been tested? +- [ ] Development testing done + +# Checklist: + +- [ ] My code follows the style guidelines of this project +- [ ] I have performed a self-review of my own code +- [ ] I have performed a peer-reviewed with team member(s) +- [ ] I have commented my code, particularly in hard-to-understand areas +- [ ] I have made corresponding changes to the documentation +- [ ] My changes generate no new warnings +- [ ] Any dependent changes have been merged and published in downstream modules From ce3c7c444f253fe5c21ee5d48b1679b3406f9746 Mon Sep 17 00:00:00 2001 From: Rajesh Mudaliyar Date: Tue, 11 Jan 2022 15:46:32 -0800 Subject: [PATCH 026/262] Updated header Updated header --- .github/pull_request_template.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index 1acd3625..ab678c3a 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -4,10 +4,10 @@ Please include a summary of the change and which issue is fixed. Please also inc Fixes # (issue) -# Is it been tested? +## Is it been tested? - [ ] Development testing done -# Checklist: +## Checklist: - [ ] My code follows the style guidelines of this project - [ ] I have performed a self-review of my own code From c6b4d78dabfb1780c0366afc7960de968984c8c0 Mon Sep 17 00:00:00 2001 From: Rajesh Mudaliyar Date: Tue, 11 Jan 2022 15:57:19 -0800 Subject: [PATCH 027/262] removed colon removed colon --- .github/pull_request_template.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index ab678c3a..c0834862 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -7,7 +7,7 @@ Fixes # (issue) ## Is it been tested? - [ ] Development testing done -## Checklist: +## Checklist - [ ] My code follows the style guidelines of this project - [ ] I have performed a self-review of my own code From 2fed7d145f9961991ad151e25c3609e03a00b238 Mon Sep 17 00:00:00 2001 From: Rajesh Mudaliyar Date: Tue, 18 Jan 2022 10:46:34 -0800 Subject: [PATCH 028/262] git-on-borg files of gmail-api-snippets (#151) Co-authored-by: sanjuktaghosh7 --- gmail/snippets/.gitignore | 61 +++ gmail/snippets/build.gradle | 18 + gmail/snippets/settings.gradle | 19 + gmail/snippets/src/main/java/SendEmail.java | 183 ++++++++ .../src/main/java/SettingsSnippets.java | 106 +++++ .../snippets/src/main/java/SmimeSnippets.java | 275 ++++++++++++ gmail/snippets/src/test/java/BaseTest.java | 81 ++++ .../snippets/src/test/java/SendEmailTest.java | 70 +++ .../src/test/java/SettingsSnippetsTest.java | 77 ++++ .../src/test/java/SmimeSnippetsTest.java | 410 ++++++++++++++++++ 10 files changed, 1300 insertions(+) create mode 100644 gmail/snippets/.gitignore create mode 100644 gmail/snippets/build.gradle create mode 100644 gmail/snippets/settings.gradle create mode 100644 gmail/snippets/src/main/java/SendEmail.java create mode 100644 gmail/snippets/src/main/java/SettingsSnippets.java create mode 100644 gmail/snippets/src/main/java/SmimeSnippets.java create mode 100644 gmail/snippets/src/test/java/BaseTest.java create mode 100644 gmail/snippets/src/test/java/SendEmailTest.java create mode 100644 gmail/snippets/src/test/java/SettingsSnippetsTest.java create mode 100644 gmail/snippets/src/test/java/SmimeSnippetsTest.java diff --git a/gmail/snippets/.gitignore b/gmail/snippets/.gitignore new file mode 100644 index 00000000..060526ad --- /dev/null +++ b/gmail/snippets/.gitignore @@ -0,0 +1,61 @@ +# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio + +*.iml + +## Directory-based project format: +.idea/ + +# if you remove the above rule, at least ignore the following: + +# User-specific stuff: +# .idea/workspace.xml +# .idea/tasks.xml +# .idea/dictionaries +# .idea/shelf + +# Sensitive or high-churn files: +# .idea/dataSources.ids +# .idea/dataSources.xml +# .idea/sqlDataSources.xml +# .idea/dynamic.xml +# .idea/uiDesigner.xml + +# Gradle: +.idea/gradle.xml +.idea/libraries + +# Mongo Explorer plugin: +# .idea/mongoSettings.xml + +## File-based project format: +*.ipr +*.iws + +## Plugin-specific files: + +# IntelliJ +/out/ + +# mpeltonen/sbt-idea plugin +.idea_modules/ + +# JIRA plugin +atlassian-ide-plugin.xml + +# Crashlytics plugin (for Android Studio and IntelliJ) +com_crashlytics_export_strings.xml +crashlytics.properties +crashlytics-build.properties +fabric.properties + +.gradle +build/ + +# Ignore Gradle GUI config +gradle-app.setting + +# Avoid ignoring Gradle wrapper jar file (.jar files are usually ignored) +!gradle-wrapper.jar + +# Cache of project +.gradletasknamecache diff --git a/gmail/snippets/build.gradle b/gmail/snippets/build.gradle new file mode 100644 index 00000000..bd5284f5 --- /dev/null +++ b/gmail/snippets/build.gradle @@ -0,0 +1,18 @@ +apply plugin: 'java' + +repositories { + // Use 'jcenter' for resolving your dependencies. + mavenLocal() + jcenter() +} + +dependencies { + compile 'com.google.api-client:google-api-client:1.22.0' + compile 'com.google.apis:google-api-services-gmail:v1-rev62-1.22.0' + compile 'com.google.code.gson:gson:2.4' + compile 'javax.mail:mail:1.4' + compile 'org.apache.commons:commons-csv:1.1' + testCompile 'junit:junit:4.12' + testCompile 'org.hamcrest:hamcrest-all:1.3' + testCompile 'org.mockito:mockito-core:2.7.19' +} diff --git a/gmail/snippets/settings.gradle b/gmail/snippets/settings.gradle new file mode 100644 index 00000000..f93899b1 --- /dev/null +++ b/gmail/snippets/settings.gradle @@ -0,0 +1,19 @@ +/* + * This settings file was auto generated by the Gradle buildInit task + * by 'sbazyl' at '10/22/15 11:30 AM' with Gradle 2.7 + * + * The settings file is used to specify which projects to include in your build. + * In a single project build this file can be empty or even removed. + * + * Detailed information about configuring a multi-project build in Gradle can be found + * in the user guide at https://docs.gradle.org/2.7/userguide/multi_project_builds.html + */ + +/* +// To declare projects as part of a multi-project build use the 'include' method +include 'shared' +include 'api' +include 'services:webservice' +*/ + +rootProject.name = 'java' diff --git a/gmail/snippets/src/main/java/SendEmail.java b/gmail/snippets/src/main/java/SendEmail.java new file mode 100644 index 00000000..e8f39050 --- /dev/null +++ b/gmail/snippets/src/main/java/SendEmail.java @@ -0,0 +1,183 @@ +import com.google.api.client.repackaged.org.apache.commons.codec.binary.Base64; +import com.google.api.services.gmail.Gmail; +import com.google.api.services.gmail.model.Draft; +import com.google.api.services.gmail.model.Message; + +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.IOException; +import java.util.Properties; + +import javax.activation.DataHandler; +import javax.activation.DataSource; +import javax.activation.FileDataSource; +import javax.mail.MessagingException; +import javax.mail.Multipart; +import javax.mail.Session; +import javax.mail.internet.InternetAddress; +import javax.mail.internet.MimeBodyPart; +import javax.mail.internet.MimeMessage; +import javax.mail.internet.MimeMultipart; + +// ... + +public class SendEmail { + + // ... + + // [START create_draft] + /** + * Create draft email. + * + * @param service an authorized Gmail API instance + * @param userId user's email address. The special value "me" + * can be used to indicate the authenticated user + * @param emailContent the MimeMessage used as email within the draft + * @return the created draft + * @throws MessagingException + * @throws IOException + */ + public static Draft createDraft(Gmail service, + String userId, + MimeMessage emailContent) + throws MessagingException, IOException { + Message message = createMessageWithEmail(emailContent); + Draft draft = new Draft(); + draft.setMessage(message); + draft = service.users().drafts().create(userId, draft).execute(); + + System.out.println("Draft id: " + draft.getId()); + System.out.println(draft.toPrettyString()); + return draft; + } + // [END create_draft] + + + // [START send_email] + /** + * Send an email from the user's mailbox to its recipient. + * + * @param service Authorized Gmail API instance. + * @param userId User's email address. The special value "me" + * can be used to indicate the authenticated user. + * @param emailContent Email to be sent. + * @return The sent message + * @throws MessagingException + * @throws IOException + */ + public static Message sendMessage(Gmail service, + String userId, + MimeMessage emailContent) + throws MessagingException, IOException { + Message message = createMessageWithEmail(emailContent); + message = service.users().messages().send(userId, message).execute(); + + System.out.println("Message id: " + message.getId()); + System.out.println(message.toPrettyString()); + return message; + } + // [END send_email] + + + // [START create_message] + /** + * Create a message from an email. + * + * @param emailContent Email to be set to raw of message + * @return a message containing a base64url encoded email + * @throws IOException + * @throws MessagingException + */ + public static Message createMessageWithEmail(MimeMessage emailContent) + throws MessagingException, IOException { + ByteArrayOutputStream buffer = new ByteArrayOutputStream(); + emailContent.writeTo(buffer); + byte[] bytes = buffer.toByteArray(); + String encodedEmail = Base64.encodeBase64URLSafeString(bytes); + Message message = new Message(); + message.setRaw(encodedEmail); + return message; + } + // [END create_message] + + // [START create_email] + /** + * Create a MimeMessage using the parameters provided. + * + * @param to email address of the receiver + * @param from email address of the sender, the mailbox account + * @param subject subject of the email + * @param bodyText body text of the email + * @return the MimeMessage to be used to send email + * @throws MessagingException + */ + public static MimeMessage createEmail(String to, + String from, + String subject, + String bodyText) + throws MessagingException { + Properties props = new Properties(); + Session session = Session.getDefaultInstance(props, null); + + MimeMessage email = new MimeMessage(session); + + email.setFrom(new InternetAddress(from)); + email.addRecipient(javax.mail.Message.RecipientType.TO, + new InternetAddress(to)); + email.setSubject(subject); + email.setText(bodyText); + return email; + } + // [END create_email] + + + // [START create_email_attachment] + /** + * Create a MimeMessage using the parameters provided. + * + * @param to Email address of the receiver. + * @param from Email address of the sender, the mailbox account. + * @param subject Subject of the email. + * @param bodyText Body text of the email. + * @param file Path to the file to be attached. + * @return MimeMessage to be used to send email. + * @throws MessagingException + */ + public static MimeMessage createEmailWithAttachment(String to, + String from, + String subject, + String bodyText, + File file) + throws MessagingException, IOException { + Properties props = new Properties(); + Session session = Session.getDefaultInstance(props, null); + + MimeMessage email = new MimeMessage(session); + + email.setFrom(new InternetAddress(from)); + email.addRecipient(javax.mail.Message.RecipientType.TO, + new InternetAddress(to)); + email.setSubject(subject); + + MimeBodyPart mimeBodyPart = new MimeBodyPart(); + mimeBodyPart.setContent(bodyText, "text/plain"); + + Multipart multipart = new MimeMultipart(); + multipart.addBodyPart(mimeBodyPart); + + mimeBodyPart = new MimeBodyPart(); + DataSource source = new FileDataSource(file); + + mimeBodyPart.setDataHandler(new DataHandler(source)); + mimeBodyPart.setFileName(file.getName()); + + multipart.addBodyPart(mimeBodyPart); + email.setContent(multipart); + + return email; + } + // [END create_email_attachment] + + // ... + +} diff --git a/gmail/snippets/src/main/java/SettingsSnippets.java b/gmail/snippets/src/main/java/SettingsSnippets.java new file mode 100644 index 00000000..fab67fa6 --- /dev/null +++ b/gmail/snippets/src/main/java/SettingsSnippets.java @@ -0,0 +1,106 @@ +import com.google.api.client.googleapis.batch.BatchRequest; +import com.google.api.client.googleapis.json.GoogleJsonError; +import com.google.api.client.http.FileContent; +import com.google.api.client.http.HttpHeaders; +import com.google.api.client.util.DateTime; +import com.google.api.services.gmail.Gmail; +import com.google.api.services.gmail.model.*; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.OutputStream; +import java.time.LocalDateTime; +import java.time.ZoneOffset; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; + + +public class SettingsSnippets { + + private Gmail service; + + public SettingsSnippets(Gmail service) { + this.service = service; + } + + public String updateSignature() throws IOException { + Gmail gmailService = this.service; + // [START updateSignature] + SendAs primaryAlias = null; + ListSendAsResponse aliases = gmailService.users().settings().sendAs().list("me").execute(); + for (SendAs alias: aliases.getSendAs()) { + if (alias.getIsPrimary()) { + primaryAlias = alias; + break; + } + } + SendAs aliasSettings = new SendAs().setSignature("I heart cats."); + SendAs result = gmailService.users().settings().sendAs().patch( + "me", + primaryAlias.getSendAsEmail(), + aliasSettings) + .execute(); + System.out.println("Updated signature for " + result.getDisplayName()); + // [END updateSignature] + return result.getSignature(); + } + + public String createFilter(String realLabelId) throws IOException { + Gmail gmailService = this.service; + // [START createFilter] + String labelId = "Label_14"; // ID of the user label to add + // [START_EXCLUDE silent] + labelId = realLabelId; + // [END_EXCLUDE] + Filter filter = new Filter() + .setCriteria(new FilterCriteria() + .setFrom("cat-enthusiasts@example.com")) + .setAction(new FilterAction() + .setAddLabelIds(Arrays.asList(labelId)) + .setRemoveLabelIds(Arrays.asList("INBOX"))); + Filter result = gmailService.users().settings().filters().create("me", filter).execute(); + System.out.println("Created filter " + result.getId()); + // [END createFilter] + return result.getId(); + } + + public AutoForwarding enableForwarding(String realForwardingAddress) throws IOException { + Gmail gmailService = this.service; + // [START enableForwarding] + ForwardingAddress address = new ForwardingAddress() + .setForwardingEmail("user2@example.com"); + // [START_EXCLUDE silent] + address.setForwardingEmail(realForwardingAddress); + // [END_EXCLUDE] + ForwardingAddress createAddressResult = gmailService.users().settings().forwardingAddresses() + .create("me", address).execute(); + if (createAddressResult.getVerificationStatus().equals("accepted")) { + AutoForwarding autoForwarding = new AutoForwarding() + .setEnabled(true) + .setEmailAddress(address.getForwardingEmail()) + .setDisposition("trash"); + autoForwarding = gmailService.users().settings().updateAutoForwarding("me", autoForwarding).execute(); + // [START_EXCLUDE silent] + return autoForwarding; + } + // [END enableForwarding] + return null; + } + + public VacationSettings enableAutoReply() throws IOException { + Gmail gmailService = this.service; + // [START enableAutoReply] + VacationSettings vacationSettings = new VacationSettings() + .setEnableAutoReply(true) + .setResponseBodyHtml("I'm on vacation and will reply when I'm back in the office. Thanks!") + .setRestrictToDomain(true) + .setStartTime(LocalDateTime.now().toEpochSecond(ZoneOffset.UTC) * 1000) + .setEndTime(LocalDateTime.now().plusDays(7).toEpochSecond(ZoneOffset.UTC) * 1000); + VacationSettings response = gmailService.users().settings().updateVacation("me", vacationSettings).execute(); + // [END enableAutoReply] + return response; + } + +} diff --git a/gmail/snippets/src/main/java/SmimeSnippets.java b/gmail/snippets/src/main/java/SmimeSnippets.java new file mode 100644 index 00000000..12f895ca --- /dev/null +++ b/gmail/snippets/src/main/java/SmimeSnippets.java @@ -0,0 +1,275 @@ +import com.google.api.services.gmail.Gmail; +import com.google.api.services.gmail.model.*; +import com.google.api.services.gmail.model.SmimeInfo; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.time.Instant; +import java.time.LocalDateTime; +import java.time.ZoneId; +import java.util.Base64; +import org.apache.commons.csv.CSVFormat; +import org.apache.commons.csv.CSVParser; +import org.apache.commons.csv.CSVRecord; + +class SmimeSnippets { + + SmimeSnippets() {} + + // [START create_smime_info] + /** + * Create an SmimeInfo resource for a certificate from file. + * + * @param filename Name of the file containing the S/MIME certificate. + * @param password Password for the certificate file, or null if the file is not + * password-protected. + * @return An SmimeInfo object with the specified certificate. + */ + public static SmimeInfo createSmimeInfo(String filename, String password) { + SmimeInfo smimeInfo = null; + InputStream in = null; + + try { + File file = new File(filename); + in = new FileInputStream(file); + byte fileContent[] = new byte[(int) file.length()]; + in.read(fileContent); + + smimeInfo = new SmimeInfo(); + smimeInfo.setPkcs12(Base64.getUrlEncoder().encodeToString(fileContent)); + if (password != null && password.length() > 0) { + smimeInfo.setEncryptedKeyPassword(password); + } + } catch (Exception e) { + System.out.printf("An error occured while reading the certificate file: %s\n", e); + } finally { + try { + if (in != null) { + in.close(); + } + } catch (IOException ioe) { + System.out.printf("An error occured while closing the input stream: %s\n", ioe); + } + } + + return smimeInfo; + } + // [END create_smime_info] + + // [START insert_smime_info] + /** + * Upload an S/MIME certificate for the user. + * + * @param service Authorized GMail API service instance. + * @param userId User's email address. + * @param sendAsEmail The "send as" email address, or null if it should be the same as userId. + * @param smimeInfo The SmimeInfo object containing the user's S/MIME certificate. + * @return An SmimeInfo object with details about the uploaded certificate. + */ + public static SmimeInfo insertSmimeInfo( + Gmail service, String userId, String sendAsEmail, SmimeInfo smimeInfo) { + if (sendAsEmail == null) { + sendAsEmail = userId; + } + + try { + SmimeInfo results = + service + .users() + .settings() + .sendAs() + .smimeInfo() + .insert(userId, sendAsEmail, smimeInfo) + .execute(); + System.out.printf("Inserted certificate, id: %s\n", results.getId()); + return results; + } catch (IOException e) { + System.err.printf("An error occured: %s", e); + } + + return null; + } + // [END insert_smime_info] + + // [START insert_cert_from_csv] + /** + * A builder that returns a GMail API service instance that is authorized to act on behalf of the + * specified user. + */ + @FunctionalInterface + public interface GmailServiceBuilder { + Gmail buildGmailServiceFromUserId(String userId) throws IOException; + } + + /** + * Upload S/MIME certificates based on the contents of a CSV file. + * + *

Each row of the CSV file should contain a user ID, path to the certificate, and the + * certificate password. + * + * @param serviceBuilder A function that returns an authorized GMail API service instance for a + * given user. + * @param csvFilename Name of the CSV file. + */ + public static void insertCertFromCsv(GmailServiceBuilder serviceBuilder, String csvFilename) { + try { + File csvFile = new File(csvFilename); + CSVParser parser = + CSVParser.parse(csvFile, java.nio.charset.StandardCharsets.UTF_8, CSVFormat.DEFAULT); + for (CSVRecord record : parser) { + String userId = record.get(0); + String certFilename = record.get(1); + String certPassword = record.get(2); + SmimeInfo smimeInfo = createSmimeInfo(certFilename, certPassword); + if (smimeInfo != null) { + insertSmimeInfo( + serviceBuilder.buildGmailServiceFromUserId(userId), userId, userId, smimeInfo); + } else { + System.err.printf("Unable to read certificate file for userId: %s\n", userId); + } + } + } catch (Exception e) { + System.err.printf("An error occured while reading the CSV file: %s", e); + } + } + // [END insert_cert_from_csv] + + // [START update_smime_certs] + /** + * Update S/MIME certificates for the user. + * + *

First performs a lookup of all certificates for a user. If there are no certificates, or + * they all expire before the specified date/time, uploads the certificate in the specified file. + * If the default certificate is expired or there was no default set, chooses the certificate with + * the expiration furthest into the future and sets it as default. + * + * @param service Authorized GMail API service instance. + * @param userId User's email address. + * @param sendAsEmail The "send as" email address, or None if it should be the same as user_id. + * @param certFilename Name of the file containing the S/MIME certificate. + * @param certPassword Password for the certificate file, or None if the file is not + * password-protected. + * @param expireTime DateTime object against which the certificate expiration is compared. If + * None, uses the current time. @ returns: The ID of the default certificate. + * @return The ID of the default certifcate. + */ + public static String updateSmimeCerts( + Gmail service, + String userId, + String sendAsEmail, + String certFilename, + String certPassword, + LocalDateTime expireTime) { + if (sendAsEmail == null) { + sendAsEmail = userId; + } + + ListSmimeInfoResponse listResults = null; + try { + listResults = + service.users().settings().sendAs().smimeInfo().list(userId, sendAsEmail).execute(); + } catch (IOException e) { + System.err.printf("An error occurred during list: %s\n", e); + return null; + } + + String defaultCertId = null; + String bestCertId = null; + LocalDateTime bestCertExpire = LocalDateTime.MIN; + + if (expireTime == null) { + expireTime = LocalDateTime.now(); + } + if (listResults != null && listResults.getSmimeInfo() != null) { + for (SmimeInfo smimeInfo : listResults.getSmimeInfo()) { + String certId = smimeInfo.getId(); + boolean isDefaultCert = smimeInfo.getIsDefault(); + if (isDefaultCert) { + defaultCertId = certId; + } + LocalDateTime exp = + LocalDateTime.ofInstant( + Instant.ofEpochMilli(smimeInfo.getExpiration()), ZoneId.systemDefault()); + if (exp.isAfter(expireTime)) { + if (exp.isAfter(bestCertExpire)) { + bestCertId = certId; + bestCertExpire = exp; + } + } else { + if (isDefaultCert) { + defaultCertId = null; + } + } + } + } + if (defaultCertId == null) { + String defaultId = bestCertId; + if (defaultId == null && certFilename != null) { + SmimeInfo smimeInfo = createSmimeInfo(certFilename, certPassword); + SmimeInfo insertResults = insertSmimeInfo(service, userId, sendAsEmail, smimeInfo); + if (insertResults != null) { + defaultId = insertResults.getId(); + } + } + + if (defaultId != null) { + try { + service + .users() + .settings() + .sendAs() + .smimeInfo() + .setDefault(userId, sendAsEmail, defaultId) + .execute(); + return defaultId; + } catch (IOException e) { + System.err.printf("An error occured during setDefault: %s", e); + } + } + } else { + return defaultCertId; + } + + return null; + } + + /** + * Update S/MIME certificates based on the contents of a CSV file. + * + *

Each row of the CSV file should contain a user ID, path to the certificate, and the + * certificate password. + * + * @param serviceBuilder A function that returns an authorized GMail API service instance for a + * given user. + * @param csvFilename Name of the CSV file. + * @param expireTime DateTime object against which the certificate expiration is compared. If + * None, uses the current time. + */ + public static void updateSmimeFromCsv( + GmailServiceBuilder serviceBuilder, String csvFilename, LocalDateTime expireTime) { + try { + File csvFile = new File(csvFilename); + CSVParser parser = + CSVParser.parse( + csvFile, + java.nio.charset.StandardCharsets.UTF_8, + CSVFormat.DEFAULT.withHeader().withSkipHeaderRecord()); + for (CSVRecord record : parser) { + String userId = record.get(0); + String certFilename = record.get(1); + String certPassword = record.get(2); + updateSmimeCerts( + serviceBuilder.buildGmailServiceFromUserId(userId), + userId, + userId, + certFilename, + certPassword, + expireTime); + } + } catch (Exception e) { + System.err.printf("An error occured while reading the CSV file: %s", e); + } + } + // [END update_smime_certs] +} diff --git a/gmail/snippets/src/test/java/BaseTest.java b/gmail/snippets/src/test/java/BaseTest.java new file mode 100644 index 00000000..9fa3740f --- /dev/null +++ b/gmail/snippets/src/test/java/BaseTest.java @@ -0,0 +1,81 @@ +import com.google.api.client.googleapis.auth.oauth2.GoogleCredential; +import com.google.api.client.http.HttpTransport; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.jackson2.JacksonFactory; +import com.google.api.services.gmail.Gmail; +import com.google.api.services.gmail.GmailScopes; +import org.junit.Before; + +import java.io.IOException; +import java.security.GeneralSecurityException; +import java.util.*; +import java.util.logging.Handler; +import java.util.logging.Level; +import java.util.logging.LogRecord; +import java.util.logging.Logger; + +public class BaseTest { + + public static final String TEST_USER = "gdtest1@appsrocks.com"; + public static final String RECIPIENT = "gdtest2@appsrocks.com"; + public static final String FORWARDING_ADDRESS = "gdtest2@appsrocks.com"; + + static { + enableLogging(); + } + + protected Gmail service; + + + public static void enableLogging() { + Logger logger = Logger.getLogger(HttpTransport.class.getName()); + logger.setLevel(Level.ALL); + logger.addHandler(new Handler() { + + @Override + public void close() throws SecurityException { + } + + @Override + public void flush() { + } + + @Override + public void publish(LogRecord record) { + // default ConsoleHandler will print >= INFO to System.err + if (record.getLevel().intValue() < Level.INFO.intValue()) { + System.out.println(record.getMessage()); + } + } + }); + } + + public GoogleCredential getCredential() throws IOException { + GoogleCredential defaultCredentials = GoogleCredential.getApplicationDefault(); + return new GoogleCredential.Builder() + .setServiceAccountId(defaultCredentials.getServiceAccountId()) + .setServiceAccountPrivateKey(defaultCredentials.getServiceAccountPrivateKey()) + .setServiceAccountPrivateKeyId(defaultCredentials.getServiceAccountPrivateKeyId()) + .setServiceAccountUser(TEST_USER) + .setJsonFactory(defaultCredentials.getJsonFactory()) + .setTransport(defaultCredentials.getTransport()) + .setServiceAccountScopes(Arrays.asList(GmailScopes.GMAIL_COMPOSE, GmailScopes.GMAIL_SEND, GmailScopes.GMAIL_LABELS, GmailScopes.GMAIL_SETTINGS_BASIC, GmailScopes.GMAIL_SETTINGS_SHARING)) + .build(); + } + + public Gmail buildService() throws IOException, GeneralSecurityException { + GoogleCredential credential = getCredential(); + return new Gmail.Builder( + new NetHttpTransport(), + JacksonFactory.getDefaultInstance(), + credential) + .setApplicationName("Drive API Snippets") + .build(); + } + + @Before + public void setup() throws IOException, GeneralSecurityException { + this.service = buildService(); + } + +} diff --git a/gmail/snippets/src/test/java/SendEmailTest.java b/gmail/snippets/src/test/java/SendEmailTest.java new file mode 100644 index 00000000..6d17129b --- /dev/null +++ b/gmail/snippets/src/test/java/SendEmailTest.java @@ -0,0 +1,70 @@ +import com.google.api.services.gmail.model.*; +import org.junit.Test; + +import javax.mail.Message; +import javax.mail.MessagingException; +import javax.mail.internet.MimeMessage; +import java.io.IOException; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; + +public class SendEmailTest extends BaseTest { + + @Test + public void createEmail() throws MessagingException, IOException { + MimeMessage mimeMessage = SendEmail.createEmail(RECIPIENT, + TEST_USER, + "test", + "Hello!"); + assertEquals("test", mimeMessage.getSubject()); + assertEquals("Hello!", mimeMessage.getContent()); + assertEquals(RECIPIENT, mimeMessage.getRecipients(Message.RecipientType.TO)[0].toString()); + assertEquals(TEST_USER, mimeMessage.getFrom()[0].toString()); + } + + @Test + public void createEmailWithAttachment() throws MessagingException, IOException { + MimeMessage mimeMessage = SendEmail.createEmailWithAttachment(RECIPIENT, + TEST_USER, + "test", + "Hello!", + new java.io.File("files/photo.jpg")); + assertEquals("test", mimeMessage.getSubject()); + assertEquals(RECIPIENT, mimeMessage.getRecipients(Message.RecipientType.TO)[0].toString()); + assertEquals(TEST_USER, mimeMessage.getFrom()[0].toString()); + } + + @Test + public void createMessageWithEmail() throws MessagingException, IOException { + MimeMessage mimeMessage = SendEmail.createEmail(RECIPIENT, + TEST_USER, + "test", + "Hello!"); + + com.google.api.services.gmail.model.Message message = SendEmail.createMessageWithEmail(mimeMessage); + assertNotNull(message.getRaw()); // Weak assertion... + } + + @Test + public void createDraft() throws MessagingException, IOException { + MimeMessage mimeMessage = SendEmail.createEmail(RECIPIENT, + TEST_USER, + "test", + "Hello!"); + Draft draft = SendEmail.createDraft(this.service, "me", mimeMessage); + assertNotNull(draft); + this.service.users().drafts().delete("me", draft.getId()); + } + + @Test + public void sendEmail() throws MessagingException, IOException { + MimeMessage mimeMessage = SendEmail.createEmailWithAttachment(RECIPIENT, + TEST_USER, + "test", + "Hello!", + new java.io.File("files/photo.jpg")); + com.google.api.services.gmail.model.Message message = SendEmail.sendMessage(this.service, "me", mimeMessage); + assertNotNull(message); + } +} diff --git a/gmail/snippets/src/test/java/SettingsSnippetsTest.java b/gmail/snippets/src/test/java/SettingsSnippetsTest.java new file mode 100644 index 00000000..8622e8d4 --- /dev/null +++ b/gmail/snippets/src/test/java/SettingsSnippetsTest.java @@ -0,0 +1,77 @@ + +import com.google.api.services.gmail.model.AutoForwarding; +import com.google.api.services.gmail.model.Label; +import com.google.api.services.gmail.model.ListLabelsResponse; +import com.google.api.services.gmail.model.VacationSettings; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +import java.io.IOException; +import java.security.GeneralSecurityException; + +import static org.junit.Assert.*; + +public class SettingsSnippetsTest extends BaseTest { + + private SettingsSnippets snippets; + private Label testLabel = null; + + @Before + public void createSnippets() { + this.snippets = new SettingsSnippets(this.service); + } + + @Before + public void createLabel() throws IOException { + ListLabelsResponse response = this.service.users().labels().list("me").execute(); + for (Label l : response.getLabels()) { + if (l.getName().equals("testLabel")) { + testLabel = l; + } + } + if (testLabel == null) { + Label label = new Label() + .setName("testLabel") + .setLabelListVisibility("labelShow") + .setMessageListVisibility("show"); + testLabel = this.service.users().labels().create("me", label).execute(); + } + } + + @After + public void deleteLabel() throws IOException { + if (testLabel != null) { + this.service.users().labels().delete("me", testLabel.getId()).execute(); + testLabel = null; + } + } + + @Test + public void updateSignature() throws IOException, GeneralSecurityException { + String signature = this.snippets.updateSignature(); + assertEquals("I heart cats.", signature); + } + + @Test + public void createFilter() throws IOException, GeneralSecurityException { + String id = this.snippets.createFilter(testLabel.getId()); + assertNotNull(id); + this.service.users().settings().filters().delete("me", id).execute(); + } + + @Test + public void enableAutoForwarding() throws IOException, GeneralSecurityException { + AutoForwarding forwarding = this.snippets.enableForwarding(FORWARDING_ADDRESS); + assertNotNull(forwarding); + forwarding = new AutoForwarding().setEnabled(false); + this.service.users().settings().updateAutoForwarding("me", forwarding).execute(); + this.service.users().settings().forwardingAddresses().delete("me", FORWARDING_ADDRESS).execute(); + } + + @Test + public void enableAutoReply() throws IOException, GeneralSecurityException { + VacationSettings settings = this.snippets.enableAutoReply(); + assertNotNull(settings); + } +} diff --git a/gmail/snippets/src/test/java/SmimeSnippetsTest.java b/gmail/snippets/src/test/java/SmimeSnippetsTest.java new file mode 100644 index 00000000..6aefb3e3 --- /dev/null +++ b/gmail/snippets/src/test/java/SmimeSnippetsTest.java @@ -0,0 +1,410 @@ +import static org.hamcrest.Matchers.greaterThan; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertThat; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.any; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.verifyNoMoreInteractions; +import static org.mockito.Mockito.verifyZeroInteractions; +import static org.mockito.Mockito.when; + +import com.google.api.services.gmail.Gmail; +import com.google.api.services.gmail.model.*; +import java.io.IOException; +import java.time.Instant; +import java.time.LocalDateTime; +import java.time.ZoneId; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import org.junit.After; +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.mockito.Mock; +import org.mockito.junit.MockitoJUnit; +import org.mockito.junit.MockitoRule; + +public class SmimeSnippetsTest { + + private static final long CURRENT_TIME_MS = 1234567890; + private static final LocalDateTime CURRENT_TIME = + LocalDateTime.ofInstant(Instant.ofEpochMilli(CURRENT_TIME_MS), ZoneId.systemDefault()); + private static final String TEST_USER = "user1@example.com"; + + @Mock private Gmail mockService; + @Mock private Gmail.Users mockUsers; + @Mock private Gmail.Users.Settings mockSettings; + @Mock private Gmail.Users.Settings.SendAs mockSendAs; + @Mock private Gmail.Users.Settings.SendAs.SmimeInfo mockSmimeInfo; + @Mock private Gmail.Users.Settings.SendAs.SmimeInfo.Delete mockDelete; + @Mock private Gmail.Users.Settings.SendAs.SmimeInfo.Get mockGet; + @Mock private Gmail.Users.Settings.SendAs.SmimeInfo.Insert mockInsert; + @Mock private Gmail.Users.Settings.SendAs.SmimeInfo.List mockList; + @Mock private Gmail.Users.Settings.SendAs.SmimeInfo.SetDefault mockSetDefault; + + @Rule public MockitoRule mockitoRule = MockitoJUnit.rule(); + + @Before + public void setup() throws IOException { + when(mockService.users()).thenReturn(mockUsers); + when(mockUsers.settings()).thenReturn(mockSettings); + when(mockSettings.sendAs()).thenReturn(mockSendAs); + when(mockSendAs.smimeInfo()).thenReturn(mockSmimeInfo); + + when(mockSmimeInfo.delete(any(), any(), any())).thenReturn(mockDelete); + when(mockSmimeInfo.get(any(), any(), any())).thenReturn(mockGet); + when(mockSmimeInfo.insert(any(), any(), any())).thenReturn(mockInsert); + when(mockSmimeInfo.list(any(), any())).thenReturn(mockList); + when(mockSmimeInfo.setDefault(any(), any(), any())).thenReturn(mockSetDefault); + } + + @After + public void tearDown() throws IOException { + verifyNoMoreInteractions(mockService); + verifyNoMoreInteractions(mockUsers); + verifyNoMoreInteractions(mockSettings); + verifyNoMoreInteractions(mockSendAs); + verifyNoMoreInteractions(mockSmimeInfo); + verifyNoMoreInteractions(mockInsert); + verifyNoMoreInteractions(mockList); + verifyNoMoreInteractions(mockSetDefault); + + verifyZeroInteractions(mockDelete); + verifyZeroInteractions(mockGet); + } + + @Test + public void testCreateSmimeInfo() { + SmimeInfo smimeInfo = SmimeSnippets.createSmimeInfo("files/cert.p12", null /* password */); + + assertNotNull(smimeInfo); + assertNull(smimeInfo.getEncryptedKeyPassword()); + assertNull(smimeInfo.getExpiration()); + assertNull(smimeInfo.getId()); + assertNull(smimeInfo.getIsDefault()); + assertNull(smimeInfo.getIssuerCn()); + assertNull(smimeInfo.getPem()); + assertThat(smimeInfo.getPkcs12().length(), greaterThan(0)); + } + + @Test + public void testCreateSmimeInfoWithPassword() { + SmimeInfo smimeInfo = SmimeSnippets.createSmimeInfo("files/cert.p12", "certpass"); + + assertNotNull(smimeInfo); + assertEquals(smimeInfo.getEncryptedKeyPassword(), "certpass"); + assertNull(smimeInfo.getExpiration()); + assertNull(smimeInfo.getId()); + assertNull(smimeInfo.getIsDefault()); + assertNull(smimeInfo.getIssuerCn()); + assertNull(smimeInfo.getPem()); + assertThat(smimeInfo.getPkcs12().length(), greaterThan(0)); + } + + @Test + public void testCreateSmimeInfoFileNotFound() { + SmimeInfo smimeInfo = SmimeSnippets.createSmimeInfo("files/notfound.p12", null /* password */); + + assertNull(smimeInfo); + } + + @Test + public void testInsertSmimeInfo() throws IOException { + SmimeInfo insertResult = makeFakeInsertResult(); + when(mockInsert.execute()).thenReturn(insertResult); + + SmimeInfo smimeInfo = SmimeSnippets.createSmimeInfo("files/cert.p12", null /* password */); + SmimeInfo result = SmimeSnippets.insertSmimeInfo(mockService, TEST_USER, TEST_USER, smimeInfo); + + verifySmimeApiCalled(1); + verify(mockSmimeInfo).insert(eq(TEST_USER), eq(TEST_USER), eq(smimeInfo)); + verify(mockInsert).execute(); + + assertEquals(insertResult, result); + } + + @Test + public void testInsertSmimeInfoError() throws IOException { + when(mockInsert.execute()).thenThrow(IOException.class); + + SmimeInfo smimeInfo = SmimeSnippets.createSmimeInfo("files/cert.p12", null /* password */); + SmimeInfo result = SmimeSnippets.insertSmimeInfo(mockService, TEST_USER, TEST_USER, smimeInfo); + + verifySmimeApiCalled(1); + verify(mockSmimeInfo).insert(eq(TEST_USER), eq(TEST_USER), eq(smimeInfo)); + verify(mockInsert).execute(); + + assertNull(result); + } + + @Test + public void testInsertSmimeFromCsv() throws IOException { + when(mockInsert.execute()).thenReturn(makeFakeInsertResult()); + + SmimeSnippets.insertCertFromCsv((u) -> mockService, "files/certs.csv"); + + verifySmimeApiCalled(2); + verify(mockSmimeInfo).insert(eq("user1@example.com"), eq("user1@example.com"), any()); + verify(mockSmimeInfo).insert(eq("user2@example.com"), eq("user2@example.com"), any()); + verify(mockInsert, times(2)).execute(); + } + + @Test + public void testInsertSmimeFromCsvFails() throws IOException { + when(mockInsert.execute()).thenReturn(makeFakeInsertResult()); + + SmimeSnippets.insertCertFromCsv((u) -> mockService, "files/notfound.csv"); + } + + @Test + public void testUpdateSmimeCertsNoCerts() throws IOException { + when(mockList.execute()).thenReturn(makeFakeListResult()); + + String defaultCertId = + SmimeSnippets.updateSmimeCerts( + mockService, + TEST_USER, + TEST_USER, + null /* certFilename */, + null /* certPassword */, + CURRENT_TIME); + + verifySmimeApiCalled(1); + verify(mockSmimeInfo).list(eq(TEST_USER), eq(TEST_USER)); + verify(mockList).execute(); + + assertNull(defaultCertId); + } + + @Test + public void testUpdateSmimeCertsNoCertsUploadNewCert() throws IOException { + when(mockList.execute()).thenReturn(makeFakeListResult()); + when(mockInsert.execute()).thenReturn(makeFakeInsertResult()); + + String defaultCertId = + SmimeSnippets.updateSmimeCerts( + mockService, + TEST_USER, + TEST_USER, + "files/cert.p12", + null /* certPassword */, + CURRENT_TIME); + + verifySmimeApiCalled(3); + verify(mockSmimeInfo).list(eq(TEST_USER), eq(TEST_USER)); + verify(mockSmimeInfo).insert(eq(TEST_USER), eq(TEST_USER), any()); + verify(mockSmimeInfo).setDefault(eq(TEST_USER), eq(TEST_USER), eq("new_certificate_id")); + verify(mockList).execute(); + verify(mockInsert).execute(); + verify(mockSetDefault).execute(); + + assertEquals(defaultCertId, "new_certificate_id"); + } + + @Test + public void testUpdateSmimeCertsValidDefaultCertNoUpload() throws IOException { + ListSmimeInfoResponse listResponse = + makeFakeListResult(Arrays.asList(true), Arrays.asList(CURRENT_TIME_MS + 1)); + when(mockList.execute()).thenReturn(listResponse); + + String defaultCertId = + SmimeSnippets.updateSmimeCerts( + mockService, + TEST_USER, + TEST_USER, + "files/cert.p12", + null /* certPassword */, + CURRENT_TIME); + + verifySmimeApiCalled(1); + verify(mockSmimeInfo).list(eq(TEST_USER), eq(TEST_USER)); + verify(mockList).execute(); + + assertEquals(defaultCertId, "existing_certificate_id0"); + } + + @Test + public void testUpdateSmimeCertsExpiredDefaultCertUploadNewCert() throws IOException { + LocalDateTime expireTime = + LocalDateTime.ofInstant(Instant.ofEpochMilli(CURRENT_TIME_MS + 2), ZoneId.systemDefault()); + ListSmimeInfoResponse listResponse = + makeFakeListResult(Arrays.asList(true), Arrays.asList(CURRENT_TIME_MS + 1)); + when(mockList.execute()).thenReturn(listResponse); + + when(mockInsert.execute()).thenReturn(makeFakeInsertResult()); + + String defaultCertId = + SmimeSnippets.updateSmimeCerts( + mockService, + TEST_USER, + TEST_USER, + "files/cert.p12", + null /* certPassword */, + expireTime); + + verifySmimeApiCalled(3); + verify(mockSmimeInfo).list(eq(TEST_USER), eq(TEST_USER)); + verify(mockSmimeInfo).insert(eq(TEST_USER), eq(TEST_USER), any()); + verify(mockSmimeInfo).setDefault(eq(TEST_USER), eq(TEST_USER), eq("new_certificate_id")); + verify(mockList).execute(); + verify(mockInsert).execute(); + verify(mockSetDefault).execute(); + + assertEquals(defaultCertId, "new_certificate_id"); + } + + @Test + public void testUpdateSmimeCertsExpiredDefaultCertOtherCertNewDefault() throws IOException { + ListSmimeInfoResponse listResponse = + makeFakeListResult( + Arrays.asList(true, false), Arrays.asList(CURRENT_TIME_MS - 1, CURRENT_TIME_MS + 1)); + when(mockList.execute()).thenReturn(listResponse); + + String defaultCertId = + SmimeSnippets.updateSmimeCerts( + mockService, + TEST_USER, + TEST_USER, + "files/cert.p12", + null /* certPassword */, + CURRENT_TIME); + + verifySmimeApiCalled(2); + verify(mockSmimeInfo).list(eq(TEST_USER), eq(TEST_USER)); + verify(mockSmimeInfo).setDefault(eq(TEST_USER), eq(TEST_USER), eq("existing_certificate_id1")); + verify(mockList).execute(); + verify(mockSetDefault).execute(); + + assertEquals(defaultCertId, "existing_certificate_id1"); + } + + @Test + public void testUpdateSmimeCertsNoCertsNoDefaultsChooseBestCertAsNewDefault() throws IOException { + ListSmimeInfoResponse listResponse = + makeFakeListResult( + Arrays.asList(false, false, false, false), + Arrays.asList( + CURRENT_TIME_MS + 2, + CURRENT_TIME_MS + 1, + CURRENT_TIME_MS + 4, + CURRENT_TIME_MS + 3)); + when(mockList.execute()).thenReturn(listResponse); + + String defaultCertId = + SmimeSnippets.updateSmimeCerts( + mockService, + TEST_USER, + TEST_USER, + "files/cert.p12", + null /* certPassword */, + CURRENT_TIME); + + verifySmimeApiCalled(2); + verify(mockSmimeInfo).list(eq(TEST_USER), eq(TEST_USER)); + verify(mockSmimeInfo).setDefault(eq(TEST_USER), eq(TEST_USER), eq("existing_certificate_id2")); + verify(mockList).execute(); + verify(mockSetDefault).execute(); + + assertEquals(defaultCertId, "existing_certificate_id2"); + } + + @Test + public void testUpdateSmimeCertsError() throws IOException { + when(mockList.execute()).thenThrow(IOException.class); + + String defaultCertId = + SmimeSnippets.updateSmimeCerts( + mockService, + TEST_USER, + TEST_USER, + "files/cert.p12", + null /* certPassword */, + CURRENT_TIME); + + verifySmimeApiCalled(1); + verify(mockSmimeInfo).list(eq(TEST_USER), eq(TEST_USER)); + verify(mockList).execute(); + + assertNull(defaultCertId); + } + + @Test + public void testUpdateSmimeFromCsv() throws IOException { + when(mockList.execute()).thenReturn(makeFakeListResult()); + when(mockInsert.execute()).thenReturn(makeFakeInsertResult()); + + SmimeSnippets.updateSmimeFromCsv((u) -> mockService, "files/certs.csv", CURRENT_TIME); + + verifySmimeApiCalled(9); + verify(mockSmimeInfo).list(eq("user1@example.com"), eq("user1@example.com")); + verify(mockSmimeInfo).list(eq("user2@example.com"), eq("user2@example.com")); + verify(mockSmimeInfo).list(eq("user3@example.com"), eq("user3@example.com")); + verify(mockSmimeInfo).insert(eq("user1@example.com"), eq("user1@example.com"), any()); + verify(mockSmimeInfo).insert(eq("user2@example.com"), eq("user2@example.com"), any()); + verify(mockSmimeInfo).insert(eq("user3@example.com"), eq("user3@example.com"), any()); + verify(mockSmimeInfo) + .setDefault(eq("user1@example.com"), eq("user1@example.com"), eq("new_certificate_id")); + verify(mockSmimeInfo) + .setDefault(eq("user2@example.com"), eq("user2@example.com"), eq("new_certificate_id")); + verify(mockSmimeInfo) + .setDefault(eq("user3@example.com"), eq("user3@example.com"), eq("new_certificate_id")); + verify(mockList, times(3)).execute(); + verify(mockInsert, times(3)).execute(); + verify(mockSetDefault, times(3)).execute(); + } + + @Test + public void testUpdateSmimeFromCsvFails() { + SmimeSnippets.insertCertFromCsv((u) -> mockService, "files/notfound.csv"); + // tearDown() verifies that there were no interactions with the API. + } + + private void verifySmimeApiCalled(int numCalls) { + verify(mockService, times(numCalls)).users(); + verify(mockUsers, times(numCalls)).settings(); + verify(mockSettings, times(numCalls)).sendAs(); + verify(mockSendAs, times(numCalls)).smimeInfo(); + } + + private ListSmimeInfoResponse makeFakeListResult(List isDefault, List expiration) { + ListSmimeInfoResponse listResponse = new ListSmimeInfoResponse(); + if (isDefault == null || expiration == null) { + return listResponse; + } + + assertEquals(isDefault.size(), expiration.size()); + + List smimeInfoList = new ArrayList(); + for (int i = 0; i < isDefault.size(); i++) { + SmimeInfo smimeInfo = new SmimeInfo(); + smimeInfo.setId(String.format("existing_certificate_id%d", i)); + smimeInfo.setIsDefault(isDefault.get(i)); + smimeInfo.setExpiration(expiration.get(i)); + smimeInfoList.add(smimeInfo); + } + listResponse.setSmimeInfo(smimeInfoList); + + return listResponse; + } + + private ListSmimeInfoResponse makeFakeListResult() { + return makeFakeListResult(null /* isDefault */, null /* expiration */); + } + + private SmimeInfo makeFakeInsertResult(String id, boolean isDefault, long expiration) { + SmimeInfo insertResult = new SmimeInfo(); + insertResult.setId(id); + insertResult.setIsDefault(isDefault); + insertResult.setExpiration(expiration); + + return insertResult; + } + + private SmimeInfo makeFakeInsertResult() { + return makeFakeInsertResult("new_certificate_id", false, CURRENT_TIME_MS + 1); + } +} From f7ca6935bffafacf536d42ded5ea113da82e0be0 Mon Sep 17 00:00:00 2001 From: Manvendra-P-Singh Date: Wed, 19 Jan 2022 16:50:52 +0000 Subject: [PATCH 029/262] git-on-borg files of drive-api-snippets (#156) * git-on-borg files of drive-api-snippets * git-on-borg files of drive-api-snippets Co-authored-by: Rajesh Mudaliyar Co-authored-by: sanjuktaghosh7 --- drive/snippets/drive_v2/build.gradle | 16 + drive/snippets/drive_v2/settings.gradle | 2 + .../src/main/java/AppDataSnippets.java | 63 ++++ .../src/main/java/ChangeSnippets.java | 49 +++ .../drive_v2/src/main/java/DriveSnippets.java | 81 +++++ .../drive_v2/src/main/java/FileSnippets.java | 297 ++++++++++++++++++ .../src/main/java/TeamDriveSnippets.java | 84 +++++ drive/snippets/drive_v3/.gitignore | 5 + drive/snippets/drive_v3/build.gradle | 12 + drive/snippets/drive_v3/settings.gradle | 11 + .../src/main/java/AppDataSnippets.java | 61 ++++ .../src/main/java/ChangeSnippets.java | 48 +++ .../drive_v3/src/main/java/DriveSnippets.java | 84 +++++ .../drive_v3/src/main/java/FileSnippets.java | 290 +++++++++++++++++ .../src/main/java/TeamDriveSnippets.java | 84 +++++ 15 files changed, 1187 insertions(+) create mode 100644 drive/snippets/drive_v2/build.gradle create mode 100644 drive/snippets/drive_v2/settings.gradle create mode 100644 drive/snippets/drive_v2/src/main/java/AppDataSnippets.java create mode 100644 drive/snippets/drive_v2/src/main/java/ChangeSnippets.java create mode 100644 drive/snippets/drive_v2/src/main/java/DriveSnippets.java create mode 100644 drive/snippets/drive_v2/src/main/java/FileSnippets.java create mode 100644 drive/snippets/drive_v2/src/main/java/TeamDriveSnippets.java create mode 100644 drive/snippets/drive_v3/.gitignore create mode 100644 drive/snippets/drive_v3/build.gradle create mode 100644 drive/snippets/drive_v3/settings.gradle create mode 100644 drive/snippets/drive_v3/src/main/java/AppDataSnippets.java create mode 100644 drive/snippets/drive_v3/src/main/java/ChangeSnippets.java create mode 100644 drive/snippets/drive_v3/src/main/java/DriveSnippets.java create mode 100644 drive/snippets/drive_v3/src/main/java/FileSnippets.java create mode 100644 drive/snippets/drive_v3/src/main/java/TeamDriveSnippets.java diff --git a/drive/snippets/drive_v2/build.gradle b/drive/snippets/drive_v2/build.gradle new file mode 100644 index 00000000..d49d8d61 --- /dev/null +++ b/drive/snippets/drive_v2/build.gradle @@ -0,0 +1,16 @@ +apply plugin: 'java' + +repositories { + mavenCentral() +} + +dependencies { + implementation 'com.google.apis:google-api-services-drive:v2-rev20211205-1.32.1' + implementation 'com.google.api-client:google-api-client:1.23.0' + implementation 'com.google.code.gson:gson:2.4' + testImplementation 'junit:junit:4.12' +} + +test { + useJUnitPlatform() +} \ No newline at end of file diff --git a/drive/snippets/drive_v2/settings.gradle b/drive/snippets/drive_v2/settings.gradle new file mode 100644 index 00000000..f91561c8 --- /dev/null +++ b/drive/snippets/drive_v2/settings.gradle @@ -0,0 +1,2 @@ +rootProject.name = 'drive_v2' + diff --git a/drive/snippets/drive_v2/src/main/java/AppDataSnippets.java b/drive/snippets/drive_v2/src/main/java/AppDataSnippets.java new file mode 100644 index 00000000..a05d5cc3 --- /dev/null +++ b/drive/snippets/drive_v2/src/main/java/AppDataSnippets.java @@ -0,0 +1,63 @@ +import com.google.api.client.http.FileContent; +import com.google.api.services.drive.Drive; +import com.google.api.services.drive.model.File; +import com.google.api.services.drive.model.FileList; +import com.google.api.services.drive.model.ParentReference; + +import java.io.IOException; +import java.util.Collections; + + +public class AppDataSnippets { + + private Drive service; + + public AppDataSnippets(Drive service) { + this.service = service; + } + + public String uploadAppData() throws IOException { + Drive driveService = this.service; + // [START uploadAppData] + File fileMetadata = new File(); + fileMetadata.setTitle("config.json"); + fileMetadata.setParents(Collections.singletonList( + new ParentReference().setId("appDataFolder"))); + java.io.File filePath = new java.io.File("files/config.json"); + FileContent mediaContent = new FileContent("application/json", filePath); + File file = driveService.files().insert(fileMetadata, mediaContent) + .setFields("id") + .execute(); + System.out.println("File ID: " + file.getId()); + // [END uploadAppData] + return file.getId(); + } + + public FileList listAppData() throws IOException { + Drive driveService = this.service; + // [START listAppData] + FileList files = driveService.files().list() + .setSpaces("appDataFolder") + .setFields("nextPageToken, items(id, title)") + .setMaxResults(10) + .execute(); + for (File file : files.getItems()) { + System.out.printf("Found file: %s (%s)\n", + file.getTitle(), file.getId()); + } + // [END listAppData] + return files; + } + + public String fetchAppDataFolder() throws IOException { + Drive driveService = this.service; + // [START fetchAppDataFolder] + File file = driveService.files().get("appDataFolder") + .setFields("id") + .execute(); + System.out.println("Folder ID: " + file.getId()); + // [END fetchAppDataFolder] + return file.getId(); + } + +} diff --git a/drive/snippets/drive_v2/src/main/java/ChangeSnippets.java b/drive/snippets/drive_v2/src/main/java/ChangeSnippets.java new file mode 100644 index 00000000..23710324 --- /dev/null +++ b/drive/snippets/drive_v2/src/main/java/ChangeSnippets.java @@ -0,0 +1,49 @@ +import com.google.api.services.drive.Drive; +import com.google.api.services.drive.model.Change; +import com.google.api.services.drive.model.ChangeList; +import com.google.api.services.drive.model.StartPageToken; + +import java.io.IOException; + +public class ChangeSnippets { + + private Drive service; + + public ChangeSnippets(Drive service) { + this.service = service; + } + + public String fetchStartPageToken() throws IOException { + Drive driveService = this.service; + // [START fetchStartPageToken] + StartPageToken response = driveService.changes() + .getStartPageToken().execute(); + System.out.println("Start token: " + response.getStartPageToken()); + // [END fetchStartPageToken] + return response.getStartPageToken(); + } + + public String fetchChanges(String savedStartPageToken) throws IOException { + Drive driveService = this.service; + // [START fetchChanges] + // Begin with our last saved start token for this user or the + // current token from getStartPageToken() + String pageToken = savedStartPageToken; + while (pageToken != null) { + ChangeList changes = driveService.changes().list() + .setPageToken(pageToken) + .execute(); + for (Change change : changes.getItems()) { + // Process change + System.out.println("Change found for file: " + change.getFileId()); + } + if (changes.getNewStartPageToken() != null) { + // Last page, save this token for the next polling interval + savedStartPageToken = changes.getNewStartPageToken(); + } + pageToken = changes.getNextPageToken(); + } + // [END fetchChanges] + return savedStartPageToken; + } +} diff --git a/drive/snippets/drive_v2/src/main/java/DriveSnippets.java b/drive/snippets/drive_v2/src/main/java/DriveSnippets.java new file mode 100644 index 00000000..49942b6d --- /dev/null +++ b/drive/snippets/drive_v2/src/main/java/DriveSnippets.java @@ -0,0 +1,81 @@ +import com.google.api.services.drive.model.Drive; +import com.google.api.services.drive.model.DriveList; +import com.google.api.services.drive.model.Permission; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; +import java.util.UUID; + +public class DriveSnippets { + private com.google.api.services.drive.Drive service; + + public DriveSnippets(com.google.api.services.drive.Drive service) { + this.service = service; + } + + public String createDrive() throws IOException { + com.google.api.services.drive.Drive driveService = this.service; + // [START createDrive] + Drive driveMetadata = new Drive(); + driveMetadata.setName("Project Resources"); + String requestId = UUID.randomUUID().toString(); + Drive drive = driveService.drives().insert(requestId, driveMetadata) + .execute(); + System.out.println("Drive ID: " + drive.getId()); + // [END createDrive] + return drive.getId(); + } + + public List recoverDrives(String realUser) + throws IOException { + com.google.api.services.drive.Drive driveService = this.service; + List drives = new ArrayList(); + // [START recoverDrives] + // Find all shared drives without an organizer and add one. + // Note: This example does not capture all cases. Shared drives + // that have an empty group as the sole organizer, or an + // organizer outside the organization are not captured. A + // more exhaustive approach would evaluate each shared drive + // and the associated permissions and groups to ensure an active + // organizer is assigned. + String pageToken = null; + Permission newOrganizerPermission = new Permission() + .setType("user") + .setRole("organizer") + .setValue("user@example.com"); + // [START_EXCLUDE silent] + newOrganizerPermission.setValue(realUser); + // [END_EXCLUDE] + + do { + DriveList result = driveService.drives().list() + .setQ("organizerCount = 0") + .setUseDomainAdminAccess(true) + .setFields("nextPageToken, items(id, name)") + .setPageToken(pageToken) + .execute(); + for (Drive drive : result.getItems()) { + System.out.printf("Found drive without organizer: %s (%s)\n", + drive.getName(), drive.getId()); + // Note: For improved efficiency, consider batching + // permission insert requests + Permission permissionResult = driveService.permissions() + .insert(drive.getId(), newOrganizerPermission) + .setUseDomainAdminAccess(true) + .setSupportsAllDrives(true) + .setFields("id") + .execute(); + System.out.printf("Added organizer permission: %s\n", + permissionResult.getId()); + + } + // [START_EXCLUDE silent] + drives.addAll(result.getItems()); + // [END_EXCLUDE] + pageToken = result.getNextPageToken(); + } while (pageToken != null); + // [END recoverDrives] + return drives; + } +} diff --git a/drive/snippets/drive_v2/src/main/java/FileSnippets.java b/drive/snippets/drive_v2/src/main/java/FileSnippets.java new file mode 100644 index 00000000..f79a8159 --- /dev/null +++ b/drive/snippets/drive_v2/src/main/java/FileSnippets.java @@ -0,0 +1,297 @@ +import com.google.api.client.googleapis.batch.BatchRequest; +import com.google.api.client.googleapis.batch.json.JsonBatchCallback; +import com.google.api.client.googleapis.json.GoogleJsonError; +import com.google.api.client.http.FileContent; +import com.google.api.client.http.HttpHeaders; +import com.google.api.client.util.DateTime; +import com.google.api.services.drive.Drive; +import com.google.api.services.drive.model.File; +import com.google.api.services.drive.model.FileList; +import com.google.api.services.drive.model.Permission; +import com.google.api.services.drive.model.ParentReference; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.OutputStream; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + + +public class FileSnippets { + + private Drive service; + + public FileSnippets(Drive service) { + this.service = service; + } + + public String uploadBasic() throws IOException { + Drive driveService = this.service; + // [START uploadBasic] + File fileMetadata = new File(); + fileMetadata.setTitle("photo.jpg"); + java.io.File filePath = new java.io.File("files/photo.jpg"); + FileContent mediaContent = new FileContent("image/jpeg", filePath); + File file = driveService.files().insert(fileMetadata, mediaContent) + .setFields("id") + .execute(); + System.out.println("File ID: " + file.getId()); + // [END uploadBasic] + return file.getId(); + } + + public String uploadRevision(String realFileId) throws IOException { + Drive driveService = this.service; + // [START uploadRevision] + String fileId = "0BwwA4oUTeiV1UVNwOHItT0xfa2M"; + // [START_EXCLUDE silent] + fileId = realFileId; + // [END_EXCLUDE] + java.io.File filePath = new java.io.File("files/photo.jpg"); + FileContent mediaContent = new FileContent("image/jpeg", filePath); + Drive.Files.Update request = driveService.files().update(fileId, new File(), mediaContent) + .setFields("id"); + request.getMediaHttpUploader().setDirectUploadEnabled(true); + File file = request.execute(); + System.out.println("File ID: " + file.getId()); + // [END uploadRevision] + return file.getId(); + } + + + public File uploadToFolder(String realFolderId) throws IOException { + Drive driveService = this.service; + // [START uploadToFolder] + String folderId = "0BwwA4oUTeiV1TGRPeTVjaWRDY1E"; + File fileMetadata = new File(); + // [START_EXCLUDE silent] + folderId = realFolderId; + // [END_EXCLUDE] + fileMetadata.setTitle("photo.jpg"); + fileMetadata.setParents(Collections.singletonList( + new ParentReference().setId(folderId))); + java.io.File filePath = new java.io.File("files/photo.jpg"); + FileContent mediaContent = new FileContent("image/jpeg", filePath); + File file = driveService.files().insert(fileMetadata, mediaContent) + .setFields("id, parents") + .execute(); + System.out.println("File ID: " + file.getId()); + // [END uploadToFolder] + return file; + } + + public String uploadWithConversion() throws IOException { + Drive driveService = this.service; + + // [START uploadWithConversion] + File fileMetadata = new File(); + fileMetadata.setTitle("My Report"); + fileMetadata.setMimeType("application/vnd.google-apps.spreadsheet"); + + java.io.File filePath = new java.io.File("files/report.csv"); + FileContent mediaContent = new FileContent("text/csv", filePath); + File file = driveService.files().insert(fileMetadata, mediaContent) + .setFields("id") + .execute(); + System.out.println("File ID: " + file.getId()); + // [END uploadWithConversion] + return file.getId(); + } + + public ByteArrayOutputStream exportPdf(String realFileId) + throws IOException { + Drive driveService = this.service; + // [START exportPdf] + String fileId = "1ZdR3L3qP4Bkq8noWLJHSr_iBau0DNT4Kli4SxNc2YEo"; + OutputStream outputStream = new ByteArrayOutputStream(); + // [START_EXCLUDE silent] + fileId = realFileId; + // [END_EXCLUDE] + driveService.files().export(fileId, "application/pdf") + .executeMediaAndDownloadTo(outputStream); + // [END exportPdf] + return (ByteArrayOutputStream) outputStream; + } + + public ByteArrayOutputStream downloadFile(String realFileId) + throws IOException { + Drive driveService = this.service; + // [START downloadFile] + String fileId = "0BwwA4oUTeiV1UVNwOHItT0xfa2M"; + OutputStream outputStream = new ByteArrayOutputStream(); + // [START_EXCLUDE silent] + fileId = realFileId; + // [END_EXCLUDE] + driveService.files().get(fileId) + .executeMediaAndDownloadTo(outputStream); + // [END downloadFile] + return (ByteArrayOutputStream) outputStream; + } + + public String createShortcut() throws IOException { + Drive driveService = this.service; + // [START createShortcut] + File fileMetadata = new File(); + fileMetadata.setTitle("Project plan"); + fileMetadata.setMimeType("application/vnd.google-apps.drive-sdk"); + + File file = driveService.files().insert(fileMetadata) + .setFields("id") + .execute(); + System.out.println("File ID: " + file.getId()); + // [END createShortcut] + return file.getId(); + } + + public long touchFile(String realFileId, long realTimestamp) + throws IOException { + Drive driveService = this.service; + + // [START touchFile] + String fileId = "1sTWaJ_j7PkjzaBWtNc3IzovK5hQf21FbOw9yLeeLPNQ"; + File fileMetadata = new File(); + fileMetadata.setModifiedDate(new DateTime(System.currentTimeMillis())); + // [START_EXCLUDE silent] + fileId = realFileId; + fileMetadata.setModifiedDate(new DateTime(realTimestamp)); + // [END_EXCLUDE] + File file = driveService.files().update(fileId, fileMetadata) + .setSetModifiedDate(true) + .setFields("id, modifiedDate") + .execute(); + System.out.println("Modified time: " + file.getModifiedDate()); + // [END touchFile] + return file.getModifiedDate().getValue(); + } + + public String createFolder() throws IOException { + Drive driveService = this.service; + // [START createFolder] + File fileMetadata = new File(); + fileMetadata.setTitle("Invoices"); + fileMetadata.setMimeType("application/vnd.google-apps.folder"); + + File file = driveService.files().insert(fileMetadata) + .setFields("id") + .execute(); + System.out.println("Folder ID: " + file.getId()); + // [END createFolder] + return file.getId(); + } + + public List moveFileToFolder(String realFileId, String realFolderId) + throws IOException { + Drive driveService = this.service; + // [START moveFileToFolder] + String fileId = "1sTWaJ_j7PkjzaBWtNc3IzovK5hQf21FbOw9yLeeLPNQ"; + String folderId = "0BwwA4oUTeiV1TGRPeTVjaWRDY1E"; + // [START_EXCLUDE silent] + fileId = realFileId; + folderId = realFolderId; + // [END_EXCLUDE] + // Retrieve the existing parents to remove + File file = driveService.files().get(fileId) + .setFields("parents") + .execute(); + StringBuilder previousParents = new StringBuilder(); + for (ParentReference parent : file.getParents()) { + previousParents.append(parent.getId()); + previousParents.append(','); + } + // Move the file to the new folder + file = driveService.files().update(fileId, null) + .setAddParents(folderId) + .setRemoveParents(previousParents.toString()) + .setFields("id, parents") + .execute(); + // [END moveFileToFolder] + List parents = new ArrayList(); + for (ParentReference parent : file.getParents()) { + parents.add(parent.getId()); + } + return parents; + } + + public List searchFiles() throws IOException { + Drive driveService = this.service; + List files = new ArrayList(); + // [START searchFiles] + String pageToken = null; + do { + FileList result = driveService.files().list() + .setQ("mimeType='image/jpeg'") + .setSpaces("drive") + .setFields("nextPageToken, items(id, title)") + .setPageToken(pageToken) + .execute(); + for (File file : result.getItems()) { + System.out.printf("Found file: %s (%s)\n", + file.getTitle(), file.getId()); + } + // [START_EXCLUDE silent] + files.addAll(result.getItems()); + // [END_EXCLUDE] + pageToken = result.getNextPageToken(); + } while (pageToken != null); + // [END searchFiles] + return files; + } + + public List shareFile(String realFileId, String realUser, String realDomain) + throws IOException { + Drive driveService = this.service; + final List ids = new ArrayList(); + // [START shareFile] + String fileId = "1sTWaJ_j7PkjzaBWtNc3IzovK5hQf21FbOw9yLeeLPNQ"; + // [START_EXCLUDE silent] + fileId = realFileId; + // [END_EXCLUDE] + JsonBatchCallback callback = new JsonBatchCallback() { + @Override + public void onFailure(GoogleJsonError e, + HttpHeaders responseHeaders) + throws IOException { + // Handle error + System.err.println(e.getMessage()); + } + + @Override + public void onSuccess(Permission permission, + HttpHeaders responseHeaders) + throws IOException { + System.out.println("Permission ID: " + permission.getId()); + // [START_EXCLUDE silent] + ids.add(permission.getId()); + // [END_EXCLUDE] + } + }; + BatchRequest batch = driveService.batch(); + Permission userPermission = new Permission() + .setType("user") + .setRole("writer") + .setValue("user@example.com"); + // [START_EXCLUDE silent] + userPermission.setValue(realUser); + // [END_EXCLUDE] + driveService.permissions().insert(fileId, userPermission) + .setFields("id") + .queue(batch, callback); + + Permission domainPermission = new Permission() + .setType("domain") + .setRole("reader") + .setValue("example.com"); + // [START_EXCLUDE silent] + domainPermission.setValue(realDomain); + // [END_EXCLUDE] + driveService.permissions().insert(fileId, domainPermission) + .setFields("id") + .queue(batch, callback); + + batch.execute(); + // [END shareFile] + return ids; + } + +} diff --git a/drive/snippets/drive_v2/src/main/java/TeamDriveSnippets.java b/drive/snippets/drive_v2/src/main/java/TeamDriveSnippets.java new file mode 100644 index 00000000..7cbdb71a --- /dev/null +++ b/drive/snippets/drive_v2/src/main/java/TeamDriveSnippets.java @@ -0,0 +1,84 @@ +import com.google.api.client.http.FileContent; +import com.google.api.services.drive.Drive; +import com.google.api.services.drive.model.File; +import com.google.api.services.drive.model.TeamDrive; +import com.google.api.services.drive.model.TeamDriveList; +import com.google.api.services.drive.model.Permission; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; +import java.util.UUID; + +public class TeamDriveSnippets { + private Drive service; + + public TeamDriveSnippets(Drive service) { + this.service = service; + } + + public String createTeamDrive() throws IOException { + Drive driveService = this.service; + // [START createTeamDrive] + TeamDrive teamDriveMetadata = new TeamDrive(); + teamDriveMetadata.setName("Project Resources"); + String requestId = UUID.randomUUID().toString(); + TeamDrive teamDrive = driveService.teamdrives().insert(requestId, teamDriveMetadata) + .execute(); + System.out.println("Team Drive ID: " + teamDrive.getId()); + // [END createTeamDrive] + return teamDrive.getId(); + } + + public List recoverTeamDrives(String realUser) + throws IOException { + Drive driveService = this.service; + List teamDrives = new ArrayList(); + // [START recoverTeamDrives] + // Find all Team Drives without an organizer and add one. + // Note: This example does not capture all cases. Team Drives + // that have an empty group as the sole organizer, or an + // organizer outside the organization are not captured. A + // more exhaustive approach would evaluate each Team Drive + // and the associated permissions and groups to ensure an active + // organizer is assigned. + String pageToken = null; + Permission newOrganizerPermission = new Permission() + .setType("user") + .setRole("organizer") + .setValue("user@example.com"); + // [START_EXCLUDE silent] + newOrganizerPermission.setValue(realUser); + // [END_EXCLUDE] + + do { + TeamDriveList result = driveService.teamdrives().list() + .setQ("organizerCount = 0") + .setUseDomainAdminAccess(true) + .setFields("nextPageToken, items(id, name)") + .setPageToken(pageToken) + .execute(); + for (TeamDrive teamDrive : result.getItems()) { + System.out.printf("Found Team Drive without organizer: %s (%s)\n", + teamDrive.getName(), teamDrive.getId()); + // Note: For improved efficiency, consider batching + // permission insert requests + Permission permissionResult = driveService.permissions() + .insert(teamDrive.getId(), newOrganizerPermission) + .setUseDomainAdminAccess(true) + .setSupportsTeamDrives(true) + .setFields("id") + .execute(); + System.out.printf("Added organizer permission: %s\n", + permissionResult.getId()); + + } + // [START_EXCLUDE silent] + teamDrives.addAll(result.getItems()); + // [END_EXCLUDE] + pageToken = result.getNextPageToken(); + } while (pageToken != null); + // [END recoverTeamDrives] + return teamDrives; + } +} diff --git a/drive/snippets/drive_v3/.gitignore b/drive/snippets/drive_v3/.gitignore new file mode 100644 index 00000000..1b6985c0 --- /dev/null +++ b/drive/snippets/drive_v3/.gitignore @@ -0,0 +1,5 @@ +# Ignore Gradle project-specific cache directory +.gradle + +# Ignore Gradle build output directory +build diff --git a/drive/snippets/drive_v3/build.gradle b/drive/snippets/drive_v3/build.gradle new file mode 100644 index 00000000..6ef0198a --- /dev/null +++ b/drive/snippets/drive_v3/build.gradle @@ -0,0 +1,12 @@ +apply plugin: 'java' +repositories { + // Use 'jcenter' for resolving your dependencies. + mavenLocal() + jcenter() +} +dependencies { + implementation 'com.google.apis:google-api-services-drive:v3-rev20211107-1.32.1' + implementation 'com.google.api-client:google-api-client:1.23.0' + implementation 'com.google.code.gson:gson:2.4' + testImplementation 'junit:junit:4.12' +} \ No newline at end of file diff --git a/drive/snippets/drive_v3/settings.gradle b/drive/snippets/drive_v3/settings.gradle new file mode 100644 index 00000000..d8be1d67 --- /dev/null +++ b/drive/snippets/drive_v3/settings.gradle @@ -0,0 +1,11 @@ +/* + * This file was generated by the Gradle 'init' task. + * + * The settings file is used to specify which projects to include in your build. + * + * Detailed information about configuring a multi-project build in Gradle can be found + * in the user manual at https://docs.gradle.org/7.3/userguide/multi_project_builds.html + */ + +rootProject.name = 'drive_v3' +include('plugin') diff --git a/drive/snippets/drive_v3/src/main/java/AppDataSnippets.java b/drive/snippets/drive_v3/src/main/java/AppDataSnippets.java new file mode 100644 index 00000000..05300c26 --- /dev/null +++ b/drive/snippets/drive_v3/src/main/java/AppDataSnippets.java @@ -0,0 +1,61 @@ +import com.google.api.client.http.FileContent; +import com.google.api.services.drive.Drive; +import com.google.api.services.drive.model.File; +import com.google.api.services.drive.model.FileList; + +import java.io.IOException; +import java.util.Collections; + + +public class AppDataSnippets { + + private Drive service; + + public AppDataSnippets(Drive service) { + this.service = service; + } + + public String uploadAppData() throws IOException { + Drive driveService = this.service; + // [START uploadAppData] + File fileMetadata = new File(); + fileMetadata.setName("config.json"); + fileMetadata.setParents(Collections.singletonList("appDataFolder")); + java.io.File filePath = new java.io.File("files/config.json"); + FileContent mediaContent = new FileContent("application/json", filePath); + File file = driveService.files().create(fileMetadata, mediaContent) + .setFields("id") + .execute(); + System.out.println("File ID: " + file.getId()); + // [END uploadAppData] + return file.getId(); + } + + public FileList listAppData() throws IOException { + Drive driveService = this.service; + // [START listAppData] + FileList files = driveService.files().list() + .setSpaces("appDataFolder") + .setFields("nextPageToken, files(id, name)") + .setPageSize(10) + .execute(); + for (File file : files.getFiles()) { + System.out.printf("Found file: %s (%s)\n", + file.getName(), file.getId()); + } + // [END listAppData] + return files; + } + + public String fetchAppDataFolder() throws IOException { + Drive driveService = this.service; + // [START fetchAppDataFolder] + File file = driveService.files().get("appDataFolder") + .setFields("id") + .execute(); + System.out.println("Folder ID: " + file.getId()); + // [END fetchAppDataFolder] + return file.getId(); + } + +} diff --git a/drive/snippets/drive_v3/src/main/java/ChangeSnippets.java b/drive/snippets/drive_v3/src/main/java/ChangeSnippets.java new file mode 100644 index 00000000..147668fa --- /dev/null +++ b/drive/snippets/drive_v3/src/main/java/ChangeSnippets.java @@ -0,0 +1,48 @@ +import com.google.api.services.drive.Drive; +import com.google.api.services.drive.model.Change; +import com.google.api.services.drive.model.ChangeList; +import com.google.api.services.drive.model.StartPageToken; + +import java.io.IOException; + +public class ChangeSnippets { + + private Drive service; + + public ChangeSnippets(Drive service) { + this.service = service; + } + + public String fetchStartPageToken() throws IOException { + Drive driveService = this.service; + // [START fetchStartPageToken] + StartPageToken response = driveService.changes() + .getStartPageToken().execute(); + System.out.println("Start token: " + response.getStartPageToken()); + // [END fetchStartPageToken] + return response.getStartPageToken(); + } + + public String fetchChanges(String savedStartPageToken) throws IOException { + Drive driveService = this.service; + // [START fetchChanges] + // Begin with our last saved start token for this user or the + // current token from getStartPageToken() + String pageToken = savedStartPageToken; + while (pageToken != null) { + ChangeList changes = driveService.changes().list(pageToken) + .execute(); + for (Change change : changes.getChanges()) { + // Process change + System.out.println("Change found for file: " + change.getFileId()); + } + if (changes.getNewStartPageToken() != null) { + // Last page, save this token for the next polling interval + savedStartPageToken = changes.getNewStartPageToken(); + } + pageToken = changes.getNextPageToken(); + } + // [END fetchChanges] + return savedStartPageToken; + } +} diff --git a/drive/snippets/drive_v3/src/main/java/DriveSnippets.java b/drive/snippets/drive_v3/src/main/java/DriveSnippets.java new file mode 100644 index 00000000..0262a6f4 --- /dev/null +++ b/drive/snippets/drive_v3/src/main/java/DriveSnippets.java @@ -0,0 +1,84 @@ +import com.google.api.client.http.FileContent; +//import com.google.api.services.drive.Drive; +import com.google.api.services.drive.model.Drive; +import com.google.api.services.drive.model.DriveList; +import com.google.api.services.drive.model.Permission; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; +import java.util.UUID; + +public class DriveSnippets { + private com.google.api.services.drive.Drive service; + + public DriveSnippets(com.google.api.services.drive.Drive service) { + this.service = service; + } + + public String createDrive() throws IOException { + com.google.api.services.drive.Drive driveService = this.service; + // [START createDrive] + Drive driveMetadata = new Drive(); + driveMetadata.setName("Project Resources"); + String requestId = UUID.randomUUID().toString(); + Drive drive = driveService.drives().create(requestId, + driveMetadata) + .execute(); + System.out.println("Drive ID: " + drive.getId()); + // [END createDrive] + return drive.getId(); + } + + public List recoverDrives(String realUser) + throws IOException { + com.google.api.services.drive.Drive driveService = this.service; + List drives = new ArrayList(); + // [START recoverDrives] + // Find all shared drives without an organizer and add one. + // Note: This example does not capture all cases. Shared drives + // that have an empty group as the sole organizer, or an + // organizer outside the organization are not captured. A + // more exhaustive approach would evaluate each shared drive + // and the associated permissions and groups to ensure an active + // organizer is assigned. + String pageToken = null; + Permission newOrganizerPermission = new Permission() + .setType("user") + .setRole("organizer") + .setEmailAddress("user@example.com"); + // [START_EXCLUDE silent] + newOrganizerPermission.setEmailAddress(realUser); + // [END_EXCLUDE] + + do { + DriveList result = driveService.drives().list() + .setQ("organizerCount = 0") + .setFields("nextPageToken, drives(id, name)") + .setUseDomainAdminAccess(true) + .setPageToken(pageToken) + .execute(); + for (Drive drive : result.getDrives()) { + System.out.printf("Found drive without organizer: %s (%s)\n", + drive.getName(), drive.getId()); + // Note: For improved efficiency, consider batching + // permission insert requests + Permission permissionResult = driveService.permissions() + .create(drive.getId(), newOrganizerPermission) + .setUseDomainAdminAccess(true) + .setSupportsAllDrives(true) + .setFields("id") + .execute(); + System.out.printf("Added organizer permission: %s\n", + permissionResult.getId()); + + } + // [START_EXCLUDE silent] + drives.addAll(result.getDrives()); + // [END_EXCLUDE] + pageToken = result.getNextPageToken(); + } while (pageToken != null); + // [END recoverDrives] + return drives; + } +} diff --git a/drive/snippets/drive_v3/src/main/java/FileSnippets.java b/drive/snippets/drive_v3/src/main/java/FileSnippets.java new file mode 100644 index 00000000..784a2bbe --- /dev/null +++ b/drive/snippets/drive_v3/src/main/java/FileSnippets.java @@ -0,0 +1,290 @@ +import com.google.api.client.googleapis.batch.BatchRequest; +import com.google.api.client.googleapis.batch.json.JsonBatchCallback; +import com.google.api.client.googleapis.json.GoogleJsonError; +import com.google.api.client.http.FileContent; +import com.google.api.client.http.HttpHeaders; +import com.google.api.client.util.DateTime; +import com.google.api.services.drive.Drive; +import com.google.api.services.drive.model.File; +import com.google.api.services.drive.model.FileList; +import com.google.api.services.drive.model.Permission; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.OutputStream; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + + +public class FileSnippets { + + private Drive service; + + public FileSnippets(Drive service) { + this.service = service; + } + + public String uploadBasic() throws IOException { + Drive driveService = this.service; + // [START uploadBasic] + File fileMetadata = new File(); + fileMetadata.setName("photo.jpg"); + java.io.File filePath = new java.io.File("files/photo.jpg"); + FileContent mediaContent = new FileContent("image/jpeg", filePath); + File file = driveService.files().create(fileMetadata, mediaContent) + .setFields("id") + .execute(); + System.out.println("File ID: " + file.getId()); + // [END uploadBasic] + return file.getId(); + } + + public String uploadRevision(String realFileId) throws IOException { + Drive driveService = this.service; + // [START uploadRevision] + String fileId = "0BwwA4oUTeiV1UVNwOHItT0xfa2M"; + // [START_EXCLUDE silent] + fileId = realFileId; + // [END_EXCLUDE] + java.io.File filePath = new java.io.File("files/photo.jpg"); + FileContent mediaContent = new FileContent("image/jpeg", filePath); + Drive.Files.Update request = driveService.files().update(fileId, new File(), mediaContent) + .setFields("id"); + request.getMediaHttpUploader().setDirectUploadEnabled(true); + File file = request.execute(); + System.out.println("File ID: " + file.getId()); + // [END uploadRevision] + return file.getId(); + } + + + public File uploadToFolder(String realFolderId) throws IOException { + Drive driveService = this.service; + // [START uploadToFolder] + String folderId = "0BwwA4oUTeiV1TGRPeTVjaWRDY1E"; + File fileMetadata = new File(); + // [START_EXCLUDE silent] + folderId = realFolderId; + // [END_EXCLUDE] + fileMetadata.setName("photo.jpg"); + fileMetadata.setParents(Collections.singletonList(folderId)); + java.io.File filePath = new java.io.File("files/photo.jpg"); + FileContent mediaContent = new FileContent("image/jpeg", filePath); + File file = driveService.files().create(fileMetadata, mediaContent) + .setFields("id, parents") + .execute(); + System.out.println("File ID: " + file.getId()); + // [END uploadToFolder] + return file; + } + + public String uploadWithConversion() throws IOException { + Drive driveService = this.service; + + // [START uploadWithConversion] + File fileMetadata = new File(); + fileMetadata.setName("My Report"); + fileMetadata.setMimeType("application/vnd.google-apps.spreadsheet"); + + java.io.File filePath = new java.io.File("files/report.csv"); + FileContent mediaContent = new FileContent("text/csv", filePath); + File file = driveService.files().create(fileMetadata, mediaContent) + .setFields("id") + .execute(); + System.out.println("File ID: " + file.getId()); + // [END uploadWithConversion] + return file.getId(); + } + + public ByteArrayOutputStream exportPdf(String realFileId) + throws IOException { + Drive driveService = this.service; + // [START exportPdf] + String fileId = "1ZdR3L3qP4Bkq8noWLJHSr_iBau0DNT4Kli4SxNc2YEo"; + OutputStream outputStream = new ByteArrayOutputStream(); + // [START_EXCLUDE silent] + fileId = realFileId; + // [END_EXCLUDE] + driveService.files().export(fileId, "application/pdf") + .executeMediaAndDownloadTo(outputStream); + // [END exportPdf] + return (ByteArrayOutputStream) outputStream; + } + + public ByteArrayOutputStream downloadFile(String realFileId) + throws IOException { + Drive driveService = this.service; + // [START downloadFile] + String fileId = "0BwwA4oUTeiV1UVNwOHItT0xfa2M"; + OutputStream outputStream = new ByteArrayOutputStream(); + // [START_EXCLUDE silent] + fileId = realFileId; + // [END_EXCLUDE] + driveService.files().get(fileId) + .executeMediaAndDownloadTo(outputStream); + // [END downloadFile] + return (ByteArrayOutputStream) outputStream; + } + + public String createShortcut() throws IOException { + Drive driveService = this.service; + // [START createShortcut] + File fileMetadata = new File(); + fileMetadata.setName("Project plan"); + fileMetadata.setMimeType("application/vnd.google-apps.drive-sdk"); + + File file = driveService.files().create(fileMetadata) + .setFields("id") + .execute(); + System.out.println("File ID: " + file.getId()); + // [END createShortcut] + return file.getId(); + } + + public long touchFile(String realFileId, long realTimestamp) + throws IOException { + Drive driveService = this.service; + + // [START touchFile] + String fileId = "1sTWaJ_j7PkjzaBWtNc3IzovK5hQf21FbOw9yLeeLPNQ"; + File fileMetadata = new File(); + fileMetadata.setModifiedTime(new DateTime(System.currentTimeMillis())); + // [START_EXCLUDE silent] + fileId = realFileId; + fileMetadata.setModifiedTime(new DateTime(realTimestamp)); + // [END_EXCLUDE] + File file = driveService.files().update(fileId, fileMetadata) + .setFields("id, modifiedTime") + .execute(); + System.out.println("Modified time: " + file.getModifiedTime()); + // [END touchFile] + return file.getModifiedTime().getValue(); + } + + public String createFolder() throws IOException { + Drive driveService = this.service; + // [START createFolder] + File fileMetadata = new File(); + fileMetadata.setName("Invoices"); + fileMetadata.setMimeType("application/vnd.google-apps.folder"); + + File file = driveService.files().create(fileMetadata) + .setFields("id") + .execute(); + System.out.println("Folder ID: " + file.getId()); + // [END createFolder] + return file.getId(); + } + + public List moveFileToFolder(String realFileId, String realFolderId) + throws IOException { + Drive driveService = this.service; + // [START moveFileToFolder] + String fileId = "1sTWaJ_j7PkjzaBWtNc3IzovK5hQf21FbOw9yLeeLPNQ"; + String folderId = "0BwwA4oUTeiV1TGRPeTVjaWRDY1E"; + // [START_EXCLUDE silent] + fileId = realFileId; + folderId = realFolderId; + // [END_EXCLUDE] + // Retrieve the existing parents to remove + File file = driveService.files().get(fileId) + .setFields("parents") + .execute(); + StringBuilder previousParents = new StringBuilder(); + for (String parent : file.getParents()) { + previousParents.append(parent); + previousParents.append(','); + } + // Move the file to the new folder + file = driveService.files().update(fileId, null) + .setAddParents(folderId) + .setRemoveParents(previousParents.toString()) + .setFields("id, parents") + .execute(); + // [END moveFileToFolder] + return file.getParents(); + } + + public List searchFiles() throws IOException { + Drive driveService = this.service; + List files = new ArrayList(); + // [START searchFiles] + String pageToken = null; + do { + FileList result = driveService.files().list() + .setQ("mimeType='image/jpeg'") + .setSpaces("drive") + .setFields("nextPageToken, files(id, name)") + .setPageToken(pageToken) + .execute(); + for (File file : result.getFiles()) { + System.out.printf("Found file: %s (%s)\n", + file.getName(), file.getId()); + } + // [START_EXCLUDE silent] + files.addAll(result.getFiles()); + // [END_EXCLUDE] + pageToken = result.getNextPageToken(); + } while (pageToken != null); + // [END searchFiles] + return files; + } + + public List shareFile(String realFileId, String realUser, String realDomain) + throws IOException { + Drive driveService = this.service; + final List ids = new ArrayList(); + // [START shareFile] + String fileId = "1sTWaJ_j7PkjzaBWtNc3IzovK5hQf21FbOw9yLeeLPNQ"; + // [START_EXCLUDE silent] + fileId = realFileId; + // [END_EXCLUDE] + JsonBatchCallback callback = new JsonBatchCallback() { + @Override + public void onFailure(GoogleJsonError e, + HttpHeaders responseHeaders) + throws IOException { + // Handle error + System.err.println(e.getMessage()); + } + + @Override + public void onSuccess(Permission permission, + HttpHeaders responseHeaders) + throws IOException { + System.out.println("Permission ID: " + permission.getId()); + // [START_EXCLUDE silent] + ids.add(permission.getId()); + // [END_EXCLUDE] + } + }; + BatchRequest batch = driveService.batch(); + Permission userPermission = new Permission() + .setType("user") + .setRole("writer") + .setEmailAddress("user@example.com"); + // [START_EXCLUDE silent] + userPermission.setEmailAddress(realUser); + // [END_EXCLUDE] + driveService.permissions().create(fileId, userPermission) + .setFields("id") + .queue(batch, callback); + + Permission domainPermission = new Permission() + .setType("domain") + .setRole("reader") + .setDomain("example.com"); + // [START_EXCLUDE silent] + domainPermission.setDomain(realDomain); + // [END_EXCLUDE] + driveService.permissions().create(fileId, domainPermission) + .setFields("id") + .queue(batch, callback); + + batch.execute(); + // [END shareFile] + return ids; + } + +} diff --git a/drive/snippets/drive_v3/src/main/java/TeamDriveSnippets.java b/drive/snippets/drive_v3/src/main/java/TeamDriveSnippets.java new file mode 100644 index 00000000..10ca713f --- /dev/null +++ b/drive/snippets/drive_v3/src/main/java/TeamDriveSnippets.java @@ -0,0 +1,84 @@ +import com.google.api.client.http.FileContent; +import com.google.api.services.drive.Drive; +import com.google.api.services.drive.model.TeamDrive; +import com.google.api.services.drive.model.TeamDriveList; +import com.google.api.services.drive.model.Permission; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; +import java.util.UUID; + +public class TeamDriveSnippets { + private Drive service; + + public TeamDriveSnippets(Drive service) { + this.service = service; + } + + public String createTeamDrive() throws IOException { + Drive driveService = this.service; + // [START createTeamDrive] + TeamDrive teamDriveMetadata = new TeamDrive(); + teamDriveMetadata.setName("Project Resources"); + String requestId = UUID.randomUUID().toString(); + TeamDrive teamDrive = driveService.teamdrives().create(requestId, + teamDriveMetadata) + .execute(); + System.out.println("Team Drive ID: " + teamDrive.getId()); + // [END createTeamDrive] + return teamDrive.getId(); + } + + public List recoverTeamDrives(String realUser) + throws IOException { + Drive driveService = this.service; + List teamDrives = new ArrayList(); + // [START recoverTeamDrives] + // Find all Team Drives without an organizer and add one. + // Note: This example does not capture all cases. Team Drives + // that have an empty group as the sole organizer, or an + // organizer outside the organization are not captured. A + // more exhaustive approach would evaluate each Team Drive + // and the associated permissions and groups to ensure an active + // organizer is assigned. + String pageToken = null; + Permission newOrganizerPermission = new Permission() + .setType("user") + .setRole("organizer") + .setEmailAddress("user@example.com"); + // [START_EXCLUDE silent] + newOrganizerPermission.setEmailAddress(realUser); + // [END_EXCLUDE] + + do { + TeamDriveList result = driveService.teamdrives().list() + .setQ("organizerCount = 0") + .setFields("nextPageToken, teamDrives(id, name)") + .setUseDomainAdminAccess(true) + .setPageToken(pageToken) + .execute(); + for (TeamDrive teamDrive : result.getTeamDrives()) { + System.out.printf("Found Team Drive without organizer: %s (%s)\n", + teamDrive.getName(), teamDrive.getId()); + // Note: For improved efficiency, consider batching + // permission insert requests + Permission permissionResult = driveService.permissions() + .create(teamDrive.getId(), newOrganizerPermission) + .setUseDomainAdminAccess(true) + .setSupportsTeamDrives(true) + .setFields("id") + .execute(); + System.out.printf("Added organizer permission: %s\n", + permissionResult.getId()); + + } + // [START_EXCLUDE silent] + teamDrives.addAll(result.getTeamDrives()); + // [END_EXCLUDE] + pageToken = result.getNextPageToken(); + } while (pageToken != null); + // [END recoverTeamDrives] + return teamDrives; + } +} From 6691736cea13ac485e334d0c4a9876da076876e6 Mon Sep 17 00:00:00 2001 From: sanjuktaghosh7 Date: Tue, 25 Jan 2022 22:33:50 +0530 Subject: [PATCH 030/262] Enable Auto Reply gmail snippet (#162) * Enable Auto Reply gmail snippet. Co-authored-by: Rajesh Mudaliyar Co-authored-by: Manvendra-P-Singh --- .../src/main/java/EnableAutoReply.java | 73 +++++++++++++++++++ 1 file changed, 73 insertions(+) create mode 100644 gmail/snippets/src/main/java/EnableAutoReply.java diff --git a/gmail/snippets/src/main/java/EnableAutoReply.java b/gmail/snippets/src/main/java/EnableAutoReply.java new file mode 100644 index 00000000..ef6e052c --- /dev/null +++ b/gmail/snippets/src/main/java/EnableAutoReply.java @@ -0,0 +1,73 @@ +// Copyright 2021 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + + +// [START gmail_enable_auto_reply] +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.gmail.Gmail; +import com.google.api.services.gmail.GmailScopes; +import com.google.api.services.gmail.model.VacationSettings; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; +import java.io.IOException; +import java.time.LocalDateTime; +import java.time.ZoneOffset; +import java.time.ZonedDateTime; +import java.util.Collections; + +/* Class to demonstrate the use of Gmail Enable Auto Reply API*/ +public class EnableAutoReply { + /** + * Enables the auto reply + * + * @throws IOException + */ + public static void autoReply() throws IOException{ + // Load pre-authorized user credentials from the environment. + // TODO(developer) - See https://developers.google.com/identity for + // guides on implementing OAuth2 for your application. + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault().createScoped(Collections.singleton(GmailScopes.GMAIL_SETTINGS_BASIC)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + + // Create the gmail API client + Gmail service = new Gmail.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Gmail samples") + .build(); + + try { + // Enable auto reply by restricting domain with start time and end time + VacationSettings vacationSettings = new VacationSettings() + .setEnableAutoReply(true) + .setResponseBodyHtml("I am on vacation and will reply when I am back in the office. Thanks!") + .setRestrictToDomain(true) + .setStartTime(LocalDateTime.now().toEpochSecond(ZoneOffset.from(ZonedDateTime.now())) * 1000) + .setEndTime(LocalDateTime.now().plusDays(7).toEpochSecond(ZoneOffset.from(ZonedDateTime.now())) * 1000); + + VacationSettings response = service.users().settings().updateVacation("me", vacationSettings).execute(); + // Prints the auto-reply response body + System.out.println("Enabled auto reply with message : "+response.getResponseBodyHtml()); + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + System.err.println("Unable to enable auto reply: " + e.getDetails()); + throw e; + } + } +} +// [END gmail_enable_auto_reply] \ No newline at end of file From eae5d8394d42f0992156d1389a725f945cbbe8ec Mon Sep 17 00:00:00 2001 From: sanjuktaghosh7 Date: Tue, 25 Jan 2022 22:34:09 +0530 Subject: [PATCH 031/262] Create Filter gmail snippet (#161) * Create Filter gmail snippet. Co-authored-by: Rajesh Mudaliyar Co-authored-by: Manvendra-P-Singh --- .../snippets/src/main/java/CreateFilter.java | 72 +++++++++++++++++++ 1 file changed, 72 insertions(+) create mode 100644 gmail/snippets/src/main/java/CreateFilter.java diff --git a/gmail/snippets/src/main/java/CreateFilter.java b/gmail/snippets/src/main/java/CreateFilter.java new file mode 100644 index 00000000..06840c76 --- /dev/null +++ b/gmail/snippets/src/main/java/CreateFilter.java @@ -0,0 +1,72 @@ +// Copyright 2021 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + + +// [START gmail_create_filter] +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.gmail.Gmail; +import com.google.api.services.gmail.GmailScopes; +import com.google.api.services.gmail.model.Filter; +import com.google.api.services.gmail.model.FilterAction; +import com.google.api.services.gmail.model.FilterCriteria; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; +import java.io.IOException; +import java.util.Arrays; +import java.util.Collections; + +/* Class to demonstrate the use of Gmail Create Filter API */ +public class CreateFilter { + /** + * Create a new filter. + * + * @throws IOException + */ + public static void createNewFilter() throws IOException { + // Load pre-authorized user credentials from the environment. + // TODO(developer) - See https://developers.google.com/identity for + // guides on implementing OAuth2 for your application. + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault().createScoped(Collections.singleton(GmailScopes.GMAIL_SETTINGS_BASIC)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + + // Create the gmail API client + Gmail service = new Gmail.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Gmail samples") + .build(); + + // Filter the mail from sender and archive them(skip the inbox) + try { + Filter filter = new Filter() + .setCriteria(new FilterCriteria() + .setFrom("gduser1@workspacesamples.dev")) + .setAction(new FilterAction() + .setRemoveLabelIds(Arrays.asList("INBOX"))); + + Filter result = service.users().settings().filters().create("me", filter).execute(); + // Prints the new created filter ID + System.out.println("Created filter " + result.getId()); + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + System.err.println("Unable to create filter: " + e.getDetails()); + throw e; + } + } +} +// [END gmail_create_filter] \ No newline at end of file From eb89577c66f359e867c6deb39466919f5d89debf Mon Sep 17 00:00:00 2001 From: sanjuktaghosh7 Date: Tue, 25 Jan 2022 22:34:25 +0530 Subject: [PATCH 032/262] Update Signature gmail snippet (#160) * Update Signature gmail snippet. Co-authored-by: Rajesh Mudaliyar Co-authored-by: Manvendra-P-Singh --- gmail/snippets/build.gradle | 21 +++-- .../src/main/java/UpdateSignature.java | 77 +++++++++++++++++++ 2 files changed, 87 insertions(+), 11 deletions(-) create mode 100644 gmail/snippets/src/main/java/UpdateSignature.java diff --git a/gmail/snippets/build.gradle b/gmail/snippets/build.gradle index bd5284f5..f0dd197b 100644 --- a/gmail/snippets/build.gradle +++ b/gmail/snippets/build.gradle @@ -1,18 +1,17 @@ apply plugin: 'java' repositories { - // Use 'jcenter' for resolving your dependencies. - mavenLocal() - jcenter() + mavenCentral() } dependencies { - compile 'com.google.api-client:google-api-client:1.22.0' - compile 'com.google.apis:google-api-services-gmail:v1-rev62-1.22.0' - compile 'com.google.code.gson:gson:2.4' - compile 'javax.mail:mail:1.4' - compile 'org.apache.commons:commons-csv:1.1' - testCompile 'junit:junit:4.12' - testCompile 'org.hamcrest:hamcrest-all:1.3' - testCompile 'org.mockito:mockito-core:2.7.19' + implementation 'com.google.api-client:google-api-client:1.33.0' + implementation 'com.google.auth:google-auth-library-oauth2-http:1.3.0' + implementation 'com.google.apis:google-api-services-gmail:v1-rev20211108-1.32.1' + implementation 'com.google.code.gson:gson:2.4' + implementation 'javax.mail:mail:1.4' + implementation 'org.apache.commons:commons-csv:1.1' + testImplementation 'junit:junit:4.13.2' + testImplementation 'org.hamcrest:hamcrest-all:1.3' + testImplementation 'org.mockito:mockito-core:4.2.0' } diff --git a/gmail/snippets/src/main/java/UpdateSignature.java b/gmail/snippets/src/main/java/UpdateSignature.java new file mode 100644 index 00000000..b6ca985e --- /dev/null +++ b/gmail/snippets/src/main/java/UpdateSignature.java @@ -0,0 +1,77 @@ +// Copyright 2021 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + + +// [START gmail_update_signature] +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.gmail.Gmail; +import com.google.api.services.gmail.GmailScopes; +import com.google.api.services.gmail.model.SendAs; +import com.google.api.services.gmail.model.ListSendAsResponse; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; +import java.io.IOException; +import java.util.Collections; + +/* Class to demonstrate the use of Gmail Update Signature API */ +public class UpdateSignature { + /** + * Update the gmail signature. + * + * @throws IOException + */ + public static void updateGmailSignature() throws IOException { + // Load pre-authorized user credentials from the environment. + // TODO(developer) - See https://developers.google.com/identity for + // guides on implementing OAuth2 for your application. + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault().createScoped(Collections.singleton(GmailScopes.GMAIL_SETTINGS_BASIC)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + + // Create the gmail API client + Gmail service = new Gmail.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Gmail samples") + .build(); + + try { + SendAs primaryAlias = null; + ListSendAsResponse aliases = service.users().settings().sendAs().list("me").execute(); + for (SendAs alias : aliases.getSendAs()) { + if (alias.getIsPrimary()) { + primaryAlias = alias; + break; + } + } + // Updating a new signature + SendAs aliasSettings = new SendAs().setSignature("I heart cats."); + SendAs result = service.users().settings().sendAs().patch( + "me", + primaryAlias.getSendAsEmail(), + aliasSettings) + .execute(); + //Prints the updated signature + System.out.println("Updated signature - " + result.getSignature()); + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + System.err.println("Unable to update signature: " + e.getDetails()); + throw e; + } + } +} +// [END gmail_update_signature] \ No newline at end of file From 359d6d0179607e5fd821ba8a564d4e0dd0d245fa Mon Sep 17 00:00:00 2001 From: Rajesh Mudaliyar Date: Tue, 25 Jan 2022 09:04:52 -0800 Subject: [PATCH 033/262] Added update signature gmail snippet. (#159) Co-authored-by: sanjuktaghosh7 Co-authored-by: Manvendra-P-Singh From e5358a1f1fa3bab61a762e3defa00984e2639704 Mon Sep 17 00:00:00 2001 From: Rajesh Mudaliyar Date: Tue, 25 Jan 2022 09:05:06 -0800 Subject: [PATCH 034/262] Added file for CreateFolder use-case. It also uses Google ADC. (#158) * Update CreateFolder.java Co-authored-by: sanjuktaghosh7 Co-authored-by: Manvendra-P-Singh Co-authored-by: Steve Bazyl --- drive/snippets/drive_v2/build.gradle | 1 + .../drive_v2/src/main/java/CreateFolder.java | 67 +++++++++++++++++++ 2 files changed, 68 insertions(+) create mode 100644 drive/snippets/drive_v2/src/main/java/CreateFolder.java diff --git a/drive/snippets/drive_v2/build.gradle b/drive/snippets/drive_v2/build.gradle index d49d8d61..609d4c93 100644 --- a/drive/snippets/drive_v2/build.gradle +++ b/drive/snippets/drive_v2/build.gradle @@ -7,6 +7,7 @@ repositories { dependencies { implementation 'com.google.apis:google-api-services-drive:v2-rev20211205-1.32.1' implementation 'com.google.api-client:google-api-client:1.23.0' + implementation 'com.google.auth:google-auth-library-oauth2-http:1.3.0' implementation 'com.google.code.gson:gson:2.4' testImplementation 'junit:junit:4.12' } diff --git a/drive/snippets/drive_v2/src/main/java/CreateFolder.java b/drive/snippets/drive_v2/src/main/java/CreateFolder.java new file mode 100644 index 00000000..8bb1b908 --- /dev/null +++ b/drive/snippets/drive_v2/src/main/java/CreateFolder.java @@ -0,0 +1,67 @@ +// Copyright 2018 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// [START drive_create_folder] + +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.drive.Drive; +import com.google.api.services.drive.DriveScopes; +import com.google.api.services.drive.model.File; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; +import java.io.IOException; +import java.util.Arrays; + +/* Class to demonstrate use of Drive's create folder API */ +public class CreateFolder { + + + /** + * Create new folder. + * @return Inserted folder id if successful, {@code null} otherwise. + * @throws IOException if service account credentials file not found. + */ + private static String createFolder() throws IOException { + // Load pre-authorized user credentials from the environment. + // TODO(developer) - See https://developers.google.com/identity for + // guides on implementing OAuth2 for your application. + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault().createScoped(Arrays.asList(DriveScopes.DRIVE_FILE)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + + // Build a new authorized API client service. + Drive service = new Drive.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Drive samples") + .build(); + // File's metadata. + File fileMetadata = new File(); + fileMetadata.setTitle("Test"); + fileMetadata.setMimeType("application/vnd.google-apps.folder"); + try { + File file = service.files().insert(fileMetadata) + .setFields("id") + .execute(); + System.out.println("Folder ID: " + file.getId()); + return file.getId(); + } catch (IOException e) { + System.out.println("An error occurred: " + e); + return null; + } + } +} +// [END drive_create_folder] From 4b94aeb26d1e43f0c70f34bf51c1acc927359cc2 Mon Sep 17 00:00:00 2001 From: Rajesh Mudaliyar Date: Tue, 25 Jan 2022 09:05:21 -0800 Subject: [PATCH 035/262] Added file Uploadbasic for upload file use-case. It includes Google ADC (#157) * Added file Uploadbasic for upload file use-case. Co-authored-by: sanjuktaghosh7 Co-authored-by: Manvendra-P-Singh Co-authored-by: Steve Bazyl --- drive/snippets/drive_v2/files/photo.jpg | Bin 0 -> 1128108 bytes .../drive_v2/src/main/java/UploadBasic.java | 71 ++++++++++++++++++ 2 files changed, 71 insertions(+) create mode 100644 drive/snippets/drive_v2/files/photo.jpg create mode 100644 drive/snippets/drive_v2/src/main/java/UploadBasic.java diff --git a/drive/snippets/drive_v2/files/photo.jpg b/drive/snippets/drive_v2/files/photo.jpg new file mode 100644 index 0000000000000000000000000000000000000000..98b05d35ee5af0e111177c397029593f553ddeaa GIT binary patch literal 1128108 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

HQ)rO7BEjui9nQ>LErPORLjn%TCJ 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

onJQK?d^r;4N8M@Rqx&?@C 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 >fN8wuB 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ɬmLhdY2jg-yJ$B=9@^DMrTuqwD!qL?PI2 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�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 >i_ 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�!BC6p@!X#{dYzncrB;;{X4TZ7yO(|`e!RLxm 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

N=uA1h2{* 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�*(xZILBQ}X=S{{RZk7rCYROVXl% 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%0A{beVWLFa^A5E1 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�qEu*f*+o-3S}R*lJyDGGwvBmJS+*Ec&C zoMDd7PR56x)t}1UhQ@Q!scLg_S|>=iqApW`{75>J@f;g#+ zj3pCSPQJE|UC>Ulk=S$mtLE?8Tf&-pn|~TYgU>7EN<#CJ-zX$sOjQx1!-Jq%o2sBaz&W#<-&y3mkEvbYADK zYw4ozsyqoUjDyLLZ}QZTxX1Tal2o>0?78`dap-BV+`YV>U-3Wr`Kh-eJ>{byr+@do z4O&eJb}8A(9o%Z8DVOTwk^a!Huznlq)7oiKtA}Wx4f&7eYvju$Eq4MH+?m5*eBXet zwtgPWbp0kcX6YP31E2MP`}+NBi!p+6O`Bn&j+c6-B9TZ>TxS)#5L2~4&!=k6Lnv&j z`H{Kj{6%kC`Do#0`^(b2S-mWdn8V&4@ib564nX}YMmVLnRQd2uTq+TTuJSVJ8U`5I(xFe3(UnAmwmYY-Ln^F_Rrv<3+{miA ze*Nn?S4G@5;-v(f793Rz zYln1L&T-Q(!Tf6Y4Yz6LzYL5S_s}GUL%nx53szBab{maf;qGM0lT%4a6)O z;CYxQcwTnnr#0p_mqmj{$>qnMJ^q#JUOb+A$euJ@9&?^LSCB@EHn>vmqaM}h&|dC` zn^)trI#Du4P%|##c=kQ1*6lGj4RE=U&PTAU+hw$5P*(+yD#PVdTI(}h5)ztem_nl?w&BO;T$5~Z(VMXo zY@S#u&(rBQ5g6thj(p5#zd!8PQDm>3r|t^Eab@qZrxQY1yuRIj zwRJYQLnc+1`POt2#~h^jc~(67=C)u3oDiQd=ntiE);4r|RcYiA#<&VPR&BPlHK)1gegMBk*5S5@aU-Z5hEJ|*?n@|{H28=+ z*Bxu%e*-&P>d{AqE;89ZwfByONzyG)9odXA=RYwS>sh$8dl*-EmW(HIkF8A&Ege8jEOlY&lV60nb`+K))*vDm-s1o-t2Wa&p3=2$sWg=k8FC zhg4C@(}Zuo<~;SOgjpfltqmeUFFsJI(PaC~HsYd1ReYbqrY-Uq$K9;?H4cZD{6N~) zk06uFWaB^MUmxm`#P^TqeCIuXt$lss(k6;zL<54g@^6Tl7ISQo?38ue^JRbDs)Thp zs(Bo%+uE$5_WYu*#Vp9lwmtE;_q$Xp0d1v~Sx4Th(lR>igMt3dZs{D;T@Dw;vP3Ly zo@-^9WEjK!!WzC`RkDiU!L#H;{{XXaE9u`FTgvuM+xHA}_4cosUrt!>=fKF_!+P$n z`UxIpDK3VMmftamJpTZ-{3}j2FEnO&*AkBYf}*!OA_a$<=l%kfF|#J$O3Q_!MccFGZhl`{xe!EXrp*?GyvyNnyp&X_+FR`tQXf7mAEDxDKD$1k{cPv^#9CtVg zh=}W595X6O@>h}+YyQ9=?gP%Kd ze9QN6JJ*E8J8Tg%e5+o~@UGyUOh=!US8&_+zx`E|)~8Mt*`If=*NIv`yHR;~Wq#E{ z##R}tx^=Qx_F})O#Fk|vcU=j=l%p1n%Lr!IUf~A6Y0+(>$SG}6Ss=_ zTIHfTjFBR?@4x=a*VSGqnJw&ITZ5gsWf=be$7|)8Y~DMGu8XeuPDuU{UZxd$r;}aT zf<%%j#&;+8t6J9IEUH%|kL6hLO3Jz0z5TmZo}W9inFropIj){v4tw1eVUXd$UAqbA z=}QEo&DgDw{rgpj;F3^w{DAUkhQ=tBqKsud_@^z4gDkn)$ro|=jcdg7#X2K4^>4fM ztb0|=UP)e!wz^A5)s+T5NV;yU-MLELnzr!Ui5^GDW!km0XD9m`!#d0?{`!M zcCBtjAC%{wMPpJb#l>iCLaQtcV;?>~^H!ChjV4{if_nNlrBKuE#J{@<$?yHz=5^HebHR#i%$oMA;r7Q|&Be5Seg2%kgzBHtv@7yb{Gm;2TA6p9WC ze7sl6e+nHXx>r(H506^Xe?wWatfMD&O{Cu?$iytc^ zQ54IW4hZd1d7V?Sp%r!xI@HnmYDddN8Jv%qJ}^kJ+FU&6YV12t`&i@u03NS|CZ87t zn0@Yc{o4EU;{+aMy~J4BkN*Gy`?c^|#~haoQzz#BD$%V@c@$@{Guo046K-97Yv#>% z3uyIQh^>Fs#NWmI_Se(1+cYZ8yx@+X-LIMaLlccm{Pv zcKqtpE;vFPj+I@bVE$Sz?)$33OTHFRHWAUiE3D>;VHQAk$Uv#>SQs|M+e?2Rt!G06 zTt<=3bNoQog1x=FwZ7k-zwz39#l@B(w^(8ku2`O?v|^Sb1Q`s=RF`ogIQ~$ze&5K6 z#sCMut#ejP(&*HI8C_$O`1*gdTh>;ppX?gPl$DFkG45sl?P|b4UGMWU{{Z8^?$;F6 z&~qC$7O0Xo<{Q89+TXBGvrD~HS1dfS99WBXdgtZEc3OHw$|T>FTFQDvosP=HOC}rc z{{Vaan(D2?6+}b#dz$4eWDKN9@($naS7WEeyeX96uWILZDmLh9K%P`Zhe1}MjUsL1 zjMZoqtGc&J05Cz%zGE{Jf~>1tl_z#lt);||enSka{{Rhrx!?)5_<0Jpcb~id)qGQ- z4cBPSy%}rmKLaAcrNtMe6rQJk7h|<(%YbR14ZFLJ)h_*kiKxuRRb2M2h%>Q`0Y^Or zLm@mK%~I~b#yF&9+%s1R0wBw5+ny*n+v+Mw4#2yr0>BOhPuVM>JYP3o;rVG58Z~Zu zR57zh&faQZ%;bmrtxck1Barc9TsEHgz!=Sbczi%t{{V!B;Kp#w$1A(#+&_xHM7&ua znPlyPLXL~WSLc7km}j@w;2s5lBAsDzDAWQnrRTowpX)-`?uf z`1VOZkrQWib4ys1z0&^Z=3;h++w$hOts`O(7OXpaHb+&D?tR+dj@7NBJDaUxQL7m< zU(7M8?;DkScC8&XC7S5@JvgkpSk=izlXuO^wQbr#Bogn5$gUcbu+Fw0IuIH({o{2wNP|S$OJ3sU)+KGW=n6Bae&171@oGW~<{qEJdWD(+Rt%cptS0zdIB9SQB+B$!D*H5P0H1o5{xM%+W*=vS#E)3{x;eti;M&kbf z%9T)+`8!ky>Rf;}`qZ%bksrI270!woIgkLwcWtic;WT9Uk{Na=L!H_C!?z#dTtvX4 zZYSlhLilKh`*Iu2+Z1QzttBmVIkCnKoRY@&S5O*m(1x(h2 zh*S{S?^V@)U+-0yJpiZ?c0VmjOQ49~&Da31lm7r{H`}L0XkZeVA96^)eliz14e#7n z)ss8M3a`x7@^{CUki`Pba~a;;4vv`r0NG7w$gaKHADZ4Lym@sgqD0;0bz}a`a_KTW zNZ8tQk9Ds^@wL6c)D_(XY}<}O`A%B6CbfT=isSri)uk4rspF-}H_h@KZbmFP$mgvH zWOQ*mbGziK@ejI@zCLQ4sobkD;GFUOYgmcMyBEn5MCuL)CYl^=ZJ7giUi7abvmqbu z)K2>e&rbDL2pVuqk}sN0*7Wr?bvCf zb^icqs~X)6yCB=kR=g#kxK)X_ZvOzsYYK$8JKW#0fQAV_)xs+S&+&iD{)+MXP zN`k-eD(b8t5e?)0Pk-rLGn3dJ!{CKu%Am$5kxD0@yK1jhtGiLLv{g%^Y>>B~gpYEJ zpYIca`I=n%7+9x=mDh6Dao`m5JV|CAHkUF05q@v0eE_aK;xWd%2i&fs;rX~v71>P- z{_LJfY-8#Ct2WM@KgN&Hy)erSvPUubK>2rbQ~7v{8LM`Q8L)+<fwL@F}Ex%qmiRz(Vol?;j{`)nChfr!Dtt;Z$Y_zr#_O)-?fY zB_DWYNR_rPnNm8lar`tL!M?QM>;9`BcA~*yRfK0IzHIpUJb&fhe)R8f`6$0Bb2FUGa6e4DA-Ma)W16*OsyX}1N-vjj$G9q%b<2FT{{SsFgdJP>Y8FSzfWL)p=@x5qbqt68 zS+-bLMK#P^UWSyAq)>Tmoxh5_=TL$uq;nrTtJ?2YH;AeJ8uM$5B$1Bc^4D}D%33%d zE#!&JW9MF!?XK}IkKbk>ODqW=K1S&bK%N~q~nx3R1lOh{G$2Ue{u3ie5FMW^uA zJg|^*I#ta*MYYs#9|w0@6R~nfxLe)F9AY4!N}PzMMclj}TIXzT42rqu-nKr_QNHdJ zcC8|Fm>S-h6qfB8FG}U~tNAo5lsn32w(YyCy^yr4oOP}bUAMv)+N|HhN=vBXzRByc zYS8MI%Q1d2(SB<3{{RqfkVyXkDj)9G3#E9D`$?Kem~KY?^L(rR>ek)%r47stHhR>z zb4WztFIQ@@X6uUc?-5?5y}L^>!hPEBwHacSfzA|Hn%&u4>wYb;(;yj!HxA?b%e&_M zg%CA8pWwcM4V}8`3Y-4b^CRu~v0qOMRW|qo=B_)!I$Tw`KkT(S zk-p^fBF}^_T@Xjsy}rXvit5~D6@v=!j||(%3kR5d!=-&8p{hrxsQa`~6s2RIyzqsj zfbAV?kh$=crLOXc@}Iq$_2h67npUnqTE7#gmuR0bqIP7(*z$=q3wvq2{{Z3@BS!=Q z0BxnKrt(aOY>R{5skW8ozDe9ahy9v}%EhK*K`O^H7`XSSrHw8_WA9e%I!v3$DmK-- zT_h;mx1~gt*hKUBG&DC$BBGbBjvXDEETwGEZeo>Grt0kNbp7_K{aUkeE}J~h`#49q zF>KeJ>hKul1qR)T2+&O zucj;H&yD^o)(3{Kt{_#-*!weQpOR0Pzk2$|#`+|WY|C5qn+my@t-~3U?=CZ2N^xHnNU5~#`Nc-jfHRuD z@spo=i^)}G9qH&eM5C}DpKmo>TT3ey1LXIu1&FJ%o@rFFE);dCZo?8gV6F3Zp<-n@ zW7echV+=W~s*2H!4wXFPi3D2-WaKqlRKk%?MP16oW43APIrgDS<)W%8l14I51Fvde3?B!8YDUO#PZ_9Wa?Wwa-YIg8B4$u< zTeUH=LsdRDMv#Nbt6BURZU=eB7r5lNZ%R_a3WS)wHwQCm`p$Z|(c z)m;KF?+N)&=xUYv67}~?!30YmmKSMShFfUTHD@{Yt#=C|{VP4rSe6_wr&`)P-)J4~ zViFiKs`RR|2apGD0Iem3;~rsil5>{+SgHJpo!Q1P-789e5tPnqcw7&WzZ$6|7auId zecI|Gw{>8%4r;8-@E@FTcontuGic{#wvg;}TpslZwufnv6J&?xD_tav6aew(e@|-9 zl>)m1!nfV43mGay6qpaW$I_sgB{PFB&lu_L_|@rR^I<+u@S3e9wd%)&=-#~Iq>e(n zDJ{P{eX1Eu2?NJ6Wn0u$;|TJO!g!|`7Ff2(-*=|!=z|9qbJ0Ag7it}!cjf*ctz8M{ zu=_bHD*U8{NL{>VXhK z{{Uy0WVb6_EJ52pyZH&hBxeSw-$N7v;NIE=%-YfEsEk*Z;(@k%x7q!`cH=jxvN181d`6Z z2OsS#SJ{35@N9Z&2+;!n01-I*&0LqlF9BU733GP|jGvWV*KP>*>zew{MbethRU=%2 zHvTJC_Od>I8;e^bpVM?1khIbtz1eyy{{Zn-p(dXi@&-O?^cZa=VpPYqR8>oxSl^sw zSEX8ybH{a#9klrHc*g3W_MTjSH)`xBi6e_7?W_WXk_|NxuXyF=Um*)e+OkHgE=oi< zlG|JTn(Y!8-!Z4k$}1v00U~CZ*X7+rV`3Rr!U-DP=W+5Dre0giF4)nwF!ipE*feRd z4k`<{jKB~!n!ZnTqgTR~Y=sWpm;2xQH??)~qOsfDQ6w7~R94-ch=_@w z=G|R!S_(|(V72on{opwDJXY|73Uk_|)LJV=BrnYT))BZnGFVcT*2YdH+2w{eQVuGd zZfB8#ecGc1toN5*ZNb|YWfj+2z>u6OW{5kJ6E+)doR!62hYRyC$gKk#M3^6TvZk3M zI~e00l~H;VZAactEG@;vZGw8&nCiOR*V3|w{n-_}uHK}Pc~G2(8%=ROQ8AFcsOQwE zA}Bnyjf&G$$+U>iN|HVX4{D2Q`JW)gXC`Z6vKhR?=Oz_@ill{PW0(82YD8?~Jt>gJ z8^0o>&{5?RZZpL-V^vdu!KW77FgsG)?!hg^SnNp}WSx4G_}M-J0qv1lhYS z+OcA{HxhZ$ecFu_Og_13=MfFY zFi*?=dspUf#=nR+n*P20oeYJnVnmZ-K6ktIC+qU@?OuuTTjInTqf9irnM_JbWF3K< zrc=H+J&1fe4A#>~@*LXZ z7(GLKdsf($(ns>!a2+e3xAWI!rOWw&8$aF6Z9#E~1Z(TJj@7Bl%8su{o5@AEm;G-| zqos9Lw~l5b?;7MS*&0tQFd&XcbMIPqm*Ul*F&79p$5ZsFZpSo{*xI^s$M3geQ`$Pk zKII#Cb*w?CLKrM)TX)T$YIoY_^8kedFM7&LLo}>>)%!qr8p0MDrkjCrDQRYnzybI3 z<^npN*sqY)+B^cMK9%|l@wY|0)O;}drMB@UsN2un!Sy4(eth0dg;tS?c-!Y4ay_f) za_ZdF?9ZOYLenVB6uP0p1Jw7X$qTCmA3Bl8xT$t0m`H4iJ08^KwuNlnvUf+*)PMD> zxaTTq@-%w3$g>zY+H37E2U{)viw(}~mjff~?Oz~hvB5p+CEA$|K{56}UuyfO!gjV% z=~l8^MjD!OEJ*$@)(KDk96QZ_@?69mz2?nl4W>r=(<-U~khiKckQsuN%FHtu*=3{7SFsZ72Ir8_N%i>QG{}IJ?kRvNCo5Mjyb2x5fs_7 zHz*?~9+c^35zIj8>FHG?o&3U^e(zk=H*rfL-k)EtDgOX;BFJv8jB%`+OSa%PuTztc z)2&(a8K%Ph)82@Sx(Ptrx2UMzK;?Fg%6j6i>tPcgE!q6CcPZ)q9@QjLsB966tq#bE z-N9~@^$Mp8$?9n?QFH1t>_;N=#~+Pxnw;a!OK?73`1P*3X;v(}oT;up=>)ePf8A5f zI$H`wQ3F8h=AGi3G}{WqS3dPCvVr@d@`|Qq4=7%^>st`d|IpGIax;KewK(oml6W-~ zDjBeNs|*NG2TJ@eZ4bZZTNadze3fNEX8FGA)_f;v$753&N+AcIYNu-lDlH>?#4bo$ zyAuL7VyQyqjsW0QsGaficBnc!D-*%%yR)hy&CL<-kS_zahHUS>n0Py~}Rzj2!l^BwaK|%|W>K z{{R~3i*`6i`Dnv2NtHbF+uD&9FDS&n>pgo4vQ%7yE1U!zk9y8nFHivLzhx`3*X+oQ^#T@fbvV{B#*ntZ>@PuZZ0JeoTzVZpIY`X zQTI{7T-ft-#y4a9^Hwba8Jb_bojL4&m6dHP$GK4M0s5ax(zl1~_YA?ZkMm&k&-*pe zYaFcEw`7cnxA~2nocdLZSGbTF9|d#Nbze+Yd?=Gj7%vgzHhP@am8nS7#f*W|+OlHQ z)v$}r)Pz?#HsKh#&r-O+{&l|2BUD&9+xdZ6_Ip55@%+7i#ymQ0 ze(EggQ#7-@vnG7Aw0{;9*LiItM%;`?Ty?xFZz@k8%Oid4S5XY5zTwzjvYXH$BHe?C z(qx@7OYaZZXSHj_%_9#iZ6l$qs74!~y5HxT*lR6^Xnmk__p6DUMQUC1c9cdRy!HOH zMy}0>v5x1pQP(@g6hDu6y#v=JcA2J3k8*I@P#O^@v7z?O$-{lW(z( zLOPHBwR|_>`7LbqyLs1k_aI<;e}#Ru;ZwU#01Pg`e>%^Y^>EMKI!rKMkYyT=EmAc( z`?VQIWFU6wQOFp^2c;J}bu<~2l`;L=V8|yQcB$K81`A^~Vkc#cXT2mgi9tB^#Y_O( zmgS8`69eTHKE;b^A9{cl2w6U5sTrkwe|D;um7J6tw^g|nnN^1hy=yz94*gCK#X5Sy zXw%AY8}(}W6JC-SF5hBtystI&w}{!Kw~-n0i=VvJ@@I+CGjiTZ!QamA=AGGvP0mhI zo?Ac6qj%ozQAYk*Qk;LaR{sEW-+L-C&{PmFm`MApjw@C7{Hy1UOHDR+hDIvQAIdAx!p7&Dh|s4T zj{wB$#EXn|{AtnJh~W^0FZ@IOnnh5Xo@T~>y;p47ZWtARFXj4IRjlP!@KZ${F7$HF?XnE#~=nHYHg?!*j`5*U^01fcm6NR zx+o^%GjH;S`Ht%5p+sp{3!mZpwa{8y&*nLQ^?j-&qkT$>b~Y^ptLDAQ4HoZ_f4lx# zwC#|UCPz5k#%nyPNeocUiBs=lwc%x*H-n9p%O}{_v!yUoc=WD1vea>BK@1*4DL*k^mv8rLRtchF(eD2M_NyW} zE@y?`q@Di&`qitY+irkIaL0~w?_ABBK^m5@s~`>3cdt_TbpzUJv6xWJxmi~q-YmRV znA=4xaP5Qm%iiLrEYc6(WCA=WMg9q3->_zY4QB7LF#Ijmo$y1 zMW4O=RWLh#Y9DjH5+0zb+to*EauMh8QAGGWQ7&&N!wLmvT~0{w- zOa>nO*R02J!iHa(yuadva5kFgLC)Sb=j9##?P({cx<1F}{{V>o(dYRQf2>dMe-nGx zKV{}@3RACA-@{va&C?xH;auTE{{Rm^Emadl;}HrJp2sZCJH@u}M`0w+H@d3<{5-eu zeJkY)wgTyvHrzk-C9kZ!S#Krfl)h>C0Bo}T>iJJmjScg`0Om8cy?h?AJUmat7LW@_ z)*v#4vTIEIvIGToKQ&1rmMBU&&U&EjR_!g+j+kG%1$AzWVbD^~4ZvoTF#*DVcCFjp zM%$s2`027o6l}1N$~{F#a1|Od7b?D#lx&S1u56Hz7|dX@j=O(~w5`qDPGnQL4@5h% zD>}++wLr(MY1+vkW9R1vv2T>PvuY(+l^xe>ZsxUOd3@~cQx+?ovzZLLNoFyw+TFFX zAz6tjD|5AL2D%RY&D&OvIdKB*X6;>Wo(LvJ>fNh|w8s3WQU3sr*L9^s8H~)*ZFT## z$v9aK#?7<0+Qz~2fAKZl*t;VxD~hqWTZK1C^KJQm+OEq?d_=6vxYrEeZ3J&5o@4EA zmo;)ok~A0`)<8*iB#FV@T9O@sU5-U@jP{>|FukndJi>Rr{{Wk}8+O;$@uPV|J%77j zCVVAn{{XdFE(h*T8Z2-@@A>?-^{8Eif4Xa~jJ?)+xP6N9FjU*Obt*%ZQq8q#vNNv) zQZo@405Q#N$>wg9MxU3j-Khs$r9uNn*&`;V0axyv4@#a=Ac*m^Y3==KLhl*ICHzr=*T?i zTWLStHJs&KD=J|6`&IjL@(qp{dVBlQPeM!Nxj01mKfV3xuq}5mbsKWr(-er2Vqu-t zX3(Na(R{-P8TYIzT-eczDYhh5ZQu9JYeSWlTe?+yXGlXo-q~7qR~DrC#B=Fft!M^| zz{k6waY0LZB00sN_P{@Oe0n}e$`qy(SouTRuyt68*lH9 z=IvaQMvSwkOl|KLK)Z(O`$yr~c{IoxPx)#CFVNSe>Jbs4-qeyWg>ct{POsV8b6Az z5gD5YZWo~4RVe$$RgvXaCGM=A5;$23PaJi@&uboGv)X)we`4 zGnQ=h{{X&f?X*za+$+cTTC)+C%;kUDty_5f)kjs@SMp!>s~Wc(Xw~yheqpz3XKiSf zo%WKYf{Mh7C1Sg`Zg1i>(^wa1wg%ouR{OQdCu18HwEI;dW)HE?YTdH)Vz^bC<{#dy zc%l%xyuT|i@YdWYM5LkXUVUe&wKjD+bTG#%vy9=sR{OQuT9PhN+-K7rtB2D(&pXIH zU+&j&ViGa1zT!J~u1cGVpHr#c&mLFh+fn96RnN;!w~yuaHK80TBih{!MU5NK%#t0h zC6Sqc{Hy5?gE9|0elU6G{i^xaP^4^+t$i2pfXXf*W%)U}M9 zCI=No_k~)yJWQk)s>Md!j!3T81JHvip$>4=#{pZOl<>h%1B#8~^FqJf+eaYM7@-#= zaZC_Elp$H}53}B-fTCumWR`kUH0>_@RcT1W#||?dad#uPl`s(nD?+_iOi`)vMg2 zvE)=M$k9i8$XsfYU8NXN`uhotQ6a# z#!m8oin_~1Wrq;8g?3gCy}YP~+ViSv9Ol)cghuYiy;}^SSLNcV zTdIfIlgC=O8S=L+B=iC};R>5T+@I}NZSdh{m&Gx{PRn7F{{RDAW1sH&*AC3cJ&kuC z4qX2LZby{fjCXDS0CuF>hs1r?X)I>hVlCzo{8Z`WSeGAo8mp!l($Xgf<;70eW1YWt zy*R}6qBOW~yHS#xlo5io#RqT8{4|4djqTQsQSy=!pyQ@$vq_V)8%0F!%*sc~)JUp_ zK9s|hM+A}DsmO;a?fO;BlGPYi+w*m)NN{8VDGZ!8)vuO5JEW6atQ-*zSnfM|^ZhI8 zvI#?;qpf_O@$M$_qL~83$lICQ<;rv)UTBKEj(YOY{PgjQy3QtkP@X@$HrJlqNp&n{ zAaDjnw(%Hu#Ah$TK*1>~X`8&FH zu0F^SE?M@VuC5Y=cEE9;{C2$g&r?Lrd~6sUg+ml+Gj4XNq738Y8*xTgDk(vV}RW%fUADOX5pAsHF1NIX-`z z86N)CFlN*~BlHr*Rdm~R&I+RE@~9+?l^@;hQdzQ_B$YZEcIg^CFzH<}lRZ>4WnFgs z)m$?q#SKcVO6St6hcY(hrEhq4cNIfpo*Ixdub8Cg6()GbD!GnG20^WrhZG}ZoQ^50 z_r7JT7R;pc_o+b}-J6QeaS=u`cWqwyubVzSTuY{CO>mAw%t~%m=$l(P$EdHSH>%1q zyDR1ok7i?|&kS+2*BRdeugniXcXk|Rv7Bt|5>ChEo#)vmzJDd~tJHR?@r>@=n{!Uo zgfVI}$YAp1oRWXo%YSx~6DDvuRj;apO(Vmq?8?s$@&f$3yBf0p0O!od% zsupG}tT^w|luQ)vQ!uT(YR1K(iV~F8AfnLs;=zs=&=| z;j(|=Rk>)8qN*?O_5T2Rv8gK)4##6_YLTc4aNX;EFEycH7YqIG?$#EcB8a&eHPG08 z{@gg+o~qTwCRNz`Xjnwb-!K&B44aWuF8Y~bP6~0lk%&`{i~iMNaQ22=v9bHVHEZ}` zeCZW%fZ^M_i7d(jGDGlm3FsE zsBw&uLRx#Bm4vgC~IthhA; z4&;&kO4QZEMR4k?wHM{DKiA7c2zdVhi}pf-yUP-ao>%(|jb- zPOqvyt#+A3`H|25f zNZAYIjhzRK2YH98?h{P;HvHRZD zCz2wan zs-dt)LrLWj*<(`}$Z?(lsTq04QBowzDFFqU2i~W~rH9VAt3k@CCq)Z^dr8ZO} zsR@a9b)b{b9tA(h!7AhBBk4k?lfsXdsWRf&iRUIVbC1fU+*ELB${7CfdUU9Z0^YQ* zVw?$5GbamGrNR&gBviXuPDkNUu*(ws991V{D~(Z+xs42}xyM6HT!kn{2c%(9ol~Tgmx|4Z)^}!UCz&zG`yAy(ZvdF{cOC zgshD^6^v@9Ju0gtN0%KdLSc=Y2T#=1WKc;m9jtm%W7vSH3c;5mn9*Qk9epX_G>xzv z9<^XAs3#pMqHS{*?CP8i$8|;wY%&VMF`jc>5JGC^RFM}OJO2QC{hFsLnD{*6w!}VL zGCAC|+yMwiOt)$yQsClYLXY#KF77i@MHCWl3F%iPiDeBOyOTdISG7R}r`dQ%$gM<~ zj@nvAuGVJ~50?$|4b@n~bV5TWGwWSqTBsZG^ZNRVgY57ScaNEBkep6QE#OOmXE5jd z^sNJ9YR;&`a*nlOL~={EMGSw3cUnHo@RH}JcC8~JK+3(-ZKNaY$+yY-yQ#3-Kggq) z+t=kas=&EURlP#>sw$TYH;_4ZT$ew0KAyt2rz1C^JP}81Jhx4t5BITD)WhY-vmlWh zvks!Q;M4A|WyFK$`==i@citZOWhL~{!8~$EvV8lLe5#eKBKKz%d_-x-R(QUb;j68C zQEPh$i07BX9johKSolxjZk=yq9J0jEa;w9i;tlF6)I2-z%ELjm6W9!H>bo|QN8|ce zqS$HPQjM`;N6NKIJ&%^g=6u>jBc?RDf=RFNnMaZ#H@ z-TSfgQ;Y@e4tD0lo&`;B0gPeC%sY3klsIWpt~PXK71y=8OBa^O{xw`%Mh8l2kus5# zvN&}haa{$ju?YoV_-iq=STo_a?Pul*<+AxUs~O@h|BxI{5>n1hxeBrQTdcte`JwBgJ(h0 ziX3#gnli4u!)@0X{OgIol}2}c<*u(*ERy0jEL){;`jxEk6Eu}66%Tow?aYc@NohjkT}F%0$m8V5>ZiE*e~PLSPoUvV%VXD6SzAU!vhN)H)rE7b=}VgZE-g~WIrK5 zr#J)V{QA}Mv#J;hn;(4m%i?B{pxQCIx>$Bdv288)T&oZcKI)O{UljaJ_}6`ZaVDQ( zKbLDB-ge~3oS)x4T<#Y&#yI(@e8R6xy(p&PBgWj#dQ>d;b9S>CxLm9%CIlf4fQcc%m%GGQayZRMY0r?qq}a zGLq^QNc<`6h^~%5b{DlaXt$yR^PSm0)}E0cH_QQXjx$jJlJ|hNQIme{zwjDFR*V#v z?mx<>{pxZ@1)EcvHeEEF0 z7)rB+G<|nNrD&kbLBfpT?ks&%4hpz~}z@ zt8Zzu_mVc}e!tS9RGDY}=-`dN?9ybtiEY9@{zCbk*mF;U0c{g*8{GW9+iGtr7Pb(o z5hw7Pm6QOIPs=KDi~ZwL(D@2wUKm6P_02LxnpO&gDFZ)Rys#!gD%(#=bg_Xkf&qsk zulv;FD{OO0jme|5iDMg%W&SU%EKz)pk}yNx)YLFrHL_s2SKZ&{ryrbi#%p?WeNR5E z3l6sOgQI0z7qKJ;pjBa72Vy~uaKL! zzn9VXjOX*~UZz)9R*yd$4rO!Y_7H|K$?_FFy=p6_5J0|1&RAzTtFl?chLOH?Vow|j z&4)87R2UfGH}tQ6mqW)#Md1rqzrS063~s$h>&1P!po=!q?F3Qbqd~aiA2;zI#Mj0? z479qBP>yJy8yIc`aC6qa)$sUXV;Pw@90ljU;aoVqWOdQd=+fy#NQyBS{CTP2Wr2g^ zD$UB(6d2qcc8{f6`y#Wff?hGxx7NI>kx1)`*5;IcQ_a0PEji+g%~`?2gTVgy^fg>; zie3lG)$S4l>FGL+Z9waBd=W5#iKbfs}dOp ztbFF1wFd2@pK4@L%fE31nj@8zw;v@_zu5?ncvZw~N#d=<6lI4r#ARjYuUdNGy5wHZm(_q}Ubw z)4{L99Fu3>TcD_4EIN-$wGJQVBhsKm^Hl6OH7&W=2YRWO4#m4y-bfuqUXSI;BB-d1 ziAdLHdbJ*7+P`{+*2FT{T&o4F`;x5_h8b*DlyYrSzr-st?%^VUm*YOwqE@j>W9RP^ z+eXv0jxtz|G0;~VIFc!rFrcCAE6_Y%aDLHlGbdtt0bC=@4Z7VpA;-6R>4HZL$Ho+^ z2FlfY*T>`zjk`m(7_|Jq-~R&^T!pr&&YIe%oYV@ z`It9P@vR$3_mEWW1-RYTsLJpXkdU#Ga8GlN^>PT~hG7;-2c~@mOK2{34I@DcET9%2 zjy{yO%@};f#Ifs|%D0*c%Vq0b93o`5@kk!$}G?@{&1Rs=FG~@3CV$GXpK@!BnIoritSj4g&kFykw(Lwyb8kBXQhOC9hnjFvxYQ~#f*kKn0KeD?*9N-K3ZE? zBaO5T;6=o0-aLt;j6s89$<@}|%t9%(9am`OQhLL*Qu%kRvMni@_ z!$`!$6!j*UtG93}R8^AQwJ*d%=0;vxqiI`dRqs^>SY|fsSIQI{$26l7P7}lt;s)K$ zep>lA#x~(KCAH4LjgnWX&3$F!NwaG)BbP=j-{OqTl-G(Seb2;xg!6v{y zK~@`Ne?HD?vOZVlQ=j6g#o8U&Pnktr8N)LJ#1MU=)x>GF8Gl;&ms*l*dx;w4d1f}i zuc`G3oivH0W%+sAUny&e_PePaoV)$vJuA|~YI&HQ%9iqrg!5;Q2mbo}YFji%W|rUN z1Fb-c;3@=I(M4adFvlaTsmHB$&$-R9ddN?oJhzw!L*A|`+sxtaIFSA=RU?o0fZP0l z{{RR3H5#;jd+*8wKY#eMSujlAgfd_S`>pq@LKdDe``7E+wNZ{la1{d#4)rSuU6mnS z(z|V}qZ=0XIx9ae6$UZA&r0ZEhir+tvRG~d{hH*o=x*S+Xl{G|0OP+(>f?*a5te*9 z4i4_#m4wqOCY7to)3?d74`I{mTh%8*z=wQ8Gj}!T z)LNGmb|Pr4pg;v*x7zqD-!D)H@YXH5fgag@ZT|qnS}`&NWkt(>BV6*-=#Iv++^l5@ z=*?cA;Hd@Pu91HXe?R-U>0Ui)@_zPjnUC=LS9#$3sQ&=A?PCGin1%h{@NW5XcXkz* zT@7iyPrY=4>83!WWwBSmWf(P?p~z&@qITtR^0jICYNK$gdmfcAbCw6D+IwXRVyeP? zz)3j8SyFZ%RjD*Bw%{<;3Afscoj~nCf01`_OO*aI^3}>V0iiJ8B}@q;aG_ZlFsJW( zRE(q%$I2?zG88Py<3wfotIhr+6?-{1ZCplI-+4kQqE>I0g1*1qt!rdRM(}f={R)#P)3miJjL=4=TpHH0Ymc*} zR|}a4AMWO>z=<(OL*=%1wkpY#`JoeljrXgDW|7uL)vz|lV zMXc*~^MNOoYS+_kR^CP`a$l#*_iK`O>QX!1BG57;6jj_lVO^BnGX&3S;H@SHLk+xY1~cUvvE}6L3-XTj3}@!Z=xTZ8D40Rgxn%S- zrjKa&Ty|c-cH;~;H?@6YuF{}(HS!PYc)u&{h*s5@;JIFkCsiS7b*6rS* z3dEMa@lZPH_X>XD-Nx>%?_UUOXz|>6rShuZ!&*t0PDU*8`SCKc zV0PVKKX|B1_K?WtJZI$}#a~0P^B|DFB#tZRpBoo~Y+E;0`L|bA8c&$>u?L=8jk0-r zNPp6`5DmFc$!e;zw!r78`H#I!urij7nRp+2pf%`AnBwLZ6!RFVY$)W`oGRBpGJLGR zcCpvYd@2vAty^VvBOEgdabD<|ei5@7`JI1CwF!^T3nvVsqqc!0xbnknZ@pHhMMv{v zT#vi{^MAEm(_KowwjM%A6|;h^{58D>GwdcA49rCM#on9n!BqcR{iXi$vN4R1E{n>R;)2&mQhsf<}AAh80%VoQ=Pt1 z#d6DYL?w^z=KxDVw7!h=udzNG#~W#?2;55s&t_j$uZ}Hak*8lXfTwTPzQXuqj5PS6 z+qqB-e|HpN)ueafk56C~iS136Wl%e{6U4z>mg1?TVR^4cCr34h0($kJ^0;2~;t2{s zqbj_0p@eye_w8IWaZFt9`F`z5wHR!uB@BluyG3IYKr$g_2c`#BI>{lHz;~jko3gCgUADSLg<_9G_%jzj;T?U!Ok{ z99Z~<^5W(9?<=tv{`sqdXFYw7IJulp10(+NxmDx%Yvvys$AA5x&_oB9y!^l1$ID+% zVa=;LH!Q8U{hIl+#ZoPW{IO2k&UWtWy1Veo$CWEwGi9q@(=^@p0(*(+M@zRXyTn#H!QU*F2FZGFTe3r3lhlVgI7(i!HD0Ce-$|b zG_BY7ipV!F{)1XjGp7*z$Nj3zw})s5$7vl~_^U=ZgpPJ@!u{b~lZ)&-d&RR1lLkgO zTGzF^Xh^k!JpTZ-Sb}C|SWxU=ySwg8<6C-HlR;8V`aWd)~xh`cCqyRYpc`L$iRW~3gvYBBLpGG zP2Vkbb`Ha@Ij%;m!ZA8qS6&0v){k;z{{RhVK*;1{gIBjCNUA$lZJH!g3?qH*_lHXQ z8{qxZHPC|?cVI?;x<0k@`xa=kv#ool!Q-32>TuEHKD$q+{qt8zUP$Ppx%Gw6#sE9G ztkx~i){VkQp-J?t`4yakK2j^O=z1}^U3tz&-Kv`zA3wrsW*L3LoX6$dX<11X)JMk^ zTljhDPZ=lXqdSxX#wx5PG1!I8L}v1WmHW+BpJR>}0CuY3m0P7t63|Atk~mvFg1!#; z^C3Ftn2vnVF_GDaZ|h%qT(d_DN~i9M_=n@Ax{X5A50V|MPxnc4x9@%xwKryCU*SGQ z@iDfuwcjk5d=7nU#U{8*wj~eC{2`apy_d!?q!0-uMUj7neSf=NFpK2LA=n1~TiE+o zwMBcUi&Nqq40+nEgslRI2g)+Nb5x`Zm@US73STxbpCS3{Qez_f%+lQ;WceAk{{Z#s zOOXsM`@g^c0FKl~Uo43vT;rgo%W%@gBt>%FLH_MTuh5cvSA=boEtdZP$A8(aEvI(I zMc*&|^H~~vhszmH&#A3domx)6DE|P*YdV{i65K6xHst)fw*4zfnWb%`gg?dFvMu9s zOgP-9^sTt^A}CJPTvsgJkk@G%+HqK+ZG+|Yu7gj8Nsi)nDEqaEX}Pf$*3S0YjDWOvaC<{TmJyD^ra2WaPidplS^|gvauXe+(*FXpJ$f02X4`d zY`G*4%Dp%v*orAETaPSNR+LCsVUJ3&%H*-AnlRDfX_Q2W+cJ6zWV?!t^rxY3Ebjgq zXjPFiwHMT$q$?JAUzZf%2>CP3Ar1}*;*=0R_i9|EtwzTh{_`Khiuotw(p+9??FibR zI+k`gQGzk`$*-;4g^9gLuaf>bPiiA*9sXAv2<*O}n}6su;~jJ}uC9;H?-#u7aL5mw zNB%kVuRn@ipS>yN zET1mkk5NV*Hewqi9Vw51<99jbeX2+#7~Vk!l`^3n2dtZr79Vz}j&_PbLS(n{s=FL{ zWN^l{qqmKu-zf_0Ir`R(GVT$}42|~=f7+?7;%He)$<~^&+{E~BtyaWA73P1KeciwP zYRagZxuI$0MH4;O&hod)zSU~nfZ{K@&Hn(7)D}_496-*%&+hbN$-cw(_mieVlJqZuQAl zWg}t~oz!j{3v{mEO;t!lWB7jca$0zjYlSYqO73mUA~t3_2$`^I(v&wgp&d`Y?c?&SBLrq7Ca=Vd_DJu+ z$0O3HNOrCV-mb=vUONgSWI^XQ6&?bvP<5gq$L}g28I&p>l=%k|K!E(q{52j7NtSGi zSkcplY^bD{=3n=!7Uf5AB4gz~(a5A5nL!`$Duyxh?I&eRFPRhJI#!dlz2P#lsFlNd z*Ui5j^*Jo`f3w2ac^H`ne)31i&*NW8`EFBkuNCs&?FDfG&>Y68Jc-1NI4HRo$@I-l zmC-WT{Jp(k(Fx`|6MujwXM;RA*@GiWY`W1o7@e84L3f&(fy_ zA)9}i@sCCRDuNd;Zyb%r@T>==Jn`W0ix zBTF=E_fQ`IvmQ&sp>{WmtC0^X$P!>suDFd7F%$ynQN)#~GB{?%02d zwC$J6AprZI#ay%8B?fO;1cz)()vKde);P+j9RC0+`&pq?w5QYI+g zv2QG^p~l+j_f0m(#>{>C<#g6q*)qdx*HaDRyzLZi^RMu?_iHJ;jJWDJ87uzM{pwQV z%tTIe%}*3@KbVf8`d48(vdG&<;auGCN|J94oz*u;w)+u6#&_~@g|3aF@?zRL8s=>$ zXs(dB$lYCq)2EUEUbN{;Q8S(L{HvV(^={SBLcooHVz2@7p9{@s+7Bsn<{2nV8o8+7 z!V|Yz!_+~Ea;=~1T58xvm;2R=c3i3c@1-l;5#-(=CGG(BCh(-U$z=>|oNNob_^WCnsj;!CX)rGc zRQ~{Y8sR6lc%NbEUY9&E$UMjU>(a62v_?P(`Rk$F#wHG#eRl$EM%=&Mu8P;rc-6;# z)sqFHKv@UOYo^m;ZMZ)zR2G9}n>$33P1AL*!Brz&qoD0ru)^+vm}3>G8!;qS)Rv|d z70mfr8bX_X^;RB8e0|-t_Iymo`?Xc&CzjfCP}y<1B$d@bG1ffstmDkvhgzC@l|&nQ zRS!Lwe(deX@l=&z@c|pMo@#j5M!7v}Ddi^s9!)q%=$ks`r<7VFPwgxfo*r0MzLFTe z;(qOO5Wd+qk&M@0V0^gAUi7V~-o~2{vUARBI{JSiB02+C#TSYgf!(Jhz<*GOpDvv{%?#oG=9_MmE>YUlHsieZ&q2O7gLh>U()?z2oy! z;*Ef{_<;@Ck1W>Flz*XMeep9s)AxDpv~r-2t5)ZR zZjAbT2`9?n4C1_ORIaRj#vaFI8ezPq;0l$B$Bm<}=}e1bFV9kBBW)e)&AzugqwtKD zKb$xvw|@;vgXBATKgyWwb_M8Gq*cm^Fjq99wHiVsK4T<@I9joc42~&cAe^tt)g&si za^HW_tukyw3hz=thHSM5&oLsU~FDzb_RmNN{jYP-8W2HE^51@!HRf0y2Aa zsSusq9m0mniYx~}+ap}(=J~1zSI!UJq`{5yyb6%3mEW8X;iT?bMPRJOmP59tR`UM< z+NgH`cQ+XIr>AMH3XTzQf|nL@QwSjXR~ z2`Dj*tY`=kcy4_tzJ4CJ z&*@dw@*7|*MNJzyi)sEYv^2(|A+-TX4U%fPg99~u+*|(us@^#J)SHpASEUQgn02(WRkn_`0>G#<{7YKHW+@oXkA`BudYddq%HDD@TXL$1 z@zDC!Aq(uwKK}qpbiz!>WRXN*CjS8MQ{xb$5aW~E(zQ%$v~4?mD><#EQJCBKs^qRs zh{owZdAqOh)p+4(raOjRs%A+LD{lMW-Jup{Y{~b(hPI~ehjOWiFe=064OF68-Z^A= z_(QY}+kWkBBv1*|?ma&o)0tN8R2|r|9?k zoaWvnaOB`P4Bczed^_;={{U8GF~(znILm?aAl=wDGhb2oQ{la>i$@~Ix7Ek-{&m|* z@;rQIXHJ^abI3j!{3g_V{{XjZs6ftBcibqwo7Xk&2@0vLj|-d zpnRP$FewXjfHv1+f$^BUTdOW+WX)o*FhxHgr^gD2+9m5(41*XVpe0A$t?AOxW#flO>^U%0&<}@t^wIGE=s?qeT@!5Hhss80ywX}6O#w%htj^9eSb_QZTn-BMXZ{e)j z?T*EcG{aY9ZI5=U?`EwT;+u;zb3FNM!JBq4{?%|#ECp4M-L8e~qJ^7p-fF_U(#oq% zoB>%jD8#*QXKd%~lgP1!9V^OwMW~yp-67>8YPEZRc_THva+Xg@z-T2h?PbZObZZC@ zM{e9XYzmxPk`>(j+P!51&OULoZE1@&Vv%ER+RT~1c+0Y}lY2YXiGz)xY^(7_BRe8< zQ#^4)37X`9DM#KiGpyl7Co9P3H2bUTD`v!>F&{DctC;Z@jdZ;h)sQ-?zsfRp{q8qc z#(xmLKWT8h-c8JN3uy{I{mbSQ8U5Zl_V=wR#mnI|rAkw0)|#)6G@C1iLw6Ee?aD~Z z0A}=gfw|n&0~3(4b{}-o zPUDL!#M|M(IP*SG-jzG7YX-tgs^LkicJ{I9^R!n^{#x}^EcYWW+vU=!h>HDP-1kgsQ zZH^n9^&d(hw0IcKW_dH$KgCnCsQJeQ>S)+`Ob^}v02&~Y3lIxfyw5TsLHBMCwOon= z9D-Ik57j!-C9^b&d0~yUqaCsYAD#btBJlBtOY=?0@ z*-koDg@{PaEQIV{YeWT|H*PVaatZI6%5@l{4veI%(--Gsr)sF>vyPG{df1K_JB$B6V7VSw++nCgWSrY1K)>*m^26(2-fDk450@j4NiB&qUtyG!;DL!lE zU!`psoK<3OSVwOysFDwxw?4m0+O)CrLd`MxYmL+IKeHF?`!*;%bsPO%yTto?8s#<@!}<-BI(8n0&dbcH}QJ5`w(R^Bqwv%^Sxk`F>8- zES_4&`qWDQ0B9$F&a3JD>X~JQBgFpz!&#@$)+CT1cN^DuOxjhcjZJWvDS4!AjuO|kjq-k=E z%d<8K&1A_t0Ao-<6|;JtTL(QW4u3qbc%$YOWq{UatR@G?@F>npX*;>9<(|X zkjW6``u-JE%e$SRk9yWVK_poFMq7Fu4@y7|PVW5Galz|T955<4V?=ce6S87FgH8yp z21yjwU_7-T2{GHHB4xjMC)}!pUnm^*u`IC>58qsJYXQ-Sjg#faTG`g-irQ2XeB1h0 zI?{Zee7W_|ejRT<-oM)GCLdgCLfy;zY1aw`VF#Xa%ogBVYt&!VC6V9 zWkyry>sJvnP~Zh3u3IybKf7751%4Z`tw;z(FVG4|B=jBtgt$)iLit`;N@JW=-0zb; zstbkN9E*&OD{B(nk>P$M+RgTM2k&q@R|H^aq+@W|jez65dS{4j(m5U90z(RdH9XXF(k7^C}B|M#(qIP#iaJO05)D@HSPp$soxc{{SkQHI6u% zNO&vXJ-(H)({q;Q#>;7-0H|4`Jo=BuwCsyY>m%U{a4RCxCU}FO4yT-&(6*M`LoR=E z@t!@v??RFerM5`YMt9|j+r@6G`D+^?<2X3?tc!T!y-4JYk)E0V02=8u*&RMcO!h4aTJr1h`swgdGa(h zEMXS%JB~vfk6PD`NrN|>`ScA{P%ExuJPvAj*xW?DgLge~ShAv8%*yWKK4bT!x}>w zn7-xz06#4tXr(77YX1NZYNYEk0~{-{UYWCU0!CyXFVeJ(dLDe)4!aD$V1Kjp*yR5J zvyV^qtL5!coJ~B>fx8&n)Q@`lisE@z6BLAxf8wv2JYQ`zdgq-Q{_6)H?e4Ej2yo&x z)a0OR>aAX4%_^lkH2DC^r89`qs5kqlgA$oE+CZR*fQbk9i}Q;%52Sa4VtHY|L!3 zyp@Az<=mBiH~Rb6Lu{vENe&c!>ho$dPE)IdVZub}!D~|ocHlW*PLUWMR`OGLhg^LFR`KN{dl6qQ-|PfvR6{4aW9)vbd60IJ?P ze{?lwr^<9tcX}UpXi{&}AQ;BbD@e&Ntzu|5!s||mD&?{BHEQKmHn7`UMd*7F*bJr_ z1S9dOAZB9056e(0E;s)GcAp4^2FB}HiY@gtQ*@Zf+lr7Wb-?LVQPqwr!mCHS2j!~d zV<%I!xcj1l(zyzwG{__dB6{wn&&|gbUeSUkW_3J@;QVT`uAc4uEC)5*2f-PxBgOJM z+lZ$dlLCoN*mgb<@jL+P4J3`Y?>rjiuAzoh1PloNZ}=5-{x4DeuQL3~T2}lkkt?|2 zn{us9JDhTlymR`rEiOdAb3Njr<1NqOUs&p6%(UAo{E7>0Uzw}r&liHX zzEoRQ+>(FYuU`W6vE*VY>TFk|E8 z>}$Oov0CbAq>U_yP<-B>-Kp()nWI0(*&p2%l#;Mz5}Zimb_GjrQaMWm+n;~p`cg{3 z&Ym<#(b(|#7ARUYR_*fEa(WuA%eIB$i*$>( zKP_xpM6M74Sa9vR+wcDXp;q>nAd7Xg^5duXjdM+0yEAkl3U?ix^d0L?6u81l2gr@{ zW3DSM-Ylz`&eK~q*9PHICHsk7H6hTWwzD?PiC}M)YoxMPa>Kne2W?=^OI z6M1E0+kspY&~Z9wTWC@~?O0N*H$7C5(GoqwetD@-tg5+8RuX2AjgMORZ0r4_6Q{^S zFC+D@vTYS!083z~uZsR1v~X&1$U3VA{{Vqk*!HaEFkA7iyf4Cfv=gyqw;}afYR9pg zpOvaj#~1>kJJoUj0HIavU%XjJ*LcTzfGZ5=_-RvnF5&sp6qJ(=+_hRAIEcJ+O>Vr@ zhbO4%O?Fb50+h9PE1YO9yke}!8*Wm)`&B?gjzvm{TdCvLsYRnXF2{}hRE!-i;zm4? z@~ZsY`q#kv<9_@n@b2cnK>jJ(3ym5`3HcGTl|MHX`Qdg=zNaF-=XE7YxBkmhFNnsi z>@2F0>B|#+^PE@BUOAFWTj3MG%O_87Q(sBk8Ki~r$Xh6cBXDiZa#;%(z>v( zQ_jR*#|I&Su>!X5Pjgk3+F8~Y-MT#QHEnh~or4=Y`kJ!>sC>vcZvOz|UZf5v*hm`$ zCO+@**1fAT60E;FRcS5Ya!=+oZEMxuQUH<@iYS@*pp>oDMeDdK__FH5<7c+F0pyOC^ry0R7JO-$KhNZ!B(6^4Fbd&|Ib1m_7q~{{VO1 zy(dj*kci{^z3Y;u=8@RgwYFGtN8WC=X+(}+=h_7>?37peeJW>x5ah4R*16|{{Vo~0d1r$5(ofi*~0wP zlPU6Z-lY*R1HD8feY=nFRKg=jhBL8C73QBLq~U<6aD2AhyJ~|uM9wN<0TeY&#>|t) z2ERT0dn~ix&WC30r`~@Xf#~ep>na##ZZXb0SF=OE<`W+4cM@=wwDR7oB+PUqATtyt=cj zPm6XxBDe7W0D8J`viGz+s*K{+P>Z)5e-UrHR~7{Y9Zo?Ts)&vJ&nth(I_>XPaxK@N z^=sC>8h;6zHf>d7Y_A4Sz3$YA2b{yx_`kbQMq`iypDxDTyV9R;8yOtL-#6aJ@U>Ie zg4|3z-LUgo4+ZC!8${=yz5Uf))mAO2-@HwP)|669C}kWaa@3ze!bH)bf_am@-y?<|{fSU&bYhPG{lkjU6PS21BN$dBz1 zj6e6Qth5qbjI#XvR~-3~Na}16n-VooEMSm-hpjTzT*j#D@~tF*XC1|6&Em8ox@K6u zPnXiZfcPin!+0c6UTKrB{0o)EcpCyX<##CSUi0v2BL3P)l1;CMfA|O-)zNP+pExO=cySK)mL_XDH)3W-jwA5ci>Rb40$IzcN>>KcKO?vN+o_TBpYb!cF zSuxfB0NUHyypGUI1Z9+MX6in*?bCkgnZz5;m69ksa==_9na}i zBS;o*TVkYn!C&@j<)Dcp104PDtwSP59I&_y?%&1yBXwONW0h4GFaH3J)_jX%FQ+ML zDOfV>Oje{o?_@t(%}vb`<+=VUwF+g_+&0BQ_p6doD$;)O(7<6=3ys^qinm}eLiv7N z{*}sGKFL#O-sq;fyLhHC;gL&Xxaw|8k<(hnlB&&`?ChZt+bp@=?OaZk1j`2V^5MEy zWo;*#v0}L9(A14M2`l@uRd-gTaz>+-=~a>_z}pe){pz%1+X}mU#eVf;xlSZe5VAb@ z&MU0=Y@%-y+vh77KYRFb-*^5yT#7;*?)##<9|2qK@eR9&WY|gEzuv`Ftn6<`bMC7q z-)OrJ%Di(^u-ch5OG;Mz1R_7WMr!kXvHt+OUC=#Mu|%s9Kf6sE*X09>mppOWfCd{p zRkk$5F)wpf*oZ=^9AmXg_>ch~@YFyuvk<>6LPU@kIOBs*Cry%n6TB1UyiX#bo(X635jXANEnNfmn4NZvW||@v{{Xmv?%Z-%&}2zD zbm`L+sgq2d!jtB1&$st#z>CjRJsCTH?A1ym8jw_MX6Cf5;dvY9`@i}XIF9VOC7Kww z*}D^k`RKQRjHIUwKa2a-Z6)4{7w=Qkms0DqZD8E2OLr|>g7NuoyOy;JIfY01w%zw} zSvICk>`(W&+xKf`NYs(@{o2ld5R33cP@+iL-CH4!=%YpXM^jjq_epZzQ}tf;zh!ST zwpE9aJ$N$I~j+z*^D@mBS`LmxX=HKs3=FptN}$M>tTgLjvi6fYba^XAfJ zK+%iki)dP48-ZWqr`rM|5^ds}AZFoyUA4`n%83#q#{U54<*uK=K6-ev!Qwjt$TGu< z=Ezb$Zfk48EMV6y)H#efRARk({t@-37`vNNdY__pa&EO%90e6tWyruAs7Uk%* zBF5R>FU+(U6sCG5N>&S$Kw_!^jHl0h#I_iIK-gm-MvfT4ir-iZ?oWgmOJdsMy? z#i&tOBY+h}$j1VoZo7iMI8K@ES2nx;?`99JSBK?iLj12!rD~nEC!0dXB9ZYg`p(0( zLxI0*Avo#iDoCP^VuKq<`9pWBrXs2UKPYdT{saB$nM%kbVIYSrj)NO|*0`2!hj-sz zjZmkQ!_8K~{VF7kJd5VDd29XOTIZa3wHGTc+lZLu*`86(@Aj)k-r?k6sJ}PyRcMin zxQnXw#c05#a${Ys>sVBcm``(ZIO3HCKKlOv6>7r<)z4CU)^47QGcab_^}7IVts3$M zYYLkLH!f+b6Wj=!=k6A}yLe(9zG~z&n4cS#A-R7rJ*%zKQRdyB?``?I))Q7*kc}0Z zXor`M8^5JFW7>FsmX$5#L5Cav0EU&|bpEx?C82WoN?ux^VBd1J{3c3k5yXvz1RVbW zz`9mTf{o8BTYeX}Sv9+5`FV9-dViDBihQ@wboWQznhFKekz$h|plY;Z%KW@lT?P{t zoe^EZf(5M!hm;21_0radyA`1Vq>%jmjYdD#=0)P9B?$SdIL>zN`?N(^)&$X*!7RM( zp;R-4A1y=&m$;FYrHgaE*v9IpBuUcvXG(jGS~(g1M6YWK6*eH~E0*v@lo2CH3o$)M z_iM1Yj4QX7UactFAfBf;aze|>{KBy=oGe7+rF3_U*vMMuu2>Mju4QOT;XNdAA6SB|w) zQOgcG3Q9jckhtF2B00yP)bm zTIiB6skjVos&`N!iLuueO=u+@Pbb$9NgF^uRkr$!wlcIB)M)h5Q&YOJxk3epeX(0C#5@ub}RMQmtK-mX|P-*5yXp>c=^( ziMQ70dR~46O86lW+TG22+I6wE*2$o$6%*?s#QM#(HC*~D8{JWfvMOSmV zd0bVQK<4!ucatnSSCV+6PJ7thOnbQbf8aImmobkoajru5P4m&dUzWLX6m-z-!&T*c z$o%H`o8fp(h3q%O%|wnz0~ueG9DY94^KXGBxwiQykje6e`TJMtzm2>R9sE*-AG~Ed zG1MCT+wo?Xt9Vbwa@$@-@;Tods%%G0^1x@Y;=XRZ7Z!caUy6*PdW;OS0DkE;sPVH# zst+q%E`zBXrygr#f84I#37cj&ZX&pOCCqy?=9?!m_dTf#J{Nc0q~E-$9FIy=Du+Blu}$>Q3L4zeRH*o}{Z}{M6#firAhJBQej)qL|El-`)b&cZWeb@aeP)tvc@6*yfrT22L{VJlxVxlI(a6VXJ|4Qg zn{~7~5_j#oy|2UH3GPBiAx|@ZB)9lg#x3Y`R>xDPyF61*@SV=4q8Jx@W0EV}ybJJ( zc_WVU@;Mbq4v&rxeEmJE-25ltD-9@;Ex?jO32bx6YW0|6@*^;m01x4=>Nr;SK2IN= zH>6HGNbudYjj&c+E-{Y6w;{BS)8yDIPhr`}s`ExmWPR%ODADCUc2y-U$Ro>s?p}*k znmw%9tptpH)AJf*0J}-8;~Nr;c16w=X}(XFkVjh8lG-xcqx-&A}4lH+Ns ziwQv7Q-lDm8y(ojD(q2^RK>^5%{Ja9+(8@~xeP#XDCE?o23Uxd46bugDQ_@y$MI9q zN{21?hAJ?wtQ@U5#>F*a^}JgHIu5mHvu#p(Rb-XU+=`H?>S~-cGL(swAlg{qnp6uX z?+?nNt9lKz_`dG;914cIBI9D^tTDScyAL6bvTh^ZDHMWHOi{JRFjy>@=7o^15l9S`V?Lv z8#WDFw~8W#u6R;Dl^yi@ZkrRyA^C^nUKir8iIF2q1+2N)4nKr3{_Qs?rOY)8o}sMx zpH0v$-OFW%dilG?-yE#8>j}iS5IS`Epxx%*_^VUYgp?#bBS(RvE3JUQ9hLk)A-{v>>LpICN}!_&$#n-$#U6D03dUw+l| zZ2tgiy7J_0&IaF@pSy~p>nMdqpv#`E>FU)f^Usx++Ncgd`^5U1^eMQ+^{G;fW1*z$ z9uc+!G4I@Cy$^2E0AzAK2V7QjmtrJSwrKiir{!A8)BKGmALqSOeN#13xY3r3C?G6n z4^7(NHpV4)epD;SvYnrIxdNn(**Bwn-76_BTvYI3WEEPYX%qq7k*ny+3p)Jfz*`zuokx zKF=Owk<{tbuU;zPjEREh@AWLbYNU-Mts2BOWN#l&TC#%bTeub; zh}@IY@veC;rSdrzqq34YOpEh*eUIJws{D5GnD)8a19YjQ5etu%@?W?2s{0`be3c4C zE^Bo)bmCAB1l~b#vST1)sP(5NpCnu4Cp+4-7AJ`T$K3DrtpRLEV&@!IZe&I}nGi-@ z0z09RbI{Vs6~TkaD}qi&Ju20;uxX@l6#{q1U#(~xJgY>^cY61(X;0oSmd1Qa&k~{x zC!whkN&ylKsQJ0AKPgV&PjA+vC{gxRa6+)bNrxH zMadkKMs&*2zGwM}=zS@+*X?I`liD2Q{_qYr1M609nQkJ?W9C}QxwRo@LJVj!%gC;rC6unuGP=BZPsy(m=`-4D*S2un8PeKUPcis#>(n1pn&aBuR7JyX z1Fd?e#Q3bB@t&z~rb_ZJpCOUt03S8ZTY=j>E6g53vNUhX>%*%Wwn7+$g_}95#xpbg+z;WZ?;@Z`;|I+>N40CmnEaJy-Mb7)uQGNz zQn8&Nk|3fXwGZc4k&m1sm~KJ$PhM)wkz2~-zwmw9iqvJ)Qn{kkwo+#2qIUVJ)rqyBE z!kpmJm{A#W4$;pPpu$5o{M)}O0rJ67NYW~j0I){ zS&x)DepHmqCAl8tE>=^}R3Bz(HmbObzpYC0h}Y&HewCkW%Dohh54~u#7RUe7x}ak{ z4NAC;M>O31;srSsm}f!>_nuN zhm!cw)O^Gf&{vh*qsCPO)`~9GSkP_^bI)qLi)dsK5tkz)K9$!8V;RXK%zQ^` z6HK_dxs&&b2p^A3SAp!3H*z@Ieq8mhrhHYW-pgq;P!Z)!2qngFp5FEI(TP#aY`qUv z^sh>cv^X&fsX;`oI_fbl`EiVT4&t?9F_rTf0T0ekP-{8}uAq6^+cv`F4UD`C13(-os@bn(uy9Io%<{*{Sn9n>i$$A7J8!*3yChnT_1 zz^+MIJxgxqV3J1yD103Et!IcAfv0ojpx}DfHEkQ_JT_LkxY{`J8GLR2_wd&RMRrtK zUUHybm%1ob_XI=irM;i5QIW#jLE zQ8EJ^v@qP6Grl2x5}$h=7!PD zYjXyL;zRP0$n9S;c*@j7%<0Q+-Twdquc-g7J68y~M z#3O~Yk*+YeQ85|&kN*Ind)G?7V=3~w^aG`4n|;DN$2)fLHva%xvj|efOMdt73iM~# z;*>iYmXB>{raPVP@_H^p{xx9AQeCoqY-Ay+hchtj!pw zQ0x=#5%^W>C6ZJT$e$~Jd;7JS5ZL8NRy=I~0Bil>Td*NAN4x#n=cuArH*=)35R?(c z!msIF6^*pdjJE3KU;qH1<8Mmqbjg@Tt1AU7UVTOGnndX=)exPnyA`1k4y3W%SG8nA z0}?s;kKX?PX0EEOw;^5B`g2^3Yja2<^1Hg>&)xY&c3u{BI*c%E-p<>B+w%|iO>tsB zk)M`d?yp+tyf-*Y*ipyIK5YL0O36g%qP0Hj@M{S4wS@lw2;lz!d;RL@*oIY*@m!~a zq!Q^!cJit}in=MdAP<>o*`w8q(6T@>3^gNvB4ECwFpW$jwpsYw3o)h?K+gR{B)M|E*-criomOFN>9M_4YVmr%a>)N?b z7|MRgIQf(fwbXflfO)Jx5~E9|mWLToTju`&X05|RCXa*sVFRW6O2>&9*Al3lG+#A$ zK0SG()Fip;G4~Z~&HUJs-GAkiAD8`=rlVt$Lv;t0pAC_)ec}HA#aGQ9GrNrH#5cat z{o(!U`eJZAmqlQ}50}&Bua!Jt5=~XvCEbVHoxEeXuR{T2gA!odOtG0aXD|F!cVTt% zckNNm1!c-#ZY^TpA~3-I^=QRwy5L+n>C}2xqW%pXig-p>W z%kr&Wg&d~Q#w!Yl+7d@a0!0*I$5n5;R;|_1#N9VlNVj>aW8{CeTB0$v6RECt?pib; zN0Lw8KL_Qmg5K9|(69MdF>CjS@iNzAXXQkz$lQBZJyoWIH?($^A?2z0>$21KG-E${ zxQ#v7+_L*uTCg37ERFZEv<{WQRyqxCbk^*w+gF{nXitNQKj1Y5ki=@omZC&ND}l{% zPAbOHJ#)Y~j`Atb&HOum-mkDU@(r@>`@ij1$9@2EE@7CaLa^Ky{{V@vu(ar;7N{HL zTvt{aO(WB#KXlLxv5ljpS1b$dKkDgrqOUzgK%c#QAC|ggbjxDOxrzI0dc`-FE6mVt1JGynFuu6@3=Qh( z%!gtvT4F_uVKSjE;hT5Kx3K>JYNm{D-Ww>wt6P-v)Hge8Nl%+{t1$U7{{R7~H8u3* zTUeKSXFvG$Y}hN4A_BSUs@|2(TL`7hXt>+|0DRV!q~ntr!yx9k<+*WY{i;PHv2&b% z54~>K?-GXt0DiTJWwK@Sq95=Y=(LPQFPA6rcK+>o^SLgW*jdPzJ4=EZyKObF%2gX4 zt6Y7P#>7IE+v&hSb_3V7amj}+mN!?+mu7zQ)wwQ#d^h{GnQtP@%?kXab5>T~H{5y1 ztY4V)W$iSp&AGl@H{P$SJ{AD>n~S&2(02a-_N(O!SY9?!+jV_i@V&EUBRhEMxBInJ z7ru94k?hP$p<1nit&@$ktCe;?dX`4o$`5+<*JHg9WtEFa-z_n+rx^K7N_Ix0Zz?J& z4(vCrM0X_!tlbuok3}MxxMwts?q3^zS|%v5<|{v$+7v>nx4h|`dv zsH9@dsOWmv!5V`_=PzjO>J3vjrGtJGTD- z3f9<2+FBk>ZH^ssfn0a|>gtm(%h5ktV#cc{ogu(q;q|F4)BtHgmcBft&mE0=sYWI? z&{*6??-XZak$~UUv^2QH8=SwHC#_eT%X|=>D(nGJZe_>!X{%UJiJ&cwzh zZ{o#hz_0SYSx>EFQW7NTt;Rq|{!#w`vex~qu{wEVu-nsZbJmZw26`IYwLvb{J->>% zYE!XuM^mRrQY1|LwbfXe6~Rxs)y>(-5;AY=U0s|Z+?C+>t{RaaE8OWKoyvgR3YJU_ zvJNT;U?N2LqjQx&aJ1PMQy z4YgH4s1%s856jY(ONCRna~h6DEUF*xEli_wktAdgc=V}f&OT-T0CuV@Wg81t*fA>7 zbDAKCk|}Ovp;ec!G^abT7v!K7KXrE0`!cyu{p3X;R@=pVbMcH9zmhoE@{b}urTcu<x2>xRE^b(8(b`J=MgFGir3RE-qH{h z_4&5eQeNp5C34JHY#Yl1{sUVv0NYMCE<4r$nNoi_{zF?5eWdw*Q)BzwRui!|{!>d& zjbNX1{ommRx=7iL%H!rw?$eA=TOfSoxwYzMK z7*fA^tDMqp+I^-)`9JTP=^^{VHD8)Pmb~e!8XX;k87$4sT$y$*TBzGD+~@eZROVfz zg4>NucNplltV-U$rFGr~lqR!l1fOxY+z zWpcQxNVt&6836eH7X-*HzN{XsQMx1RXr3?z7T9yl8 zn10prZ^xTOmISz2K6qGz4tqCKkNf7nv_PR7C#8J3@y5_xC`bT}nmGpl0OH<%r>$>? zc9DiA{JI~Uo-SKIw3r#&d}Oag(=isy|L{V-7wRYYuw@9u7u;ZQQvXRkigM_N? zMQ%7a_ODefE_rG69~(63z1IZw9+cSB+K-rgrkVDJwr0+DpO^79Br(k&6P@Vo(Dth! zt#xe%rz4CMrd0$=)wlv%lE5EBv(#;`TNxb zVkqNa7i(=Bo8FsjuQQF`C?CUI&qD)t+7KhoK6718o47==zh1(*n`twZ2k!K(+c@Qh zMIOED8k4XcMwPMIOMeA*#Dc*hJPPIPkCy5pRaE_VS5s<%m`(gO=2T#BTW|6L?fbvO zRi=oc+NT4(NU}7Ex9*ScR1r;y8_aFh&0|y`ZHt||m-wq|z<~b%!clBnE;|6b&hMpR zEL&ZfcP)0G55P|nTD`MkV#Fuc6kf)(_dfZxG8+iI@wDUS{Hni}_zt})Yb>2I+t1{H z6~EpU8phE|sr(IH^w%^`U2H@*mRxhvq?9ONF}j*O!6xSZ8d*r(qe(q~@GCM?KDZgka=NWJBWA9hf$W;}Pe9K=fe$b?y0{S5yTI$+J z(Dx79{{UvEVrp%v`F;=C&3z*|?nSY9}pj`gs@5>B(S@K1cp8>s_37%M=XEH!=IBxup6HB0a@M(A)~LCNeGuI|uPr zazxR#58m~w%L6kknD(sY0+CUdF_m-v(5|DwNQtXkC*ES?pYHtM)6%)dgUePe_g1#N z5eZ#(IZWKEj0|r3-|p1I;x(hW_m+bplFBz76n)?KYV3fA{qKL8spt`^=}``h2H&k) zC6Z=l8?jwT_8?Y~RfAKZMaVL7<^0P{Z=IO!q$)_=oYBzHY&up_yHlX2MdqYgkDN7D z+Clla6>7%nIHn3gCwJZc^=VCNPg@@2;J98rFi#@ju&#zf{nJ_66io$!4cJx{a#c8H zTJ<5=rMZ)G(zzgXu6kew<&;-U?YQqB!(83U?*c|_=7%ESj#A^xD#ZM*wUKh`_glSm zQ^%dn)K@uh3zhkPVNzP`BtS7j!)_}(Q!zy{Hg^iqGKkdVecI>l6{Rf4wHLPK#ER9G zCQ{uuS9Na?l{cv4{hHu*vcvN)3;bWjUWMVve9IONYN<$uY()~VT=G3@7gPB|BDHOo zYj2b<%UrgxDQ=ZRgLgdZShk$V-#$tCxUUoOSuxCqZsQ|CHTwbBh zclPi8^=8sKRFU;}!1$FkcwRr45x3_4`1{rFH*5x1A9}pQ;eMF9M~1D{@>)UWANEUs zcDu{#wc(e&ZK75=R^>^Rx}K|9%ueiQimP?0519{Ir3J$>ZzCaSY?~XAw%o4om1}y* zf@gQlT;85V)SQkhvbVHERb%qCR7sY@q5%fu#X)%Kjih3oA!TKgZ|>_h>TTPY)i=;0 z%!ypa&4E7)A-n%|v5z_Z4Pjd;^NL5)-#ISbfx1UA1x-RSXAu z8WTdk8~28xgU@H%^8~ArtYl!+q$DH={%zmGS+*SI>oi!`8P01=1&`%kwV4czyBIIt ztD(+GBc)OT={rvxwKO|`*{bO)?%h`7B18-aO1l}rbf0xW`KqxQ80xh#aOWq1N}@Oa z0P9nd)N4bQztZEJvlXwKJ}rD8(L80Rw0AH(cT4`R;y?AVxBES?d*;5o`y6rn*v({W zT3R^dZm&MR9Z6X3!s4X|bkD{H@ZP`ReL_tmUx>#zf0gidum^5Yy(^`&zmh37x$Dr^ z-=7fv96{q7M}~ODR5*$8%w+!n5U+;(Y4H2R{scsqR8b|klVCAr&-b!;;=X$mhLlgb z%Q4Waw&s)<1TV{0cd|JV8DuENRe`j^8D2v z^m!L|0DbCJl~)UoyF{yiyFOgha+l0IYrL7x7NpyOjBsi=(CyDZEj~bgUzarD6G$P7 zaN$Sr(Yrjq0CuJ*`L^bkLaF<*HvvZ}Q4sAbyl^R@!YecIswu47xdNFRG5KWR4z$u; z2$Qj5Bm2Cfb?2InNS7gq=qf9DJfKv3;PXNda^MaWPHcgp)0UsJF`-NBTv27mGuP5>k@=5 zyOa7F8mc=VHjpY?sJtibuJ7BNP*9mqM2UwZtak{0{fA9}9& zD*WSi+KuB~$ID;1IjKQpK`C_F3v{OEAH%w;Nk8wrusZauOGutp2uEML{`G6hOqyGi znY^5t2JO|C=gzW-Q~p{vZnf&xUJunL^4G~PznqjkJ*(I}Kk#v8gimyVW+Z&PFvon? zUK)g^d3cOU`cOK6^m&&klS)(`;gd6xzw2KiRKFj?x=6 zK0@uqXuGcLMmVanf<`f#>x~G+@GD{^J!B+TD&SN1v!6^=eSs6?6tV8x`_5}<#N%zR zh_a-{6m_MP5USXyx~>|RbCufN1znYbFHyM+`0r4*7-X+XCObZGDO84x@rt5(5E*hY z+N-of=4^GVFvbGzVb5x0?BU8k-KP|9Pg6Qo+B1%8D(8AG{N(ypqbU2a)hSiT8+%h~ z!hMR6$Ydb6`?V>M9tz@>6^GuZpw89BN{E=`S7%h{KJ{Ek!C*U6;Z28W>sHhxiMQ_J zsy^vXM6oIZu~!}GSvFu}Ij0EIK4P!TYQifQ4E=>%A`%FJU{j_#)S}(c7ha1}M7-sG zYPO8~Spml1yHNQ`flaOXP*dih#t6U|HDCvk)U`0jo&H7#}*ItXA#T<2>FSrq}= zodr}foRm|I)aA;J#;2HEgy|OK${q!2Tf(~)R8=^_?o}Nd?^cDd5rMh4sp(do*y34^ z-BrsD^>tP_gKiw2^-W~i_|sZKc>WVsoKQI3nvuv9stjVU23OjP)6`cnEa7mg*00*! zG)auNCnJiKM-nSfM{JE5}A!y|4I^OX(ikFO>(% zed~yL)?Mn$!*{G|)V_#xsPe15#@i%vF)Pbf#lD?&G)kzO-3Q)plv3!LZ`Govv9KK%=4^j^Z+gc=TPLxeBZ?3n^s3^x&lG$_vC<-v3xD1?2ata2EqLdR zJ}O4CNem6V{{Rl(x^wqiHQ-u@iEppuaUuB+@ouP;`xhEM@!WWm;?33kt!r%m0JwaD z>T|gI75?sP#cs7dUgqJ9l6`)j)mHXstr(EsIc)O1D<&J$AyS9$4)p0R=Upmf`n~Jg z+A{&VQO_stqqM0Fl;3KMvtc9TdV~J}*R8m%;*#t4k{!LrYM@EPamY?O?v|GZCKZN3&BcxIY$R1mIdi`oxWPqGU&*4hJbV+9; zOJ@_4fc-Q5YWl)UD9=9CQVawnL68XR=~}{Es!NZU3Qcr1ggcS65G3lm0*_i`k<8A? z2Lsprnw0Nzzp{135h*UQ$0yI%@ThI0sxTRCZ6Z5|JPtQ{)%3I$(EjZ1Svvm!jVv=f zg(E%NXbr_}No4JA!46oQR}|`8=!`oV%NS%65*9w01N5smG1>V^0%vTE+pTQcX?Y6( z1Ibg!&&{7vTG8n6$C<+C4f57%aYZPY(^2jH>suEJkOhi0~~d$vX({&-9e^A70;IIgIw>r0<>9-7UYhAzgm#& zZWq6$X^0>r$y2;~`_y9HB9vr&tJB!ijFNhhB+7Bd(XmI#MmCC~B9u+A46Zu*4{GeEH6wzo zbtp$3(C_?eI5pMyR{B&T7L$$KLmVpWBc5CF6!@OP%J1#c{J6nPf4$nesiU5y zJEQ1(8BX!#o}&lpT5t&*<~4pBlB6n!tQ>@wm|-M^32hR0^DE{G7$S$(_y1}NcpTlTb#=&E z^9|sI@>W(wQJuV!YFOiq8IV(uNB;mU@})XvpaAW2_n*Bhvf@~Q-6JVFXVd9cZTFW! z8OnNAYx&6&d3n#>^~GygGb4gj5NSD@#O`#1md8O_(~}uh&fs`8Lcps>(;m3(QnE6! zZPkBhZQTr+yv9{ODXbf%FigQ;Ju5<4OJp|$R%D@=?#~qDv>BZs*|>7ps`k6Qsaj0F zc^<;2W@!F+#%NdA2`7WqeQOs7av5E)>4m^6)EbUK^B_@$QBGowFwR>ar4l;{ys$oA z^=b(X79#!}H_g_hUC|1u5|(m0Vy!foi1C7bYU3nchZn5N2$_Grdw-2&JdngU4Cnoy zdcUczBqlW9o=Nnqsg)Jbjv0E;t+9lLNw>@L`u%FTF6tqhpzHqt)~mBF6dZNw{>?)e z$Ip&wMGKVw)VGz}gzr+UY>K|MQpt>whjEI$Llc4gHTZ2dZi7%2h2Tz9VXmzwCg1Z)w5f*hZaXFOJ|q;JYPgA)!1y=6@C+OOJ9XE^|4 zl7hA^q?oqIxY#(Xq?r#>qqK0)`A{bybL~>wnH7T{-In8?Gm6TwyJ-OPNfMtyfya8( ziWy|N2KGNaBj``~dv>ll*bR$mr;M~a3EJO({{XLDBof47GROa5|7P$A_y{{XdIlI1jsJ%bVk(TtDCdsehTBb8%_66YoT>ZC-8b~ZO2pGwz` z)%@0-8~_J@=UGXbBwYR4#;MNl{hFMGrf=VTh$@?0M-V7aC+;5gEwqcZ5>nFkayUPQ zVQ09_3kYTNnr9%5!)N!a>koy?HMP8Us>Sj*_3nQ4e1mfY{$TqnluoKe@Pg)j z>m1UCXI$gC^`cvyxG#+QH}1uO)oFmXd8rN*an#ch9F@uWYZ=7#?jC00|b-*1m4><-01k*~iFRs{2w>Fs`o?$Dxcf13yj2=Bb)BeX+&&w*y(I z@=Z2VqI0)5utucbr~FO-q}@>I8`-ubJNO=#0>wQ}gZ1|y2?llQ&Tk~$+o*{tHW-p7L7 zI{oU?PbPUA363`7wP3+)9(9>YfS)ex^Yd1|oZ@oFcE^v8cC6UVD>!X!;7e5=NRJAM z{3?U{wXE6Qg>A~8E_Z$3_G=~q<}-iKRs5>#WFQfb-AeqQ_z&KxV@%k$vyCF(&}aOb z(1fx}=AdWCUwX=gfZUy8i%np^irr-X;ikRO zT(rnzDixQC=X^w1LQ4JG-CvoD2FBXT*AN{%yV8msneg9_A&}}90z#*A6M^V@SD7t@ zW)lTT+Rw1_lZLga=Uk$u- zJj}nnLRXJn-`%gIuHly1T0(at{K^-oubF&jH`yg?L`*d2a+m)Ad;8Vs;MI>a5Shfo zHO|Ztw+&XU-ZDJvpW^vc`n6Wf(F4YI{uL}6xMx-J%WeU`*{?+5Q7l`eQrohrBR@Cg zT6WP&fU_0ae((3Hpz|`#Z^8TA{o2%xRjszo{C_w5)Rx72#mgB;o6256{{Y8paEQSI zAH06{@4D5UVHLb_oP53NG`}|Q_iL(vDncZa=5_gNny%xCzmSoskL6?hU;S#aZnGrl(Q}_uRIOE{ zl^^b(;;xd{%8j=F02b=uspMKZI|%o;n~$10>#ZJ1Bl7mI%Urdpm5X_9pDlITUeA$t z9-RLGcCePlv5C>!I7JbI^HXAqR@`M>j46B$-X5nJKnchLAtt@8c#-Bcsa z{n)KZoG9z^)dW@xx+>kB5n{aA7*SFq<(R!wkb*%Ss%Y6HE5D^w3y)&bNxD7CxTdyP z^Y>~7%HlE5)ACtY_*H0|u}efJKsK!`Z6h}|8Y5>v-K&cpAJ7`8nKz-qd_h=~O_7^! zSx$FX=J$wgp3d>%ZWuZFy{q(l;t$!5mvEOE*i#=Zesg$>DXd&EVp2jGf7$*VR!?&& z6hL&hU>D7OzomT9@dn;s?HO3`pTbo1uc#TAS&<8T_^+M3d2aFDI^2EX%CBawtR}4B z#G}h$8AK4Ax2sjxj#UCcHz?|Rny#@hasq7+{3}{k;ziGw%XH?wPF-$!_PHzuDG@}O zL;dQII+*;X21Wk&_kY@Isku$cr2hamJwLlzD-?fnCg!Znk57f;moK|v=V|X-ipES9 z`2%*W)$<5grQ>PB*0ReXK2m|TdR7%4rqO|A6(ZTPv|w1wqi|F$>E5YD7n0+g&}QD~~mf z(kq5&k7$mYO@iTNPat4@;##_BNfIiv*C(ROe=N+5;3n$sq6~1M71e8oYQtKcKAZ?e zX)4<%-jnW%p<)Iy-%8d9vF_t{_jguK!ir=}`#iYU=Kl44HSn$EcoEcWTKQ+~8_vMH zTpIeT;ZOp`G#@t4{hE~*@12-esqOAKQPY}*@r~U!)Y87-0xwE{?jb~Vt1Mc+y z0Cv8A@uaNUl!jrjH{JgLcDgX@-aM+z^Y9&mVe+ferA)&aX#Qp*t1YX`Gfx|pQZbIz zU?au~ug!)W*K`@nHKArH6_Ge9SFY;SihEm-u%q)HK3>(2aLEcQIourJtvkyxmE?e< z?)I*ZV1j2s=FEYlh%5V3AhuRe91*Ksw&gC0|bQQ-}uqpYSEu?aJ!#{gx4gD*tv>XKAwD-kx zmWS=Of@r^YyR~oWums30_p8sUjiBz1uF3{M@s zF^(}yxN<7unXT-|BPAPf?Mo!PxjaTwPe`s-)~CsC}D=sv}yO(_MWzv-=q$Q=jX#e0+`?w(p4qh{t|vpA+S*ol+o{{VWdu3w2mK3j08<$)P@ z1CjmT?^cFnI(4}Lkp>ZaR-7gX#^ui+rDs5e14fG29cuc_1io7Qul?GVR8eVswT(+J z4f559nPVs-Y$}h+t311KtUr1DKi#Mzo<)7EzjyC{c9JqTtqyJhbXQOAwP@Rvl5gGa zinA?#cFFsdq`O%MmfuR`kyOo_Ic)9OjES6lyT974I~S4}o5>w|{{VKfH2A(&cZ_eY zk4RNwM}6Ga79pU#PVUjAFt5#xwXdg%*_oL9m4_6s<*mDNE1=TZP#8%2wdYB7kx*wr z2HBY5@wTiaDVHLsjfy{ZD#SS)vvsMFXjX-swkxji42>4Q0?383cKp46-oKiRKR zJ06sFAdy>W$7)67WKzE*D5&$eW2R|M3}dMSXz5XTTg5!10kwI@-lh_dYv|w%02LP)701^HgnJ3Vw zv^=n5<%Giz{RXZ=rCa6u)lD8_Aw|QmKkzJ7-zUqFr9;Z~TEeU7hs=#cc|Kn`{#E|~ z$G)|CGvx+mJ!={XTm~ZywSGKJaD_hSdd6y9Ox~u|fFT51{$;MN)aPlD^T$fSjuv8q zAC(CCoBi6=gYS&>PL<0qh(~W>0?GTy7^;S?_-A(c6@T5^SQZioK)pA8@As>uvQ<@S zQ|8-T6;Y%W&1ho}7+F_l+LT2Jjl93%s5eP4{ofznse_nCz`WNjm`lj0rM_-4xBmbh zuG8W9iXCFtdgY9R4cC_Yzd>AlvX(q9?cezAc3uE-`pvXZ^S#2m4$&40T8ll+DDHjh zYOJ=ZAE*@*Zpi)>O0{gLw(+7i=)l@48C0XHFWs+3l0BHc3e1j31a+$HHa{OQH8O9E zf&4V~c?#~&-K| z@5=m?$MY4D8}8L2(CD9NIbW4493PN zXjoxi4&F^PrV$)}A`kg!NygvDG_GYWkIcCleBw~<2)zFQyxr=&0SIDv1EpTShB&3j z`^+ihI|3MN9<^#CG)uh~{pw6mL*h-_R$rDC zA2C|Ak~A$Jkej}4RjQ;jn~7u!-!vn3-{n^=t}^0JyPx7}#-rB6UsGZ@WR_f&+C3{` z(F|K!ZUG6Z^lJP7mo-jJkh~!pnqvdL2GlfEGe>JnQPZbiT;!b|; z9;TP>HMcMY`qjNY+wB^ay`l`cYNZ}gum)?Y@TI!Ttt{-nI{d>mtR0x!J<1qGy{g1F zHx)tmw0l;y_pZ#LaIe{{S!Uu%dbu2AqzYK(K3^&da%0yPGwJBw#*KT=#|~WVcvT?qh9kI)(ec zcAQp$5<9DpEk@enby=Qc{_S;FO%jZgTuuA#EK#_naE_X@ht{IqnH#XLAhev{c$OP& z*@>hP0KdWuSE+b{^KGn$A1DRC@0#Vl4`}bH_^<8rjqV@J0Y?XK^2J0=dC#--J7}yl zyL(W0Kr(;brMi+Sn*`%+S^;6(8xGaW>Tj^0EAF=y(JOQ_wx&h>;1g|M;i;@HBX&?e zVfU+=b_$YwIsO;Z;uy+PTfxZLjj0&PI@W50h|0Kku5) zX2U4PD?l$FJ8r6yC=Y|$h#Ev=2I_x`qzLMz2wrhaXB^WZerQ!{vKFDfK_`DhEBfOaR6#=MeU8&%Nc`yQchB4fLZ zbLn5L7y2?zgKFly%U}3yr|P)hXp%eprQ5T1-R)mLiOY5OPqV>sAG^y?{NGEM_ikpx zFKyMKZ#qerKOy_I@7^x>8FZHtwYeL3gSCATid{fg%l7%J$(Hh%GX?(B~ zC~5QN|e@ z;O8BvlemiVByOHr7|lr(YKow9?Nh1;JAmm0Qp5@V{2MoXZ$2pG;%ekLzBuqkJ1{s7v0Bj6PfpAJ^Kpr9x7X z$yYU_O={1cEo|p#zz>7ow=6t4cXg2(mj}PAdRNpsSHak=)eXir9=Q3A?@ILz8^C&I znm9}_>Ds$tfoF|hi6FFsJ~y@aQ>aQ~GREJv`lVHFhCY?yeLB`Xksu52&1k)%+K(*;7PL{5 zYX#w|yurTm_ODizB^9DPIo6wcvpzRhY;vSh5&`F$pXQC5BQ(Ziw5k3Y(~*(wNf&0$ zM@prf5=rY!N!8S=bQK%Q8~~hcrOL{The;?@EV-1d6hO++>VYP(zNr1x#CNuH#dnn?n{d2JgE_ZS%q43Y|Vy-Plx4+n0CU{_R_V zRN_!J{#na*sUKvZI}B~BY|(_^b5*1)jn6x)IFyx%;EFXnfX!V)mgHeYQHOpq8muPq zyDgPkJqU%%u1f{S-K@LozC>s-wx@fjl`?wQD|vF}>=pS(dUIu#g9eiX;MEOJQkfB> zQ^(z^x}DdMJmL3$^cups-*>Ue?ZVb?KtwVs%Pv0m`!&;P+F~R|Nz)sCW%^W_CW)^&Bz(v>?DCb*JW z9po7&_^BdQSyX-HscxfTh{9x=jx(|`7CwGIO3#$u5Hqz1OtZOm-5T`&0BC#HllZ^K z8dj61NcwSGhkT$|&+&cV(zZNt;}!7rsY{jLB%gC{s`byHua5OwsBU#8p56BaJC(n@ zO?Tm`b861|RPU)Z_MvlqaIJR#05kl%oBf~XNe!*JoX-&4qva)PXO!G|X7M)2pD6zT zfm7m%<7E-KjD6ld?RF}MWKni897=qVyaB=vIr`M_G?QW3Ht~;ofs`{UIN9{{sjX}R zuz}<|Q|q)6}EhZ{`tL1}k5gYH5$*l`^h=(C}uX>tTM5s@h(x}TiTA1QbzuXSv z*17CdV{#dS6pTldjGP|q4Q)$cwxK4r`<|HVQdx_8l|u;Lr_^^IwWMO2Ni#RfoxZg) z(^hmsiIW>VHxXfT9K?w|LF{Vy%(!513CF$#Yg$@C>~l!!lslf^bGM7+cy%yRZ4sIEs@ z%R_j?OJug(f>=WyHu0Xl#dNSm2~|zITygDGEp*cpWjV)EYp06Mih&*p9<|3(rnWbV zD~m-)mB9Iw)X|oVF_0dgg-*-0lyqhNDtmHeM~waM#Me8Pr8t!!iI}q%&8NLA7Uj9*eAQw(WKw+N@(=cU zRK8-z(XtPE%i2B5vN5jVj@7qHyN^;$QUnqiK`MPZgZ z@IAU#(M-;3u~rzD3Wq9vspRZ(%g#78C?|g4xl-KIi45Lq4tIZ?)!S1RP@5m>;pm-7 z_4cY|+s#pO#N(%>Y3&kj`8>SxKIu1!^ul;Paxe68FMn~wEXI32RXKYJrRtE6;e%u_Zo^NP}(yByP|iV13DW=8pr>ZKyQG8i@qHuU!Pt!bw*EBw2eyH`H95=32O zTpv-%AMIClHgd`xi@IK^bp`Bk79tgYm@Z9y4WvrsBS=Jw!zb~tnk{aUNdb;M@qiBR z;y;CZFNJle=d@%a5=F)V>s|EHJREd;9s~PEqH6lBtO8H7{f0Mr20rQUlH7v z4YpCRa&iwC2l?03{{SDaKHsiKc++`L3YeNQcyJpakIx3aVcgQru}(6sk13Vpn)*Q)?^u{&zVFh!BjFU6?<=}6!bUo6;O^~TK_hw7 zGTg_2!|(gonTeCS;gq;pUgD(pG|O7|R5D8y*Y zaz#C4lL}aI??iJx-MzhPSwx8+&PP3}qiYowa{9A*ah4eK3E+Q?aOfvVI^l<3dg?V2 z%Wy-S`Gq(?y*oNut!bDTd&wom-B$o((bT}Pq?0#dYVHg{Es6@VQ zE+CKvBZ5IcrxZn#8=wExn%5pep*TO4T4K$GUe#U|_23SbWjC^dde`C99g;`iPnP0{ z)d$XVnw9~%$@Hqq8do95HDU)T#x~bPB(5j$j*POi1KO;_K~@h{_c4!}U`VAgm;wu%CFWo_}AGnZ-8D>qa zr;7I98HZh@F%8JT^!itc-j>TL2NkqCvz~G*q@HXkZ`3c$O$4Hb82hx?oW_f>aZ1vd z&&t9CP#*x`f=k5@A>0dZ& zZxMI93}YGj6!rEWjdtMUc5v5y48)iOWRDC#l}m1syi0N%{G1GoepOo1%|rdE&nNgl zxmICUH$P@_S|uC6{t=IQ^ct~*8G8uPM<7C_`5=rM*MensR4Nl-!6LEC8<{r-As49h ztq6)4)(o5h_v-aK+nvW8n%s&Q zl*W%9PhxuQu1T$RG?vA`~t8d6*=X)!)z7Yn%@mMKR6 z0GB4Vtf!LUpUjhL$I`f_mvZ9KvL}rhBa3l%Z{n?3+(|JAo3{0=h=`sQk}kfYwqc*k zkQF0%?d@3e6qc4GSmH7K=O#bWlG)>qLFNo(_4?D}iUBl|07sks@47MmHBv?MBWRdq z`(xUoeTs@TlVnpn+LO5Ben}%9!oH69Pj-<_EE_Q7gP+5ZUoH!lvt>scyI}g)(*FPo zT)`^D?^yb*QNu9hg6e`f4cy6%{t;EzioLtE_A0D|Ff_XOQG=`=XSOYDDWN zmbhi7JG!WKs_2`#)bYOzlJ%^vB#EPa(JvfTo#)Hgz3Qs(azd}mO6?(F6m+U`21v|P z2&V+o2x0Pl>Ua*y8l_*Au-sGTDk!gZ&i3qy#})IJj}c5)1ReMvack(Qgt0`@FU%Vi z^T&+fw^<}<_p33^%xE6)~A>??idZ{e?+e0x0inuX2OiW1rxJhchN;Jpi1(YJA{E2PiV zecJGE9LF3=Rro`n)A(z<1vcH8!HJ3GfuWJrBqcI9$0PBlFnA*oz@RF(My5fqNF6?6 zDbFk_`$61T@%67pJL+*F^_xSyOS9%ZfBjU&aSW0$`^CA>Z%kErZT5ev%o3BkHK`#l zB0Q)Ho~$Zlkj*_V>fS)jE<+;ca{RwFYTL#e{UH3=Uai*^gKIUQnY_62hy3wf4Ya6N zZZ?5gPS(^7i*F@k*%pt{3f!Q(?@gczX%nA0+B8k z(z}vafWzjmJn%%RKAxzJoG4oE0g)NjF5PP56=T3Nq{Ip@DQLtka2-rpppL&53Zrqq3E@`Q}ZE5~&P>mTGKf_OH z0*nJs;$+4)B#FOyf;QHEz0I2@?W%L1!nC1|N9uD~dZGhqBDX_Y!k&eukBNRLEOFfl zOZ?KYU>E(Kro75IRwYQo^405q5nIi@k~u&dc>{0V+g?8%y3ad13?g)Dh_rK6LflFn z9!AN=KPvgx$B=!tV;EM674o0(AA0&Q+e*SCtXUs420i{&-Ti1CGUCho)g(9k2l!k2)wO0yuK71J z2J8G)M5D$QG4pQakG*I><>oL*8a0d$pVxI~%v_Or1ZI)Vxn^JQRp`v6_VudJpC&Yl zIF85uFS}d7f~mQ7x67L5n^zP`t)`YPW8uf}z43Yq(e7XKA-Lx_+hBR&kbDDZQw&7((l&gHd-c$a~ zY+Izt#HZb^Hxi=XG1f%rpyTh;<7WuYesA}yE)D7zExoIA%2OCFaBG&Uxucpoe}~0J ztMjjxT=D+^0r#)BGzW8K6leHH@~?+{6DBo?N^^%F#b0meo?6aD9qw@I~KPuF&K#f-$swmFDJ?pObIw5-vD7&~^(xSFPn8J#CqZa@-N?AP5;p<8W zu5vcV&A0fdZdG>u<*5}moStd|jl1NhYZY?RvZ5~UmYcZl#_lR7%WZQ&J6TJ7)ucDD zlukFt(C1GvV}=~p=TC_lA=W2_M&src=jQzD^jpU2WU-VD+^_Pl&hHu98Fg}4D3G1b zSN{M({{VKgnoe4oO&PJv<;2o5;fL`50C|43;9feGDZ^dP3W5Isj}u<@$e(06J-%xB z{{Z3u6ES#O3OjA|uDl~$$CZfG^4l-oIfh5_l{rtPT-bGqSGcwN> zQIFsB{{Vqi2%E`wjcW8ain#$jD<->yBxylvuwN|Da*h80eOF;@H?C8K70YSke9I(5 z?*9Nf>TTe1M2ddxan+EV&X&&d-Wd`<<8S-syIU)XRB*euas_budPZ(?>62Z(ge5=; z@`bJml#Z&#CPW3e4g4pyY3?FHgOxwSRAPbCo#%0P9ns7tD3xH$CUdbPKklknK)+p`~`|{54p# zl5j`LE7Oxb7Bgv$Skz-AW}dRP&zU~$KsSSyH9UdH#=?xfT9X@@42!|36qCz;4Lb}* zds2_OB|8<_gnu$|Pd_qlKQT1}BPwQ{8aNp%n%LNjQQswzi2d65SK|XczN%!NA`uiI zKf|AT`=;;18`o$;dMAA9F&nIo3A$BM|Tu=%8A7xJ&3{B-4S1cf)b z>x%jgL2)uXF&~wCH}O}4_}9#i=*EnrAAfJ~*G3W=o-I~+z>~{j9CE+i=}1A58*lk) zh_UlPUbxx~PO4#y0-rJe06DJOYjZAx)JG&r^9+^$0D)GtF``6WlYZ})n$Lv!Tr#Qt z_V2w{Bc1M(_luA2)8uUm1*>E%H+|T^+gi4=yovjO2jFfcG0A+QZxIvuA0sf97-K` zY#jdpwf^;UR*FNZ#u~aycnh#?i+;T^*=K0qBiFu zy3qKi#Kzt`cP1`=>eqWW>_jc3eK(neB!uD#NA>R`w_Fv-MzwFdGBs954+fMH0JDxF8$YjCt{_52n>|wj- zSNV32;j7lknMOEHD>VT?(6s*mSD)^Ry>7_LOsltV-KsG#4%-{|b)yOcv>&_u+Qv&z zaA??qLmYXB=W5^6*`rY}+-WPE(}7LFNB%oo&`#xkWUe}i3i?>=EMS`AWs-OKKf7IR zs=`@Ve6`AHLQg5C#&-ShMXsvBWkKgR-t?{+$rS@}6J&V)F7;yCA_rQej7uv8KT5q5 zVU>39d)F&>G=4<#+#!o%jJNRDPvEr)sl_(TqBvq3*R^v3Bp)Z=s5Y$IS^r@d-s$ravAw_TqwHG0lxF%Ua+thl#s*hbVHed^`An9uIc7PFGRf@Z3+ z#TiJ3#y|QEEH1uUvE)>7v{G$W`CoV5?OFm5HpUrMYnh0a#X~QW2G&0}&HdWHZ*2{s zbDWm>szB(mh)*Z@cK-ksOKw=Y#v=KvIn21TM%GEUDuw(jR@N*d9`#1j8Dh#0m7S|j zB$PU*O5~i!1az8cWmPhKwb)x1;4|H+Uxej#%7LJ*@gcAYxt{; z8zoj!ahmMB0B489cCp(0%7>?@@4N7*H^cl#-j+rF$ryFP0*QA?A}dv!c4KQ8b;dJ{7#og&iwZxWz^*E>(8squq%zN6Stb`F>hr zh7u{E>>UY}fJ2XzijGMGFUV;g6#$aodY>NEkLDTMOU!;{O`j%fF6e{q2h&>PRn)=0+f`;40e53K|IOnjr`$X?*j}cAdxBEa;PjqKJkIc!4FCypn zp#0wd08?3!TcZXpxjVjEot_D9UMSB_{mnghdCLl~$a(pz->0N(c$Fon)WDC0>Fd_3 zNC91rIH@EunF|oZKX-LR?J`IVfn7H9?eA3EWHHc9=jJ%cP`n)W{{UvLt+dmq^4|n} z!D*sAMVRrp^rf_ubbF8A2WkHR;;55d3xL=xjijw6e*Xa9t(yyXmAGG!R5tM|03~c6 z_Nx83k9Q8oZ}6{A_!Vb-_ew{WMUSEI^O zS`_C-?O5)SH<|tV)Gn)Rj%{WnVH4rAI&BtYvfOmIvhfrnavFlmUBI zOCeO)I?&ijYFC{R%7a(rV>xp%#{n0t}y(Yolw$ zj4~G8SWpK<$MT*Uz3Dw-=hAjaSS;)K}En zJPW7k@!KwT{{W3u6|SSiJv205Jq=Tol?R`@PI(HkC#7ayPY@eWeAT;=gi)6+bB60# zlD5{|MsZgdXQ-+fO|8DNEQ8EGXSFvXM^(--LZNrS6nR)VA1fNnaYcxT$SwReIwGO@ zM_Pt4&g!yV)pCoR&^Zj+SR8RtDlj8GDri}Va_5fKWF{BbRYpSCY)5L0bfpc!EzLSS z5C%F^a6lNP5M+p>zi!nQ(pg%Se8O_$ihkG5!QPxiY1=y=mFni*qYcTdhzMQEOZ~nA*y&%!%zUO{tI|(P_YolZY|0=kwk0rGoP1}>Fr)ut9%d0 zTUeE3QOdfGpXb)T);8!qV0V5MU+jsJ6kwX;o?RY?qle9EL#g@iseBdJ^yk|Hq|l!H zf<3n4xZD2#hdS+na~usiFQ7kry5he|n?<%|Ab`zSm%bf}V!m8zj6dKt$t(ft)8Z-p zqw^i@F0GTuo(D{H`F8V1*k_S&qiDxQuhF0QKy7DWWElJb`Ky-HeiGQ~B#DqGl5zqr z-j&Nd6FodX5ihoWe|gOln|V>Pzuv1$Fmb$e74`k^!Cf+U-#ly&M+5I?`@r`90Cu^% z{{Vuf9Ilu1ZTYbMzZ&6|23wxIGpa3E`Iy}%HZOmAYDuzO#&=@9?Y<9P%e;AKU>`Qo z-1^i}{2A3(Y@twwP`tJ)o>)o$04dQ7&WCfxzSLqNv(lJJ*ue>Z;^w_ZUxYe|cVsLb zdw;V;KMJ*&$|@%(*QeuC^-1aWC21lHC2;S+^+v07#KhM|$+heiL|| z*{6m*`!UY(kELl_{42h@Zze_EEB^ooOl|%uKCdpq{?eiR$Br3MTPoYdL+2m|2j*(} z0X`00MyYQ)DlzG^n&?yDMAAgD##SBuOMJwCwN>>xorV3eL3KV@hUzXYa9z)F{>^E$ zw{lysNPblBUsc%r7Pd>5m&)3qLj0re;=0`{;U1e5yF?>l>K~pzyIaFAnaNX#sI8BQ z29>K#7-WsP?4q}{zXa;{DZV%e2e0?B{cG)y_*d46AdFiKBW^+I{_S=)UJTRi zdw+CdyD4ST>Uni|nRGrE)4mjHm#ni#8NpogHj4C3BjEIn2H7^2Z=1} z7Ccp4pe#oKS3;zbf}4AjmFxi9S<^mScTrZ3_~Xv()=aV~UMoZs)MJ@kZ)W87t4IqE zmxUFWC)>M!N{MeWgl^hatyq_ShN{Z3Hpb-DSCgDpb6lOc2a#38@{#60AXbry4K`@a zJF2TUAXPS-D#VJb_K!E@-O`9dJ7ABMYNK$o6b+H(zFMI?p%@534r@W7m(1s&sr;e4 zkO`xenpxO-K=LA;_^mjgfJf6O9cqgO<&<=*ic{nWIj0B&OVLP?AkWGwiMUm5!|EXpsM9FsSuHe$~#jWZ5#?6 zl&QyhgcXc!tK`t9G)hn0+w#+05Xb57QKFCd4N19)*he45PR92g8?2jEPH0I=f-#X& zM*&0ov5H%JNedG%O!4nUMX56_Y2n$!FCcZT$09V__p?>4cET8eRwG8(%+(G=!F!^n zQF*2hH{~0+^rtkWDw!6gOs>WYP(DT|kfZJIR$_Hek;d>l)G8IusbwNnwE1I{xgiUz8e!WLTeh`?QHs z@x@OlqE)_yB>`kRk$z!XIz^OkH=T03k%tRe_FL}n1O#MO-leERp+*Fsc!Ed#29qBv zxgU&tM{A;4{_g;&_1j+%d_wVy>URvDXYWICgZFEv_@U#bds&P?%y%5^IAqVDZ+iL4 zIfcPDG7OVhRhFiz8i@)t_d|Kh=XX5S=ZP9cZ0%wF+NqR@ywBqOX^n71zb`eEuX9q# zm^&5=xkufs+o|>`0A&a|lNhFOOFr9P!Ij=zYuXk@2zjR}Ow)fgVIaBZc&-=BO0(q#FrvuG&T>6{>H`;)h{y;J_g0>;2VITHKZi=i%KM!WNVgK~ zW*hU)KN{AEiB96XGr>L0XIsL*JNaf=BLso{^VohhziVnFX#D8RMnnwCdZv4E=~?qw z)|554`+F!|a=AnwDMdUVtz4eoRB`1DspH#qNG+s=rC7HECr@hM)9fXR58idhdcswE z9kGpwbo(o0MRW7W2hImf_r+-u97rBt-Nr}*p67r)`KvaT1sD^8akP6@sj(75qaW(d zbLeY^ZJIdhbNGCDJ2!mYJ!?+R$qe3R-MQ=Q#cA5w#~)vq_RVZZXk^2C5?i;;oYdEkPRA0imT=h1#nwh_35+fIKhu6Javqe}w zKnFa7{KZ~dS!P|*fPs1A`Bbr@Gi=6o@=t2!mgAE5N^Gqu+^h0|(whyqC?o>`Ygj_^ zXJ-I$k6JvWjRGE|^r1(nMHo{;>f>IH)AFhnb(84D(GS z6Q`km zAT~Bj*S2cYL?t;a5tE*J)l0N4>*X%&@K2>&WXxq93NuF+nUFZFtCa)yv5e=x^{q>X z^4*7UD-rt$$r(GVx{jwEYIa3;m_k(*2@crewRGF5H0!jM6M)|{jn$q1Y?f{M@8{;_VJ@fUie_L!Kw&2J=oq5%#X_W|;E!eaQ zM@qRPBPz6f4`1=9p^iA?8~$8V**-$O0q5Si7Ut0v0S(F9>*#7i0RG>DQXLl^u>w`Y{_Z*|>K-v0UTMOMr`jJJzl2o88tjKt1aue4y_6@$FM%BDC?O z+^IZs*NS9U7)4_aKtJTvvj`U7a6V&a3J0mCnWP~=T*yDY(EWWV*oP}0|JJyeRypfa zLfeK^VAXiY&%Gk=M!-3*!{V%uyOX(j%Vh20g*6wW6ZdHox$8~mJoKxIyCymlLy-9# zgI1YN{oQEOuP3k$-JdXZG2&OTaXDdo8&aZ4`b+#=+A^{Sgz z5@!?QwN?f~cpt5Jb>W%h#CRc(IrOh>*CLwbK5v(9P6c><-_Lr%1`$p&J!@)fL!PtL zsdBiGMyCaPb~Na%rEW9*v7uOl@d#J7|IX^Gn4OM zHtWY$7o^->EjN&+x;AL=XS{{R}xcLt=^a!6(?j&XzZuKd1w z*yF_PbI^kkZzV`PWcK5|XhkIM1aZbT{{S6PhT>wu0OdaYS@WF+@Z9GgTJ4tSA~X_2 zX_h5Voq5M<)Cmh>LFB#+xy(?=+wPlGXcL0?HuWZ*PNZhk_)R^wXCGyTs z2e-Jbi4CkQ(V@e)bKm~}tyn&6!Q$DsBPv{Vsb1DoE4;(a#x`@-yy}lzGNN?$sBM#E zP4~ZwwRFoR^IheWe4Tl$OE~685EFpB)~rmaB2Et1Jb(J>!YI}#-A^}hBxP!{%2zDF zoKvECBUTLCkdRG30#DwlBipf}YfvPSe$_G(fx_bkzJvHtE!0S5 z=?chW2*=8pHa%l;T=5%3Y%n6jY%N>t%p*IWHid2k9+kwHTn7Iu2so{OJ){JSPM1~)f@+w^84fm-n*jzbJxwf3a zqj3`&O4iUXrHO6j1Yx+(_o`7Jn#^%)jTh;f7-1hxg>a2iIAH4{{Z3) zNgT3CDcnCUylt<2xKEQKy?AfL6=XuYcNRb7(lVRS`P9Xk2?vgOsiK4k!{o-x(wUNE zcw`vQdYPj~iD8Mb-Hi=1hH<$RX(7qH`A74w75JNNAK4A`Pq|BNBcpTaUf(Q5VPGF6 z_{aXuUq5_Ews@^fF*XbGbLsx=cHpGk&J0sY9!CYDr0p3y6YpdDtNq&BduYKy1Zv;J z2==UN1Y!d>-XAaj0A*bYO%jwy_>!{VI4C=c_H##?l}2tZqC!}(XRISzU^Vz31d$-L$iVNR_66k7`AtO z%4?2Bu{0ZcVHD>TqhR~nV}BiHMyv=Za;B{-JSx6gDr_VD?A8-(=%=~%AHwwV^!Q;9 zmS6n^tJS0hX4&^w`_<(i44&dxB6d!2Gq$~Ha+3LN^9t53O&-$Nu2o}=goc|Fq+w~Z zv5yM<1wv+RyK}`$iYt`64DP_LK2uWtt7;g}@c#f6Q-t!P8*1iv76*{DL*f$^2kzFM zRK(d-;-iSNj1}Q((-+{aRWe6H&9`##yVj`cA*8n`&9{o5b4e!E`D(T6vRk&_nUs9H zsnlaf#eWr`k}XbENjP)C^Z{|S{{Xv3ozr|kR@f9tfbTj?_ezoA}mawA4 zISJCUgYI+H+?Q1IRyk!WR394+P--4^D!%P za^$l0Znf)RA4AB*o>j6&jEPt8{n6M8b-WCx3-Y({@!Qg;idgPQcaMR-OgAOJ2ZP?RNMa5Sc_4P0Fap2w?f(F3sG~`8j-a+xyVUm3i02Q#1a$|$ z`&5h2>J|5Seo~#Q^HrGLot0nY{_p<)Wmx`g!;u(#7N@kxjH+{=yYkYIIUR8_$N^^B z7qwkflL%j&S2=BSA&+4MWBc9fcHTyhXa_6kYnrDwP*ykLxyrJ?O4rkT*DD@b>z%Z_ zS!KX%FY$k~T^*E=z{NqvI#-=J7i%4jj`&BKry2Qce$HG-WIWe5Xwgc7No4C=`f`D| zbxquV_3N5)9A2jVyn9)gx6Rg|oo2pd4#8G4k+=PtkwO;SIBHl`P-7dI)(@D{3!&9` z4Y903gAcsz!C&tG04n?E!=(QJWk9Rb95f8DRr4;Q#Pd4DfIrG9jH*4`^EW_`{`mRDfD zi@Kq`PI`}19u~EGV(8_TpikgILN^jh|-f}$nZH$~pOTgRx3-!a?U z`@irS>cYE7^Q$j(@uc}*XyvI;+zA(V3Ey=ju+F#Y5tnN9Cy&ak6B;`1%)5T|dNn4| z#bQM`lLhw=UrM{>?qq+uR&0no%vCjkwzuV0CedvkkMWiBZ4a z6_=)4pCT=-fPVF9G;XR@8}59y$x%Cw2lubVl5+K3eQ-nci?F8@BKb za8@EI>~&VRlMx(Fm}B>k_iD@&thr*PaB)d(0C=!IX8v^I_$mn6MRLn?M23*A!>@yAnj;kW?!DYvydT?PJk?^?fVwn)F955bg{NHR#K8(a=@pF#iB4rbZWZc%>>_;~PTMYz${;<23Kkp$d@O zd(nWQmAMrD9e>)W*ClOSAk30y752^6;~VX4abFsIXtpw6Lh+nqEXBG10D#oJjB8(%`Or9z_j&pE zb6zRq=(jsc4(~JXxAAda>uu$`O1pO}H_iV50k0DA%t)7P>UeGnx6AUaZ-QR_r-Hf|)`^Btb z<|fIPa*DnZTZUN4z(0Hc0IgY6Q6ba*Q$$Q)`J?--TKZgOZPHvf%06wintnnFqo|_xytYui0kyZZnZrj6X9a&E`l|!kW)uODi z2vN5w6|<(CGRAl#xA507rGm_&Exo>4>+NA=aDGxquP(dPs_Hi!v@tK z-tSRbDu|WGC+^k2geWJ0Tv8mjD$i`MAU|*~>t3nw$(lV`Hva&sf0X|Kz17~9gCNmL{ZQ`nvV059=U08cCTYM~%@D`U&~$fa^sl|?M?v6VK{QBFOoqCp>+ zLCY`8NgL$1%Z$=O4oPZwAUOnNQ@8S($Z``J%KfY4&yDMEcjdafA1XphH$vx)!~LrI zxtYW+uC?;l#*2L0qCxUM&i?>69XhoREi)>wL*lO#LXtr#ZZUimEd2zjpSK50PPsBV+np!!>RF->5wu>EUefI@}cjFu*5qJ+qbJ` zpoBR2!k#~e)~1F=d!;0Dzc2f%T?EH*>cEyV{LI}d>@ON7=l=Ko^HuzmX_=el$4ZhV zMtzd^piH$m+{@%`4NW{M9jp!c-5LM|x_(J;QG$Rx$qoeO7+yC5R?Vgi?#; z?fc*FR=uGIc61A@W?Y`^lZ38l<9%Ev=yj8}hL^{XN~ubF`PR;RYby|6>b?0e8AFr#zw z{*}o0G<%S@?$@5x*mw;W`(6u~CfOnpuxD#At|{4_cpYo4_=4GQHS(#Rl(n1FswKH8i1P3ZbhCe-UwH5wTLide?jK`YB=Y z6`aa&3D{5jCy)GkywwH7+{^pFYV?nX#&NFN#DjX|IsX83RLV9tqoY3Uv)(M!xz2mh zbFjtF1XR#&TPRTS2d z@^0m7(NA)^midK9@$K7&-Aw4m(wyHn%_sZ@nM4G!mtg5r2(Wl>mZLG_<`k;IM%-_x za<+tzl6}Y!bQSW4?HLz~6l9aV{xRgcYiV2%kgzj*cS{{R83`DbKxXX9@)>E~5p3j_1=8|hWc zw6Z38Zm)J1x4d}uBdKMjGq}$sYM3o4W$o6cAUk149jUAG1A(|FKU&r=Q!YWPCze@1 zy;k87#@Ii8p%VS0l^l2f0D7LW7u_O_pYKwY*eweS1GA`el~(H2s|qw5n0?*VMWoyS zQMdm9imUeVy28F`=i0E8d5F2M8a=x2UV^q$A1i^l<8eRTtay;fp!$99_p4Ge(yKz* z-^U-rT+-AF@lFc}f%#A8UACU8A`Tk3n>$uXVh+4+{{Vq4b&ENLSpdjAE0(7(KsqQ1 zm6IoHEp>6>t@!KrYn0MF%Z6wBp?~q(>C=2_q;l2CC#cahBn}vLrm`WNGdpY}ZYe~B zF88I4H+;pj{nJ^_K+_XxK+6*D2mb&;uBX8~YjKmzY}o73yH_W_%ZREgeeasPKLftq zUf1PT%%dag??fbRLN4dqIzTq|il4)dD&%a)tVi9bbf*T%6K+5oR;;vPUu=hN>gbG* zVjB>ugp()knvK<)w;r_VTt;~LmY9T~Qhx8HS~Y@w1c@1m+uprH!f5c@GP``nyuD<@ zENFI`^nDS_TVR^%ptT&1_8YMeL-N#D6SSi{aaa*do4Gr&M7PPiDlnqE2rbDmQ_ss; zvrf(Oe+?wJF%YC0tn&kaIG}IHY{O)DUIk>xOC8aT-nD+}MF1%{th9A3L+~g_)(ok2 za;X~*^&E1>uo+m7m$vR}p44VoCu|+nkuCd`ZGoApIjmYn>)pCW*lNqVyP1cU$BM_6 z^5LNXFC+M?Ij&@R0B$it9X1k3JoY)_qGeLd8APH!XpWq3SE_o5^P?8M9c`lz3<872IH?%TNU;J@ ziREeRj7PN~MRky&*rSSDXBch6tvDg)G}Mf!=B_9#Sk6~HF;&@^5Jg5_%H>@k$6~18rN6 z4b!z|laG)tD%>p1(wrnYB6K_W`?#kT>^oE`CzrwG)WoUws^~);A7~jIRAtv7ZKZH9 z2kA^3LBOo;G?wBJ*$fX_lVMb?Z?*ow;11;?ZU4$ANFJcKnv2f znRYhrl;Gi%XRTxG5vRA8Lz_(=)DyV|N4+1|kW7yZiWE1cbR`acl!~Yh=b{u9{p4E2 z%ejRQhwWiTOoAGrmqxaURRm+pt^N7-sN_43&CM@jij8UCbDUig&pD1Tg@3zK4K4tD z)`$~~9y*HJQr|K$s1aGiDfx3!>Bq5t+Fi`cdkbj(Q5u9JZa;>YnpLl!$`B^*`1z}B zENK#`90~}*Tnq|`VdDA+wPh93tn)y`6`ES=xB7?oxD_kXaguI`!qGo#9@|Wwx)@AB%i%Yl>5h%P?P1b%~vLb zGzVl$w0=}X!wf|QzG9=jS2B4$sm4V?+?C%0X8myu#ymNEJsm7BQ6xhLsOS0I$#lkZh# zl1qGKZc|T`ZdL~~NZW@>rdtQ*KT5N5lE?wKI3||cPgtP+>C3lMM=2b_BP58TF_Tf- znH`uoz^NgJWTR(lwZU!%FYQ@Zc-SGagzT4 zceO>lsxm34WiJ`>`l#tqlIp;*;-gVqncFFo)Yd$uLmh(v)yY|gNUZEIO~hvvQIMMq zD&Vy=pS|fy*aHTn@`5ts=AvUrjaBoKI#tM21sLs7D<9&i)w9o~RUwj~U~!BN)p`+@ zP~#N9W5SiGqLFtJS2(3oLaidpTamY8RkIKQPI^^!f0qqbnH%nd#bjv$x&T{0!%_xU z9VrxTU8b3ly@xan%vgh`09DI;Oh$fORb*F0;MLe80Q30OK*>9@GDz-szj0jjGlkAmZrYaWEuaF;$*L@l6gT@-&ik9EsbVH+ zCi(g=-JubdSG3mKkJrJMo>>jjY6$_7lj!pkP-k z^KBKm1+$>@lcDO>OT=+bnmd3t@6R=&im|01i2VN7f8;-R1jo!sreKWC^Dy1TR*Kqe zGZWY4{{U%zl|Hbx)9aTe*KkOkm+tLagZI|)q-igbKZ&up{VTclN3@!;HKm`}zEm5T z`jc9az@A&E{6=d%9z<92&hUB)vXI=|Iu`*IeLbl`ITufI_m^=TK*GDRjMd9~XDaV2 z?ca>&idfOe@?qiJV}JFl##lUp80JW@57wnU&d5XEEZJKNAo4#Xbb8!?#``92Gx^hP zE!ulder0a{)wicWCO>4#<*%!xzkQ4j?yWa{O1@0`BwZE(@VACBq15k{{UL9 zt(+F+T0`^W99D&;qoDy#JL9!-%2zt00vjuMqdAaezm-k`MMwhj+$b^6hjNxZJ#)~94JU>^RRYY8)CyNqa^@=$!M)}oEoTx{=BpFCq{7zdA9 zeYX(gr#bwoSzAzJ5e821RQ9F?Tm{B9_p34~RPz-4!?ht<9x)?fRFB6$;X?8hVq?r@ z3IdFRYSe0{uW_`Bdv3;aRQZKji}C7eTezE1BVeh72W|~4(J~H3?&6^iE*o(KZ9kn@ zo60eO=Kzl0wM{>S$;EDGqRTPMIZ(eSAN^{UJ;(xm?d0?5J!&|kksIabH6yabImjcu zRBzD4&yw83^0WRmM&V^+xbs@%iAj!0Ju$^)$kN9dDf3|Bwx=tSQ4!^Ya%5os6&=JZ z7=_$C?A78#f=%-mgwsq*A$1dV5t# zV`pH4C4ukOw}kwRWX$`B%b%Bnj8-6m>M5IX+z(JW#c#^YaCTs!DnY7DWP(EHzsp+E zs&dpZUftbyCsl4isHKKC*)*Sh2H(B?D)|yU#_MCi&hK+j-9m}`#y>c&mm|-eC36Q+ zv3+J2vzO*YL$J48n)#ydOS;o_^|5p0%WlJYUzlgDeL?0=Z7azJN)u({{VZfci{0-jo|h^cQwI5`|ESp{1+TI)==aXBn-E%E7esR5FmxV zMISKtuORS*S903Mj!p-EUu;*Y+nEsnQ&&}c$Bd0TWnmxB)K%0~X)sU9DutwNChshq z4!f%02&}43(tDnjDj^rjPYGyQu(?j>(vgbX{_hyu_i7|eH(kP|w3a>JbLA9X%+N%S zFXc(Xir3O5A87%H1J~+FXAmwN-|L>SQeP3<@o1h@&d9D?C5E zW~$1_kG!6~m0-%jSIQjHY)#wPWYKg8h>%?#F|cEiO?ccg>`aIKJ?TRL#c{&-G~mP) z0OEpViJ+2B<6@4KUZcISe!kTh*$kPL`u6mx?-^%|#hd~8RYi_F92M(%viWG3X!~@m z>18XFD~$E4*9gke7W?G&>-yD3P4J&Q@@iC-%-yb1SXD%1$aY82e>#UAVqlW^J^IwE zZWTwGbB@&#NN`pr^2z02xaO@gci8{exSTFX+emO^;9yfXmd||pbg5(egK@9L+CKjP zlH`$+s=yrLrG%+oMOTQqcF5waGh`oXQId%(mLt*CPS&d-_O|0xkwZRLq3>3G1~czN zmC8!!vNGraH1z-sgTmASLbk$krka@tV)mhIWVbW5QWD-l7{ihIiuvnagxX3&I0L>bz&vL*HJ>agI2aOo{Xdm^ z(n~8@Ge!!`d3~J+1%i)j#?t~DaS0mIqyughU7xeDBH8A zzr9Z#yn%PXcdK+Fq#?vCr!G){YtT|m=UWzSAZg-_(Y881K^zi254CNByaaQA4tT7n zM0WP&v&hF4bR42ePS*6PVPkIENSyxY zq_fEzrJDnTkEL?XIsv+|7*%&J7&UZ|O0vQnf-%%q6^hDsM?QD${{VZDTF@#fSe*Rl zrEt`Wy~^e<+p{q$3Bawpcw&k+Blz2#)>XXHL%CKh?tepCcCyIG%ENrW+&m2Xn$A!! zo1uCpLO^0cW~&V4en~h2sgWhjVMy|49d;eq`W`A37jw1BPIgB7RAZ`rKD6MAS4P0y z<*$~0Wck7VRqekFb?fOQjweKvIorEG@Em@1;kIC`aYPP$pfif~ABC;E)`rN=| z@|SKq(&jOoPnf5J=PDcTAG~V9L3APKpL%ubBhF;T82#$79nup3Zr>@YQqba&LK1wy zg|OrAX1qJ%D?(Y_)6aeTeaHU*s=dl6!QN!~pN-YyUNrKP&W04u{s}&VwRT|TB{Xni zHatmTc=uby_nVb1_kS9&w(!R54a4p#o0t9rQGg_WBtIX+_*Amm?tSvE{PH=@+V_qX zxa&fbznB43TGY0UZJ4xEAK!fVC-}XW(x9{ZJVA*&Tn)a}d1JPgLT&~^^zY4aFf^^@ z0xj;DBmV$GtBZLovM)TgmdmdybIs|QkWISW@Klgqe-$~Wc4Ki>M&NK+c0{{UTC z(^e~);dd2&Mk0C-cS zb(VaAPBIZG!)zqgO+WyQx!ORdgB)xE9nDm(ok(?lk5kNna--#6iVzv35{wPFAMXnB z1Q7xkZg%|N@FlN(__G??$L4+EpPSmgdh#AcX$Q)q6`GOFTXOZ|J4gGY_s2^4zv5uJ zb&e|}*!#bF{Qm$CwS5h1YST;};Xl=`)&Br#Tkltnc>Fh*XG8KZ`@V}_mI7;>^D1^c zM%5*TEFN7>cXkWu^r*$ev$vT2k3;F+r@tY9m03hwZK&-c$~$A`A9p`?y+evd)Djd$ z>>K|8L926HsAZNToPT%tt0!~(r#bZtS}^&5Y%EuAK|568ZQGamR$Kv+CBrFl+kf33 z-mSZ3l(0^nI(^#boRxDlfJM4T`D<$4A#?Id42r|(YG_N|J7{cmGe}hYrm7Y@uzFG! z`T1Hf81Y?}I^nj1!i7fYKL3&Me4p1v@I zTX>4@8PS;w?ngcMdVMSOC&eoN0NFB2w3bo8ug||7i4LW5@<)bO8 zbFe61zTYnD@h^y0?wm-C=AV^+`t|KLCFO;D-}R!rgW@X$jpdY<+1EY4-L9-OS25+) z*zjWn@!ha3y%X;P{VLO3IXe^;S|MAjmogk|UY&?qRZ^SwpSxXfe9}0FtTMLOE5<8Y z-Gn=F_m-&GwCumV?z=~&SXcqvjJVp}YgqGjDH?Yy<->#bzGLZ21F{@1Dn4(TtH5M2 z82)m5H8B3QmGSbm zDkw<8P0O06X6#iIeA}x2%tw;nO68GdX(KAiQ|@m0tLWc_3ac+Gh9l)Wzwz4n=rU{w zYv2A9sw|N-o1MO84e3T3<2S?nN70PCWFIfxr4mWFowXmHOE)`IQlTL8Ub>QJtUfo& zkbj1nfQ1JevrP>nH}K(VP=$Nql!8cbO`kCpRUMUfV~TKj3hqC4pa)>~tkUM(#$tp6 zk6MkDu)x!>U*`9ueZ+fJ#TQSMp)m^q^E!cF9{gFK67HL84f{f`-mkA_gqT>G`0wK@ zBsb#Bh8s4qKBVsXXmKW@_fG|ebxFwCx8|=1_>wMXlwC%H_g^Sc{9C)%xlF!M5{~W7 zc*l@DBXr^2Oaw=c5&oUk3J;Kz+ zDKkK`mgU(?k^b*$-4dj`PCn<}{{VWi;*ad`D@cBI?Ndc8+m$0+r>$oBNPb607Gzar zJGPGXW-a1XkbIxRS-NW@yGI-R>+@o_AR&}vw@tOrCW(QfEhLduf!kZwXk|r>$IV#w zo@fn?yG3bf856Qf+q3s83X(Ra`<=FwrW1lUS50AZ@|?QzD+1K9P>A0(br#z~060B< zTJz`4aW~lMtz{EW@=^skgYH5+%gY2}2-;CU^N;otlx zcWRz(Oe!yQ_;1EAyteKG;S-X(f30|%hmt7*;Yu*Z>i0c)Ls~t(ynbHnuI6n1wc&RW zO&sPS_dR|80J~nL2kvs7Eof>I$mbt7mce$NwKcY43dC-2T6MZc&^%HvI3IeTj1dZs z>s?p-B-pyg2qZtp$I#OlIslpHcR8t2IMy}aAS3?(W~hltq7rUxtMZNC#MMznOLJ1* zDP6gb%o}%Z-BL3nZIkZ%R1o>lKnZ3C?|igE(lku-4Zie@%P^L9S7rHs+O4=@^9YGo zyH7DL zJd^WRB=;&2IvXh^iShS`@Yi3ZhDigk%D3@XCl@lDHrnfSuQ6E%`C8(T;B;~3WZHx7 z)x}2H$fsLIvG6&~NFU2B#z(DjHdIKYjWC4rSHJsJzu>rCHMnji`hd3z7(Qzheq^69`c!^qI%1X8kyVQEP>q4MEiP6usKhv9N#~6G-!(oq!w|x&1y7lG zQ;cjm&L7Z=Le1~1ss37US|us zPa}hbZ_L-Cc=@1$?8gf47X*~R`-;Ebt_5LMi_DDRj_20B+HLZlJmaZe26*LQIS2Hn zg^>nV<{tGj$F@wT-T-Amn!fJT=*Hd17bmW2)3CY`TqCjvAH(?y(h;@6LWNmCs+QyT zLP<9TeC|{HRXiUiJcix5w|}!)$~Q#WmhDlHF<+I#bgS!aB!4vD-u@b|1hJ&ds^2gb zpo|qf*?#{3@YYUTqA%OCZ*Fn_0HIZg?xb|z0&XF;)ks|oOy#!A{{W9xj-L`nn?rC1 z70AHafPU>?JBNSvYj)7B!!FU&rE_t}RK*U{^S4E=rqKPyf4Z3IT#_%5okpK;6lxcz z_iJ|5HnRT!5-nxf2bmG$8zEZNwJ4(r#{U4i7O|Cu72Mdh2(lmH%}VeFZ|>%+t1@hi zF74HA)twKuVB_x<%4ZoRBgh{v-@I$kejGH9;%hkLKRcFRYyp-H^#ZtOQt)x|d)Hy` z=j|!4LFBgHd2hRc-{ztbMwGWc_OfT1)eCSc2T5Xf^36X^1uW5&m+yyRLf? zS`95Bby*u5YN^5w4r*(t%V4^eLtAX;W3P?zJ zjp0qFp{P_0<$s2(m3CY&MW_-s`G>6}gpngV`FZ{t`6u>_5FZXsWsT=>FbW-lGRK1c zqucw~udS6tw(NjyHS$O869moS>x&rnquer#o`2P_b_9QPj+Dr#erR4m9lWTQI}gfR z{hFucvMTQx3H<9q?eROUk>03IN8K!cim*-0(lFkIS9i<@%zwzQZl0*|s!3kOwwL#3 z=K4_>A~M6N>6(t>1&zXk^5Z$|Xo@C^KQ2Cr(|2X6A+hmBV*UAie+zA`1d$m>lsB5J z6vT`tUcKoebcSHD50@V`09qwvZ!MQ?ZCWeG7$^P%S*be8zIjc#`D*$FVf)A1pU$$I zDhSw$RgCQ)b*n}!tbtz`>}v|%9F;2n0C%|m0NJZX!dWf`E{B(~w&j0_e|c+`Mn_9& zBa$=oHFOq46S4WtU|Prf#UuS+{{RzPrR0o>A{_Sr0Cu=0{op#CHfB}Yzb$o^(cu7b z^EGlhMkEO+O^^N7{*~E>a0WQ8c^W{Jz_E?_Ixul@67KK*lg18kK-P~_Z)k`$H}F}-nDdZoV5M*+U>YRo#5Gzc1pF+p`8 zxkVB%k+btwRIuDTv4wtS`Btpm$_o|G%xix|me$5IadyD$`@QO5u4vKCf5I!P#(}0j z`+X}WeK!8pn8_l#{sm zK%D!Q<&9zMT7)JKk^WlhFJ@bKBwgR`*OP0P3aHtBE2b#TE1X}5F8t`sVYe$c>0J-Q z9}SC*P446e%2nigp4I0DSuZsNjf-HoTKfM0!WvKZW}h5w7!Mx=`kHjwlhkteVssHi zZR7HY`9P}79Y#fHyM68}D(TcmvNrjvMsk#-&UmVC%H@wromsbSZi1;yxEWJf+uk;U z=pk=W)~hOIzHXHvjBek~dQ+F~oSczamaasqayAZ>*x^$!AYdM9+!3n`)X~Hk;PXx* zW4=^Dv~;M6J8*hc#*FOa_-el11zJRMra~YrbK0Zwh5=qGe>6vc{i*p~g};Q+3zZhi zp+bzw(xD_i)g3)5d0!(6Dzk&Q1J@J`I&MsJL1P;z1LdXYg!IKCDUh6wluZnJ%8nQx zyH+x)GObj^8*{gzsbb&#|+8cE;^fckT49XAPrxqe?Yf!y9l#K2&8H2O_Kz zftZ&0Yc^RxQmgn#(&H6nLaEvOCV&?Uyl0}*-0fncrA>{y zR0=|h#GLf1riC4f5+FtA?^RU7=X&+6CjHpynx`ayHbT>Vk!2=~`qfzpjN`Rkd@SJTGc-U`9Rwt|H{3#g zRS40eK$joI_p3<7Cy*V_&YeYJjIn6P3e}sHm5mm~)(PgJBZ`?7fWYbg)mB)-zTWFr zoTSbB#o|AjlvT^-7Reep8Yzx{in*T`UQZU8cM;5%`#$IQc&^1RAi82g?b-hT0k1pp z)}tM@gG~eAhF`}$t4e1^ALBkW)V%l9C3!$XTju$8;Qs)2vt)rws+029q4={=(DlzM zSR&bW4#wH?fFgLf1-m$eYKaa>k`p?p-CQK??8#jmED(| zoYyZS#uE+)%0TKXX4B4PV<6|!xT;L)QBfZqqZ!rnmG`YHbUt|}s&yXJ>v-hCk~r;J zilzSmb{CIY!c#Sh)P@Un4Ta#Ewf1yYeEshJ;++g_3k>nvu3M;ZT>bCqT&`{GZy1$e zw3J8tqvfSp@`}b4k0ZTWL}h=Q<&PAS#5l(}?Of{Pj7Tk$ErHHE)QqgIcXOVHys}>sx$)y`ul9KNY$-t`f zWr`ZM=J_&@kXDbB8bGoF4JX2AINfa6aypNN$F`GhO1@5N zw1PDGMO0*C?8;K2D}0;*RGAyfZHGDNdsV4$jH-DbO0Oi0(+hCBLF8h)BD6BGOJLfi zxN6L~0a*D&oOP`-4&cv|&J9(bHCHT1ML(~#TxDWqa)Pq4MQ()P{VFLISmbDfWmmuW z)vd8BZ|Dcf+l}d0-V7COG)n;i2oFLC9pTekI z?TT;%ebLjkIQ&K|%Pb)qZO_g#)3s*2#kg*x)~^)(`H*k{$^QU=)^yG!XL0f#xjge- zDO~gFN3l}%XLIMwzF3G32YSW2Tif6~tYB9|ZePm#Gq;%IsXTs_QYH|GL{FEwHPb>m z-0<t2NlFUnke-u2w&bbQlR zb}n0x@sKz){{S&aG29QIrhTd*c@%OiPBD?zndda`0#Ixn zsa8oP+aBB~@9T=P5;fbiKQR6;N{x*-E3-5a06AmV-nyL)6#oDhPH|k@q>+v8cW&wJ zT?T|zCRNTEdsB?jqdMY+Sy4V={?%2IG#OlSD%->a%6nA{tR&wrbNlFMI0`U9?^{XOha)jb*^%=6-<3E-&O;yJ9co2Y zMcU(s=M@gdL*{P4Jt-|k5kiRblb>3Q0IS<0y+)HNM$GGt{ku{^p_9zVEy0K4l5m>`6>zZtrAB(pHXgy&X2g9aaqd5v19x_s@s0^avqEM)M5lE zQTg<$iXt*U|Im^)^49?7p3*X={NpDS&Ik-T4z)WJBW~P^{AN$yKKhX&90haN9V$cx zh-K({)KMwicJQc* zwk2iqSnhYC7I{#ru33AnOZFon4DxMN{OdYqoW09pDdKIA5%RY=<2CAj z253`IPcQF%!au#1^sg^)j8)`Zp%}px0Vpoh*Db_7k)yu{m( z1M_>8rL-q|;dnhgsrsy#xOK+vc>e%qsUqB~?>{K@tyB*_a=I(rOM4#upK$(l<9;uV z;(}M0yOV$)9Fy*A-SYw79gC|E{R+I-#?ruumg|5I`P*GoAH12vURobB2xhjw#@)!> zNbJ>eSGaimh{4!Dik|z$f3;h&;6&2D z$-Q>A>dCPx_H438$^Q5G=Cy=T6$y5XV~=j#t-7Q(DS7hSq<>|Jf&~i;BGII>A;-(e9Vxb#H&Hj3(d{|fz<&)v95OpB!M;T8>sr=ZW9DV6eht19?McvLmQB2s=ZQ1hFi*MyFL+%wYi?D=+SAGXdg84?mTdLKy zDx)Lsim7$5#LV4TR&$JrzK6_z6%{Y+o;KXV6T9X6x$mF$Yv+4N74oNrTKXsAGD8pm zJ0p|#J)3oS1fFU~9&v_0EmH@s zJ?flsNfgFH`6uRQtDk%Yf0>WW4SLBgho0Icft}+)_X_h@l3S4=c+k41-ag;n6&nt37p!1=$u{>@W_+r=KzySG-7I;>}5 zDT?K(3o}T&m#rka^Tzbxj`h`B&2QzbdkB`f%UC78l{|^|BCqi_-fN?TM5(pDVx8-X zq>*URv`K{GbvqaC5zc=@PyIfX_9E~nt6|d>UvGE;q)jhsIBXxnoUd}4Mn8zAPp~q7t56Q={QUTc zuO6;TleB~M`F$(z-FhP?pCb-=74R>_+h>zml6a*r3?zbwrcdz-B92CUm9ih&y++;)p#CcJFCRr0+26?=$^Gy4YqJmWo=s!G4q}z!ei2U| z#+@8(C(ED4t$yVdOw0SuR|EUi1S{rBxqp>AFRglTIV5N#tfgRc^AEj_)pb&0t+}v^ z{8dSnyuTe|wy^_VnSm*ovjjYz2J=AqpwRsR5I_^U=TBD7eeU7=TPSA{&*4&NvD zYRLKH`MZDYv^GmeLt;FXjGkC^A9}Q*{qvG|WA}gAtV?~V60khh#js@z=y6$8Ot>8! zahR2S_T2dVD&?e$Cg>$UI{n}GYc|IOZS?*s=yc{uCEc(t!PmWT)QgF1>vTqr*4N0~ z8~eMy^>q+jJSbdkVUL!$cp?S-$6c(akD#vGO^Kc%=SHizSDR6H6pot75u#Us{NMTw zYMCTf3g0p){A)K(iKEMO2eoR1+HQ#tCE;0!`9{=1>5ff& z_+R&jXJ1P9--Kaa^VUWje|zPsqi$oShUd}JTQp71cGQVD&eFLCr;~EvNZH#|&I4qM z^eyimq*cc-Q2CFgEKJN;{px9Lqw7(rB#%)|%Uc%LQOKn357L^-2-td6fH~yxQSbY^ ze(0&^Gn{*fqy@<6DY7r_*|$_t??dzb(^AZLukM#{6;^i~4405>ZQR$$-x;F&Mc`7I zfA9YQvMcL}cBD)sTvy3I85b8RCA_TLK_Bd|`&Bk~BB#Q9{RtbvexG%#!2Trcu)QGU zqh)daHSUUy8Ce5l{{VWtOULod?9C1zV;$SRUzWRYo1Qi%Cy}Cl`D9Ur9S2NMBEn>U zf99&DcajDuN)A8ZRQQQ?B~M@b=DiE6oUyUc!EoEuZOW*peWFO&nlrV(_FBkTOfh*; z?#XQDu&sCj1ImBCzoko!$||dk*mL(!AK_XSzG=8sBMQQq_IqQpQZh$+ka@8(y8i(B z>Khy)YC-#%a}fLg0DZkHdeMTTMQ!`Cd)5p>7M%h&-uv8FM-sG*0&$AxoRFmCUWL#@ z^NqjWu8&QQ+XClfZ5{srya6Y=2a<>7BkunI57xP=lM|@1xsFSa zfRLuUYe?0bE4bI1#pXK(hn>Ip^?DASa^(@D$gW91)lHo)oQHEp#wh^1Yn2_gr-BH)xr-D>gD{w#i8rR+=X5TO8KX-EcwQkNg zmNtZe_qTlA7NfR*F~|w>kGn#-ies}YyYE#)b}zJFMe}Ze^EWcD{05|X6rx01Yl^KL zG5HF`xu&eBTRS&3TS%@$RTV-i?b^%yRjv{!nI&~CpSxJ_%o`{B-`=f=6ut`Nvi;iS zWEwhjxt-h}k$>^luDUo3=(3^x=Irxaln^W~o3}5`y1NZMiEOvt>>G;bsSAO(X3P*D zzqj+QzR+S3D9+>eg>rW2BX2kE*Jq|QR|O6|SbWvF;QM^*kqn)rjQiIe89STHeCE1;1w7yI zk=i@icV}%8>}f_ipLgixzQq~onz+D@gRk_e)+~n38200jnQB>9IL6=a*P{iZ zJ#`mrj0_*|ACy#TQw*SSQTan}`&8|sA-1K-jUbGGc6$nps$m#(;;bgZxIx8MBVogC zD^7a?1l_Zj+G;Zx3{G>3i3yN#+N_xrNL2KwrVNd|wg45cnf^GNm(fCbi~iTw+O@;(V_AEr=KlbUon{_T;{>ly?zdgl z=ZfriDxNFTd~}OpaPhd@?7P5U?w?BX_DRB%8<>Ilz1F?DO8ORYsr7QOf+=t3j4Pp+`>t0PlYdRJUEX8=s%D+0+g@@Wv9WFMh{vE%|p*Ek#{QBJ8KhKN=kssTV8a;0KNIHYMYHkoo$roE4H_-=0fVx1Z|ttx)SlDeVS@J~L`A%!lN3jiqZpCHmRkG2ll^?}d zqgD#d{7Y36<``-a$x&sOb3baV!(sUiNCOn-icqSHhUI8li3u5H{{VqgNfB^*(grAf zsB;l)?V{kB7$XdR=vw(7_KlioygfYDTYl7jOtDBP`%OE%t=Ey%0zv-5S9J9~g5R#%U=^{Rx*Wp|sF?ez7jrdNtkpzdM) z?zG2|hRDKv=jN|%9we8%LN=YnljTm8G!9(?5r-8DHd|&k{{UKKffuUnpX5n_O@BaX1uCBrfkbLR# z?WiF)8FY5}8}9p5u?Y6Ek+jG6f7-07Y$(1`#ga5~Z67j8_eFHpv8p%O_I$r8?yUO= z+2f7M;f-lWAriDR9mu~nf7-4}^6H5?1V(@a`^>ew7UD#Ocsp}h5OWscyDM6DzrB5( z7=P$B=S)^Q%Lvj*yvW<+j=D(P%5cs8&-=B?K)EZhY+C5__)JUYI}!cb=W<2ABV%j8 zHb?h=h}D0!ADMB0f{!{$8=e=vOt40NVk@24v{8;h^D_^XzlOUX0!cLbpx_yH)h~-a9zM znzFh`8Jf~bia7GJTmoTIc3Qw?Dk?Thf-M zz|2*))5Nnoe5Y%zHb37SCVsT|Vs|8;m6p0L1b0s;nK%5!aas+2%NdF>^s3hoNx@DE z)l^6GfswZDsC=Q#WLZo3ih##)TFjSNy9~*@3iJw2urxvh|yMpWgfDkJ7xl$3ngFPP+x9$M*}%kUI+ZTbN+6vs-u* z2%sv1?OIb^NOLoF`=x$2D_4-~mx4BHbmw<=u9sK1WAc{5isUr=FYO&bM%@c=wX%)M zgF8=$-W9i+=k1pV%*ST?we*yKyND|Am4)Gb8XY@LSd}o|wYwl8c<)`Qxq}oF;*hSUiBNsz>FNJqzcQmfT38;$eCn6 zH=(9CUA?M4di~K+h6LiRI~FxmvlN&3XexHEby`(yaL0pD7x|a46mw`z>_+XldSav6 z8>z)S=NZS!YPj8u^a7-5jwmyqN}U6BJt_#JFO&xvsmw$!389R%x!Q5YDWGI@=Bp`m zeX4f~x~sVxZ(5#GQ1u~4CY}gjcJ&nuX}6!fN{;K6jB!rI6D~kgih3T$gHSIeO+Ra) z$u%roq>eu73VVc50q7~K&nBB3WUgQCtv@2rhbqB9=9%QMZ#Y!Ni1}KG-B~bAOF^+& zV3YWU-PLPrZTeD3;!V51hpkA5B|+d+#2DO|&PU!_kTT4ET4;&0x2UEhDjPBUwO(YF zl3?5)mlWvbZO!Hir5gV8k-Dt5e((2aQ8X-<%JK7Jq4U8b95U5MNfYL%7AI!P(&ZJ6 zMx3AaaZ;?nr_IG=uvJDId0J5K^PE$+a7KiV3CO6~i>CvnPt)X;kQ*2k%a=Evy1|Gq<@%XV~Qe5Wm2vQYHrV;by#L$f!n=E zAX19W$TXrj6+$a#jEb2Ua)eOOx)N8VDn@u_?N!P?L`W_7wg(jTKp5wdPapZoc#5hGOITgp(I;|??F^# zbFeD+rEs~F?#a$LsF>#`_(fikc6-)mDaiGq0%B*5c%tx3 zdSp{wS;i^g1yF$Cie-V$a%u3lQ;(XNmOQswauXWzD1?c6mO;oEsSz@u{nJd3B!YX@ zpqoH6r@2a8u_ONgRx)|bIBjR${#KvEe4Q!itGneND5-)Ikw6FefH?W9HKd!)cn9C? zYiDQ5%vPzaLL_M$^P`0DA z=48Uwt&|>H7Dn73^sFte0}_9Vv@9-NI-Zo4#=OquKN#B0ab+$#=ZME=Ej-!ShLP>+<=auv|%URggIMV`eDD1#{IJL(Q4+5G-*?ul zT1hN%5IGfc300qY9RC1%sxHMxm#FJ#3~0f|+WF(-E$r5|@W*CBS8tt{<#2mr+P%+Q z*CDsIEdj>Ra@FxSignwqV_SQRiM-BwFWdv5!nJQsSNKl64L0R=bC%E|6`#y0Ap6Vf z^{oQ&#`$$VXKW5CgfNJ%w<%`aH-Gi3QW+ZKhzCCPq@tPbLPtq#v7)Z`1mp5GBr>vX z-^-r75j!YFlY)*9ma}+^zFxq5P|;)5K2i3bB2I zHGpm8h}*|-4#`Q$2L(@R>hz05vpWyXoPzG%1#ncFj^}J5YTGpb0A~zbjhyUL*Xvy+ zoIBzBQy#rgaz$jo*0$(C84_{zt?L-XYlFaHkz8|`ye!KL0Fq!x;{zD&T81(lB4Yxp zM+E3Mjz{vX3wuA~X)@=gc&=H>#_Bc@t3K3WgH{ACtMeT0=zGwykPL_K)tIfML9u~2 z=xZ6u`x>btHBh4u%_h;q<7pLSDIY5kGfW5_$p`NHcczMP9|#3`9Mpm(`I!y~_328n z?b}WOD!DvVkl6*a!dOJ)9FvS5Ivi6G@LZ5rxy@PQXsFy5IXx<(K2o$(G>Mm7e@caj zZ=E^CUJDxFCV8j|1yUGbRHi{i&+bnD0GWqDP{ht-1n2RqMOoRIPad?Az5rHS;;DgF zEFIoxqA(SXTZ)(Wai|VAW~)gWET6mJ`qH_an2*RfCj+fhmu~JqO1S(Y#zqBEGNYXG zia5!ug}Rx^*rh3V0I1<=C1MJ*a4J9~MKOQ1P)i4zGUR|gD|o#T&QO4+MPDy>anzrBr8YMK zyXRj@)*lgs%&UnQyOY9?mY|;63wY90Qpfz8e6qsI7Im$vCqj zMOhACJk$p{+W!D3UZ2IqUbsMCCz0*g)es0_g~=x#*sUWUbo1&m?}z-$eM6{dh&a!^ zdR@5;tmU^T@9ADccXjqjl*7Fg^>0J%UV-7c66zpCzq|wH-Gg29YA#lM);5DrnCwz` z;g`v~j7tIIBd^w_5C%pFIotUPYI$uTE`tN5S>DSQSCi{i8Cc@bt7gtiMv^co{70>C zK;B{qZjUR})?)85>JhXIv8=qaC>Y~+ zHMOJp5wU2#>w0v}N?i+5I$+BrYsfo5!KyO4mt`WZuo15199C%st$lsmjeKmnJYAXY;1vV`ax`WQJz|$B;XU1b9c- zn-(kq$74wllgldSAXFNS%NtFgb>e`H&K<&-h;=w#IjYdc_OO*hzn*hfriIazgOmDI z51j*#x=G{MdRDMnks$M)Nqnpfo~N}!tFtl5Ai^HL)D;8gUZdC2p(fqiZQ{1Z?5AnZ zZhLb|#Kj-~(UvIj^8>%urRDkQ?NGxBjy<{H(Gd#cesSwxh|TKHym7H=Ga5&R&f;kZ zEDC+$>)cZSA+p?5ip`Ucm1;;NfXJbMImfL{7$h8@!l8Vr`F|RoAcQVWRGFtcCV;Z; z$@zcu8n|L(5LD+Ts)7+)y-OPzBLo7KP@c9XPUcR#YE}k>4aLX#HQ>6{ia~MqaUofc zB#(dbuc0sPWR@}%(kXq8c>Z*e zT}3s+Mi1{-u@!L)a+4dUzH6orQ=V(6ycrILHW%nJ%|0x(88Q*F-U$7+}{51zGeVG~3csL9(?eCxw^ zsAIwt-i(JVQ1UTTFpk8s#?2lLd1sAcEpEymmFZrf#e{h#yz9l*jBI3>aUfE|Jw9LI zts!ff)Y$o2?VM^40pS_CwK_aaDT$u}Df)@U*iwP_ciUCfUvz|b{#B&*JjoWsWykK< z_hP)$;tid;Swr@S#IGOCy<6u&+*hLmi*pcfn!M}Au(UP~2h8$t`L3!d^Q#<{U5}k5 zXSltPjQL7-r!`K_S*5u9GkoP(<(HtQ2#j})5>J(KPWqD7qPBL9*}T9yw@UUQriT&I zGDK6#jO=9lr25nCfsi^$^XH{viIMIVnYO2`TC!zJrwKN9{J@`2N{L6^5xmkfghjx3 zKH&cKPXkZ1JfC^F-~H+q)EK{X!_Fh0{>H3DmA4T}yInsT#UaN*@Vl`H4r^xHdDv}} z3O@I}RJFIakp$3gZT|p!b!^9P6|7!lWXZb~j?Z$Ag5FFv!nwly-|tn+a?!r`j>lsXnN(CDm=I8lWO=3f-PhPdi>ECD1%2;~; z01b7vld1)bu7BFDDw~@`)QV;DK|zeuizI3L-duWr=v4tNG#LZu`@)r9YYcqHy-tRx z`aj`hkv*gnN1rncKOFO4M=@x^Fm6b%ntl>o#7uUjG9b$z?;No|@GiCVo654Hk}4&+ z>|ymnXN>1*sTNqk+E3l8(gl2O{u*H$f{c8$;ZWJTZe2!ZeC_Q~9qT6H^3yWQ5oq`; zN+w?~FZZawFiT?8GO>S`<)wE#gZx!mDHc<>Eh%HmH_cjf6k}q2qZvD@3D+ruQbdyZ zd$aR3K)`~{jl!{n%6>Vf&F3AR^IuQ=O=;F0sNP$jm=@^5 zzHXUzv3Sno{8efB9FtlFv=dOoU-muYa1Y+g-rY3wOzO z8LwGB=bV>gLfx50*61qbyKj?xL*~Xa?NxA$HUY`!H9RV9(|il&@AUo}tCM3!1ZbBM zZBU=Z>r%j*-|pmp4OjD(Epn(#pWUqscZp*8m5_D$svBi!UbRVAbf0u~ttgsF2u2Ke z`Ku<{X|^bo?iI0VD2!t}*#7``_-l$+HbnYyWR-(N(W;Hizk8*1w)whXZ4-2CH)gr} zNpt(8=MBzltAN~FIy^1858kd?w8m=b=u>QxaW|)>ZRyc4xy(E#eE$FyW@)jav6;u2 zj*I@)YyG==uGszm0N_>2Gzn^MqbzFJ`=zSvGi0%le5+W2rimh4XL0$ym8}~GA1B@a z0BW&n#lh%a(q2g~1W|p-e)sz|_m{)}0NrUY$1|vHi(dz6@szud%T&Q&tgrHe{{RB_ zuef{>H=Cx!WIJ$!{pG2nJx}@wWD28O61wyyVjeusT8tx21K!DL6*mQ{Qm&>ht9J+a_5EI zzl(LRzjbDBu#mOzXT^^>yhh_^M99b8*x%m%>Gr2?q*vJU>j+*Exbm%DIq@FZV}CZ< zR#?K}*ZsQn_*sNXLw)Ym=!S{VDIzZPYf-ZCa0FKqj6{1Cn4(A@AdA`+^+FU#`Q zoM{{~108aflFjD@R^xZfwbUwkl1I7my0|Ko+0*G#X5g7yEI#dac8_rK`D&RR&;H9? zPL|g3eC*qQ+W!D{yX_({&LmDpTJr0JRnDr>mL}TV)}iu3U>&XRS&_>S!BzX;daOuL zpbosR_iK^L=8X}{42VpL_gAfZ-@>_Ft|6Kx!Uo#^0PTOhULofvkg>`4de^jkE0C@7 z54sQCsi!~Q8)5z<>L6X6i5LcuNeGk8!>{Y zcxs(hquG}EXiJo73{3fheMUUB;Bilr`~LvMDzmXf-|JRUF5LIX6sqkSoEl;uPBTn? z2fal0CS`ZX4Eg!7UnYEEx3-E2WOZd#Zr#Z{O?_SFD?(I?`BUQ!z*mymW#tC-+`p)$ zcF~nZ?w>YWN|F*kgdL-A`#;{V4)~3-BxvV9=~Dv1KZkDYZm(#JD04UWYsLJ2$5157 zs~48|AK%?wcvSh1Cb{F0@A7eSysb@aw#l_ov+94|s2N#K*5?&+(%uwdI7f9c9zgZ6ggA-)BW1&^#1_f+q7}=$^QVMS1}syM2I%p z>NMc7M8Y@zF15=&hIIB;)PkHBT!Cw9A-@HdOP}hBhA$44W=SiL9`$5e;4~z zrELn^Mninte~PFXo^;;dHs8{(!#QX{f5N%m_Z&AittNMHKZSqs+S#<2nNI%zy4c%X z`rJOxlZN}h@EX>$M9OEP{{VOU)r|fU;CGhgS$4?XfAlKo^vKwhjRqNOledU(Rxh2E z)amabQ7GZPYtEgG4wn-oq5BH3QJx-Zly8XsU*YRkV#AHj!~tBB5+aTg;}QI(y3Yn9 zT59k+ef{Gf?^X%Ke8JzXbUqTh7TVM@%yx~#->=Kl`_+@o+`F7*xsC3BI9XS^Y8y|F3;rFpDwduj=dUmoPB!Hm(<*A$vitXNzvhb}#6F15_ zEjJs8s-zR1f`{0Fl(s45RD7USDH(jjo}#UdAr~kC^rw^_UQgbpMisXq`^!nY=Gu78 za?V2K)C#wkj>f)l_~R7+0N653Y>O)fpO?^m<^C#?DW7ilPmuh)*Ck2nE8M$o8Y_fCH-+o| z?Qg)UQ_Mx$-*s!8gK<08_nSxF{wnA+lxBzbhiNUw>gJy?8{r*(C(rL>_O4pO-LCYs`JEUpm$02OtX zfFklYD*U^vnpa57)GJHRyBlb{;H-Xc=T9I=?^IV47{e}pTIH0PrG~2P z`Nu}C-@pixYcR(wd$}L@^L6|y&%D`Dvfp;S7vbmHerOHUm3pOfy1!!$oA9U1He9e>o^>-zy>qUTe95>yfFi}~5 zy-*~EKlf@t@rK;SmBz?}20KB(YGLy@Ud=)&;{)$g!b=w6R3WoDSK3#lMvLZU$lAPA z(*vG4W~d?(M8qp`Nv#U#M{q;NQGF}q584=94-Ykzh2dFu>{Q0dBpY$O_Fwj^>*={b zn|@JWA%4+G zjq2BPJXydecJE*JYP^5C{ov^J?xuMo;0$Ctu9Wev>=&v3Dg<8cPM?}x5` z;U$LET*nOOYx<9+ags*a-`Co`3*nRz{{U{oaVK2u{{UroHEReL2-%-(TOHPs;eP1h zsC|mtPagCjF``C#EhDOK-Yd2!_37+NrI86%=~ek<+$qZ;W@3BOUPUBgj#8GIjyWsy zRY^Wgqd2SJ?@qWiLh@LliM;-l;*BX6ZIsTexCa%=YTA3X##9ZU{KNagxosQ9(Aw*% zr(Q^^lQzV!qI8WPPrKc9Cf6)B{MEHLt<7xW&ot9CNYHS&%{G4wIG1c~v@?GddbGN7 z+XAS+g=Dg#I1=z%itUO_ZfxMjkM?CTI+t$PTBC8JOZI;_CffCe(~(B~n~!cOmp1-v zB}(IM9EMJ3&Qn1o5|KagbfwemBNql~SLbh)S*y`CjTPjRd}Aeh)(kovh*2eMe8ICx zSgLIGe+t_rzKr7x8Z^*<>2Ys&RofYWED>e4z` zT&5-QbGY@dK=^r}JH_W*#yKFP{HKpf;;mqPLgZTQIA-Mk0Cv8C@P3rqZJS10f2SQW zT4CeOGdi!8T@(OJN9d-Tmo zIr+C!M1Z09u6Ug>MO@_oMM1j0deV$00`{lkH6d}*mf2UG=JHabbDF^R;+9D?*$G&ljbVO$~&=l<>ky3$%8wS;? zM01STRGgl);0Zr36*8*lC$%9NB#}zyqQXEVQ`v!h)lwPqN8MULuOG_QFJNmz+HGID zDZ9ghSD>o#GNupbRuHPF2BITno(}|bRbJecC3(dwOXLritw-jR8&4qCjyhaC%ZRJ9 z4ti3n3;;(;r@d2mnfGd^p0WJO+m@h4u#z?`r@c3NqL8ESRTYt2?u<1!GyI&>lhA1w zV_cjMy;4WGoI7BDcB(-ti3xri_-a&aw>_zJFR3c|gtDjIrPut|0WtKdQYcgNiqi~3;8bo{HYnyO%Xk#8rB!%j$4``2w$ZmIpr=da;~{ZG zcP>w%&xMhjYPQ;coY^tAZ(b_^Rf&NN{OJ#{G;ZpKn=ez z%}s=C9+c$8%dLugHj|!$su=exd0aQWUXvOAwGQ<`$MDe*XszTOymeY+aQxYCmu*h6 z$lH`JHCW|G9QUL+p<4m)qpd`6L0XS_UsEaBZ2#0F29)gXnBw?fe7NHYsu>Klc7|vJj)ecgzHr7&D9lo^1Rgf`W5BF(- zlm-Cxp%O)P1B~^j1}GAQz<=*l=)I2wb*PX89MrLW@_SH?AXzbzIPFjr+SvnwlQ`xi2cBm)VxWM_F`?TN&IUOik3ffqWrF?PHsF!7I8hotaF&qV| ztU=@Wg;RIf7|WsqpPQP^azf&)7j_4X)d>r3=kC@rW^-gjNxvQO#aQzn8E&-#zSZ@o zAv?x;dR0MOYes3n#1021wQ1YNTWLHsW!s@*8Bbd2Vut~7)Ks)o31Vz*+$!LVkN_MC zu8Z7t6>&E8UF5RGx^+GMhpSu45!&b>3FKVX?tAKX=zr|BR7B?!~?&(n3GWbg?9_2iJDcQm> zU%a%jx0YLQriR|1D8*8gOyJ1yL|oM=o=-1g^fh`!CLk2^S(2l_d?>8cjcKzk?j%@C zkGw08Nl?r4{{Rhix`Zwem3}eOxP~QV<*PZBEzJqr%zrI<(`^`qJmHqI5hk=-Fj4wYHeJ~w>DB+$h)}dUm5&R(Nf;&rx{i~2Oz7Bb9(YFrP${2;IQzuv6tY!u$Sr^fAV=R#Eu3bCq-J4G(pIN9=# z_NrK~1I9{mQAU7(e~DY~RuN}XFP1D8IL6=onypQ57T+s>$bR)wW^)>=uF$n=V;qrh z&)uO3BL`idNYnJoiR5$%3}lVx?;X5;web$EePw&B%{`P`5>3A-=ns1LuZ%j8lG4{t z^8xBe$3NZN59eP$LvJJs-d5P~cYk{#x+q1Sz71HOF*I|c1={_?R;9ZC0Hv}*zabef z?^N8%BZZ?Lbl<_B)~!Y*j%K)=V6f;9O6azyp%YX{$f+0c7UrgbV`&cK<)?gl)E4oy zpavr!d-CR{ThLhHep1+8D+$3Jl+n}MplA>~pkQh4oBL}c?eN}1z16(notZjWvUYQcdFk;gVY2YR*;0f9|ef^FJADpK25 z3Nk8^X0Ri{NpO4m(h$htby|@!>>Y+N!2bXmdBEkWfuvO@A&5ApgMb^Tr<52fgXKMG zyGo95M_@m#0dAuX6nwl2fGbQe-8)pIGa=jBqF>$ZM&QtABr#)*W+9a+*U;5jm$P&o zD$9Q9@}qWoRe6bU2S)E&!E-wkCt|Q=jYyPd(xTt;f;ipK^{2>%mm6|BQf+ODF@ib# zDs7>Y+@#^zm(Lh0oO4J@%@Xbzr$|?CT=Pwc?F2d6pP;7{g2Nst#9eTslT;p2I_-&g zUNc%V5g*7-?lLh{nf^_TfddZJy(EzmMg_vUl?uZd`LWGFsIf6@=QVCb36|P@t2mh) zjE|Q*5nH<)vqF^fg9yGt4|=UO)hdn4A8NGhh)CPX>s3+5F_F`dPg-#iR%mdTLCNpw zSrW#vs^De4f30oHC|KDTVzV8?GOz~+j8?bhk&c+bi|@2sA=t`wn-o%tTvtt~57 zkADndIrOf&D$Mfnw9}`d?Ca*p>Q%O-Xxlj67DMui=dJIAmhrgG$rN+!YhKDUjt!`H zA75J6%^y1B(A!i{&Od_`)bjF-8v?6EAyCO8)9uzaDyVX+%{bh&T?)Qe%f{;KbSTh7 z8B}dQopFLTk@)H>vC3k7&T9O_r52h;9E?3J9iiAxVn2vUj%M~;2JY%m+Q)z^UZDc!t zgnpv2wHJv-(0cmTxM$ntm(6pU+)7uL#}slCV;*TYk1Y-{-!(;|GJqpEBZE~fUo$i( zI8ODU8YWx}t`7#fDLW%JjOUdgW>PSqa%!uja_uLce=53GHd2zVT<1Cdl~>DXS7IpJ z>Fq?hdJZT5(s7qz3)`^jarLQVC_@}zty4wJwPjxl4l|1UIvby$qUllPZzu5YRpVnL zecmc?cP3Jp18pRAK9r-mFeZ480-?=1J_1Jk;)R?b*@{rCpL^!b5eAD*G)fCfLL&7o zz^f4`Io;S*KOspk`Wm?kVkwXSD_t`dUP)fM<8#Pt`Ds? z6CMPz0vK>BRU@9vxor}HB#{FEJvvv9c+N>~E#_gubBqp8J;i$4yokffeTB#KuP^a@ zSC&?@TnL2wKI(&my!X#QJxzAu>T6_`R<^I9^=I^gXA8=)0hCQFog zANL1mY<#5u06K4xvepQN$C)Yl*}88%_{qk7J6EAD#~f0*U^B_KHEp}k2l~~xPm#Pk zd7vC@Kg55XP+8jONel=hjE?7(9+;~Zu*$H0@8?$g3Tm`eVWGbn~&tK}) z07g;suWG_lT&9WGxLB{vCOADSqR<&8)h*WO?TnB(u3l&rRV5_le=OHmq$Do(^Az)N zKq=}!8p-TwM|16849Wh2v4is9Vz-oo#d5wC+a{i^8R172)omDD9GdfLtFzyxv?htR zoFBVZAupUCyIK2*+PKatYk5c|PkLpV3OH<3Y8!X8KpkX#tH4@t!Y~24)jfeb3%!+Ub3P0Yd0(Fr>F5%X^`^IxiHM_?P;YazwuIP}WF^aQTjLC+uQx>q;|z{u>rdS z{`sxx`J6Q_IVJ`?L^=K?KQ(ZEH4}el$dbpk&q5opuRswZFO{B8rFs7VjpCNyO=$(s zA9n|gEp<`c=Bu(kXt+?Xwp8+%9Otfnm1QjAG5+EH^*Bi#)U77{=($m!N=sz~0~y%0 z>%VtX&V7cdfgLT`GC!40A%$iNMnP_$?$X>_becbuuTk2iMxDS#0l_2c1tj~D*|{9C z+RVOZIsGcrO6?#Kjmp0>8iEPqHjNe(IOFE@q6oNUEzNUD*toM!-bRT?KPcU~m;I{W zhT&!dXWeSYh{X`{mOaSdFZ;EpY-39`MQyHnRuzYB4Xr9Gmt+zyBTDIENcRz)quRNh z69~nwzDFN(p4HL`3|Ml%ChlvM#JICb50*A3$mjUKyIb~Csy~&vn>B=DljORLZc~mA zTA56~dSm2e?Oc@+tXb1r;#mx8-k&XN6?pi#JHPtX^!Ri|P@}bI zqO5zkZ-o(V`8JXA(S`YcyG&^vcVq6;0o*=b)iQy#x|a)`zF7Ocs=6-TKJ_sN%DcK# z^W~l6rA^0T&7e@H_;F8z{b@#DmZC`zjnVKazqyF;erBQ^z?I8KF_r`FnyDc2)8rYc zkNUrpnvcmK3~;qR^@y6XJQw0%cC;!+a@&4`*1lbo2w21pM(X;n;v%q#;0wK^1#!~8 zQhRd`6Lm(Zgqg_Xt~FtJLrhzE{_S~pjmP>ll8CdB-=%uH$i(@7`0w!7oqRwoEw7cg zWP3UW>L9a8)Kj0+g6>t*%x`p>;Cuq)rDnnvB;5Jsh4KuF5i3on$U~w5?!6(c`U(y z+TBq7(?d-V%e7bJ3f&EBX}(-jfhWw(@{PakRS_XxtMa$^t5OuqY^plfGnL{@S+fWL zxGT#3mAzp+tURY*m3nD{{RX(Y-Lwt%cqVnvmr&pn)2Tp+viVzI&Gn|#@yGY zOkZqnIob03zLmiE-gvx)WILFvF5i0T!%6d=J!PTum79pwi<6Ply;$9d%d}o*-pkgb zoj``_NJXpx9k4ZYey48RReDRCSUfeI@@FZ`c}&)@UqqT zipuVHZRt@sl;m`lZ*3{%Jg07~D|Rym0a4PhEzB+f{_ZPo)uA#3!);pQs)~CZE}UXk z^4UKB0L@*#j>{7j$;bYKT#cNjd>KIc8LD~{hCx_qa%Dj#*eN6Xu_O-4ODjXKIqA$^CT=we6*3|vnzD3 zSu@v20&P#N1@`eLN=Fh8lys&dI`IDhcCs@e!89?-DxTE8IQe$cFxi0J>Zfi}*%-?! zY&%!WUl%QejA3aEUYl`-+v`>DSXEcMsq+G&%Ef>2>hVt=SSI5m{I0A@pZBZU2kx#< zA3xpO{5zJsbK*R#@yUiRh0S51^GgbDuhiW zkK`^`w>ZNk3Q8#evp>swK}1aBkeQTK&n>N7%nSro+H zV(rCjTjAkHKkya*02<4)iYIV>_T~AP{i@W7p=M=4hEMNSJkRWs%{7P+2|H`BvJn!H ze-1x7Mq78D5#}_qZGFY|vDV?Ts&RyvzbsXW%) zlXPgFV+Q{KX={JNfnwKf<+nRaI}!X&K8M`eWGdD%Hd_iR%lwCr`{u0KpoY#k$IXFIyol0zX1yvBNcGe1M20-E+nN~j z!K4Wo`GrP={pz{M808r|faa;9HwSOssgSHL;CoX87KxTM;)pTqHB};Q>MA8xW3_2Q z$+OGb_o}%&Mi}#04Iy0`GSRWG0QlCi4Gfu?b}JSt+q)|r+gH-P@wb*NPIJ<{6XQL# z&Bur4RR|GTOSw2@+vvT?=~~78lRCQ}oE|o}S&=UxQ@AhP_x|v&CQF$fKbb&o%q!MB zQ*iF)MeIuK+rrnE%K}79(tN7TUd;!mDdSZ5v?W<*3+7#AhrK||$+hC()DF^bKQ`~; zsQ@m(^lH{OxsrWJLSjZ~4)Ab)8ql{R$vNS-e-%+NMh@ll`_(^~xQKasw>LhOGI!7k zt%8J%hT*qXghoG`%x$|Vf-6AlH{D&kcGbjKB$3pe%eQvg}2K}R}oso~bT|KV&wkha-TIV#&NaK_-I0m}7qs#5; zeJhG=ArnqHJhf;7^r|FpMs2?>K)z+Xj6uUj@d|NNe%W`Q$5?Pa7q{FO`kjS>5de7oYhiX&c-;8fuEfwSsXKe7peQr{`F=TR5(AyR{Xgl zl%(G?=kUk)(>MJ1kq^|@w2vjCFtNy{HwQV$#X}^(kf3GybH!OEMSmz@?y7GASxA|8 z1^yvb7iV%>b~IKul~UbXX&=Q>G*C87L3St0{@45pp;;LH-0;43(Z)`7~dA}_zKo`ks{g4 zJeD#tmi{2vKknwZVTo~W=i5&wr&5ycezaUm4Z|#ueCg|0(^`41v&6gFzHazG@t#Sv z@u2vYXySW+mN^@C`G;W5{6@Z-()GO>@;&iL7eB%nZv0lgoGvaiK1UaXofm17tZrje zkZr{>^JFpY^{t(@mp1-wljJR8-UBHrd0}12oH`uz(Z?7q)K@!ru}K?o^BUH?^K+D} zN$wM1Lf<%~(WGhGC#iftUHWKATYDpZOI^z;!6E+uS&#g7 zyl@os7?$=p#re-Aa!>wi7>GM6nMI-`q zL)4`!8om?L#6V3Va<%NXkCe#bxeYSN!iXbWH{PzkGl;ri*F_a$8jk3&#E?frT>an% zP^Pt=wuWaptO=S)Tb0{aQCuNRM?oIrRauqQRYgfR%sm#RhBX<_%hIx1NVx1*NXTK8 z`4+9G?$acEw5b`|#Pn*GGv!2}^G*v=TVyN%8--VqHvk7wR+xfUWmIX3^jy-DAZY=1 ztM#T5s!I=-G~Mi6mK5CXWBgq{T2M5Kvlt>$-+GfLDqHS~a-kmBrC8n6h3Xor4H`ue z2UT_}_h};;k(hkTQw1gR^z@Hnw%#gbE0H!-W-8fVmYmGWy!Wdi4%N?Ua0(9AsR*%< zpgh#YcKhO!%S0y>{mq|h%$7txQHqz0jCZBR7!%%=P#$^;wW#1Q??%Do8kq+mdenK} z_qm`IL6$veTa}?6LNN={oTDK{Ds3Zq9cT&=@t!JM7$P0Pm~be354lbV8w8V@=eCz%t@lMbHRSWt6s}rI$6aT3Wo#bRdPzdFIbKb0 z*7C~}Z;zJGHPOK&l7MC7KYET~N+#?Vd*b`GGdN@)FDK>|l@P;xg8);KNjv?~NJf%4 zWWiomqTHjcKpm819<+*s`17{3Ah<4H%i4OM;;T_eyLtQ7Lje_&8$~fwaoDw-kttml zq&ou<^3{Jcl{CON3?IC;7;V2OrxNT=Wd!{H04`}%1wY=Z$O+(zOp+N#HBpGt>`vi4 zy{bO-Frif9h~&(9Md?y2mPS9tOp%3DfLHznP@SWd;*e!Zngaa1_omnl!hp;N`!x~B zAR2khYwb;6o02KW2qXunJW_zWanRG1l%p1?jzIRRItfbbMPM@3N#owd$=g?=>A3W! zvVvBKuBIwRT0%y7BAm;#ZB+S9T*GIc)ZZ;wV13#Pl&n)#UEd(!QRQu5xvRoF?FcbU z2tspQQy;L`ad6bJ+g0@fiaml_NY8Q>Y2= zL1S=uWpBGv>^p;x!j%`)Vu=`mgy~lp65WVrP4RL%)g+0)!*#7CV~>Mfmkat@##(%1e-3~1y#azu9DSp7%nnRWLdxw zmj@=dqUE-$WQr28tP&d%h?t+HX)F1Gfaz5PEYcht;;h1jOJn$IiisFZed<$^IUg-b z5zce^(l|I#Q|}Pe$|(UmnEbe>geEoZidGMi^KfcKQWHID+V@Lp$g>1WW7X>KE?fp^9G#XCvhuD3MAp9Vv)&$9hLRZ0;y>(2*mUC(BfCB!Hj_{{UK< z@~XuA%0)xv+xbiUM0TrurNJ0i$qEd&Dn)sYr7((8vHaU>({7z)$~pVB=2w7E$QYN-?S&^4^ zFu*CEl46P7$PH2Nm=G0FV564diCZ3^bEv9TmRrKKJKZ z!W_p&77fVrUlD4DU)N;4xs~K7K2-ao2lS{Qht1u$jMgezTwLWL1tdmNU4J_1ZQu~H zmd^Zs7212$Y=n*&!*9nh{{ZaNs&cYSSFatbh0~K~!x0|}c|Tgz8{L%)aqV2P znW~9$HH@5sb51cxq_FQ*BVKR`2pX<#0oD=eoYpbA8>U2C%Tc?br!eyQA297rF{@w< zjkP(9Y{2R(NJ~Df{~ag$nWb^m5@tv9Fxcx6$Glr zLd(-1ty)xe2Oo`Bm0VzAwWn(tHbAc1I#pLYdewlXS7AI1)DkvO1sJIpF+i@+IOH6G zQJkw~$I5$El8z2K;+nzs?ZBk0(UDw;+vWoRRZ_Df@5jsUR;6HADHtEts>$XFRYA@> zcCLzOmlBk?X&A81KPt`vZGqa@3{UG?Qplv^7?*WsD?#RB;dgD$Gsvx-jAs%%govHF z+Ir_5ezlwiZ#F$qjI=V zP<`s5AxNbhWMj8V*4*C-$sz^{0c61)>l%1i+nCw5D;(r@9+i1kBJ9xc4_c#k3c8>< zQTf*Kj;2#xOv|pKG0K|Gl0YUlR7IhR@#V_|~Z?js$JI_sumF&2jUNNX9!?R35sV72|Yz4~8%2mccD$!@3=X z)wpj%^se3oL4r>Gz1O9AZ-!jjYHwuCx+g-!d-ktYwp54!tDkDspEWmW5|cTbbeu+e zdsNXw5*CsoN14;wrygibW0BYWnh6aUSpNE+O(;u3W4Qg^R?z~G-41(KZ=^#LTar)C zI^+4*ArozgoxAI%(hlg%xGB4e69u`WA=s*fWYi0TF3Z(6pUP7*1GZcc*;>S21L__i9N#QJA_=jN6GF=~0OVNW%(O=rPvolGEoUf1Pt$^l{6! zf4WycPMnJAV~3pYz&)#-*JXuOqmi&pT9KT#IM_=!G5mt8$aXL8eq4RwRTFtE7oq5X z`qc2=TkUhX$5V>c%IL}{m7)ibaNWJCjB7Qlg&c#E-<~SW*q7!(jlY#pVy=I9O3Tn5 z^qAs*|I>j3L=+x<>dwNvo>*{^iL9sbkDV%#%gdnRG=}^M5H;jNBfkDcT!o9N-nc%#l~{n>^r=F);aiHta(WY)WI{Vt*!RWr zIjB6M6mF|RG@W)gL0wTsYvCx&?YzjmA+Htj8C1G5&G)i#k578`dG`b5r)u$k7o>|R zE^@tU;=7p7%;9CTjin6a`lqETNrX1?4n0SxsUkmWQjXg|84i7F84yV7h<@)G9@VT} zj#)HGDBP>DHxMv?#=Q5&YjnD7kx7p;7*I|I550HM+)oj3qbj_9HO2VGDeqUz97dxU z?hR`~cA3voS|2@H+WB_N9N+7K$-&6ttU-jE=S{~s6tgGUrt%`j(bFHrO<5R%@^KpX z2a}rhZsn>x{#I*5BDKu-Ny*@R-9h!ONTg{kyMM|>H*r~)AquLHC(Nn9txE=tROP;4c@>>v@UR6zLQX!St^%=d^2YZaJvpo@ zu(gq|45AsDS%Ja(rnVt4vWcN3w{%*iYG9Hj5*^OJm*HA)0)TlcFnVLPV*HAQjeByf zZb}cGKJIH#EszF^5eBW z)*vp#%;Ya|+cfk>X&MyyRYwMemLy*-!A+e_WyzsP=n?nHyKZ*&{>)a7Sm?B4=EpQe20V<6f`^5(kr z3?*=W?-j*(K4e|CvEYI@BmI$G%z(u%)UP^HJ?c9kQdNT5n7JCKt6o9$(+VrUcuVo_Y$A6l}&xYJ)jE^r@8R01A5u zayv)<=&oPHZzDoq8QLqQ%9dQ8mbq^c%l?YT{sT*#&QDt(F8GDo*HI{QwTVAQthrbP zRXyut#IR=Yd5xX5ffQ^p6pOV#gzm1cZ*=35B#5eze(60cgYlzFC4{K9{&N-Mcim72 zHRuy3n4UoX3grA>X$-nHz^@#`YXWNY`qLd{Rd}t{*6_ z$7lDC@Yam`97v^cDtlHNLM|in5sD~moP4BzyI%U4=WNZZXuim#7x@>AHC(cTCCQh| zEZNOLVQwX~V&~^PW73@*AfGN_l=S}qWL6D~y*!0x%uBp4%a7r$bYxY;qh>2Lr1RZY zG37u9$fLH})suDLj^c2v{{SxU?zZ1r$)JwroGvf`7(%;vtMUAkY<2$tcNI+BPc%X! z7}~!!>e06;uu2=}`=+>O?-z3IoS~)-G)z~ubk-hz_EO$tP3!zMM%>27VHbYb9Xe{*NDnOl|Lj{`D*2niOaG3?%bNnjHHqf4$So)ndw?k!*CbPQ;hy?g40__KO>*dacuj^B4m`9u zT6k5Af&4WSp@mg}-BMulgNn&(BdNF4n4>IQ(*fU%{n1jy`%!cGR5Kl$anR7v*&{q@ z)9%v|6y?2Y18z~g#yhiC3aOKWw`ieg!YGm`UNiFj+Kz8Ic^`I#civPUl-Y}HVrw#F zc|VTfd35=SIExJW|~JnYoFpDGVZUe{CzA>VI*@V_|$Rz+W9&B$fsf#1)HU7 z1BP!>t1Iq8epLSTdGC*6W{Y-Ipy>Yq-LFKGe7tSiKlCc&d}(VP#)~XX`==c5{vHR+ zKj2lZDSO8)T@mu+@<}9%FBp&SS$LfbPJY^H#)nM^SchCzR{nSwXNOTb5dpnqv zF6A43@1=8GaWt7%pw6M2(vpYn8W*qa)+3X$VA@A@^lhwL^<8=TBy! zN(^hiXCrlMTTCuCi?5e$WyYZG5w62p5XZTrQNi8wS2W?=cSh_NHzof7cAHRt6IPL( zRla`p7b$Kf12IL`pjKJLauKy$ZqNJGgQhq;8v1HN^RD+|5BvoFmG-B@`K3!(?Z;2O zUlM8Y6}wsSkc=zsKZf~hSlxzpfyn68QHkG$TIzb8#$H1uLdttD%Tvn78_Mxf4>0oQ zn%|-5MQA=YBX1Z}Q!1*R!m5`F8AD}SoQ%h5tfdB2N!&LcO1$_ezoeJd2u9vGszz`U~%-P z{{AJ~A3@tasS7?!U?^Vxl`LjbiXZ)1@7&S>E#nUyoN?JZZ8fu{l=7M|HtgsrkOhg! z*s8wY#ML#dMmdXm^;#|?SI&w_0}c=H{{ZndZYGtph54GQ2vkQLY4^DynzZd!TXh@N zesAKen<&(XlIRB~p<3y5=+-z`2g9p=mCf%8!+20}Tbg7q{{Veg6q;qiCtGB$7&MHp zzx}H2bl8&s5%;Ul?d@icM9Sov?_ztC5F>)T^IlzaX(OVyXk!6WwP*)oQ_O7EJ(+ii zNW+|ST2V&Qo#0@9dbunKlCgG8>c541U&A<*T*WhcWBuy!IS-f9=C5h^X?u&}h;-rn+%rVG5RjQeDV;dut?NJk# z8T+kHJITQ0Qtb%5{rZ?j+L@`MDRCZi$gi1xG|S}K$07w_?X)-dYw8I$7)r>UtL6`k zX){& zcd~q{Tlj0pe17w6A7t9&`={k*{{VE?UKip#s@t9`6ipSu8}|Y!VnSKGq4WDv`LWKW z`3~KFURI+PT}|laXyFkn@mqRKu*6H; zE_U{=X5CRv{{Z0r>wgt)+S^SlY=oVkdoBDv)yq-b5!mUsBJG&(#y;(Jma1Yvr+|M- z-~4*J8%CAO6m5dIDyCc`?wuX71t_x&ky_BmgdZ$nR}^eIea&j8>`|V%0~Eqo{FvZWmf1F`jz5QQ_iDO{M5H%L?~cc#0hyVYg4 z+}pnGO(#K3UQ=>64gKo6e+h4LxIRRimzpCj=4bd?g#jHy)26_D=jEpXYp~FPSJi&? zLAh1FUzV7~vCTK;Df0c*sdUSm(3wj}S$^$&HhT+i@AkU;*S!lrM!&0cWpmD-{Su1TKUFXfpc(K zl;_{IeFLmT8`=EsS3fpCy4B(GCA@c1DNIZM0L53SgLaOmk6&Vxaz-TB7k&jl$r4Pj z6KzntSwDuE2u0mAoFCGa&y_cw8OZ+t*{frkoLZ40@7hzgd8t-#14gHwF;Esg4;gMx zrs`uvtoa;)+O5TPIssi_hDC5owipiea?UGuL5{9DrcVPyhw}W?ljU#kElCVfE+dbE zp0$*x8(A6qruDAKEjL9kPnYKY8k*fR!xC9~dM#xl1_4=H&Hftb?V>TppzSq{Q_4y{jsL26nn4?3*RFoP4WYb+gGM zs7~L?xXm`!Smcs+Iodym_-n1SF6BZT*96K>-Z!FEKYNxHJ0|5*^F~&of;iSyE!Q1t z>66MBUzk@Z4^q0vBA=6n71DTSFm)?(?XiQ8pZm4XGj4k6d>zKM5&r;L^M>2~-V zloqGm8f3<68)DsYPn97Uwld|3?8O3>RLq}toEvcYMKN47 zc*otTBMyTNTXS;_p^5<+^s2xzw;y(_^4aGV5k=ayVi(LCH-8mo6(yOE%TELb^{5Jv zxF?F`E-Kp&MQ<@icCIVIem1mG=;BEON)k}S52Jk5^fJZ^BOWndI(%$5OQ*=zUSl}< zWQi1v#CHOB{{XY;_p0EzS(R6z`M2W`ZKNVEmKjMS{{V@vF@+sLK))d9E7bgNb8qGg z3usG3g!12cPw>~7O4wYvAPzHL{Uz?)@uvOZV2BUjIa~&$X(RJwF`-j{DnBj=B-mL) zcl9mlQ!qO>DsD0K9<^NP&gFYQJz;TjK5fJBt;;n+{5Sv)lvaE}NVibYtyOa1=4zn)zNX8w0^H*!|t|?~mHL-=l zH$1=j{HkF6WG`?Sor-o*ggA1}+!H!t^U7|Bt& zj@V<(kEt|8QsFcnNuIc$L0J!mG#uG=4ZAm4DiTH# z{K@yT_iH{F$yN!w3^vuMqjilVf179C{{VWq>Qq5^npTArE;!v<_O{W?R5@l}_G>2I zDI}Go&+v-55}&&fV0za)(Fav)m?LPDEUDeAb4&tl$U2TiV8M-oIUjI;_zyL|W}aEv zt%BWa&zuRl(ppN&<^l76dbcdWjqrxCEs>SCFY$G*h5}57nEh!<*5l|AU$Vs@`#`ud5y>L*QxwB^5)c|NmrfW zhTgx8d4W|UaQU%bmGIXOtRuT%#q*AT;6E>|R3YyhQ(B*9+r+PKvh`|Ic4Nx?rkMbL zv7yE(?J7r~?^k3GUOOQXWINk$T7`OTt7#@r$@1=~{J9<`k-k#3XwniBK3jQUab8E` z?MhhUcq0sUgZ}^luUBadahGNLqP!!=mvRW^k|*j2Jbl&w0A{kCMHt;3`F#mgnn?ME z;cdpFJkRp|pzdwGH&k}^-(}xCKgai~8T_TXZQm#j#(##d8?sRlau&Q7GxXX}v=WgD zUEOK&B+xmIL-Pg(y1ggjPmA>8Vvayj&o3ggxc5(+!DD5!K36u#QciS_w6A6I#@gWTZv4A~2Wsr6 zWRlq?bIXm@=6a3Mg`aobuW_F!moA5O;KWPaWioOh=O6kFdqu=5A|-mTuMGHIa@RVf zz$)Pr``>#%DEVvNrbbmNeqmcu*v+MV4pFU$ZJ4cnGTBkVlwy(?TdaczjkT`=WtBZhq|`M|0)3$`-7^vSEauEjAeZve{};Dl#lai{G^*nN}GbR7Hw> zpky9uIX8FjRVippMjQuVc&KG@<>e>@lae=65J;ruYZ-1+L>b-w@u@a!Wyg9k8lC6z zsW%?6&`gK|$XSQ?Y5xE+@(;~YE_#kCUn?heXcsk#@hcp&bv0o=UQc?DVMOVi^rVO| z<+-NXu`GBv>&T{U8To!;PdNi8r2}9au~QP=hJeSCF^Y0zj2@H>w0TjAauOq5!if-t zBxDoGrf(yc=|lE3(Utj+%|uNiAja=%kd56&X`(mANU1qy>55WC2uM+hDkLFCP1~wQ zjaXnFl?Ha6D2ZAQ^LB39)r)%BWx>sC$RmnBGO#3Yc~zv?;!u&m$~P4T{{ZeDDINUT zerj))yRtc~+9{RXN*jjYQ`hDBo|>r6-7$~vRID&Ry^5WKVN`89$68{9+{{0Rttyso zds0FI6$Y^QO*EEQ+*P)%T8criF%?GL zca6Em+O`V$UoXp4$SsE5!itbKK*d!A?fu_MTy5n(_xn_N0VrnYE7qk}UF6j$ywv$+ z>z*;`?^B`Lc{Fl@XqlTGYB={kGTmv7*Pf!4Hz*+V6l^sV_9rF!9vAqkFylWbYK%E? zgVAXffFvB%#^jQ#e7tc|s|HVcs7j}PwGn1fmFZ8EaYdNeIVcvSDJI+wf}peE$*G$= z*n^DJ%%`~t$xdicGxKl-0Ap(!VLY7nryWSJp1e^X3++xo2~{;5kL8oMns(^Qh`Wk_ zq*DWIaNVg)e{|Di;B>_i5|*GujKPmetf$L7)rJLAu4=IbaNS3xQFPg3c;MrTR4OD^ z?N!T?0O$=hNn?*nT%pK|n?X72nr7XnDmv2xU;$4}*~3zaks|!2oDe8Jw2DB+dsKnk z9RC11pc(+m=B9xGR>w+?J-~eb0CZH5vMKpT%SB0Cu3@bK036f8;EsCJS=)Be(v*e+ zC!wt%in}8rfncqHO(C#-spS}TsK7bNKZR%oUD6=+%?%)6zz!+T>Dr)mF}GeT1j>ZU znB5ZR<*MwMC4Yp~xt&pVuOL=rvH>OlAXA>!3lK=3H{R(`J2`Bz=BL~b&(fiM20f}` zx)8|KL2gECLKIl@wC6RRnLMXMQx7#x)y^|RML_6nV_anLYeiS?k-@4ql7kLdX0@UL z*m@dqS1X%KgmJrk%f(w9a(SeT<07A(paJt$a)rl&SP&PAh1Y6sHDwMPC9zFaY;9w> zQ%jU_i9`~{rHC;q2i>Q6V{>gkcAstl-I`O9u*V3tHhR*yaG{|%=b!#2pSAaYvrUY7 zauCCcR?_6T5XR<4F12jBuQGM0fFLmo#_Ab9>5;x_k;RTP{Jf8rvaY6$1_fy^?-7^M zvTh?olPBG(WtbCO?A~$r{$6W`yPc$RbIo^tN1CqZjlQ+PT(--ZGC1AEb5z(-Is4dB zKv=iTKk?ec-5fYhxvi_T`Su3DYUbu9HYk2}TIF(=G1CM}9K`HnA9|#+y(ue+7aP9q zRDwr!V=u}-hNByNswuEhvo`Nzk5G?e^sf!^mxXp2E}&muz5GVKN;!;ghCHuIzZi>C zvX&_#^;O;f0HIXoPU6WXiZ*}J32zd29g?fBIw^hD}q%RCEnBLlHFWCKy! z&30xc)tt!x05T8nFS)KZ`e_mO%-=BibLhU6+Gtv;q)@{c!X6WM4Ua=q;L{XmspwjK z_Ym3dl1dsj(m6p^>uVo;u6@Q?PZ z&BR40p1lToC7cknt0B*r4qT7o$3dFx>=Cya0K!T4z3a@aZ|)rIuuaeRer}cNI#twh zz_yc}^A5S`UKK;qQab1{2tq#St!SJ`o3`L}tSDYd090H^dVPKCcG^c+*Ui9j#d9}f zdls$OBzqBZPdwD4_aU*=)R7#ian_=dQYioj=X%O2<+3P|QC>z>1y$ViAA&+{AGG@s;YE7HIW7jnU zq_a)BJY_3*8IaC`IgE}nSEXgKcMMbw#N>S|N#l7w`Nlb{`4v`OrH^GXtJ3Y<79qDC{c4os&0II$9Vx;l45G>kg$O$j41w3!){NGXti_4P9V;gFbEUHS8`Uiv14n zDrs;@{{A~xvDmPdF|)Y&jd)UQcq8*0bC1I{>fRli>ibR*%677JVd+&Cx}P_Vr)ga5 zp))2>wgL62qEZgs*~L~|nAP*YpwFolWmu$&z+@lNw2V>97Fb!8HpR{ha(h>Crht}e z{4j6xn&X69P;VH`b+$l70+u-#;89`qFH0GILEsO@vlO2(yARY=#wy{Y$sUzK*eLl< z38|*_CCM4H5Kh+_#bsPzHpXs8YSo!=?90}&=4FuYkaJW|F$xuphSbSF-lNQx9Q?V> zN9Jt-2q&C8tQQO{{j-%!p1ieE2-f6IIJDC0M^nqRZjrNhnDu#@J2JCgFqhN9` zLVWcFhR>~W+N?37mY432UbWJeV2#HI6~^DkJnqp`-6ag(GWpHDcDlBF`*`VN!OFK~xI< z^_E^E9Xp!Ql4%wLwQ=i{*0qh!SuTWX%^KoP0sU*1@mYp+@}rQZ5Vs#n>QW%k1!7A# z_qx|5;u}CL+?E2c$W<7fzbRu@CLxn&QvKJh1$@}d&M}_f-Kn67 z!uf#hskgc~vcxbX0b`Ga1CjmO-O;Y4v%8NR$Gh<#O2TI{NRFR)55lB|>S*MQ+{QBJ z!qOdQvu%IwY#E6Tna+(G?`0;=q3BSy!idQ_6K z5_{JRO6Sp2)gox5UF=WYrBb=wwxEfL8CqYN3XkET#JKh>f?c--r2ZY>#ZiY~R3}=O z8)9PMpJk^d+-#M8c*Bkddb4fwZds1nqZj~YKf6{H3hid%vuz9xIUs%7<+aw$y8t<^ zxZ@dKYnIm(!33Sv>f+3&vGZ2D#P2J%Ym(h6IUw}^0LN>s@eUqh>Iemmaw|4v+mDkU zFTGnhrtDc?kR+MGZ0Fvx{8o}&*d&p-MN~Nr)c36rRn)T&xm>@9;+jixus$*TUB>Ud ziqfAqv^ge^n{IBmT(pumoxiwTesz-@$!~n{j*|SqV}bbBN2#r?wcPNkj3zg2{!3Uf zvlKHnPI_0-(%A9pM$Er$J4WOph7a4`ri;pxq?jSP8lxqp!$}Lrl~26ND2~o4XJ?RY zTA4=0+UG@Y9`qy<5jwG}R!+*^S}x`O^<~+t%Pz={3p1Zcw} zjmq8YP6moa`@42lEJ9@g0`Cj*?yW%3k{CA8w`p49sH|!3n$~kQ%&Q%@HPpa-r;Zsu z`S1S##a9=n{{W%fFO|Dz-rZe1w{E*;wN-wfHFEU?Zmd7)CR}b->s=kb<88YiB3CzQ zGtRO6xGZ+boBOr)rJSei!#{O?^$%m)!TcnWIE^YXCg}cJgUtC|ReoBKotu2RIZmtG zdMfNCs#GWC2b!-8L5}S7#a%}mlwzf=N{H^gc%cSKm4`}=)rlO_U`ETY-RVVyg@CM* zFf{kKM=iUBsZa>|ugbLcAr-OrO=Ksj;-3(r-De@mNU_QORq|EQcfNR?vZ&vUeRuHz z+w4*(8=bR54lycbZe5Eaf@xUgLI0l@+OJgpqCA+;T@4sBAp>E>;;%c5(}Qdeo7$;wE^< z%4+qi`EZ!RZ7=KIg!B<)Z1Xlk!zbqJ#cHXS%1};OYo4*QZIT7v z^4;1bo>N5s0CNreJAc`&-8FoK+mADjtz7-Qtr-hH{0kp?x)_fti}z_V(Y*t)E4P~4 zvQl=ey=ykYSP(LrxF&zS%U2^Q9b|BqK$8-qwK6n9>kcxhRqQS|BE>0f%~s%5j!Xu} z)}$l3t7=ji;%<$*<*%t7lPcgToWb1i*w@RWwr6U_Uv^#1^7 z_;&vQz-k8BTeXQ*vDn(iQI)l4z<5kiz8Qhhnnct<0xOWK!&4KD5Ip9MVS5_Xo}X)eKB*WlL?Fby!zm-!E#c zS1vL>?M{r~F<-k%P!nW2gW}kvoQn9z;b!xd`Y zIIZxgOL4e*(smjy+sGx6#KRb^2p7wgzsr`ai&7+aSNSq{KJ|OanPUcb!1VS10D)IL zpS)Uuu?ndn$@!YLql#9{G5-J$KQ(jk28b+?e8Bv*u@iwVesAvWu5`hqYc0W-jB{Id z^Gc|N58eCKhhrd$aUM3g?_CrEIOIsAPrl!JvzkH7taW-!j8HMj_O9yF%$v&$*g;$! zpb=#k?{SLmEDs_!8@B!L_G{0YCM?~B#^W0O>eh&2A0fG{i#11;lWn|&HI!E?I%sZv ze+na7sT?q-v*3g#pJ-p~%e+z`M=V)>VP3U3^*uUdA3oJ|9DUkwZNRf|PAS3GNW-gb z_olDP<%cz-b}dJg5w?y+D@mQF?tw~<+nYZ%HB>U-@M;t09qw1bV8t60@^QB&l|f&W zbf^@ACP&OGLW}HGk%m6)e6{hUM0D8^#pBkf*=Si9fwuvKk zb=)}gBkIGa`&FMNhc$TFA0^2u7Lpa^_^&DP?63Ae-7n4m0HD{QTY2$s-kw{p<6e2= za}?H6nE3g*+uYXJStQRR5%8WQ?581@aV&FH))`YE9FElCZoA2l?ae}u95NeIAjhxck#S5cC1(l*uQ_Lw+?^6C;s@r<;_o^FdjuMdq?w*?z(kF~XyR^6Se{8h7Q_K9X~ zkN105JmQJD-Dz<j+JB0>D?lPoFfQajHF@>4Hm9Mj zYaZrjZ@RyFv?D4*EPV%B&qsz`ss`4p>jI+uzxUO0$qi^gkjrtL9lJk;tG@VqaWs1E zyN$}|cIA5W#d-a*Nf!O;cGqj*23PSNx;M;N^10i>@_+OimTgOO?)y#V(lY!w8;wII zPbcouTQrheMn}!R?@~-z1{;MH=)+^uTNNbZ_i_E&gXWG(B=aQ0H}KSFXeFAIor_OF zmjnThw8+%#UzdYS4)6De`?RZ-Y_IU*rXJ}pLBZ9Z47^kT1!l*}4M^X1pg+Mx-G@l9 zH>!ZYEqv$koeSw*d&*M#3l(p)ieQ|95nz5f8%*S+i3__v#PF<`Q?{LTLA*U#&770is~ zHXM+n(SO>nM-9w))jlDFsxmaBzyAOf-RgX@NU1^)2= z0A{(uR^YT!rxm$x_H>FU;$JCowN-jla|_xRZRC8)Y)CgxLF$;zq?%}yiT$!#rImdO9k^L9%EpCwOyPMBw=ID zR=oMX#)+FT0}m&kYPTDv{j9$&R z&hdZCnKsb=TAq8J zm0ryeV$+w7bP32_wI=CSMs-zWVObHO+_4AwYUQ}NY5vb|{;&Jql)ax&iqzDG<~evz z^|<+|(7%-1gOycmF>h}Z7a9t zTIsB!ZKaQ1)yE~E8X=n5$IG1m0O&QQtcQt>WiIDtSI*V%Q?l(|er?|5J>+3JV<_Y_4VWUtAtx~x99#Y_1^p}w~zi3J9}vccDkR&qABz> zhsJ%~YjR|?%W=ocRnr?-{{R&_1wn2W2FjoBed=rFLoeO_8uZ|MFxYCBjy931Ct%2d zTB9Td+T5CI4i`U-Qd*WNJ9uhnGGR_B+Zpjnpp&!Gn?ku3;J+?1Y9wbRDtwzx zayp8b0)sAPVuU$woc+=MH8RA9VQtNy;jHEcNr7+qW-9q~Hwhl^-l)w}Czj@bj6-k? zZdF-!vNuClyqLa0AN$o-DH-<0{Qm&8K*Gqyq~&{8J5dxVvswpa&zJW_S`!Qdx99$K zoeo-GEPS~6nzbz<-!cbXs($Tr&4gLGVgT4@=Rd>!+UjE)m^t}?>0I#s^5B8G5xONG+FU4%&OMBLcJJCA$dnDgpBDC$)Na!#I*nUO7x4 z?B!hl00SO4_hDXIGV$*{cUP@^GqiWqRTuBKzwrG#^{rvh+Yj*{Vc13z)eOIdLc%qZ zb5*#C3wVrsnKAPA;;YGlfWtM_eKb9qeqs&Ca=&tjox+mG!2er;^5>mPZj2ewSAyrX?+i_L{ll!Jz?W&9iVfJ|P!n^O0Tw` z3$nRh;j7xU8Kag3VsfMowc%bYkR-n^&Ff!Cwm&O^e`xJ~5MMdfZc5=5Pz}WO&p;Rd z0A~Ig`aw%K%CBD|{3^I}t4P~=kc z9ED~3%TmUt8<+0V$NkrN88e#=V8d{Rb+VNTz%JCBKid~Tmt)F zr)q`OOn?renY#zq6tS~sem2sa!YqWJEt`soyzRVlwL308Q__GOE?ToDE;(^UIhikiI0^30CZG`1A|D2z~%c>`ksF}xT6v#B}d)Kr+*G{ zwv*;g*~KnSM;ug16o!Qxety(QRE^lhFb8IAx5_$ExH99gsj*!yOM@8*8?6KqG2Wwz zj_iLAYM2a-wAvjqH5mlC+fkMB`tzEZfFCRJDdg-bRB$Q9qR2>g>+-EiipPL>S|o2V zmx^GIcgj0cdVsP65W<>>j26oLt@>1I3cD*dcGPmrLzWbUa-8#~(gk5O%nK^?t&7J} z%s|^*%*DLc#b()1dX7Z^g>G`x{{WU2aCr;Tp^Gio_-W`BT!$PQ&QnG6A>*7epa&;= ze5$nJ8D<#hDqk&_{Np=nQ#GcF%HdJJ+M!q!z#lTwHN4E*vMNPcJiW|#T5%3QvoheB z4(zwfS5XbkDmbLmxG2|ikl+iF}OKneMptcRg- zf`m$N8wT9fK(5Zcu~wvF?7uE?Qr~gK4c@MskIS~CBy3VDw4e`{_-Kilh7W3@7KGrO zo@w#?=Qzbc0>1{F0YR1KrqLc4MmX(N9f5nhkpRWLMNBXTM->XG#(Pnbf$Kx}h}>38 zFx%FhADCH^QH*h#LoNqnBP9!QwDc7?v&(0-#6Xc z_h^C$q9Q!7RT?6H=^Rk2>gHM9!4ux7!g`2hmHHk!f- z^*5$-GR3ek4~^8ZM$;}Efm;`ris;1rtz7C$P|-=)WRb{7C*{Ld?XQ~v#xecs z%qf~tCwZ8hm##51VNf^S{PF2EMzYycWB&8*X4R&IiAz-W9DkuBO;Z zoV6}~Tici#LkgDt$MJ5!-TiA+PP>PtCX1jYcW0GPtDmiwnQ+Gq~)#H%RV8*`sp@+~2wxsh%XPi%K8f5N?sL%C>|?4##c z{!yLQMt*4V>0HzvSdU_oM{3)$ zI~hXt#c)a7?~2gq(Kab%JbF?-K+J=u<5l4@9)9jS8j*f&r2bT+p>YE47$TgZrhu6_ z&Id{zSzK|q(xKjW7426T4#cFk2Rm^}M)A1tMLAS3D}sFuL-V?YBd7AK6SaI-SvQ_g=Zde(g8$tyf7ouiS` zw6+ye7!rMZ53OX}N@8$A?G4;@t9uzsv0VQ2e53{)dsI(u#E!sqskSZz_}hx9a$0Y_ z&>V_MobqK`qTG58;;6E^5Eu+~&w91@TMXD9{8?+*Yu)%qL+cjT#UpUfi&*V(u?1_t3D}jw^odQ1LS% zDmoMCSTfn--*j!u5%TuH^sUl4=dplUt{*G^0P3ni7`u#vBL4v6wYM#*!G*W^9lHJ% zl_k0*!BtW-*EO_GDvk1$B$1NkVU*!9$zIjpcz)(6BsR+~azh5&f%G-!i#(A^&fhW5 z0QRnfNtbQ#B!yBl?TX%-?s&M^T^{EZ)wE;FV0VF@7mg{>&phynyt16*1YrI(LJOd# zI9veaaqU~Af{I6ewO3mnOjU`j-KDrsIPusT?qgUZUIzme=hkpb=7$IUS?AWf$o^|k z;B$(X@fQ|Vm(7g-0JEBe0kBFr&sx6G6;KdQ?&QhwmP=?W1#$d1KO~j5E5a91ir;0#``ljI(|f$xQQkjS_M1U0vA% z)s?ww;byyF<(Y89rhO|*gtoC2!^vd>ZcaLS)=Qb93MuMR4v-A#<7x4c7y3z z@yIrD(fU=GkPPOuj^b+C2=K!+yIJ-P-9>p%jjs)q;S_(Z&ItCeQy~nDx!4xG&&DvU z*15NBqBbpq+@7C}ZOd~RqsC;nXWha>!I+DW`DZ^=W~`cyF}%(BSDmgqeXN?Up3 zkr))%bIpDlTJF08i80RC@RwP$4JX!Mk`hSI8 zw~po+Ov=Naih6tgG`Wbet}bGcmPTAQNUJL}k+?vgC-L_yRH2ADCPDJC>sq$<{!wN_ zkb71Uk}4XO;*s8H+h)K;Xl_(O$6bs^LF|yr1E@mP;6fyF1tn@Hv z%pN9%<(@z|JGR#lioR;Z-zz8gtI#}5>~6$}2E=ZCNv}Sb!!^iP{x8y+X9Y#6av4@Z zlo`WTCb77{!{tXk4Qk}Y=0zH)!K}?^nEnPN`L5@`bJ-a`JBP{3f3Yy}~$V!{Z^o?&{}m`V8uAwwPI@;ZMx8 zu$a|WW*GUq)>Wej;f*ezY6JMG?ORV1ZN!cDYo4Pk?3?!&w$sL{7cBi2wCtjhtz$-q z0YCBT=B<$LP>IJ{>~y(j@-ZrGR6A8`&zsaDjZ0-BMclaCT@9!vK`wWw^{iBv%Nyi5 z-PimpLc)ATNQi}gnfuj*hfVZm+D#;qF)88xNnxAVdVus!nI+Sg$lJ%n{;fa+OmT?xq1l;$ibRAvI{Oa z-HNXhEKw@-sbhECG51YoKWHlXhD2h1TC%InD=B_{Abc~>-|OOU&oNJ$?q z+P`k!Dy+O#V`nT^?wXaGbOU$Fe}f z7#o#EQ`M4NolathD!m8$wO3EMF>GBy$!uWm{v%$`HTFE&M^j~Hl3mcoH$Pu$xRSFc z&OTK8-`*9Q3w@t26YyJ)dbb1&=w4YlViGm1^a*ibt6L04K||W~N0%)s8_5ER1lUcQvtLJSfb`!nfW30D8Im zHF+awr~TV2f52P)s@a+a{oIfpp?+%42@OEswN#dEolo9s-?W7h0=d8#6~P*xaN*kDGM~+$4)C3o{eVPOKPg$6BiyU92O` zSu5OjqULi(efs7ys&=Rq@_)rMmOEdPes5a(-sOR}eD)Rccf~i^bR%KJfRfA5f3sB^ zbuyndkDlUKWk}_O?%S3B0D)Hv;}Iy0@>X1Z)vrK}BSc|teqG<)t}n$F@!IL_aXa8B zErzbVGgq=adZ*2Lj`qDW%(&n3{{XvHZ4pF|L0=jNq}(;MA*70pv~qv1Cowu%59CEpQUpnKJT z6iArjv8|ZPjh}UD!?KcwEa!L3E18oNc6xj*D&l3@wX+{AxUO{_qm5rb?AJl2<}Jm# zed^7ja-B7<8I;POD%W*qKbr`a6O#4FSx5GWgme6e)zsMA$7rmvbUyXRAxm>&G4pO6 z>qrI!IO$nXl!*Z!Fm7vVHU=E0-2S!4C8@l36v)t@_D|lgR`_Jn{kk`I*roaZ0Cv1~ z;hb{Ab9+~J&}*>AU!AJ3E`u_|LXtaQ5h`zb-1f0?bq{+*CF)J6Xo~=N~bt z+157Q>s{(+qYW8Y#se~r6jC7A1xWF!49ifWuv~T9TSV5{YDpM#@~{2$)czYRdekw@ z%A^7F8dg?cyV`=GYiJnV$f~jf9Dr@gn!ACuMryPCqyyTR(9bX^3;zIo*Udi}49#p( zACq$(@BBk&_}9`sGbN<4g$g$gf4f=D*%;5^K244?S)?PLa%;!@ zb^*2k{JXiz{{XZ7+V&;55`O4>thuis_<*+%Y4bY;eVqRQ-&I&&jPY?2k>OK}DzNpc zl0h8L8JRxs-9D7XnUu%7l3R~#)zLHDL?MuEDPE=3`A#^uaq-)MaJU<`{{TAGmJcyN zR^1}CQi^qq{KqZ)RjGuQ)+ufGBd^{3D5)VwT|yBIGHfHK-m6y9nM+{oh<^|Fs=NVK zFFn^XxA6MZvqqC5%gQ$Iy0w=z*{>;XF)GSce~5Ig8z-HiDunIsDwU{n^Ps^>)V5g` zK^y$Lo91eF_eiK|Su@1|T>Qhg`>C+RP^NgMX}EN1?2E*UEjrdo{hLO*}-(s=Ht1 zu6nj27dq`And8{+(Z1=fzQ$QttaJU!;;hP`{{W#^XO~4I*Qc#{bxonOH|^d4 zxlfrzUV*&Q)q$r-zv^ZDE2_4D;bdRBwS<{zU6F-$Rv50I!ExhShYGyD-fNxO%rZOm zuFt`i@g}Pa?cg4Jaapr!Z&U59B!Q({fOE$`@G5NQb2_z0rA{W(;|MmYjw)$J*Jm}~ z7w(>#*vVn@{VGZK81c57B85%VhCzcK?rQ2kvT01BTc`Up#h>NF3Q_l)cip8c8*&$G z3W*7hPc}i3_i8wiLl!6Q)1fkSAH!9nR#~$rS|;OhN2zsD_+q~;eEac?J85@OqJk7I z;@^1}`@nkF&@Cq1ZTq$J&&E;yg%c8f`l|)*tGT)LtBdGkUt{6zcXAU9ZbJKt`R7oE z+RIRL82#aG&&OK&7g}j#OS83iDJSOi{{Z%D!LP1ujE^@Gk;2!dO!8|OMj`e zYyG9FkXI9^Xp%`Ymu=O~=V*?hp%TcEGRjqU{{S6Ku}QahYNzLZ;3yeU z*0t@=l^TipT8AwNaA!%UTz=?A{N#Mqy{Dfs)+QMnyVoZL#6%XxHvQ3Cx_rB%XD9vx zSX7y5UEJ=Vc((Zo!v6qzv~8rhSx_kb(^om9Tq%$x$MJWr^3{Bh#Ehw~3C_bz(M|2N zq1#&`B{(OXipBZ7rN{8q-#oBQygz#7xU5cNU%U5BYyRmYF7V%zRt$3}Q=h$E z7lhH}*6qq*1aRE8K40Sd)hKjUr`;Mu#@2};J90Nw^liU4O3u=4;W}JL`0%+u-8FN_ zl%1oR?uWvAP_=|;%N3E^r)qdRfD2K$3cFdcRb7DC(fp>ghcL^&VrR-D?$vgnTG0N>6~yWH6gLcH@C_6mZXG~7-RQpH34>Q+$p#l{{Yx(jzH!R6X*W(?v}5e z{yZ>U0hr}JV7r(7@AALhuc68q#_icrUpstrn&Esr&uzJ*GNF;U+5((l=a%H>k4maa z(z%W!Sf8A}GFXkrn#be|y9@j#ywwqJHxjPZ~a(D1dE;*1mZncANCa)Rrb|H@vAl}IZgz^2-TcNmUzAlFM^IZWy;J4? z0D)DuA}|2xde=KvVouD}wUovDKY!&~*S2eaEw%!O{hzvPEGsIf-DRx-8ziYBZBo6f z4b0TL7NwHnEuLC@%iH_a)LJxa4pBZ@z=BjVnHT-m{{Vp2?T~wfB~EsBtf$OeV%gQ{ z$uu_1-`?8Qza7?aKfPEMlS>?1PTiH!+w5r3x{BkGdluqW*rc}tuSTV#+<)Ld?A17k zL9vcU@YSRaenwn{`?bp`y}|$%Mt1X03);KihA%Ssh9``GtlWdw<@B#SNtMYzFbneT zuJhrm?eRUhi9nD#;hDNA;kf?s2Na-bPvbu3ix?6_+r6o7aLlqV-8D6wYxYIT^{THE zBQviHUW&QwQctNAi?pv4@Kw)Et4$ytP}373xS-UKh6b3bOJGtUApGAoJr$YvEjbe< zpvHHNlmSq@m`)e(Rk;Y=&&^cdYO<=WBsl0r8DpN+@sI60m^4^s0#7&2`3!u7MqRF4 ze+ccL@vpQ|K#czY4lCpD+GM!!yUA`hxtb6H+^XL(^cCyPCeIFd``>!3+qwu` zNVpE$YdibH=2kRfZtcu2tc<0F_E8@ z>vF?l%FS@UkNN%@$c53jWBcEC`?aHH+x}c|8nJ4|e2nN@4tIQ}CH*UI)d2w&_W~=O zMR9MjwyE95-{IX|Hk%r>eMoWt0FPHKU4iU$b}##ZZJoc?wJidr#sd7U81vKGC+3 z&6*s2D!C+#{n9GL0hSogL5i&*36ov6vOPqCLL^mV!!1IQE)}VJ5W^XwHI6@-PTFP0 z=NID%qql)lKbk|^{{UvMi@a$xSDKNIShnnMz5G@6XN@E-?n{uhg``>z@4DAuvzdF;FMu&0RxPj8R)|;PG zajw2r9k~AX+K)a|>g&0xcy5L_?W*2uGld*xw1O%I&9sq7%(1rC?_Gz4uD;8u+q$;W zWlVP6h84hDh1%ObR;&7KlO^158DLQ7KknB>IWL4&p?Yl}qt{H6K!q1*#(&3!q1$pm?)F@*guQl|PrFfs0)cDzt@UG%G{7)=o@7o^S zHtZ{L&-+Hczpyc>1Mb(v{{RoJ(%Z(CaL6|K&yKryHGP+2=yT7_T@*}ab@t?-!Q@q> zR`UL3{{VKW+DN7m^K(+Y(k{gxcvkT_=7{bGmK1&7l~^8|PbalSbomIK>0*B+)mZb>XvAN#uyBi`?Q>|v6S_8Bl8(PPL&)C%KM7#qsayr zGB(#08bh^rXLdh2Co-0T$U=ZYZPhGI<~9MUZ7D3-;I&H!-8lQlr9ir9SaeWIC(DW( z&0*#CsTniW{M8UiK3(53)xq0w@{1rla^rAHczo?x`ckxen1)}Ks6YlgVu!h$WKFTb z;;T4p{{XbLBcro!?MSMfeJUJ_<|0M|A%#6LoWDvosAcAu_-<%!=468?c8ZIJH0YG8 zt74=L&O+jd$59RW6_nF*%*^AhOXZmdJW>T2%2CVE(hO>=H)>J}wpi4`T10c))My)p zb^EmWOBlsS%dI(Bj*Gc{sb)qgnnlWmJr=2G$$=Zj%kz5GIY${hW~`F^4Kigcm=y&a z{Olsf@m34t&Hn&v`?bF~V2q5sFWszfEVFLt!m(zMf+B2!PTrLOEw_I`S_CX(FU@#| zkNzMhg_d~${mePZ2c`yke@f0zQ=K$IP|x3?H?QfgQw! zkjRm%6v6)hSVwKAqkVYAdq;%7XwL!olK5C#U9=OF-WEaCeUE>_vtH@#*5UkBCCxZH zA4yC%vntduO68gv2H)#YS>FAsG~F5yYo%-@8(;ng0L* zrB)2z?5#=w2j?FtsgoR0U1J1pU*Vudxbf7~$g#L6oKg{iwupwrVRjBF2-(RT8kLs= z=}!t8I+BJ6*?`(`tJ0$#$sH<4fm4z`?KB{cLQPi0glxyzNgXKUhGH>J zA=E|2;sB^NVfhs}I~zEp&Orl=(rR>khk)SmN-==VNI6!`DyraeSPFqeUY|-pK^%0bOqpY~zEeyL zbMl(goZO#s435*>q)VA$IXhNYC_6*4!m}(n~&X=Zk4BU#5V5Li*q3? z7aw+_3sM|xK_e@EHJ>6oWFNayyJzI@Ob38E5lW*1x(}2nQB(Lcz0vQmYJ=$6Bdw%vYWXsrsA)&1z9H7e~k4saGWlZW^m7C;ebN zcdJN_$Ag~r5{WKE5lW@}vNKYmW9IEsc_?y6Q9ws1h~*ekPtA(VyOYdhTGF{_ z{?5c6Ynh%@41z7e!)Bsjw==aCHuf^^J$hG}$_$OUeroS^Dc(6R#6x3SmBnTxkj23yZCDt@eOlW&+zR04X1h2d zRbM7Cxogj~Yq4v4<;C-6y++9hJGX8B0A$jWkeaeHWUz^MFbqAb$o?V+hfJO*k(NmY z-}~ymgG*#1%u~6$*MNLYo@iinz;Xu}{u-%CiiEE;eo1)GQJ+!QZVcO_+aXgP-Juyi zUY~_>?SRXZxd7uG{a&7=Y>2FX*?{hIWkeQ!3U z$b6;R%-ni6UDcg?6JA_=pDB;!sV7MHoPuf}Bg~a&mQ8{@pZ>ijwI%L(PmNOMD^`wQ zl_SG$UK@{E^NW3PV`PaK#3cL0M<0!P$BAZ}QAwlNJfBwd>BV^kou;0el$NZ1RQreS z@m`HIta6ppMBSi*zm4u>SynrQN*a(OnA5fB{!$!7lm zYtxGF;+|h5J1*Aa0e^%2n)C4%x$NN=x_Ta!s$9!_vCgu_|Nk6uFp=k%LAP4 zKQGd_9X1D@1hO{8AA9Ltj+EBON<}6&dRLVw@1f`;r9dP*2>fUY4499dwG2c?OlaR) zaaRW`+Os+nRxB8{jnDI+Zk4zb+&Bi1n!SC5 zuj4{#vK&3(OR!Q3;EI5q-FnrXl6~esg+nJFF*{8zrgI>gMobW;&!D6ve-OhF`BJmG zw!zLSxpq=aolQG3G$=f+^0wX=`PFqGhH!a2@m6y2FQBT#q+pz2no%a8oA$^7G6!l*DtyD5Zs2Wwib1wPfzVT?`4j+nH3r6-R8l}hJo}GI+B=xfa<?#zj+j#^#YuSoIj9D&|tTR#_vqMj#gB>zd6; zJmKbNYmSw1k=U1)_;?Hd0M@FzP7Vh(q$3*~#LMabJh?Uqm{n#BlA9{ggO{gImY@B^6{{WX5 zxE6AdJ^Nyz@`bZXh(UhGwREdo!bU~GmR2b*8yk|`~^CxVv&>b^I#aUuJ(cA1wTdjGn~$ znu(iaU>LmpofF!%kEy|07e}`EWzFm>bo`VUImUB}>`p{n4z=UH4b|17TWHjc-0bAz z>t3*;=gjhV{_VN^Yh%NlIbE5hX07Ldt+^|+G{>z9Ho^GJ?dr!QA-@vW91C7q5MKKXIR!hDsPx}J;i09^4|)($6WSW zxpG!Pl&a~Uuo z*x6wRegjgFNdMN$w+*yxI0CNQIW3&^sEZ&ng&v z!o5`2qRRWzfAEg==Kdj`*!BeXKGkGO);y9y88SFb4#OSlgYG32Q?FC+TDqh=WCAbs z58u8;W?Gb&1`tAzTCP)?}TB^KYj$f$uHK7!v%NZg> z{yuj904nEu6*FGbWUu7T+xLCmeqY9{TsN63LOw!zmHz-{vaIBaH{6cGJZ;!|eQRMt zODCHbRUIoQ5avUnjK?@#`6uNiPH|g_ZwzW2^f@(|r}+UHv4VQ$t;Z}cGlzWnc;dNc z%SO}!BjxRGeJVSUre%!3&AaY;)p;(mHpG~a4x*_;ZF4@M6!Kx?Prj}EL(-{x+Kw$; z`v>8%`!<^mv2u1N0QTMJE7sQ-$ra)s3@;vRi-q}v?HKE@dj2);(v<;KI#-=lYJCPC zS4gNM$t({v@WldCP{!CT!K8TITYvEMtfX2+l?1A{YMoe>!1;F6EUH(UjCqO)0~Il` zq;0XM8{r9%^G%Oo7z3q25|&@~smuP>YDYcE{L-w*YL(@~i)oJC>VVaURpHycSG{2z z5+IK}Q!{SI%|0wL{jBW)Lwwl&EcdTHAr?*Fdv|*8JYrd|Tgl)SKZS5;s}zOM{MqMs zb3|ltPgYGex;O+JIjo&l-7W3h$lLfhHL$FbLfgNGwNblMExVql1Msb|^VH+3q4N)k zt>YI4Lniq%-?92vBCLq2X53j$3H}}5{7rOTG~SwnG)lz_4xjAS3@RLNeZRc?R8lYDA2(l5)ON}Il= z8}`=C2*D(`eAL#_<%s?iZPm`hHmMcE8Knj^8BM+a0Q&WQ3zugSKLl`4e-%i)jkHT? z_LRuWvNd?Yh!0E<>3EK_ohO-33iFvIx1^;s$9!L#n}q`875V=CGI0LQ6g z$s2=x%2*rAR*jc|PYbu@?A1%%6yz|hhCh{h(8%6S!P2b9^2Ad+sicLACZ&8p-iMud z-|b^dlgK~3#?=+^#=h+Z*@hL%zgGSo)%Gup*iB<4yX1f~{oYo-Jl2xgZ&}WF?%VTr zs-qUpTth`$SOySEetdk({3>e?#PM56r?f9GmP(zc_;Zeiv@GQ)9G{u^Q|(ptB!lcy zy~6YdXlm%A9Zx<}K198OSZ6S2W2f;|Ip980$_JY3*^V<>I=nMA{Mlf3ws&sN%~+~K zh2J*EuU?w>Pc@e#ndFijCII%W^tg&AR)4woR~3(Mx-h_S4QSgg`8>H7368z9RNO)+ z)@FuA*)ikzeJQca6nZD7EF&c{{VOWs>-C5id!2tK!|^MHnP-`O*C6t6yDzTLMf4OWnHY5I-|O? z$0y3w%4rDPwFGUInl#_JzU_Ty@W;$BAvupAe6{jLjl_slGW^@REqzb$w&iAmJ9CjN zJmYI^$FZ!R#E#4s=g?D5!vSgy>{O`!8iqz-xhLgXPcc{J1LZZ*W_pn)j2Tfwovls- zJ5;Sf8@JtVqNFH7ed ze5>(JHkM+`^DJbk^jvXTQMJq}tq-5A>g z_fnxuE7li^Vi9Sw$gP%NyIoZ3T1SmpJx`dYQj!qdJM^rwvk5`b|-8O)g1{YnQ zbNs6r{7ASXO3VH|{LYX4+UYDoO_8)=RhM?^=b`c>jI0dEtNdTZTK4x%JYH5YiszCU zw-dntZ#8nlx=VlFM2-$Y9jlg!0z?{dzjw=Bc9({OZpDs2;jCnWDkj#SBl)3mfCpOa zEuBM`ZlB$*Hps*d;7=9SX+%vgk^DSuYUQZ93!%|PAv>35L9IAs^KI2vwPnU07A)ND ztvh8`UOrR(>gBbxHH#g&0_X2nqx?I%*{H2 zNf)~Eu@TB%4TOS|99b{PFh5rE1f8bT-UOE!TX)e^> z$L0S3cD+h8^EO8R05aE`c=iCge2^sDB5JBfm09Y1>nK=qV_ZJ(!M$@#k)4X93U~F% zr^XdrBc03`;-u*&KI?yay*RmA=N`8vf+*A#oc#Uv*3g<13lxvFJu5EWL~`+!+UPfX z(K@WZyk}G`PT$O2Q#QuidNmk)S}sXm0qdrwbQj ze$G~zcJ0R<>EWdL7!0!Ys*&5i&B3rFtMG}T*pKsV`D$TIEzsDsmJ$Gd;;!y4z@@HvVeiAG+2Rl8)p;DCle@CNK*1`?cEItGrll)x-FH9nv^=V5j&y zH~UrDK_f;Aj&`+qRlJLWIxRjGNpmRYzJI-2z^m;|_yW0PGs?jF*0r>%m`COR0EW4& zJDN#6Q4+u1u7|?Y$u6;N97hWyg<@-sc%9{J^ZwO!UJbYMwfjBeI~{fopFe6%8c|xG zb!izIY+KLIftq#87Jc8{q_D$j$WVOrl97|2mA{KM-wl!KEs76@=lD$x5)xbZsW!O5 zW$8=DJH4sPV&GI*o)_Gwc4{@+W_Jgu>HIuZi32VPHCSaAa9UMg*(TQ=81lL3#-_&^ zsG?nwv0+3}H^@QVSxF5dXye?Y{ja@WJ$zhjui3s}h%y|Xmw(O2<6lAl0IWItt6x8S zVnHQ~!3*G!NjrCa-oNhryQ@8M7JMI1&`WwVy zWI5k}Gs6D>7x!!D>zMqD`CNajJz08JvxG~O@vE&!79(#kkO1zT3GGc18NAKMuWw4x zw@Y|~3y0;$ddZ3*9HuZ?{{RlP)@8~)JjgNRyB+6idsWp|X^|6buj+q>p*WrvC^;W> zKl=2x3{u@7MA^6g`EOd6alqAzTX-H=2QnUqANSQtSgWe-+_jz_Fq@-Y&Ff9JnqN5X z8>^mC)DluPk|f^1F6STJ`^{R=lPU8P^ZxB+2Hb*V`|8!FZ*m>{q}rvwhPkRzkf2X) z;vAcX%Qwqig_Bya0e(`|$1R(^z}zy+_kX)xC9=w=YxN)a?Q=ge?#`YFgowp>0=t_7 zAb}3-@zS{6H+;?@jORT~b{0`cnSd@;e(iG2YDCeq9PWQ~Mr!chLLVz`+NW&}Tj(oF z+=4M&z%^ow{H1pL*G1uoWsg>gSLar0=cR?27%}3y9}5N=t*mMCVB`J+P?+faXWYIW zL>e`?#u*T0cW&EO%gDL%&*f0)L1NONNXEnnHjlmX)xdzVk~Y_&4UchbRF)uqW&SFS zzHgKr`)dCH)~TwjQf)lbRT)UGq%&+@qMYET9jUt(H_0C@ST3r+bo|vE>{GT(Na zAw$mUU;y>|t^)6= z0L9m*-S1yMd}g+S??h;>epupTCsMd5IO$s`>#3b-XwS{R87M_$PxYzuH`o1^uRgbF z9X$C!5B__ivjlkSf7>*3X+c@y}GQM192%y9hGwUc=P zPw{XnG(=~0JnipM#v>{f{#IJt#j?bR&%e$4%hH-QTWl@&PhHh3${EV9@nVT%Hwf(O zhF|=5Z2*lFbWM^f{Ehlm$k|+CKll}9LK&^2jXq+(-m8k6mB-!V@vdn^Ry5&vjawhX zS8OD7EMMkd_Ny)vFieh{m1|NNLOVo1hO=?^MQa+6&dVX#xn`})BP32XkCINUT-}Ph zy4?ib?7uB_P(Df$n*jdxWwE3sW1@{EjxeX@^jhldZXQc?GOpJj!~N>#BU1Pgw@>{B zx*KL#mwOHSep>U|3GQm7YbVU37^^XFBMdlNhTJsKoDRRmQ#6ShqPNV$<=tGBE;tdN zG``M)y%XWfrIx)M#c*5YS08(J?kj`al?7C?t#{uHTmC8~kSJx1cQ$!np`oU2hur&m z)6N!=NiNVx+;-G^xh}%4Tg4+T0MmC=Zeo{7Ve-A zn!R_qNpK$2@7koEpIXWrnYmnrO7bHccH8+#x07i|sZV&$e zeO5JBQ#H(W5V94B1M+_oxBmbYT4Dr@uHTuf2HHh{`FncTU2d)Reayc&t{KY4au}sH zDf`rnm}PkLh3!`3h4(3{(>YmiK3sOLJC_t!ndFit{ucDFX828*Z{jl?sZ+miMo<3$ zYP?)U9EZ4S_Fsj>J^uifjkK>{;`wV@OO>5?e~9}Y8?Ep}QFfxLsQ&|A~Am>+xb$jxf_uG&?Ex+erzk9-f- z;e%6?Nt#R{+uZZp{i^y$Sho|~I&Iy@HT1X{^HWUx(=ny&>$smaX%qdA z#Flc({!_;~lq>uvJ40978bhtZ2_kQqhc)oGh|AdO(aef-8wURXd*-jLd<(6^d!k!^ z48#Qu{qL=JQaG9GcI>L^rM~T0mCy~@tQh1d=YMLuaWo>^aQouAVqqj%X_w5#dQ<%U z!(bb$8V%yzrfwCx(ka>w4$yw}R8t0yjv3Yx95>6}lTh&;g`8X6!jb;fc?XO>An9Hd zwt00+k#49zjlTBplvl+c5xzO<_u8lSABV`E%2a*wl+TzXO{#$8^nUoy(y*2yG2HqL zqlT+u^;$0M`;qcYQwRNq@1?{;>A(-J~kD$Tt zlj;ciR~)fU{^|8_;Mx#Yl$&SY_8$~93)_w9a*Pr7AH%MGmFh6-wo<_ysKcG7kKxa+ zrG8H6UI)}~VgCS$M!xSH=tP^2^pJi8{{R(pS052PdGO=JmfA(mt0Tvz50Mk+4j+-6 z_2BcI@zS-Yh;n8V;D|rr)VHboF&*NNbKb6HT0P3y0=`1{E%D0R$MMQ_2)@O030RI# z?#rHvpL_2L`l8Z*J$U(rb*Y~VkHF6lRnn@g(W(Og2_JT&GC6E*`DuzvhC@tP%uUGa zRm_h+m$`h9gN_A9h?x3R3{xJMrUne-%T~oWqT-2_wz0=bIXt%lnv7LS4vkSvtct6S zDr8zNCe~Ais6uV&NdYXm^s6!C23-BxaWils-L#SXB9$XhGQV}HjT7a89134Hh^3F>hl;^-xpO&0K z5Xz)3;@A~NcadTOFTGY=4=)7ts?OjX9t}**;%2$ptX;O&a+LsXKQ&pnW^%`OD^!(E zLJ`GfC1z~}shg=~;M^N(rfc9o+G>48^i8^Gc@kNX9yAPG{o}unOn$ZZ-lZDHV!(ID z%U=t8WtJ1ISz8Uq$(wWW@-sK^AADCl-I?|LClBAL9|CGV5!Qao_Q~uXIMG7y+QEMs z#L~4}t4D=HGAu4WbU!*C%%;A(@vn~UJP|d&*(~GKlHqn-z{deW_27<2WAd7xOw#-X z@k>TJw0d~cZeb4yD1kh`;sor#etmyBmrF~uexWH#s?hp#_HX#BW8&Q^KMtXP?JHRK zN|F+CfMd);es7<+J?rbZn|IHgX1_E)X1J|vyj^i-ATr-1efB5a^5yA}6mgH8bvFx=6A25C2j;0)D78DHc(X}dO%Ppv$}*aaz3H|^cphp^HZ z%yGEzDnB_>0CSptIAmeEff!~P7z;#1#8P+s-6&^ZHq)Kaa50S3TX{LBbW~dEIYAG$ zq*5|-){rh2a2Yg+J$lj1t~T|#B7?gfg-UX*^V3vea+K}aakytSboC;_`F!piVx&}N z`G-SIeD33=OA|8?M?qD8cpKDEtfy|;cphIJsT`2w9Vw(HTQpB`NMgjP^7D<|=-PL% zr+wUpA4-f8jB!dVx@16q396?k&F@wmy5ydQvt*J*+)qPSP`HxKI0NP8vfKm7r%K0w zJ5*0L(a&nbQev4_Py+2Ada8mjMNc6N0bjjY?3)W5)vJxGJCfvX`Khx8kYPvCp)G@+ zwPg}n2xIcKI1>~W?>s;Q+O{H?7}b~fx#p=vHsBGH+||YV+>8p7NS5K5x2`w?t!dk` z08f4^CN%BVtw5}EgN0mEj^ceyRGFKMRj4FGCP!M#icgRcR^dRdA2=eMB*NF+)JDi< z#Y(+1KIh%4@q@BA* z%UJr8C~%Q*d)Gykh;0L{V_aLK&dygou~;;Nm7Mgd%P3XtTwjQ-T&qZO7P~nhjLaK( z;<)X0=re5{D>WOM(}B0}{UmSnd3Y<(*QaVWYb*~8p_q}ya9wEKDNQ_2?AiHax zr8_faGlr7RB)VB5`CE5JuS?RA-VrRFE0;D3U(TFlFYwoCrx7KpFmd~RUwhQ&G}X7{>@Xk z5u4ek9oz1D=hN6w<-`uQ^6xLuW0fD*73f7DOv^J#=YXK~YRbHkB)5?n@yGD{Q|;}; zTPmaDXMbOYip)HVbZ`6X({ops+(jLO%_PaOUB31> zYV|!u%+|xn1cd$$fxp_XFxRA=?h-iyp&!70@B9niy6JhIeO7u_iDzvK!7ZDR`+k3M z-!I zH%i^@NuebJK6iS0abCCKyZdP(WwrU{Mfu&A*S2fTmQn$T<7qhQ-n$(l6oy1Z{nTsM zZ{FQr1~I!>_HgH^*|aTfwn@*;+;NKOY;G|crMTdHp!)r5&+U%ccx5%*XB}A z5O(#ZtXKr+fz2?L^E|d6DWQlA6n)WE$S9&FAPx==X^pguNHQpJqvi)Dp?MW>x%rQ; zY9$*OJBmV<$>5HaN=G1-J*sJ$xAEzUqOfd?b>pYwP6B9YV8;flG-2E$3b0TPKp^@a zxvHSPcXTI;BP1d+s~HIp$Q0>HF~{A=#%X2@F_Dj2t1N~s>UNi$;Cpr`dee0}aM;>sbUeN~?p&&TD$)7?i-^A@%EA z)blKUUAs18JcIPEh1}N3G*F3o#(vj3vb7I>mzW(w@Y$@iv8V-bzKk6O5FLzaeQh^%;1ybO+bssUul zBP`W4!r>-x2GD62%;21WdYVysm%!q(#WG92QhT zx|#%pVqvvvWWd_s=Rc(^iowPkAa<=e(3-F*R*TDF!0B8jv0$+*_csUR#dpXzp$azQ zxc>kUxsJ%&$skgC9{g6uc05B;mK4gvhatEfs**~@7tJ{yz0b80BMHeo^XX8S)H<+@ZjC`HIK7y!TM3Gyz_u+?8S}f#ad?5K_@As-2ibXb`Cnq>L!RH@J z=%*u^Z&T;n`L}B9*5k`T!O6)u=~yybl(~_RSFEudp`q(H%T;XRiVJ_*?(MASZl&0Q(7xdFHw(^dX3><)WFsg# z4!~9jfW{09&OTgLwwTO{(K*}`udQM5j>!5q;hV>8DP;NNe0~DHhf$OT$0S$H{{Re^ z%n)2fwKkqndwLJ8eJZV#T!1T%ac8@SOO&L^hxvNd*rHh?+U-@QaAYJeIHy2LAuYx$ z9ag64U6O>@0Q=adL@=IZHAWGggAjU9tX4gT<)wdgvC*>(vUIB{AD%jG zY33@gm{75=Qt^Z`-EX*0oreT}bPw*=lVGA9t&pc~@Ajx)5$DTWil$hkSC9DnQ8mh_ zV~je3#YSXgUBARWYOj3c!d~G<{B-YHC(3hGN6wx#xmop%h7T+`-SctNg5K50#*lfB zBzs$U+CRHp4~=dlTkX*ymoK+H`L0eIWkuf6h3?+XUqugvSo0;hr($?eYRa_n zTu6aGau*=_`ig?qcPyYp$~&L$RoiurGSa?4_oqJkI*6Kwwg zQ}XfH{{XvGEMIE5WBa$;ioBNsETm&_f1CaUzO@%+UqamCNVZ7{8~#+8ux20W3q_>ALAD{cCv7$gwCjHL8 zd;O}~XbsxL$Z+Z2qEFr~CWV|*%%WBpkp1o7-mL^=X`bD>)o+lm%GiE4Rf3@~T=L)D z>a~qc?v0^)9bbZ-VAW$We25?C#eKWs`ONxy$T|V?*TTLNm96emCu$cTK0k->uem%i zZi}ZPqh%Op<)stV!RmA|6;h?f2dz|*5?QxnBCNU~ZMnjVr{%nIGVb{eV=6~=iPW@V z41DdSE)U9ohM<5na+2RK`!x7h&5^fpL?S!rPE&RQcBisRr6c*VNdid;2enBfzWvR> zqHEp=tBv`iZ!Npjk`)Z9e}=0QwpEjLSu6|Up#@0toKK8xk?ozAjz22+%f#?3H|Jw; zZDy)nC)_v;}S2Nx~@vy?| zIIU3|I7LcC z6v4c>{LCpl{c3_pt3Q}msH=9-K^EAf8+iW!d;a>XikDGXo*QMBa+7`4Y^T28TIlX% zfHEW}AP=AA@BB4_CAH!uZLjJ4RdOi|ZWYt_UD~ph7E}?hXZxmS1FL-7zlyb5DcEma zp>fi(QQ<+f9s9mu8@*drcXi+V130L1lH7cV)UcJ&Hsm&aYo@eexue>{HHl&)l?19j zhRP{B7YA!^ACm%0e)vE!wpK?V1 z061#qtJtWcrdL{t(^?5D8mz6jj^(*4G9t)+_wdvuutN3CZr?0VOQ||Cpw8{vaY)h-pq<|}R9usvO0dqm zcv{XZaRU9A{{Xv4T~Qm%`Ljx!U6g_MYBnUXEWaw#=0M32_-~gPrbae=$L_5sl*#jB z3Teu|SKg$xBx5AZvKBqQQC~BBO^fX9FCQ-K{{Z9F^wT`1ChuP{{9W4%sge@@XYr4^ znDzdZRQj1!_)ncDjUI6(enDLKi5?lP+9=x_ROJ5vwf)-aWsOt?BP(2Yi3-O9MhE-m zx~R|IJbK5>`ogTbmy@?}EZcKcp^QMQ4ZiL_O24Yx+pX-5j#!`5Z>3}W(CxaB{IX8m z54v;Hb$gFpjsrp_GnNc?xo$qSBr+ip?^Z+3;C-sR5ty1mpPd_kDs*{nRJ-ln?s{UU zP`RaT98a0LZvGn9fjr59cHM)zv7vQVK4;IG+KO1z1m#N9Nf#4k_B>efzVGo>hyg$_ zn^^wtGCL_-m-Qnle&2`2x9nK>Vb? zcXtiz?WJ4Sof&YSz&zz4{Sx8_>pA-E{tFfE=>_iMM) z$V5%tGS?kNsZnP0nFPTB`B&DjS~&pk>MDYiAToT$rG{iPJaKcgulqZ{opV&!l^Zhi z%!D%Hy$j)sGV2kO^0S?v?2%q|6ic1X&APoC;q=P-takhGR}J`mYa7_>!|r{rX#iUk zecWS;umi^q)@;-^M9F0yf7Re~SMZ22+qHDGdQp*5ZHT>bQAX^;C#6X+QoE1KP!b1E zyIP~6qSJ2qcM5Sx!79!2tyX}sO}O1pMhm-bEliu`(1UWbCf;hqe>ckfQwPnr<@u?Q zK4jWkg~c&aWJXg4@9x)td{J0#t)&t@ouWO7-`FABz2{P559B$&-=CL zM*B03XlXzlceri2`HA(ViWq@*2d6(ZPQSg0N~*85EM8RKG5-K}ZEDrV-H76jRsR4; z1A2YjR=$?oq&Qq{s&GUAa2v1peQCC#p6AI$WmLxM&7t!hG-Y9CQq0WFRv>96Dr7$} zYM~T?HzIQD{qMb3El5@`x1Zu#h=k6D)R-R!?)%oQoQDVH&f3V1;Yx`bE)8nw?hfQZ zw5xQkS)(a$bE4B^l_cDLU;PTZyD5Z{7Insc?Q!o@UM{{V!-9ab0fRxOUdD|Bt$DOlPIQ|?_H?$cr0>G!I{(Js-q?+UA+Y?Dri zC#77NFfX3f-A*T_wkW$u=V@#KO_^0=T+-k%$osV%=w>Qae(h-)n$lznqC$f>rBcC~ zJaDx5lq7>AietXQLU6*OQCzn&lGep=WMF<@m1@j!v}(EOQOD+NV&8U}%<>=ZtvY3{ z!-@Hr8u|C){?*cMEwZX7W#yMYb-wTX3ciDjYd+Rm@L!6SUu(8t(gYDOe1CiWnw7aT zdLIh-s@~epCz>@=v3DO@`TG9=_o3$_XboROYp7aTcJu|8=I{RXcn+;I{k`pm-MhCp z93S^<)x$}}9ws72IJP$;IbU-B0JT%xhT{iv=W)mPsE2yDl-{2%YB-i?pECW;-1FAD z{h@>f@-|4NW!wJ%pw*;lVunXva@qC98iUzV7%J)(bkk9x(wc!(FHXyT2L6}NwSt=j}ymP7MaeYp=7 zcYVgIq1qW5RFCg}7ykfbSWZcr#OPv`j^+E+(CPkO&JOt8uW6dHdh{HD|?c;C#pCtI;mRTz%^1lCdJmGshOh8=AL#7rNtGwl^Ds z@7@0EEn>$R+nnOJ{4;eJzl^`|Fys5xnN*i6KIhQo^K|&bw0*73)t z!qN9ZS6?dG9V@aM9@I7>W@8{`KkU<3?mJiWsE$K_e|$7wg&Dv`L@@;gN}!BuL$_cZ$^(QTSFwEq2425mS6U>*me1S zYTY(vQ)BZ##%&^`Fhrc^JI`O2`?cq2+_Y0|E&Qv}{8x2kBx$6Rc0ak(4gUbySC}+k zympNIjnCb$Ukv@z$*FsmOsMFqA5U7Q(1^(|pO>{*ffZu|ZXdC!K{zCG2YTt1uc45( z!yy$4hWo%8m1BE$8^%%k`);Z`Rhb>vaUXx%(yy0Qe<~)!C_B`gfi$5`!pOkL- zt7gM$+!Wo8K2umtZ>XY~*;unin@2dVmefTeh=AJ7^H(*eq_UOA@Yh3Tf+-ZYcKg-m z$kqn3OEfE$>Gwrl3nYgQy=ej@teby_=BXuBl(H{X70XfT4V7h8iTtp673d!b?Id3k zeW;zjQ4HIU-coV*d)J<#1yZsjZsP^3(*763U&Jx+sA0)DZllph@l~7Q{xp5ZZ7aM; z>-R{ivlz=WFW%yrYO+UUlQVGLDUI@BdV^hYN3RXYPIvnXk|qI3BOa6xKw?Ef8yQDG zDvF|s9Fy|y#YC%?b0^Grslu*Cc~M9RU8i*ki7|`w9j$M?3Kqw}w`S0*Foe-(Ul`%CVNL^9l; z^mmzJ*x2E=HXL^?{55nRzM0QjPnDmX=U^nj+ra1C8l(pK2-&~ZoMZ% z%M!?6ou{rl*RtPMc_YArD4!=WsM?AB&!tnBb3jWH9e!Z7AypfhPC?)bumEVh$2rAE zCbuQ|8J4$fRb(Ro@mEksEQ(ldU%meT0;WmihYQsWNoeEGWIJ#Mc&zG#S901k-)ag@ zHrARjm2x>%tffYhNj_dj@pi4tR977QwJ}APZ6yByXJu+dG4k`}{KBZiY_bN+Z6DrW zytS!pBS{2X_-@sl_A~fR`vA95uHeHT-mSYLAe%CLz}G!#GDj}hnYjM-ZrdjES@{OJ zswZJU>@DIq69!GH%lB)cg5qG<$4`~3o6|PJiZg-yS^L$$0U1^oD5qUrFHF(<3 zAVZbin)YvlthYLx$notFsBHfLcow1`5z~kGkFruw$fPf7tDLf{ds2XWsKjTCed<<~ zF^LB_>s@X)J(PzBNVmUDxUUoO&bHFTLAU;Cdc7-Fy^hk&^4Rk$`K6d?TB-M`m&YOy9t@%L)5WIQr$aaLe|k&oS{&*oGk)PX~( z5XZY7m0-;p#~fsC%Y4+?JhWwyFD*=VSrKqKroHV8is)HL*hKMsyBqHR0C-d|MIwww zxFf4mU}i4K{6u`T@i~ek6sK&T`WO3D`Buh}M`7TdXlWiJwx6BKc=S_Wd)v%49XdOh zpL)6uYx8?fy8AucWRCo>?O&iD4sXt>;Ut)JP8G-dKf_+8Q&Q4!J~N3hnyI78JaKCh zOSOjL82S?c-qo8jzf;0`W0~h01vfQ(eEI;8Zi*I?IHvmi0O0w6VALq=_HQJSWSF^Pe01 zMbi8iqFrjbgo>$bn}E+QdH@0I&2Qe^2;r7{miwwt;67^j=f;}uh2jlK@9*x!`dzsB zd0cECJ_sM4D;l_sl0J(f%2j%)&0Z^W%5MBat^8Wn&Y`N$J++4J8}96lj_faE^L|yK z;!R(`egF>-h7~S#n2{{VF7Ib*rM-ap=I$}}6*pR?ie`z589W8FMK@w3GD)~RQ3R9eP9 zZz(X_{ZI0*7k?OdhgVr+mgZE3PnT$s_DBPN5Ih>+@UDQKE%8R3;oE6|XPlcyj4C={i6ZF+3M_t&%3WRQ1 ze|R#d_-L{}y2S6VX;0A7v`$~hHPUM0xIoN%gs14 zh9|hBD56&V*5SJp!dQi>rbd0A-l>v(tA`n@5c9B%JhYVeKtpUR^k&qvlGJ( zYxDQxtW(^0yHC(G_G2h>Cm%K!q57YezeR3s+SWNY^dMK~f5a_r!&>;70ydZxGX@ms6+xofd!iPA+ayw}Jyn$4s{vuhUCb&A#U0O@3$o z%6EExr{imeb(0b%V`0i5O#F}aZ{n}hg62Wx#y2Rai*HtbGsUg_ZO6$7n}*<9rAq)V z%OG8MwxQL`~npkx}7GRTA8mNW>$Pg)6xi-LiF zhM_DFsO?ip8AJ7^Hr%cSS14GK3Ms<(^`$>6{iXy`82v8z}P4e3t_VGx{ z8I%K>BmV23!kj<`PfB6N2sH78dRU6(w+^&&fQ4|NVw$lC#sH}plgDa|=OdmfKytdq zq?(HvJaL*y8z3r-;+wg<@jwHT1~EWztMgHoVS~*e2O0FB2C5z@e&ZbTLlVOaP@r^E zyOyeH6&ns$+%UbWVxTIVQz4KX@$(w9kZ=!bn`#eD2+%e%dQ`hcH&Ybzj>4o;T=Ckf zB$7E$6p@-R=1<-5MMmFy29;YSkJ7Y(q*c*irIyguy39Av7 z4T9Y&EyOWUIu1SRblS=Y`_w^_nRX}Jf<|jeO0uru_iH{7SNDg2wLC6e0mn4n!5HXY z!YJv1Q^pYh*_<_0QZT>7Ds{q~)L5jfSytQorT+l-YSK7Nj=8Gn56sf^G~|eRnf?)4 zjJ0gWMLS#WoL0;`o7%HsWp9-S%U0w0Ml;fg=qYN8tjw$P^Hu(38O2yeQn&*YI;r5* ztx21+As;bc?$iPd2+|ntSay2zk;)T-HuxuPdKdZTn=XACPIGcZnfv$CL$z9kEehB zwR%LcIcJgnVAxvo?-jrhE`Ncztk&aaS@7!Wa13%M$bMm7)hvwBD}*JN{smt>_zC7) z)f@5rHT0Br;b8=DO=&?kbIwU>aGJ~_L^vI*&F(EFi*$jxuWY^3%=39e=B__d(F(Jw zvk<*1Dn!x}Ph-j*r81-lH*Rm5x|?m0#rw`SR%6-RTV0*$w{P91-d!7eHaOhX%+l&@ zC^OFdZQ>h?caj+9#A-I}`u_m6UzuMVHG8>k3|sjQcV%|A#6N%QpVGeG_=Tv;9lV8q0KVzOU402$v%18S(e9b&fv3~dQHFZTEyJnO&@euLBh2xK#y>izq zrO0x)PT$tG;3*yE>AA=`u5#@fY1%`AgS&cG(5LSiN&BW2rF#*K+XQ0I_ey-MzwK9& z_@Z}~{@TVlJeNVk9<7@6japQNw?G^3f8SN-+TFQpi0`LQHOAEky5_waG1lh=eNFu| zOkw*hZ{`QvysuAxmc4^Z)1w+ zk_(Z=bUI89(@DGJkFU#KUHTnV)`rAViNfy~&*@jzMTxPrimnwSI0p+>Ww#PUhz{+Z zo$HmW9dRwhLW3gmPg-o#ZVQ3){{Skh4)}o$^5&xxNW*M@KRlm7PeG(;MJDX!u~y@C zRp*+`RaDwo68^O;E<%9Z)!N#LtCQi|jBWHZ!Sb%z2TF;WLgSom=}au4%M+Z{lklNN z2PEeQ^s16PY{w&&t4=ql0ALEveu@xsDr`mhnCRtFFa~q_QcM`I3r+~}Kg=vZF zjOK_(Q8)~LIovF#wgILtrs;I%5%j&O>9ftuW}?u!8^P2$g2Ke zxR9f+K7ys0%S(;jKPsgho?M}iO#IbxchJv}E^XNeWH?Vs&zK#>)v}+hYRw|dghP{) z->qi2J9h2bJ^8JnE{1YeA`E0uF~F)U{XxjZSY?nV5b@rlQoB`g#b`@JazaZfW(7#? z+N(+f4VmC~tM0f$6!gVb+IS3br}U(mf@Lz8be-57{Gg7!_B9mBz#XSMbI+wco+#L} zA;R(aRaj4$`@Ziz`_-qZoRhIeSVV*}9mH^d`t^}Lzn3b^xeTYTaaxR#MR3TCpI>UN zH0`)J8NlN`4Qm(5V>p@qTFj?;GN0mO*Yd2JxZ(RroPbaO207{8wUvUYbsUqA{x#DHT<4M~e`l3|xR5IzNcF6VUTEAZz7+AZ{3~p^^W9{OlwZ1Y#dFdh?v1QE zX1b}RxyLe;*5V|NB1u^Llat4-QM!YBG~BFs{Etf5h7;uZgzaB`=Bm1>4UzY|pXG|^ ziah#;Zkq7@ts-{XxF;j{&!u|*0EgZwVDlnkBRLxguN(3m9!810r%rg{yPpGUpKF;d zCdZeIjC!f6JgV?_J^RCu5}+d&b?b6qA-X!z^fN3u^?^0p5xM>^Rk#@lj}+{xfe40&8?DtQP!Ox^AGM%%0)uq zcMJeQLB78JwOi(miEaV!nxZeD090@5j+pkM7X+6hVSe4|sLi)v`sShzOkQfQB#=4u zY5-_iNCx2Gzd@YRi9D#o+otSxsMmJiC=6uh*YT;=BCG3)exM|iGoULT+;%m=Uf8Nn zE!y$soSN@0401=ix`SMe>nQ!v9R_pSg`?08d059T-KWYpq0%){R04CrsgWa;2&CYi z^s&br1j1YKG}G=*q#H`dxUNa+Jt~yU=^~X}11b&cKM40?LiG|I3pPJfjVA-f;{ z(B!-;e=YsIiE$G}<$;28h91QAuCfVtqzNR+N@JsujvfN!+n7(eH_N=RU6fW(AeQRS`ww^1J z`Q8}jvV^}V#{<4abU@&1Tb8{405T=#?)IuOMy(U=IXLE|ZL#oro_cXjy#^~r2z<6Z z2(44GgrInrivG)IaIV1b#w7kN{)Zi_he_cfw#CyJ{_j6g$Ms9+s8x=oXcdaO-9K$SS zl<);|P5Z?wBw4jPkDU+iB2UjXs}1B%rFP?GQnG~G!qI_@{{V8VM+n0>jhrV_SUYtY zExaNT_J;hutD&@#_3hN5K3ji#sH|&1ts6K@k4}}N6!#d)4=op_dg8OGYic;|Pd4Q| zKkq$#4JD&YBT;hLxZt@R%_Y!{Hc2K){%5sGYjJG%hSpXeXkdSL-;ZBU$E{%Q!aJWu z{4%;pGSG3cfIm~seIX9<3X*v>^6$dia&Li77CzlS{e0Kd2*Gjm70Ea=-JreFStHoM z1Ig=BLWS24&{Gs;fofK8d0&>YY}p~{+%Me?Qh;;oP=yC*+fP;?oz#>WY4#)_t~UIm zy;<6dpL;CTO9bIZLsNXkL#f8vCH$kYW+;Rpc}1`YsRICZo@ug&ARfY@ zy$F(BPYUs7o-LB#%{gRlasGc=@%Yvh1~oWUuV3;10GTBJ04wcP&V6gd<&$#0dLs{- zsym!B+@?}SnV6D`AKmw=Q_hVrX_K$;`qtCNE@D!QK9xO8q_bg^xlXpa?m!chorM|#843Rlp1ta1tX1?hAwerE zgU9gI>tZ~!9O$t!ecHyd^VEHzhE}xf5-X`_S>iO+F^^v|Dsfx$^G+0Cu@7 zR81#&R4wEY`H24jD=(#K*(|0#(Y;~EaXe}e9EEH*`?aqOo>Knj0H2r&=XYhB%#M+( zx6illQy~!vh1{&e{3;kFl2~{A$^GH})hUVO+aq%qTF=zDo$rSxgx$uxc|?Fe7O%BD zE`}{87)SiGRTc2RhbM#kMQzINjYjT1^?k?TaOX>gMLaSO_zg;Dsew%$D{R_w{{S^L zSIi-E#YQ6;Z{lH1+*J%?_-ik;cOqSihvnv&sL?l@)oLO#ij^XO-y=U2rOQQ#re_~0 z`A7GvSxJ*`W~j?56+!n_r3|t-PJ*&>_lD6NNy@QYid=btwtTp$Fk)qed8r~(6SnR# zQbhMTZxms4*&~`g;n0uLzBAXYW=n~Su1N3qvtMXq1Me_j zo90^Gd`A^kW^s@@!z#u`+}1v`z2bC$V4U+?t$32Sl?TcEEnN1e=Y5)a6Yk=-qaJA- zQ&v7v@uj`=cfVwqvm&;3Dc$#)p|gp^U%NY52YTJtEuKwD<(^=S8*e>pAUBryLL^5! zn;yQk>C;b?^X0vbI~XEp#mkYr@q_$TVmaf5z$0+=+x+W33ClS{8wF9E_N(@>?-F^3 zDu0!1N|m=Hx0PP&dZruh{VP&vC7yW9ZLv|ie-%-JIBkYwZQCl`5{SN2CIfZvS=4CK z8Jk;<10HIeL+v--vrN7%< z;*KT6VY9m&R{RSrr)D`{{g$#k;;x(9%l;j;(^{jT6Mqgri{+(z6&8(XRkj5C?de-E zK@@GiG51G5TEU8NtPG8_KljaSS!@W~56)|rt3h*Pc)AK?ZHN2SZa5M$?#Fk%P>EI` zrcdFmJjDtL7;fGCRnIRYT4jbIV^a-%8}PlSXu=Lx?|k3GUou522NDssHRisQ_(<~^ zRj~{MA?zYN^C)i z!TYqrRt4QF{HClz@v^qhy-~<81*2?^H&m)x5*ya5ZFhaEPGS|6M-({d4HjNW8)$lF zT2{etyG;X}zeFdS#^9<|8pi?-55k^V-`-|u3#uWl~$ zw$%fdZ{j!=&uXe)O_-}vGx8M){L#W=i(9b4fom}^v^tAQsnGa`?wWdS9GRl zKQCch7xxoOs7!|jH2cl|-DVG+_oDQ#bn>}L(1M0nKR--=v+q(wfiWzZR2_$Ztwb&6 zjZCsI*gg90q9wXnW0f(4_4&4sWv6hAY|9p?@kJz<-`!i#AIE$`?S~!HcBrJ zDa!)wMPS>aJFq{zKJ7@+YB^HXM2fqy^6X#YHGaZtd#M?a?q&PS{o01!J|0Gk=9BMM zg}t;X9%9;(al36x4qYy8!5~rtjFQ!-3beDh50E=|TF15u#ZTQI-!-)W`#r~+SLVlB z<(e;++Z_d;newX*_^zhd%5B;3LoO?q(yyfqTWEBC_1DDc`x-uW^{z^s#*sGcjFLs> z6SN-Hs{~sP?Ct*UDy$ABOrq?~N@R{5rH=aHZu*fEN#yerAvZjA)%Y6o$kgNWe|P5< zT>k*IyNck;$e+H??(4AdLldmPTo+RLL$`tc^<<9RI@J5GNZf2=jrT6a+gcKB4YZGz zvUE8&>9O&GgPq^R)vLdBcwfC;&{`gZHyF+3k^Dbe+f6oE?D4`_#(zh@D+N zUEQgLf}fX~ad|#gC+SSxjoGQxk7g)!EAzL^wN@t)vl^IYA-R_{$PrxRu5nG5O%p{T zN?BO^wc_6sm0{B-lV(r?#=V*tcT4l}w!CZNly4rFG$SX^8w)DuXgyCfC#8&BPl;rm zrkY8Q-Cz9*yvxSP9F{VSmGcJdj_kkQuS~m=546i|6L~{Ce|d#@$Bm%Qo>|-EO{%Kj zD%V9lk210IqAEt_X@|@S8>wMZi}MZ#1L^Bh$rO=F!|z3&eziTEC{?9@yZzH%m9{wa zAVx?7&%EtkG3mOsETUHnE^-@{s_gMa3vWBqy*?5n_u}T8vct7mbBqjz`h%Vo|wya~!kzrNZ>Nj)uYo2aAqHgBILv*{{Mp%5idsWD! zF+SK6a<{ks%~|lEETgBmt&4LkOsl(eb%+{bY1uru)8$W^tyl?>w@Z_c;ia~cCSM`S z?thyt+P0!Z*gVgfy>VRiAG$76Zpz`=RZ%Or(qNY2RFZxXYlqX(5w@b>7W_?iw)dtv zJgCPX`!#uWSkyE+lvPPKv;FF{q!`<6V#4!E!_HO$wIEnyDzP?7eed>b32k$0vS{BC z`FnCd+Ws2e@Q0c;Xk|wEbNT-Ovt0WFC}i5e*HPf-jvZ11E+1p_yYB6&+_)`Ix%5U) z?5lGc>?BmjByBZALxx7v;$U!qe5+bOZBe-KUDTA1Ry#z`#?rv^O(Y=5sU;ggV@=tS zhV5Gk6`@_lSbf@xUzPW*OBve!f||e{F+x{~&XoReQ3?|BzTccE z{^0fPPpQu|`A>%Rr&+|(gRr(+pO487K@*^e=HyLI3nO39&e8?ddss4?<|{u;Ec84R(W z7N}alim!qTR7-FqxbjvejDHh1@mC+c(5OV|Y++W5YJ9G1q|&_WWRYay8o4`pw&Tl_ zYb|tfNYei44)5<*G^KI4oi(8^xpTWb*H5IGVZj`&avEGWTNpRXhOXw(O|To62-V9s zVMOXJ!ICj3IUmZWj0I)L+PkW>IYa?IZPj%{t16L-=6Z;daNy-f%UYfrQ){Tla+`#S z_dkmbSo2QNo_QbMtv?S2msE}$hT9hIPo+(m=|6b;zeSSf4I(9%=5`C8_!VDi3r089 zO)s4~B!9Z0f0bKkikzRjUWGXx?LCO?{$z4jt|?djT~!T$(euqo=N8(EyLQnhb4R%I z8_3@;-KR+z&fMan-Sd34Jd6-4FD*(Iwx(>)8+YMNBM?{8o?b<4u=!0_AcPzL0E(eW zmlzE`V(kNswc$S*8&BL&0AyhC&gAamN6Jv84=%c-}7$U_iKX^Lg-_d>{2p6_^R&wY_i@>vg`d~ z^kqLOQC@j1q-^RA|x)#bIPcsF%ZpixIZEaLn$*ev+US*)M`MKu_aOxMeXa z%UTgDq-{3c!D}8Oh&;vqGmKTyB#Hu|`mJ-$R}r~rBHFTsW?#BPe+^uP$d$JblkV3( zBW9Uk+{^q~t?My{V8c6qFZdN^r6S;5kIRjLLyZ3bz`kngp@2uWSw}6~{i^1)s7uJu z<9B@4-GehqQHJzim1_owM`vXINkYGS9V?`Z5|wS-{{VWqyLJ*p1NB6!*fVj^Vuy;s_=nO&h1AldvsHC2W8{H1C^5N+|dQ&?E8K^45j*w%`)&$n&P+gRe4 zxA6Y}cASSS2T&?F0|t^k}zW2VxSxx4%I6%l_UMGDlh`JM|vd0 z*wXB&wN{u05j|J6NW)>rUDVV=<+t&7pe{B?P=jyq)p*_dy-nq-CVFC^{{U7ujzuIi zNHAg}y4S_uwDq)8Xi~Jyi5x$^1($ise{<&J+}GLQ4Xyk&@we?5AZrNrM)H*mgr+{} zT%cp<4oz!EbWL54&Q5L}rIY2#@I9)mHv1(k6tRDlZmH#(N4jML2ngv?F7;M*`IJ|- zcyfA?+(u&pKTfq91Oa;U(S7N%G8jOR6;f&9Mv?yZJfY90wIzO`7BOvPbp}t7T9zmw zc|lx-PP@3N1g{?DCn~)uk!+cHe4h0)EorHK#yKKqcWxTAXPfM?f>V2+;a~Br*b!m* zGT3kLR;(z_FuyRxWY&ObMRhSFANS2{Y0$*MnNH^W)y%}L=O7LIT-Qx&$sm31#;|g^ zok$uM(3xjomDbodmk5M>&MTU;e%gpndeV84MbJUPU+f${sieT$5?Vx`T zy>y8*!9gPjcg$;_u$S!tf4yBaQJ*Pxw(YgaBuaPCwIM8lGyG8C|=&Z{LJifcVzLk zerob7RJ_m7@*E?LJF#rqD53LOUzNUHzPqZ@7}pAOo!nM6k~x$>!AcCD_G@xAVt!x_ zJNi^fT>4H@!66E_Q&ywpSz!C$?Nu~}NT&r`D1U{&O0l&glWa-*(%ou#7f?|ZKYmPd zhVql8Ktulks~sxD-fT|EC*P`DnnmPo#Wa*ai6vDV7v`oAH*Q{^-lql%H{))2^jSQ@S%B?c zpYY?xFQsd+d6Ic?NJ2^d)vfSzN@tavQ0AiFW9&~8+9a_^+jfKcSI&1<&ta^@@t?f= zzwzq&CiYLXTjnWuqYcV>it#Oa+(&u2_+j@?@ch;Ebo!s4t-D#5>H>cYpYvR zF;#E9yE(5l_;W4GX{d*HANciq1VFTE7w=b8R)-|jj{^Ad;%Gb>;9XMw;E>LuD9Ilq zJcj{J-pA%z_%B7Zve*6{Ycs*98+}P-G6a4@qNvW^?Vd-qearhz_#apCx5MLMrR?+U z?qj>dlAwsy#?C(W?D1cjUJSdo(fnC!2CjzQ7%miDLczDJfAY{3_O5wpBldm=g(+Y; zpzkEz{{TaWa4c>XJKUc!v-HnO&%c5bFrLtFcz%DE{{UvMtnR)OXy-Gh@NQoQ>5r`GQwcQOY>|JAKVkQK*3ra8yIlH(n9-D#E^SXC z_(`eXSo}iK?(AYS+!=^q2JFWoly=9kB>olZwjU3*e;WK&z3|nu$QI`2d1R9rc;hX+ z;ChYS@$Xz8?E0w}#S2-klpqDI?ThZ;?J1%P0o`#uSiq+#2M(8D|uF zd;A*s%V6-ucb2oBVgV8ZvjFxx{^$MkU#b?i@H;v>?p5dwe2x1+cy~;*@wb7stH*&n ztD_J`2YaUVd>`Q;9(nG1)YMHQ;&SdFt6p4{Plfy~;N4%r-xv>r^vkJ2WUz)9xX8V3J9rCN%}s<9(seu*vCOfAI^%l4zf_18a6x{(N@x z+fTHUv5-WdryirNdVj*b7wvzv3+s%&WxlZ_^CBz!(Rt0jLB=|I){9?xp5A8fhO5o| zr|M3faKZ&WLW;j{<=o}VZDp*8A_)M658V}|Z3CcKd$ny8en};EPGKm#a!+qctux6Q z;10D)eJM7-XKOTQW(B5yE-RG`GBtJGTD-mU;QY54=yJ z*XG}d@4hGeLch7xwAm%Mw2vYQc`=-Y=|sU@^Sv_$@4!NET^ zd2TrdxYb#AKGu%{Q<7ZOZ2b?{yA5^=mJ?e_CXKs_>Ed1EdY_iR9sCdR>&6}jOPw=T z7gE{J1DkImz8Uz7p<2Z);zO-R9xiR0hYmhc=wn(d)e zqdYwOgYg(RduZ!Vy8Tb3+a6MuT>WWEsKE88;G8-Ve(1(3*euI{IW^GFibN`pyDj`Q zo0UNJSES<7^ z!0oE#8a^C#rwfH&lpmI+ff8lhXru`gOmFvr`BtvM8tqq;jMJJWM=87R{Mf5;rt&lQ zd)7$vINjXif%wEnd8A;lTywOalvkQ+TBr7h ziefj29jAYjXU;#D%v!#*@x7LxY2ldQSip5Co|p^mT~kNueCZuu?1SOsaW12&k|X;# zjungyeg6QMk^a}O;a{OK#vmS8HS>4u*`ThG;LBUdvn018&O8l~i3z|$IXM_7HS~k2 zb`6?T&%`*EqN$FnHQwKLgW1;`NIcT~uY$sp#ksOAC{-s3pML>6PXbgNljnC6ryA!^I#V^RFI=d~)i>b)uh zoy?VGWBD;x$i>P%K|a+o?NCiujU4cJ#auxej1l1* zeiah1X4{@BeY>(vK)DQ54rqwt#Aotk+UBOVM=D>Y8>K=QEtff~cK-k=Vox5G9_U>b z;~rnk+}48Re5$oVCU2D1fsh~sx64i@h?D|>MtG|cZFVKP)_Eb$);}#;Ob!P_R+uzs zIxZ8QoodWV0_8^Prd!Gin|^gsGIQoqk$?mtlcU8?@&n)kqbW+nvSI;U@XlZc_o^w%E_>acw^JntWO+kC@OfU z3ajKv&~&JrO?kA?g7k#9jRC_JuQc&`NgQc%{Os*r(P>Jy^T2K^lkq#kZ52vx{{VWS zNKaE2z*mL!B+KjyM_;;Y>#aE@cz=G3fDSX>zBusNiaW(oz}@oK*cu(fOQqYHI}R&s z8;hQ&CN(u33FV10!3GblVYR-+CC1_2x+wQDbjUTGKE#Rm>HOa1n^#k2DN01xWnq9+f29|#H|`G_I~I4wNhyo6#G8F>V0}uvYtbder^1>qgGVTk_kn@ z*&kut*6@!}au}EP)*{z!+w9x(f_ z_iM*BB)Cn`9iby{m+4*DXsa9;ogRlr;kR38$z}w<-P_O0{?P4R<+h;(lZ%)w`Elhu zfVX<`%?b}Fmh-Z#`@U}8!o7n)yNc{3ff(PKyiGLIIxsRlM?`S&+u27aDuADSSD{(m z#<3fT_-us<`ewYxP1E7Gy9|eTi-tb!U5=0~;kqz2xoG4+JNxt*-Rai8TN6b3id7#e z=(;7mb{Ry%Rpp-uj0 z$xR!lUGm_1RMED@`MMq}M=~1Fh2)n!j1O9hSxUpYPDtbAsmyBqTi+E%RbVol3{vI| z2-NNcoX(w{iQ`Vla+5ABm`^$pJcw z(i7CeWoJ@~P!Mz8tB|-@Tbvw@D$0%Tvy7)&uPca3%Y#;lGj_`)d!)}DF;wo_D9FeW=Z?Gzy)?i|B4S6=y->N8 zE&*0R+jtoiUEI!VLXeG=7Z_yq9Z&xNTB}aL<0AkLhO{GvL*twe=~V9uLJYDo<2|WH zTAZ_57?VU5w?_W}FLUT>mO@IAKixe|Un-NM7{|)}bH!4)widC8Vcg&hupIqxKc#oj zS{#!_X(Wvuq8v9+J*%FW?0FT>%tmXXm_jy?2JCgmKb>LuO(RJAGQg4buF6)q$5C9R z46-ysozaHr^s4T6N+ToXPK5h<)!4!_m=okU>HN)S{hSsHD9W+v>T9JOa)zY|RT|{X z&5_g76{F#6N$j;Vd2B$2LODH$wPUiWNf@~<7=xeXT6%oY$7$t7ozeRH)k+S>4Qh5r z)E*tW5RK6hCjP$l(K9JHUNhU$ytCo;@7ioUl5k?e)-{l>uw*LS%HkBh3vg7B+K3^qA zucbzkd7ym9aiId#Pz|-aGGt|{suzhfyCCz5zceh#wIs!7fgCE(f?SUHri95I&OMR~4jxFyoxnXYL{NE(b`QGW%CDe|yZg51$l+J0#d3O;~H1y z(U7F|6~o0I`GIqs=9eff3CQx0D-W1X&(cnB5CYspG zDft_b$8UP>njpOH>0B3sFCiBH0AxZjUFIbICdd`|y=8eeebQPB5sbbEYPKZY8Dt+S z)l~|EdYlS!1;PI5tfL(U<*6q14yZT{QZ!72d3^;oAPXtZO-NWQj1K~zvm0LNX5H9~ zXKfGjHc07J)Hpkk_32Zmn5dwSt!{^{iGOs9xcvV0&FbL<21FU`YoG;}f2jn1V-5hJOay>ycmXR@4 zSx!ohwQ-kYj$4wXqXHl@JNr~q+ZmCqNybJ;;Z`DLiwxr|PCc6ywm zK6UYw5?fuYaH?)s!6&EViszz_&y9`V43YHm@&-Q|>-=vM#jLfsUFiP+IAPD%KK01N zN0iHrdY+|;wS+UInf zjJ!@VO4a#G7?VkSt#oD=NP_(RST6vyuhUj@` zu6>1GSyy`)Nl_mgeQO>mrYW{%`B$&66==cGuD!mh2nS7>Hb^x8+2mb);*VPv=q}GF!@qR36R>@++LWgA@^Ye}!Tb2@Q-=9A zW;(lg}@l8(M*MQ)KQ}p*m@e8Ka=JD5yI3IwK7Qy=ttCI+{BIqga*Y1~dc0Ct?fk}$ zE}x})PmYxYM`U~4es$sz9K_zuR}GFCZdhpkPb??PNgPo|>}Nap%KrefN>$mmme~@H zqpoU&uKlhXpy+AX;-9>D2gG|>rPWsbWHJIUGyEsN6~RRQQC~FfJG!?~UZdmnxrZ!B z2b>?`uPKrusz5kr_3iYpc8;-EJo<}U8xW|9e=$eRyCC;9Jc?(LrIV0OUa&Oz7A70q zw#M6*=XGu)NUY5hVFxU=T&#j zswT~2Zib|Bxc%dkw|DoeW(%8Qi{!HwteBn|O26G^`}Mh}#{$e90_{$wxTK0SN;TUi z*J#yx?c%i{WZtNHr+T3=Ndi5u_p$Q&RM(T;$#)F4QF(UD_rr`D=X}>1M)W+EOlG7@ zau1jHGxGlcvMQB_pZ>HbAKo>r%2q{RFt7VHjEjmlygM6OUq)ft#S{j9f_Aa)kms(*WDftnmel`nj`zNK9!Y4%6iy64$0ff z1CN<%B;C6{w6n?>?E^mbUu1)6-L+~Q8QWr4R+r`r(tuVr*y5O2gR-S6h?!x#6myk( z58kUQDvy?x6)kod(u@u=6Q)x;J z*^A->H`$yh;j8378pjgfN~IZcfAR13YwRs*Ib^aXzBBlVZ*cdhBYqXVeqmd6IdKT& zqDW+YkMb}6%~{umTYE`u+xWr3YP)X`*!zy+zk6?Lis4#Rc(!j0KN{8>s~j?yx_qtT zNEU5UN!OC?(y)X{6eZ(7yI+`p4lAtj94iL3J}{<7`H=qr6>`$TKGu<|WhLQp{{W!Z zvk6)!n)fHu?k-tmS39F~yB&pINn#$Us5YO%lx&tMA_ELK&$+7? zAQtlcxqpIM)`2a_<2%UdRiL#Z+(RQ|$I<@)imY3x@`Bs0(~cUmsI)CeyvRx{gdNqf zVDYV^8-JD8{{TX)Xwu;dz*iaHbqRS2VYD|bwIjGjZCtSg_iI8m1A zTDGPr$Xt~|xh=I;s=`ah@BBaP)aryq`}XPHvXrb; zUnt~?FE0hxX=?g6;YoPpT)8MVfIo$C{8jUjRpFQx+x_q2ub}=H-9zTBw28I;@($kg zbvy9epHg80DaLrJ_$Aq#)NqnjNNm&6KfL?C?K+hYP=Ay+XZQsu5tj26Hj`0GRd$9P zQ)7Nt%NSLonE`N+%kq8YrpPz8U$s^Y46U^7r@X%|2Q@s%8zYWDqhLSx)k>%jNik8K ztHJqb8{=TRe)TS6D-vX?unpS2cle{Yz}E2(_4!E;_XT|tUuyC5dsoi?02HHG?fl6} za5c@2!s=+`0aO=fZ6L*VlX?dKKJ)&NNMypAdWVJVeH$!YSM)ati9HZCU`Mb4!KKWUda)VTuzRKXlh?;JIU$SBA-c@aO*dYRR1xUZ>q! zS{1U1-;9o*-K{9xDQ%}~)?ShxTNupWEnffy&NH^VVJRM@TCn0t-R6H40r2P#%}_2e z&oy-xF(VcoI#!L22!c5SKEqNV**E)5Ob)8}`_$yjjhEp~CR!W4w>D{?y;j_Un5nmR zDdCxa*6_5XG%P#gD*3M*_^aopiG1uQCC&Xw;vVG*^2kzB9 zj#Dsdt*Zhjnf z73~}Z*5_`*iIRGcTDQEQ&s==C`?X(Bxh7KU{{ZT#p|x@yO9>x#cDF(P?JJJOhLH?v z%fnT}GQ5i{5U%~IGrO9n6k~H8%~xZ#iX-xkuHSaEnKNdpjiDSKzolxbNtFP6-|u|2 z%|jHqU{29n)^klHZyWvQZ@uYUwIyV5F)ktsK^X{o#%LiEo-=#Ko zW!toI>qGdkL^26n_2Jg)6ub`2@R$kTO9~P~xWYMIWWZvWWSMTlq z@cMPBQqaP#$HD$83i?cuxM35Yn2)_*I60O(g2BotZ%)7OSJ7JX97zm^dW_&V7_Xo8 zck-lpA_H#j{+`wBV9yG_#Ad+?$2+yh@wZ<}zTqPURImfnp&o{_?ZKKn5%*g>)x~$1 zFPp|YS9P^BZIh$`Vx#>??njevu9%tQe?$s5kW%I&0 z%Er~Dr!+!$3_e_L&1AD#x!iwXzmM4}+d28k!r3)}UKdpBbOC7q#XJx?ozV_#) zC5Vzw;U9XmTXn!?4brpxI#w+=%EvADcUFifh}`Y2%6|#%Q`oLHD}^H^Y8G9x9P~8S z48d4Z2==bM)-J)d$n5wtksG3Y4pXM~wO~1X}NwEWOG^9h^Q8~*De6);JzY2}9 zoSu}cmI_A#lq5EbLIji{b;mW}zZkZ~rn?n#je&$aOK{wMKfPZ1yFf_sUJ>!7O~!*g zx?nmDz@7&0t#m}^sqmkdUMFj4=4haEg(PfYf`@lX^V2hL!pax@qP*h01I2dRQ+(KR zNk8pwZ&mGHWo8~poo-{|CixG4%DoB+d?%4#b5b~)7h>vd-$?VD5LC>j>Q z9IHw4GX3B7t4`W?j#(nzyFKeN*U6U>j)t^hizguAcI{>U^>aD<#GC7L_HeSn_ZfDu zt$jTl+BD;ZMy_Tgk}NxJXqBsW$&8U0@gD4wJWz_Hp&{JW|`4l;UD z0z-3;_G&2sNYrMRHHxt*8&yf`Ou=MqQ)5l-muf@4Ke@uvlO2ZyDgxDYjQ;@3PnMh; z$}Tg~oS|L$IpT;&Xn=yC?c%;K{id!Vx6`Avhd;k<(v8OjJAOz10J5*OGP@r;xyxpFqR8O2Z9rv| zA`h4zyT6I6l6!~RI_o18E)MU#TS$D?W)1SCa;ma&fF zYbIB0oZ_7FDjYI@x@bp6d`7$|{3-|}qv@_}CM@NguW zi=%L`ugrgs?=KbMaqN;-&l_vqz7R(wdd_waC6{S!zdHRt*+0eUN}nmyhFaMA{{YJ+ zQ1-4P#X6tZ?cH;YqPx)|2!U^vV-@q~k2P2F?pPhcJ0JXdl}%%F=(74(sFCxJjkQ(3 zceqwKPn-O$d3-Rb{p6S#`LS0uok4E(Ne!`Qi#vU)u)@TkFIM~C-LE<{(r4j;=KQUXyZ3+KRYoP-gmaZ{^>P_Le;~!NKfK??RN!_%+;?dp zkLBDyytJt7@`(q^%igAhOKhP?+P$hA4>0T)1NeJZ4Vp#-?Cd3DC(J*+{pzRwtgLyd z*y2Bw=hmTgMP=SGQOZmpM6olRebpS%D@YV$?yX9&?hcA@J5^*x*kPCWTC157{n97e zzb`xL><*DW<|?m`yZ!3Ul^e`g3-f<^s+E)#P27ss4fAMcEp$HD_ z&AKWbqYT`7e_r(tyKJ|)R9;UN^H+j=S0{#VLwR3lg}TP48;`Dk^eXyR-&@o5%XGif zjurU%_#pQUUbY($+-%Q<%`)F-E5~Ef{u#wBo}Mk;*x>Q>TK9`}V;gC1=jF;Q!qniBR@r8)-55rw+Qr6$dw6>5vsmL3h zPQ?4&e*QM~^shR-qV(MRoRb$kWYu{jtoj}y`#*Sk$HhJ@)Frx-OM6{1##x?3E4>}u zAYeU5U&6k-{f)15`@a?Vg6`>Tth{gX9YO&7*`#+`L0*)AhE2jvOnIXTbfKD82(=WU+16sJ55X1u>M z^+gk5!hE^wUoC#nh93}J={ioIIQwmt%F5#zG4Z!>Kf+CW#n+3p+dD;baErWrrHESi zFXD%eE@ajGMX3T|iU|C>d3NnWSbhEKI^_QVyUkSW9s^06D zTI@6K`#eX^cONS}+54^en)_e&Xz;XJZ;LfedSLQ1KqHO8`3CpN&#M~gn@dCL^RIUc zQ_{!Z$pWs~2i~Y|^%t>#yPdm!?`oJn$iV}pe98Mjd{Djc_lMrwL{0biU%6ahk)8+3 zoafVuQmM**dxFa6im0Iz$9^h&Ubyj|p*MwmCv>Z79pkz#Ig<^Ind}A+J@_@^z9Z2* z4dHDM`(ftub;5Q4rzMxZQ_v3lR(<|~f8lKm_?G>a3#-N7FA+hYS{?Hnxk!dcAqv=SKs2*JMHt+*=$|xPZ z_^h7`{Cn|#hc!>NYbHHL+`joElK zK@&O72g)QbkMCo69dlkKqgrbI3h@_}7?RHZ!e5z{b~~y!I0x@9rt0#q4S2Tuz?$ub zyQLW6yRtcEm~Tk~b&QWfJNB=uekE$d#hwV#{vf@8w7hmyXB_N>l>OuBk;Z6`G;|`2 zoF(j@v1jOC!M`1!8F*gLP`$vrbi{xh^f=G^T{*`}_Z2JTxg1yH_w4QQI$sL-#@kE1 zyxFAc7+P_yIze(U$x085aq!8PI2mPw;qgLqrUx@OTg~iGi z_g<^|^4Q<=i?WFqm8Af)ZvO2-2~>?`Zd$0^>Vn*`C*`iisq>bxr6gN^Y+xFxcXJ$Q z9Gvd17sMVq)2v~VOS_2RNP;mX!u+mCPxuKvE9H+Ke$yI0jeM3Gb4`6Y%Iu47!H&C$ z{Obo@CuYxUEXk`^)+qZH8=9?@yZ_(s|kK(cwDJ{v7>6g8J4% zTsC&_D@Ggi3aW=S`7ft_)?O{O)M2-p)fUaZLcnjE3%dvA+5so6eIMX2+M~ic{h^Co zm2`{Ld=#ARjHmF(kJBFAMMA7|V>mw-MRPdad1`x)$310q&kW5!oR;B%MUr2b4d2xC z74Y%VZI{6}n$pav``zMPn|{$BWy6_tp-L`F$Aah@E~(8Rz84#6?@N##<^{ySa^2!Et6ZO(UZH)De|l4xS!eo093NK@pMe#!|Y(- z^k9FDPxnUNYtsHA>u_qmGq%#S)4WRY!ZU?ZWFdZE_Ia+#H*!9nwM$LK^gl&@4q5$^ z!8&v@N9E2VP2;khD)+BgRVBc#Yr+Jr*&YXK%`k@K%B4;Z3r$5ke(fkF`W(`R*lDjHnz_OJ#ixNT9I! zM<=~7$G7Arp|LFo0mgBhQ&=6Nj%f206U*&Nx$oblYXX!|)6;`crW@rwsqDin2*qcK zQ!IA!C~s1tN(4z5J8%VN$j;6}4n68&AXva|{cAc`8<>9$OrC{FTysewUvXJ;JdL;c zRPNs?Bb~JiZ(uk701ry2GZ6%YaCoT!Aqn-US|hx3Qe)=-0A_~uxl=bYpatcHHMD(yByNW!vjgTgah`0fEJ54a;XoZxCXwjMezcd5RAem2S?5 zAEjSOU7IC&t18Bx(HPtJspU&9NBgx5a_`3B^3|kJskrf4B314>BFf(==}vas7_h}4 zB%s^HLo>3KPNt`uLTz?5o!=nuPz<5zQk}ta+%-UClkaWmO}zmvO68w+;7cv|%&fZ9>1js=>3f8QGGIG2cfb8=LKA%d-!QVp6 z6=Z0f&Bn^-d_eI1g^P?fGyc_d#W;K)mbtw`G?EraUG%E%7d*E?xsprt3cq!_SJ~bl zxJfj40)jaHE;;XC8A%IST?~AfZPoQRg0&B{=@CUK`O!ceY_ z#bR5jr`-!%iz$5N1Ym+2zI#>$iIE%`lX&&5xdUB)qres=KPj$Q)KNPrzEk0Eh#F)z zI3&{EK|EbNhx#{qq732)3Rrxhcg4;#)oY@Zh@83{_OD}i9MUvXd8@l{=kEUicD%P%-XoFjT!WC9PIouq zUX5{l$W|~nkDGb_0MKjBZ#?#nW^~xE^5l9q_iNI_Jx@Ne>U4e_hSDnmbuTlsV5@dt zrFw>wq!VhIn#tvf8#zv)dIhf*)9+%2I5{#HhBA7et$PlU1Y*kG_9DwX`;-siOn-W` zt$v4A0&4a>TS&Mu18$p3xXJ$U_pbLxk~u8T+IMAt;6}XTMzbI#?1ys^wAY|%azENi z%2iQUjD79imGc;tsr5K{9WI+1F)|<<&&#`SJ8RN3h<4g2lONvvD}&ROglw`Kt~o(Ob&vp7o(@%F=I7yg05G zMDL7??j2)Q8Ap8y5%sX^P|TV+Cr{#N*}%a{5$ZJm|rU zayrzs%Fv~W8G;d%C;Xa{NQg!Qps8crR{&$urVFtYhQX$0jIS#o0meI3V*reET{Y6}5VKisT{#)+~aCkgbc|x=+f%m(6Rp~bFC;=gQ`_o3>G(TnS zT0(jm&toraYZC5KXoLB5$q$kt!)Wh&6Q*d_W3@ovG-by)IIR_|a7v!HI4k~i)6Jg*Qg|hzuC~W4E?r}C{6_ut8-*?iZDm?Nn$GOc~ z^P@*%gYNNE(lQsaO+dsAb~YMZ3wb;o*a$+1<`{p`_o za#J9?^8)$u9KWIKieZ5q*;rQ<8CYQnIrD0 z%VP0WAanAlq*ha~5mlASjk`CBm*n|aa95>dw24x8EGZ!2K1@?(LAWtFBfTV~saFRy z@Vn88?aeYt<0OH&ZQI_gEcxBPHI~f4Ze#KfZfe|byK51^^`{7pv|0$5EE=(O1ttgb z#!qV6m^;Pt3|BpOBiqEx<381*T?uo!;M&ylEz`+zG8FJ}+t7-@mf|^^a}Am8>0MWe ze6e^Xib6Mi_4;%oxrZUtEUSiYYWZw(?#NRUPAMhZd~%hyYCmIX6^0y z5ji-|P%Fyhu-R~PS`yTgizD zj0~rt$G5dri_VTPtMfnIKB_B13ucB>ET1Yi2*+XRT*)848iVdV53hplMD?r{U~-_oO~oQq1R@B5vkr%z4Qde%3$idiOib1P)$ zpzX)CQ-U;R4hD7-fOOlA^{NEr0^9<@K45817ey%v6j4gvTSf|cn$#O)R*Fx!7Z|D$ zh!q*i6)Rc>Sd~COD~_L9%2fXVl+hiR!#lm2$Cq|DMtD;E6?H~7>T${kjeJBf+*~YBG0bYiC#HMX zh)FDV*D=F6EhMeR133I~(!JNmwqi&;keh^GK1U8c$MvrfQstUB8PZnh!=^nAdemBR zM-5%eh}eCBLj-S^6|Wp@=Mj_g;~;lFwTlI)8v%14mNt+-kKgdEYk8N-Xz*}TzMNQ5469M$2|2P zO8Z0M{Eqr;VHW{FTz2VS8R*i@HlY|SBTwSp-oDQ89ID!3TXzL9{6E84%=GX|=c33^ zsn1%5Jd(LTa-f9nlP~iMv|U{8`?Zuk)65Ct%1oE z)oPxHC1ZxRw2l~t9}eAi_o|nd#>Ub_fj@XxZszUkYUFP6$G9h^-PKCcVd4AI7NgsQTcN)U85XTtq+1;Ayd|71n`joAK8qC=tS89g;0Cu^CmMe0F zh6mjrjeGRghnVzbxmZG4cViyl-}((r zwYf(?k|X@t##@THZqUU$0Q;UVo7%F0R*7x`^@;>hBmf0np_oHoZ(`{#CM9!;Ch@uoDXzQBSw@vc{^6X}+ zHojPc%Tu|k&5}C)@c#e{S1gi1bwv40U{>9aoBf)$W->+~1AqR@S&t%2$+&&oecINw z2wNwwrE|_`-kTiP2whbNJ9gK+{3t3WJCE;M<{A6n_sw`TQY>>iu+4j)!yhZ{$u-By zye?PoZK}Uxvj)B6>R2Omj1oTZ=B2_01G%TM7zmA&#}xy_Rl_A@)~Bm&NBr65pf06^ zXntCJv*7I&AIxFM#afP|Z(EA#wRz(eB9FQmzuKk=U6%^9$fG$a-mVcw8?wm@!!Il; z$s;+c(W%_ZdQ!&Q6@tycjYtF_d%cwfakebK$p+#GFG zBc@LkQ8Su$K1@YtxbmOn$IJcJ`D(tXu|25+t7TQa{pxF}VLeg^7B-6 zXha%lODEk5vFrD?`hT@rLRM!5MtrfXw6SW_qB9+j^D*Oh;Z>m6<8q9H+O)OHas8n# z2I$$hEoUH+K2Ny6-mhw$`H|$$ahGA^h)EhAPThj1wU$z1b{_Sho zOeK`Ui-vxEw$~)4nWc`Nz{su(9OwJpE2C6Je=XwOE3eAm-5>1NHX1m#!a*XpZKh{c zoc=t2=rzGoW4XI&11JiER*KCWq%PCFYl#Sv;#gEd zoG`AZ!0cnzVPZDC#~J?sXZ)>l$e2BAr0}Pnb(?5ycJ9bI_6^NTxwRLyT6DDNfDyJ=vt$CNkNuDh-StCV}l|PGsp?mKC0A{^Ge6lvl&3SjkM0oVOw}+Fk z?HjS5_D|M>I*Usm4qcfV<(1py-SYncwOk*M<11l^+iHM!kNzgT4*g_`M*Bb+-OzLu z=DsI{%@fOT+r2*u*AKbmRP21$aIuZhjy7|-YMNXufTN=wo&7~!yNoU45<+fn)g(}) zw(>}RU5qjBUe7~~p&%%XvRkh$^KK@$5^!-R_xn`~bySHEj=wcqMpQp0*4p2Cqn!;$ zQ%2qxRw5B{d+zN|jz)AFw_#i6{{Vp1Xx+B9JO2Q7rHxFpBB#rrnf>cK-Gf$UggCrS z@xI-ae%;Jd2=SFacW?g9SxX8p&lXXCyIR&}P^~B4ANmb)PjRzS0kwzwOXkafN=8C2FSGljdyVx#-=a1zhdTX)A~ZbB*8LtTnjD zZSymZHvRARtD*3WYaXuw*}o2|-}l$v{{Vp3F%+RgH_XdjPlVYc)T3g5iD-;XsVz^t zd@|m4oS^U!bYHr^O4M}nz}ncXzY4}-(qa+}GY!A(3emYSbXx9@z>j8-*?ipeaVZ^uFT-!`cz?# zb{=W!UHn9cs_-otTE=oT2J8J*0f@HB|u_3v&sG)wcRrp7F#T#zj&Em>eU;ytER={*wnEPHFrpx zcG4^hAuJPd{_|6dRvby;5xgPUKi#Fo@k%_cp_-n)Zj21rU{{UrL z8!X&~aE<1kwQ|i?Rv;S9wRPURmw&Zr+lbM#BR22-2Dm3HgL>H5hI0&U+dY5YtFeIb z21VZ?`_+kW6l&YmiBtSF(CLaGVJn@eJAaLG&DoVLPK!+~3Wr0=edTYuzwFm>Z*p4% ze7VDayIfQ=x12VgmHU5%b(ZlN6#y-@ep=&XolTtaOzar_+SNb@`=+q$kVPN8ZY|E( z6N{u z?a@alRO5GHQ+*1IedF&PA_s>`g^TZee8>Ijv-`z;zxowt=ss)dku0BiMQb|mY@d~u zx*&US=u#(*odqx57*R+D8*BEWM=OOvkZBb?#wQ$OifH@GpSxCsK~s3Dzz}lXDcnv% zWG;7q4FPtl;QXyhptNjVY2{n*FYwcg9ocFz9$i|zALAId9v_)5B-lRo-|yr2e;W4G z1zd*WyjSB8g*2&NOLKDzjgkfX+j@rjXZyb}u9|OC8SH*u_~f%*nWE#&Hh$Z z*9wfJWQ-p5-T3BQ>MsP5c_4Cwc6O)mjo-!ZUU#`3HeKBfdo*pzc$4^vCnsXA?laPu zmyCsCMB9plhKW?aBiflE4DQVS! z{t|zRtUP<0fxH@Vkyd5PNF;UMyoL3v5Js=L)qZB;s>J3oh776w+P0FFxr{}$1skzh zxw02Aa7VKMHW7Mlt!SJ=VpH>0Tt+o4cQa+a?OyWKuFtw#rD5*^chW}0S58%;9sccf z8eOx;8u^3f#d9{c*maB@&s}s0Ccy?nzuq+>IvWV&F_+p|11i@~WemP>1^)nb{oebl zoYGz6!ZR~}cm0~`t;~^{pxhuQZ}U>QTHvlgUcT_;NRX|wNh6IHi6Qg0V@iUzxUNcBx(aO;EMEJ zk5(g>D%tERIaytSKPu1+n+e4+T~RqoiwzTM20B}BM*@8$A7}U+Lu02 zC*`k+{{U#WRP%n^HbC)|4!<#Me9gzUYg!)~GOzHTpVzR*Y!xFrf#$OyNaSZ{h&eyc z)|}DKA`d6bLFt|VsgiBqxrA&j)&A{z=a9(m7{*s)W|T9o7>weqAX|H$d2z)?q02hH zIs2ostpr3^*L*wUKR58xnVu8}8**`m>;Cmwg`9vvSlKC(`BKT3W-s??5NRYyA~wQv zim`7Rw#@$ktTjs5EAXtNKc!s?$k~B%saeV(TeqG#&eP5-RyiIwNprh3goYy9O8x5G zwQ_)lRoVX6YRaU2+m{1+&vdVV*#7NwR&Mr-<}MuiS080BnQ$?r!%**Rs zRaS;(#7xsDA2Ji`TWB#DUoSZCSO>etdf zDAeJ$vhpM>@?+)2e0lK~Tn(6AwmbCx@!L%($yoglBEnvL$B{!K#WTC`9k{8db$7`e zR%8ZA5UYIKTZ2<8DqEsn}Ki(rMfD!2XhSxWZM(gy3yK=Mb=?tg}=qOzQU!qs?Xc^}L_ElCyBtGXFi zX#Vf}Rm^W~2{2^gMi=y^$svys$XNPfpAq?%65DC>DMGt`Womqcd?E&sN!{|1)7GI) z)8x(Y@Ef?(ax1aax zqMBDQuR%$2v-BU~2B?~x4|NlUR6BU5wrw|&8^%Mo@dU?e{Gj-YuR$lmLE)E8lBMc0yM11 zRM2l(0yBtZVHAz~wm5H*{f&N0{9N$t8YjccJ!)xo-|CmA_iQ*-*zQm(cK-lA_2t)B zsT1`M2-cjGyZ(kR?4@ZAnc}@yU%H$kTj}iz#s}{l%OWvx>42ZDMWpF|Ced}7ZtP;7 zE7>HGOR_fCjoU4q+!Z}*#5@_|-G9QG)LN#FQc)+%Exg|}GN)V|SJwU^`1@t8cyif4 zvKrFvFPZ-Ucpg0CA14{+v2dR^k@k_LRy7@#jOp~vZ{juSjy-cPr~Uow50;1*?-Jv; z)a|b=_>J)~b)7y>2WSunvX#KOxn%h*kw0QpjR!(t_=hmnAVQr#m78gD!@fOBNB=S%d^9b5EH_7XRLZ{2C6teimb2Mga z+O5ZiJR5D{T^nQ0+H^PuL*JeUu>>3 z(>&t7BlvgrUyOehV7RriSZ%GhG>WOe_h=5)CAbf><{tZN^Q?bO zTiLs!Fgw9)pWY!L6$E3geYf%3#&((yf^Y3-iS7m5X4oP&2ziizOE>V>#G}KSUxGdn zPvTECE$@UPXyyCF`G*mw*PX-Cu&wb}I71Gj9(gTWvGdo&&lpMLtzXEu`61HWq&q(2 z4cwnrC%^l()c8xmcQ)Q1{{V!$S+oMqGPrrZQsX$@7t=N8{u9$1#QrO>f^U-6S%;c| zwr&Th&+2Q~{xkUU)TjI_{UNs5SwkP0j*M6M8NG%oU%T$3^hu|FNF5Bn9qn{|KI2c) zY(?C@SlIbt7?-=A;05~s0O(cN{5tr};ZGBX(L7zEM{adU%tmdB@!WjG6eJDf*!ucZ zKL9^x)bVfFyh-92cWF-=PaH|sQ=DM8pgn(D`jf}M1N;_rw$$|dai-kae(@R=`8O{? zk580T%9e-8=D7SkYWo$s>V8%Hbns1|fP7_l;oE3&rRo7MEgg>M@*TG9&-)Ar^~Mi+ z_dkR;ejWIY@P7Be2{Ce^H2Ukh-=WWBy6 zY0-B&!{Wab{881};GT516DuMspO^iY>~Yq;*F*Rnqo$m7FBRPHo-}uoWNp79u0oza zgROaYjI1>O0EJN4E`=s#l?>in{oJDs%{c0(BbXvWe|lH;8-%;oIpJLW15umDdXVZuz$_e|qgTA02!b z)-=nFI?h`KxSBR48b2(b?uN)2_5OA6d>8B+?KerXS-w{O=IYe7(XaI@xZ<_bq`8s# z%tLc8<@`0YX!5Pit7R0{yvNlZ2h)BR`0?b?WtJJ{vgkMYE>pP#5xXDlcC9ZQd=2ov zqYivGskOb)llWLjf-&-xWCU}c;{O2ltK)4$N|R2!nBBx-Xj=}h2-&yzYJEG!TCasC zhf&d_e>N!r95cq*_3g^lLW{8zz)N~_`5w=s_yfj%8S#yehBb+Ny*lS)k;}KtM?_+9 z10Rr(8^0avvi+j1Y;3gs7Sh523AuSZ&53}>fMH9o%hdF)@4+9m2gBbK_oRz5R<;B;KM4@ zt?$OxHvSjxo0#yd+?}~b z+}}6ie@f`XUhT*+Gndut&VOYy^+&_4E9p?Quf4*Ill|)5+*&Sq+f=OLOLzoOjt6?O zs;E9ug{q2sv+yZ9GFZ+LN&AMR7$bvF2KhFi-AIJ00(;i%3PE_?35pkZBhE)z^>r+DIRON9^%5LCO3l%%MZRt)*z{vjq zd$EIXMk$Vsvvx7IlRjX^e)ChlZJ|qiw4)n?LjWN@ZfOypq++CFxA$z{D$|q8+q$Gk zk`)OWmOpx>946}#+#77HKF#=7!MG)*9#(*PmKYFE%e2jC~ z7^+O8AT1CVEwFZ@?G*%cF)qYb&OK{h3~bIZn&*+rMxdT+LK&o1RO?ztalVH`3&-W{ zJxxg&PrIHgHqsrdjPp~*He?<>=(-#(UXbl8u<=a!$W~!dF5!-IigxndM@o)RLzy|` z)ndjV%s%Z!EzW*n_g15OrP-AfqEO=_EUFI`4b%xFnccKiX(!!+IAKvN&fuwR8gSee z=4H`X+X#AAOu)IywQF2?MEPg$En~_hOP<~9jo0q{yO1;TOTO{`Gpe3Xaw~;VxBS!VT{4pO`nxyZD#V zt4nPxXYBGPGL6{X_m;0%d2qM!8Ar{}N}+#ob2Gl;%2(6)Yt^MYj@LN*i+?g-B?iR@ z3-$J{OITTa{{Y|N0)w~Gy$a~a0=fHx{{TX+6Is0klQ;n2s`|Be(Aegw7GvnJz|#{U zQmOKd-*&x%&tHUjHY$NzW>|j@AH`l9V{*{QzEo_bzGkmd@W_hiP+9I{`P=0g{t?{$ zYg+5LVQN}dJ=VfuJ*-V>jgCG~;I7L|R)@>pcVq8=dc6KQ&9sQpZAepv7{b@1cx|J* zxM&XS5Ken>>0ddC=039rvDvgy-`a>V<>w3eS5s$Y3>Jv%^OWVQ1suT1EQmLbn5|KB zAaM$(5BxRb)r-08Q)Zqfz?rZVcJEfKz>U1+$f~gX(fLQ59{s9yWio9eEO@SIKg&nJ|VP{F7YMr`XajQv9U|S6)hfl))$@ zvkkcRsMXd_x%iq!MP}MZ$~)E^h`XZ7`R<{lOb@ySX`^?Uw>t;DS29N^RD6&d>C&eS z3k}mhP5}4mK#~$-MEm-b=qM62s=vVf>0;j+?Z+SInvxVxzk^Ghoe6iM4X%t&twsh9 z%Gu9qca&E$PThM`vBKbU>s1K^bt|}aB?v#$@u;F^L}4E%`?WU4ELm8eT8u`lGO4hN ze8{Mw#z{Z~uH#V$0nYB7#ZDuUm*xAz@}w}x#1c1brE?x`S7IRwM-lyyvO!SBg21!vN#1YMha?p+H7Q9>%tg=6sejqF7gU^Yf3^tcF#$^JGqB z#~zg&5u*@5Yj3J*1+!(>dTm7Rco zcHoXPR-$vwHdfl?d1pB7S?KYwXtB*`BR10^94%Fl!l=xP&#hf0sf3+~5BjywPfw+0 zPU17>INsfjUzrOq!*WMX)mBJklVEOwyCBReBD|^??HrIZ@1O9jIc?eDkjO!hbFg)- znc;MtFds717dGo88#&15j^?*hm5e7(nB|_(M4v2Jl#WGYF4cpG-aW%OZU{bxx{2gy zMhGHLUf+deNa=9J<^&ZTtEQB$tZ>wYj5Ygw@GY$4a|hgjaHAdTvha4I`c|f?ESXjz zkIld}if!kHRsG-*pWUGY>)#@# zXr@n^Gm+3{yhp+QE0!jL-sFHJf0dl}JaRi%xV{8lYoC<%sXltG2N_wJq(&Pj=8$zY zN@Zx&$j6gcBY&G}p;6Z+sJm`rgzWStg9eBqg(HmfzbALngC6sd(wQ6%WXY2YOSx7? zgLqOo+v`>fQfOI1w0$>zb#gT-ff(Z*>aUW?`?9?C`csx>An#5EM>x5TXT%n8$jLr9 zUYyq}Dn%o0`;W#w>!8#d%`DOU$EFWz=KRgdyYlRvGt#seAKl8f{m9%tf{CD33i%-R zr_AcCA3rJdrrt3~ytElTkEJg{5ms2R%F?kk=;M`@e3REXG}vAlB@oQma=m_)t!Zpw zWdvvD?N=0b;V`bFKmXJ5Z--7&S#2N~j~mJLJv#dT0G`$BNL|?HlU_IQ(&9yr%x;q% zq+|QO{{W49ATF=Pel>{qWY4#Q+Qpb+2>WSdR!3k4aZ#BH5I-7~Smz}1T8ZtC!ZIcNrY0t=3f!<)d`(O7L5%5iiT0^`g*=A3Au7+RwcrlEJ!8thnImPboQvu;R#8_*&gpSA;@C zAtQ72A@k5z**aq5PKlqBj%(tN3Qr6=p6R!sjPF7{Lw`E^M@MyiHYXgUfDnGQ!CFq| zt%A2HtRqA_w^elwzi?laQiN@Vm+sWD5~$d$X9Z)u#IwJVOAMQLD{!@4Fjpk?rHz%2 zeJd+y5Q%XZk+dh>r>QOXhZRaWGWbr_C@bb*)T^MHWspLW7w*%aF@`9)sFMH@j8mFT zt$=u1B1(E5W#c=^Bv+7a+7t@;_VJM2wm|v+0PmXm562d3BqgIg2kT!tHM>c6M2)&O z$of^nIviE>WHLOlKFGf2KZciWyN%4-Fe!}*w~VfP_4OZ0Np0i`V*dB>S41L?X&zPM z@?f{ZKE}r2eN@+vAlQH$eB(9jzYuIuw8bcQ$+=I_JL0@hmGiR$@ACP_VP3rtg&u8X zs7oo^uxEJcYf>*UBZ*Hr9M)yM#4}vU6#oDt{{RWw!TQ$4q%yc&qi9c;AMDk)a}-~- z9%dF}u&+bwSM8DuNjKog>@dW0{{RBpR3VN;-UNG-{lDi{;<(tjM(I$|q#$(Gkt=S9 zU;;O8sbC6`u#9dSs~#yX)e!Ag+~0+1+AG24eW+tRr#~n)Iw0gM*vuiiF}k1jYpGc! z18Dhw+BL~6ms7}!i?`LgtABR7SfeiM_J;WpdM~YWRd*ohElFt0=jTrKv27C~=2iKh zn&;1$3P`QVYTt=Wn0H;yojI;%nX)uhqDVG6Z(n+?EYb+UU%0&o{{RzKVVc?%D>@c0 zOg6JcbLZSTvSWq*RH=z9~Ze_SfFSaeiCHSwlz8pwo(c+9SDUXwH@egzLuZj^w zw^s1T*ogJ7u)Y?o5b21P+q|Xdr#nFY>i+sqSd{l zZrX8NpxDV7oGDL~P^@J*V~lm6g$?|wU8(?LK4Vo(ZJ7F?b8Pr-Fl*#*9Omlq!yu=$nOy4MLDXpF~y94gn*Q(o!izlgg8s~Q5#Sr5uFS3y@q zWln>qy-~LtE+K*k<@1f-cDGgKRXATTr`~O}>|W$hH0qx^_3gT~ql*plrqTy`%a_iP z)na^m{{ZZ@Y{fiIt{-#%0PM7y8Z@H&o=l5ZqJn9DRQXtRYN-OW@%fQ;fAUte;q#(Q zH_Nx>t_quz3)qxgPM0cVP09CIFYx~WwOs|L+2Pq5CPV&}gKQ-EoNVD#5#m+pww<0WMIT>k*O^AEzbQakWlpIuv$iZRG) z0K+^xqEGoxSctdE!2Q*xCj5PWhMg03N^bJ3tlz^^&L-IS zuCJ%vR%bRtVbgSVC`CC<$qq~;bk+%l< zw^d1uS1eWdP2U912)LFFmJu`?Zs^D zSgvChE|btg5X8p!;NK?inYyaWoXK#>ga9VB0E#&c>ZkH zH4ftYnDhStpw^T#vq~-Tg<02 zbQU*7TgqZK{{ZM!jFp(;ZP_0yf0y@bUd`TBTrVTNXKBi+?1%3?Xh9tCO&~lYR~%lp z1-_-CxL!FstFG{b!aYV3{{SvqwQ(6F<^EiC`d3}yyO`HiwvOMHk-!_OmZr46Bkqq4 z?@Kf!ZVW#4YRc=qN%@+&?+wW-TdKD}E233LEg>A&M5*X|Fj^3)efd8s)sHZAHC*Q$ zcBd%L3jY8NUm_`@RRBI|g;bmdrlS=cimM}$9__VPCR-L!Sq^jZ)0tawHA>n>Daq&f zs^T`-*s$h^gomL8Py03Iojf)$FuPX6|O}xcU&AmQfz1qE7SGP!RrNZx4Kf_*o;>eZleN{zkLZXS~ z)jnN#M0YuMGP-y6sVxi}*$>Q5YD<_}*7A3Z<9iZm@j$V#V!e574NgATp-eu1S+4vC<}o?F#|> znd;uZ?N?Njw9HWe8#*8MYl5+}oqk`vpGxel6kAG>NLZKY^8B^IQ{pNoMQW1FiIe`X zpPIJSy#1v1thmsHA2R3oaay*dO9^g-Rw=Q>mt4%lG$qc z&s4RJTd3YMp zKJ8hvw3Z;j&kgEmDAcyX=2iJib=_J^51(zhzE&Uj^0%FgJP^8WR578fZY$}ar<=B}$sP0HS3k|}6dNfH>^5HJsV(eThe+VCJ> zmvH|8(5osodB6d9tt|jcZ{izhV;hy-d+o=~>p~n~zJ1-{r$p1&pS(D$(lOu9A!?R{ zB96^NesykBoy?q8@o4v{EeOCFFwOeG4**|ukffdx_b!lX1(O@}78~$ae z*ssAqdR^#TXS!En?Ny5TP1y+&Yfl+SbDNX(*4OxU;_bp~4DEI4L3-Ogg z=+5sj0eVK?#(lnmz1~8EbH>{6?~3-ZU1?62ONfyjR!{CT{J*Vq)0U{`lFzKcvmssw>0Eh6P`*LKS7E1!($!Uu&fk05ysGb^e2CChaCSvW8#)57 z)VIx1DMKg$jzfIj;;ebg=P<@MVz}(~Hl|9BN;39e?^mXLCTEw$5W#YVt;SfNNA3C7 zl)A9{hP_|mMZ+(MBQAJ}OJRGE!xTi)o7DS#C1+L2@%L(^pb|6pYE>nojn8pRkQ|j> zmFnzzh=oZx4NO#F^7RW&%B~bscDUNvrdr&ITW1)d*cBBTF4-98H7sfJ?vjBGjyXQ{ zH_C49jMR=vDx>AwOgSU{nurq;0lUkQOK!z{G5br#x4L9E62e|cCRpL>p?93V?Y_%j zbFN{H&N2mjHTz4zpV+q&+({%bJc^*F-Urhk?H)7z+S-Hn;$?`vkAmldHCHJ6*qqfS zStVcq0XmwtK#-Y}gkB9ok*lxDbBgvZ?s)E6*kmRk+X2Be?<|e(dGz|!phDY3X~_G= zp)p3ukT-vgD7%UhRwRX)0rNSho>jN>Zk1XQDOG3TyNc09Lncb+`=io_BoQOBjglfl zvt#8y?AGP81-|I3F-oZ~EAsyU7V1t`)Pm>{$s!oWQG0*2 zS_tbisB^R0vtus|xFZVx0CiXRYRfQLar{gCRnJuw$jw+?6fo(tt#z7W%usos#nb!M z%W2G3e>Vz$hvxn&>g>OFxx-{P@Se?FwRRUN(L~a(&mhJ+*8ZI&F1g)>HG>7b^01Z9 z$&PDs3v^AUGls7^TZH#D<#4K`R77O$l;r;a6-gNn5~D5|d(~2|ueAo?y-iAqF^IrY z6(D{!?_URH2{YYE^0*s4v0pvNWmMRUw;$fGYWQC$iQ~9wo0KWDcgy#_^&F>O9v=58 z?%p-j;Ym)>p!PO7^2mRXlQvULL zo1-I-Ft=U5!(33rNmS%NW8v&FjV@+OZc1(o#z$I)S9U8194l_9*`!uo=Vp1uESref zuY$enNjtOYI#{;brDgK-=2Y=XBt!?uD@zcHPu<1$$9~`L)584wWE-(q$(I=FT(^!# z*|_XwYQDZ?W#Il3_gnt}X5CcGj|*=r|uN)=&5iTiqkZp_AoKrlukmNZL@RJHM4jBB>k8{Gd`suhZ_2y^4q&v%@0r zYU9c#Hb~Y;vHt*kwL>BDm*r9v)wmHR2E={| zw1O85e91C>_wD}xBE9i4SylR_cu&D;NZsgI}vYGq$;(!diq7PVmj-NwBUr z2iVxg{yNv?r|lD`Sa>hOItGZ+39t1R`%Tcn!);bkvHo0uVEIb{pGHX-|guvCgmAI zuu+xGbTjnW$wyfpxA31w((E+1)b;f9qWkfO{_lP}*Jt9n?S3S9g2zMfE}H9aYX}o; zj7CW=6`x|9;WPF2uQ~Bnr>MgPj-JSE-^oXI8C7oB!u>1s%iw>)e+~FkLee!u0FzdD zyvDhcnIFzw+jn{Za6PMnqxX-R&U2{YA?+Tm>@(n(!g;qVZB(Dyr;=vDi4MY@`vu9z(nV^D}p+1+Ovr1$daM}?V4UL@GxAoc@)KI>m7e0J0tZ;IO0yg>!6k%|=xF@{)_x7X** zaz-BU`!-KOK}B0+dl&5S;cpM>o(|PKWv^_wf(a%;9D@lOK#K1B{d)fZz-#AgjY`K; z*Ar8fOqP?*Bp|zd(eC+|KTqQMtLm?ZIzmJ6cK*Y|az-Clisg>t+YFPZmVI%+^y|%d zou9y;95uWP4We5^8g3=#Og0Bj3mT}c?$1)4RGgfjQ}lnqzZU)*cuT_ib)0&X5m-SK zaKL=kCjf8=UgN*LasEC1p!_wg!8VcM>(4rO`5dNjsDAgh@6=buz8UyI;(d3^v`JPA zc72Z0e7OGrY!7eNx-Sd-Jd?rto}**p*^y*{_QuQpu0(I+1pfegjl!l(X-c~+E-O9JW_q{9MJSV7W9uxR! z9;t5&J6}dp7|6!&yfgiGR<0|O%c<{Cf~QGE?#@TRo)$O175>|5KGO%&21R(6|*WZpStNo+AaR#5^ z(c!p)Pjje9Idiomjd?zto(A7abYCmwK1(x)*7F*4mdi)-)t?`DpT!#I#4j0Ni)J?o zb$KCz9n4`I?cOuc8tL@kKjDs_s7a`}6HXDM9dsJL(U%Gp%df@(**5!Q>_q3_TbrmSB4;k?fi7)(1tIK<< z$Xa<64e9c#sOf?Ce+p)w;Z0vwg#Q3%qt5Y-@-Rkh?fx7L?f(E~x!X&qq`kGt#Eky{ zb$YJv;;+4Q2>d(n_rp@(PMj7Qz{|O1+l-#ssFm8W*^k6~2&EOPJj>y>h4AM}wijM5 z*$$~{o0%?2!V=%yZVuo4cAw&JANXHDziGTPr$@SPy(%Kdxc>mNh2b{;0Q##t!CnFJ zN5xMRPkNThEf#Mv(Muvala@ez`|>O6+t1lg!gtnRXJ{HIG-i>O|HweydHJbU6V z+26;rct^!{&nAf^iRSD-JY#kR#CXZ$tEYOZbpF&g76%ngziWh*+T9;HS;O{eTu2!T z9lnGgb^i5k_uOC)q1e!Z~Hl_=eoJ|cwADe4``3DJ|}4!7lXbSS>9<-{hIJB zP#{G+){>V(X=U&PC6@8*r*6#@3vl!#+&?Xxnu0>TQ?0klP{hm=(z2Ett zrSTL+1wLgpV9Ku(0K1PBR@{iE~8l6>Ld2P!@#+`;nSd~-vYE}UUCZgTt zqVA*)?%gu9(Jc&!{M(7E3IqJ@#wxPO3X`9g(t$idNXBti<0b^`Thl$iX9kmZZ>(E3v{omd8r8rZLl}cIv0MZ6JP%b>i+TChOu_2k4mHr>=Q2nD| z%X3-DB+<7WDo1B0pP5Z=+(9H+Ta|B^4wTlHdgXrgX8D^)1Gn(g7DrTJGgcQ17ZO~Y z0fH*rcPh?IgRNvl;1WlAwGzCCBcQDlK;m9vj2boTO@quEhBsAcmuJkU8)?z8Dnhmv ziO%9K10u$mJ8ESG3Ml)gvx97JzqlXa{_RL5W49Dj99@kO5`j)A%A*VN)l_Ci0#D+r zFC(hsKP_n}jWNKc2>vRPHwpLt?Pi%90Hb`=;c@-t`D#6@7cq1?{Mh@ePbY?D>sg69 zZTVK2CBru5Jt||U7DI_Kf%As{0D#q5Wx*)N8)>3N0e5}ssVEFs=jN)8g+&6&3G&yI zS@KSIv~AINsosCH?cAGd66WAEjNoF2B4n&tmE%b8r*IwX3`iY`2a0y*ecO-AR9Tij zrxZBcX%|5Xn}O+2jQqqLRSm_PqirpV;<6x_nQ~2E6D}I9FsK90$=55^5mQ9BqooNTl^8t+1M5KQ)8+TKL&^l#>nD0|pt${#EIL0eB*JEw@ zbBetWQV-pt4^o;oEu{-5mVe+ivjc#0kGtNv$W?b>bz0JnR&ApMR*jTwrNTtmVfU)+ za;$-abz0{`fX8?6)}WZnuzkg)2^qw=X3K?Mw9W2!2J2J|h?!NOxZSzHxp7R4+G|)KKJxlMn*OAY!6q`Bl17$2e{&&IFK`i0Alr)^Xe)Q#J4a z801wJ{vrYSYI#9c1+%o)MEC6jl|j4fMM-oLeM*^4o?GzSxXp3esbqbDw;xK`xzx9B zBbOa(mcF=|&zih{y;*Zv8&X|aLi+8EvZF08g6=LL)FcjmP8ct}Qn|i{R6bb*kNpa& zX;+(dBtZCP`D-icbaErd$!y=%^>*D=;Y z0W1kZK&gO+P_ee)OJ{f8p>5>c0v*_^V!`B4d(_T0W|a3SKAi>f5{w=v2a>&i3i)5+ zzrpw=XYme@f(5l1k}<$^Ur(idXL-8Rsz}6V<*Yvv>5r=E7d9%}MDeri z_kLhMxIHV*?UgO!NF#mOJZ|+h+obOlae|vC+pv+-n)&=wyRtsJ26`M9b37~NVbkvn zcKX)6rQ}-~iRFJ<;WUXZk($!#ObXvtk=w|%i-hMV(!8lc+Mc8*?ww_}qM{&^jgmRz zxveyi2{w3QKqY=tx6{_Sr0#DSYFSwTOh<*MTO@282G9Hpp{S)1Fw24LqL~Z` zpx|uzxF5q@(ngBi3w~R!RG*Y|sU|kesAG$HkB~^@A8M-7o;Ll_)|4{mZo z3!8D7dk=bvlH@Kkg4oSlm0CFpZ6_V-tiL|wVcMD_a+^rXMY!lV%~p0WjK#>!TV!~k z5JtXZ^(LWMNRP{5^A2%Udum#Rib)f0^LZz&N~;NR*!$I}w;z-Ye=4r<$>wetKQ(O` za~Y6K8Uwc50IwwWKU&0=H(ZunrgfoWYUza8n~LQr&oU@MAo-Z%K7y%; zcgkgUArp*x)vLKQUVq+pS|4Dd0XQ$BjBw# z%Ti>HPW}?tg~-A$Ja;vRwC|BZ{HLfjt#I?sTgxUh>T4!PkUr$&9dk}Bo?--2!Cq9t zCqQYUw&VSEp?qNY0!VbOYQ?d6MHVu0DzZrU z2kz92>Wj3uHBA^R0K9tCtjg=SkEL@(9SFRhS;w^`TUFSzV--@}@D4_OYC|adsyfh} z%IZ#K+J0r+DnW4GpDE(2sY1Wqr>To?k}II7+_tQ9lpi%#yJO|Im~a#mQ@~2)3C1fs zQXob_VnH1#M^t3bAn`4sxy{R*pyYd32?LoNME?LIc0c1?=ZG820Rk37`BxCD_Gu&l z@AFSjPB^ZZCCYQmeClIEBtU1s(xNvp!q6k1d`Xx`^5L|G0+O}%UF@YnX(({Ud!TrI(as;IB|z$1D-yfwdEph(Kwwj z{NQ)|YtW-Bs~&XI<|Bh>xFC{9806z0g<4rev3Zui^3A_^8;oPyu1!F9J-Vv)rHV5w zfv0jD@$?_os!%X-v88I{pg;1?PtLcY3l3xGKJf2Yky@h1vm}$(>sPHzN}1eTkCYEe z#hUUR4ZY6tks#Zio`Y>`+l<6!mz>rFaZBYZsrMCn*6by=&a!m*zuNCy((*LhLtX`u z&`t?JfA(6o6|ZCtpLlxKeXR19{pxT(+N+{c*?+hbrA?b9m*SDJ$jYzEcYjKhOdtUB zwR#g&((q67V=klVoK?6aGDNQ@%nclxm+qIPo(WU{hh?>wPFINt2s`}UtA?!gJzOHt--+92G-birjMPkUicn^yjnx@g z^sZ-8%4Y<=D- zH(|N_>2rgdFRK?)4-6?J18^SIUNQ@FQ#-K2_F7l>jNa!7;?&F=gL-GvZG7FUJ-xoJ zv9Ch7IpFi@Uq*PPl!nixe95UmKGtMy&my)M9@WzgQOi|o8;G6A8_;ykScDT3g>AY1 z^=HG6ImB(a5ARl?F%?vO-2VV}wWlMRNb(;Ys!w9lHsH!sDPFbWyN{XnQkyd0oqOkw zJfuyrfYRd`#%sXtC6VWjQh*qGSEq)lq370#qPF&Nux-CTbN>LdR*#wFpWL?P?O97Z zNrZF=Z4dYO*>sq8mkK zDcIKay~Byn%@)E2-??qC#mO()P@BpOh=XLS;kT328-59i-7GO5kHI4zPk8b zG>NA{0`jD8&%0O0u)M}YX&3JQ0KMs7SbQ$G`yHexk{JX1{{Tfjm)fwd^xW;jCYkKZ zgm&C1yyJITVPan+y)ZV@f;g^DbJ24}xNzKKkxn45d=pR?DYpWx#{P7;aaRY-X%*aP zn8v|JLsmH-HtpML0}x4Y-4FgdR#C98kKv@BC|qoEt1u*Wss8|Yt@71KpJ4#i)?m-I zR<4|de&roOSM1VxtAGW3lkqyzH*L_3s#|g0%Kre9Us&qW&eqJa{{RT&SIOTH;b|q5 z7x_Iu-J(-xJzE}7k|Hcok-5O8%*_*dLvPPfLAEJ;z_j^Z2?v`t!h87dyI9k_ND$Bk@kM7hlyfaI=Bg&ueQnYF&U4tcl>h`FV%Z-gY zVQT`mM&Tn>(8}+&ROhGt^XpWt+1<8EyGX4Fm8C2X-CxeRn>y@{HJI&>(Wn@^PcuD+N{yK zAUwZ%zZ_RF&#}|Z-raM`{cAQgnI~6v$WFuh)#Q@qNlA_P^gY_Gks|bQv>V9zT(`|i zva>pw7dyZ4>VwRaanJk;v@QIk2WTbR?)z6IOWe{Zu^}usXKU7#rWb5?4YmIO+5Z69 zs}>fQ&&;d)rTl;Is?k|t^BPtA=l=jfu4y|L6pdInZ~fug-@{rKu48p}JPq5cCdSmU zGhA{9MfI(FL`ja^V{iUFT+d+YZ(2FHi}yXhyImHYV6l(1%lF%*V%f;i0p+F>+PWBS zp(q{uwPR7Cn)dOK%0nH$-mSZPc?@1)Id4X+I|+erm}d?0*6dSlIUjiTu5n0wV5nlt zjPdlXZwv_&QeHC~u-pF4bFU-(%B}cT--YFq?eLUtcM4FMz8&g)<>6u*NQKX26~0)u z!ppU*lkkGHx@=OC0+bt<{i^Dh=5e3l^{t^LCVJ6&4OEeiALUwXZrfNz(x)vMW!kl0 z%Vj%OstlzfNL8d5f0u1QkH4ClFe3Si)FD+jH{IJ?AY_5nH-C6i;g@gA^3`mhJp9jB zt>#j`xTdZlw&jy?`@3s^@v@e+XB=_TyM?&(C1g|A6~cJj#cgLYZ`{g+jD0C5q0b}Y zEpN(>{&bP@+t1YEUT#de{v%d&=tDe&ji28B^?IIVHMRJ7x>J z1M?^MYj;h8&c_nM2$`Fy`M=I9mZpeGnbzs@t-cpOIBMuavn~pJ-K&mScFeOYd4A1Z zHJ$pn49AZ3$yE+F>U0*074|czOn0qBG3@fgU^k_6tG;Lb-{o6Yqsogo`GsL5C!sol z5Fm4p?^ef# z(mW5|94k;+V+?Uk-b!OQs*0CV+|n7fRO}t9C&52Tcq+fc^V6c*!{#4$v*sPj?00k< zR)s;eg-V-?HtuQCA&fQ-YH!P+M5&HGwdJ1@8~!B{lKVL8{o3_0y-&-#nFxLWn?(P`QXWu+UjBK);e%WONGfV^={vWjS< zBH&}@%7*?Lm$6jK>dNc14V!-TTvScD-hP!vLIdt^m;I{02JH04I#yGkx@z_=Ao758 zQ_tT20Cuk1phN+FWpA3Ypm{!G$Aj9nZBa)tpOjWr99a=HY?d%y1M@R~6>C8oMuOg6 zHvQe--K>a0y8w#AWotafA|(F+SX;evO(2TqHtbq8AZKE)%kuZG>q~}EnM3~o0dKop zo||RnLA>z&O?4JCY>2FXt$FoUprh{{GP!UEVOOA%IAc-LvFzpm0_*cNUC)~1%jmy) zuy7Qmb4Y|Pu7_=DXqh_1GD`md#I=LG#@GYpO4{(&^Q}N(+UI&V%-?(Rq{T`%XWgC} zZ$C_li*9yBZ<%)U-nQfcIBLT1;|TQFf_e|V^0(t#18cUzFaJ~!v6rXTm-8c5V++l zvhj1vH13;rrs04Ul~ujBR|qBr*(6hyuYQG`PZoQUM$U1uHbo+};zih@J;Pu{B&Nfc2N4?Dl~D&?tD-Z|N^rg=_^U-x@!rnlb3LO07?UA5FB z%kzJYe_HHxBq}9=!w>Im>C@7xo3x9=$5ZYY zV*Sdo^r+Z6yP_`YReYe!bQKQ%3XheVy%!_cOh#1NG5OV1Y;gSMto_JN>ZyCe50Cl0!YWrM>zTZ^-Yjt!u{o?C!m?2xj>}1 z0DRT#v&tZ|c8K|Medp;~6U3;9%5X)%5{xyr~m%{{RhCuvuf2 z8NOrpt6f+~`ER^BZLH+ka5gNBs9lHUKg0d%*tZH|Sit+e{cE1nqkEa$?EAgzp-}sl zHeS8!j;K>QJuX*6wnLSz_#1g?2MnUH?I7}3e2t$)?OTw?y*KCn16=QNej?l_3c27n z-lzkZw<-oS&|P-Kt-7UP@uyvf_-iQ7nVLd2MN5z0#jx?3^$!9VZIUK=Ks%Qo?AMzH z5&$uWJ^NO+fpaCa(i!+f`@4G9a;SG;Xa-TOc)Lm6>p4?tXCbjjP(9aVo`w zoxfU$sgN;W;Q499#=!*3oN-5)9zzu4E*k-V@#?7q2~~nA=jJ=A#9~&Fk@!vt7&|FhfMPA*B`(_i4W@a6kz?Q$o(IJwNmsuU4Ki`{vLcV@P4tO z7MA}2S3z}j)5eZGr(A?X{5?k%mGNb*B=G+Lhdfk*q_V;ZHn&&e=U+mJocbD!a_OYnS_{v!BmbMU{!QHN)?cd>GV%vhi1LN{@g zB;ma&HupZsxg~QCUbfM^b@1a!@z$3tZK-LnEIN#1ILKUbob4wHa6NyE73|-$U&kmW zQ{jIWUu}{X32Q8b;K#Q+3-tLhj((l1UY+%x4wpQ6I1Bd(De+vA%_+k4(>pB#Prg)z9uPmd(#UhQxasL1;*bTjU z1KPguzVXJNtN0-gtqSYPUUQC0=lGM**Q);j!sYm#919y=>~k6hkIM!oTy^!y{wnP3d;z2Q ze$p=y>*(KSV3J|ig&jiUzH76e;t#@mzanVto;#aNyfXOK{oNRjP}f2RYD-qpeQuUhfpF(JboSa5W*B5AVxwb>_T9HN^+)XI@V+fLTll+Da%YsjBR?wO zjB*eC^ftFOq$#~zjx2sD(~Fbb`h(%8hU|Ph;B7ic<79bb-b0KWzg|CwK9%r4?J;)u z-Z~ag%epIQ(XbC0arcPzuhQF>Cr+COF`)kdJuC8ayxhl!!ZW@mq~G$t%-Yeih&NTIwSi+c1!+>K~BF{uS}At9u+;qby@&gXPa%-!(dJ(`V?J zYxkM%KMMRGqwC%w^Dd%GrxCu`iexhPll!0w*70OI*0bZtd?%%&PSHv&k~e?d0zZiQ zaq`xu?ANW?*qvrOk&CI8KP0a?L7avk?_mD`I>Uoev9$Q#9=WM0hSnRvWDO}zn+6t5 z!;%5{_ILVK@?Exh*s79s=Y4Il`qS{c!kTA>G&rDw1WAH~a-#?CjPBd-Ua*lU+yZbt zYmm?xUeYPVxe5a0cjG&&vJ$N8=420VdQ`U5{&>W>dq(BCkEq(IjrK1m?{i<8f3=^( ztvX4d@h+0d4gUZsEDST|FWvJ2>(uf;hp&45AJp}0TP1mBY^dsgg=_P>_N&+C)FRUK z4Gpn%d316|Q3xD!=t<_VQnb&o;HNiP+p&7v!!|m{z)7vN$r-K&o4_rSj~6)loN-?k zd>_;;^$&=;ev_*0Fz@kz1p0jPtd`Mlc@Ds2B21S9ci!** z)qLOJ9R_a~c!{-502pMqkj{*pYz4P%C#T(N+MPD(v-Io@CaKgbS;g>CdV7#Y#-pK-uN8qNCg!f_BowGP>aKrmHz6 zw(aTsRkT~^b6Z;wILrS4p7fDBK+LUEtg$c37w**=<}yi@?NS7)Oq-N87Mx{hLNPeo zNU*q7a&X4D&mU@1XgXBdiwAh2jI_wVG1xtgYXm)x$xLz|k+(BaO#W1RGtGWU>L0h4 zj65~td)+cEBF|aUZRQZ$J-pw%aU1^e{K0@jr%pKaHT1TD`)_;`@hlQG&F#*Oa~NNe z_8q86%M=nRBjxT+KOSqN>hj*i^CRq3lMLCZl4UB%Eqt@2{?;D_HH*=w*!Zf^Z%YJQ zdACOLx#JO*$R|8wueE14?RD^09b{;?z9fgwm;)4+@x0JvxlNAIslmwp?gxBURVhob zl#%r;a*=SQPDN;N#iZTMe8zujUx9XaZ)Ru|d z`#UKSOACpCaoNJ;q4dbX^%R#swTHnwF&vlvE3^@7hZmqmaZ8S--N6cd-kMQ%IxE%BJ>MNzu{{U$3 zgW8Rd)PLbG)8LJc(39LGazCjFyP&C+314EA(mnQNP!)$1_}*1+Pg?QF{y+R7o)Ba4 zhLg2h?;E57v~=%^o(|U{TdgBovAu`*S{tb34}*>{PHH}_KE?Y;9<{jVBaGBJ^7@`@ zjnaHorE03}X?YaBS#h;wM{LA)$Tou9q2T%+D|**ZhUx{I1P(^;rB||)NxFL)f<O1*osjG5I zigG(tG|Gg#8YE#dTbhI&!_yU&CE47&d7&>vuft($7Q!Zwa=&trx!cl~1Lk0MDesAFv*PbZ0q3UaRtq|f;x@2hgyJux{vRp#XvAC@* zS7YbPJoM{a%lVP65r5tymnF)2>ROs;k-7V|h}TN;oriT*ytyfY#E>fz-ugCiCgFf~ z_1i>aA#-;+=%$Zv%6?%><^?}5$}61y)3S~Hq>yeMv;FGMx$zB!v-!G>#8yf;9(;l@ zPu=R|Q&e8$IUQ-2_n#`(ov9DidRLi$!h7NPU6x%!*has3gz=C+TH&vMY43$v7O>h3 z+Vm#sBeFpnvoe+4yEq-H6$!nf9?~mzeJUe6agC;=A1_{Z*T~wh?QQV7(^|IDVAa~- z+yqd`7}_1%p(TJqJMX~vtgElvFX0`%$Jv`xo^w{%$AwvBaRFjSPr5+C?td=zvdZhr?6LiBn(BUxNi29$c`a0w!tQdziu}jE z{k+0hTMJDD%c(jt&lHb{1B3EBY=o1&I)jW6T!r85x8hAs*5c~c&fiPAi{@2(haira zR5=9WkJl9+*>#qU2iD`g&(`FU1Ppw@SC4A9YjPR4$Z{6H8jtPM%Sdh;VZ;|;G zY}^$%{v%foQX-2{nD!EW^+rJ41D*|41eN>THA>ia{_ZKpLu%q=0^2`^qGkmC{{W>m zE)1KLCe~Vr%B>@A`DmNaR<@%Z{IR!g1vAWLOeaxM7DhPEYEv{=!Y?&6`j2xiN14_| zkdd~z`;zS*&@r0mt_y8roUSVbtesf=wGwHP`xt&)XjnSog>$;bA&W2GyNT`A-ZXBzXt-)y=ska|?rp&t>&D2m{97r)-{MM2yyg=;(x2<-~r#eW;Ixzdy zmMj5(Dpp@LdhM+tBKfR*rSZ4H*H^l1bJ^U85eoU^A3NuxFVp+A@ipTMOP{bvyP6j$ z`5f{5Rr<5yPYuU6COe^+Wwz4aTjm^T1$VsTgkn$tT;Vup427STw7!XuT~Me zIA>KfV%^%uD2<(n*!#Bj`D>~0K9W=#tSk303Q#G9CQAC zYsWk_CDiO%Mqe!Cv-H6oE7f%8c}h&rz2WNe4Ttit2E7f>u)$Vbr=l&*yifr+GR&A= z>;39|oZeu0AlMFA?!?>xd1TY-(Pfu#7-hS|ma)O*;VMP;Xc?Y1Vnl)qBArIqCc-VjeF&eP*Dq!>IY9@_#0z1}}mnkV3cP#l?K{x}DwN+wiS21+= ztr=r)H)?&{6U{@NzrsqMeSsX3YwBMI_jAfHOS@_7KrSe*0+ zoK-V*EcwXne@4F-A#BkM(QNR1>&l3WF?9>su|1 z+AEi4-0C^^s*Z}x<@p3)k5N*{uNei$C$~{ihmd~lSN;Xsnq+d6CW#U-VBrUEYOWoO zy9mlM^XMvZAu_Oj^&6r%+r0UC>(KFA!DwLZdlW8XMPZKLcRrP$Dl-O-G|3#FZ^pFe zRCdA1Anp{l~GcsI3g0nU4%nDSV6*$^QU8l?0nj&yYbG?!B>EQjrV% z$&y<<)^*Cgyw5QC(Z@mCKDD(tT*6xvS}{DHSUjn~-PVau32x7^qkiAVim`VaNpBg> z)LwUve=4bSJG0xtBzvG4IrMJa*GpZFdX)6gt9GSAw1=;6TFr^`AuAs^IrOVHQoNEc z?*9OKz3H+f!B;959dTMChIH?_b41jxZ6%IWCLkN;&l&pHy1{vEG%?L;!NT#yeDig4 zwMfqP10efW*Mj^(b!#KqNOr@Vw(g+%3eMcf@bP$V$GiE7BNg)TQ5HfPJ-ZE4j$+V@ zrEH<-!_urkR%H%@E4%4V4DzPBj*VG2#^ZTCDgIP`QHUI1WYY{~+)0u)degkv_7bBd zMQV)BF5$tOoP{2pYbsV|kb(CX^Q(7PQ9Boa;CJ)}s7owyfhj*R{{TGIC2~;?RpZ`? zwbQ*sP{_fYBvG-Y3)fA8a)%nN3`c2lGe34I(yRa}g zKVNG1;u>ANdsf}Hhh=9w$|3`J!61H>uN*1BRRCAwl`AJJpKDGw(Hx`0p9IqlT?MhiE$?w zs&hbY(c>VnKAnFG@8r``Xw}$b6r#o`*W?)Wry1yHBj#;x%Ts?o6omO|+3%CKxCauK z0I3bqzR;6Nw!8UQ4l13mgmkEbu#HuZCjfJwTIi>U?q?)?iZsjVnlcc`g}DC!>(k`X zWk6w79^%aI#G{%i$NYXxYz{N=35z+jj(c8or^*csS*01Zf(#C3&XT(~blQ7H) z3n)+kIOp-N4ZG4WWxXaQ#>OFrJvx$W^%QtBNMKXRUqiTNswcwF2}LA^4L%h~!Q8C7 z<2!~4+S%leGwE7W%v5?9&kWwj=3&!~sw{GFth?0q$E`js2UNLKy4p->@~BXG9<};- z{{Rm>J3B^Zfeeu2X;HWH1Fuf?UQdO744z46n#Lm29JT>b$NRXgBbvjh&kPekHLUdA zR$WR9X`*C`<-EPjq-IA(rvzJsY0@?dkG-&(nAqt6YB z+}~I4L{RWTWhlH)wMZKcOD)eKPC+bN#tE1uWgw7>sRFvcrGC}-nDds7wBIAcY zKP|NDi5TDz0(TpK$gPWg9L*q80d$w;7|t_ad5?#B4b!aB+n|y@L*ty|wN3v32p)nJ ze{i^oJh<>M6nhSplg!f6!}_{D5>F1@sUu3-gyl-$9`!PJG;68M;OB9xF{-kw4z<48Y((_=s#Ua%F2Fie zLE1x1=EP)@DWqgz@&#}Gnj_Ry_SSHKK~4=swG+944_(`M`?Yh(W?kc=_N{Sa7+k2u zO&y8@w|81mW>7q*#MU=6TbF`8=WyfNzH`;=?jfC>qae0==Dyav(IcIFz2BvC7d{5E zyo`s0JBF*TP>8 zJ-m@z+j);ELm^UEB@ROlc&vB$DdGJ>WtwGlRcw__iU{;Ofv&0;wH?eQLzw))wea?+ z2$J=FMEOYz$F*8rDtxLUl0$!Y``)$sg#Q2rJU`|X@_*6Tf2+ddG{f*K!-;O2A!8(Q z`Do+hz{e~{Ad~8PcCL@@I2nCSpPTV%^N9*ut2BeHTbob0g%U^0ZYrnyyPNKl770TPZbEW8_a?K;r1Te1W=B=)kdhr{E zQy+YhwyxUgH#0IB69|8dg1P?ycl*`)C_W5$c2JwGnJ{ulbGWae$u#-C3g}nG7G-8d z;3v1HR|ciy(^s)?2+z++?XE4RT*T!wjQSeTmd{j)41yHPESNWTbli5^2TG`?eQ0gwA#{cE0h#UV!z{Kv#PU5t{an+zqJZhi4q ze!)M<@@_5KzS@J~4wR+5wP@A9-Q($61L0PRVs!GhN&WR4{s0)Ehog-Hwi^^U7s&6n=k5)7H4nQ^6LO@4j3}3C;-bL~5s@6OM<(_coUix0#H?+x?oyb(y!U zV3bc!yw&!p_+?@w--bJW=)&#)0D)82;f9&LSzsFnL52I>>qyPS$B_KN@q8DTR|-r; zlZC(>*99H4!dD3y`9AWmRj<{X{{Vpg9lyO7(yOEQ5$!-*-)%v4@Dswb&hp$?L}!tK z^AbIdr$3SO&M{UvUKO`{pO*r|P;|^u6(8+!wST#jzy9w13RflL$s&+Dmr4R<}q;+!L)vJ zT3B4Gvy~vyO$FVo;wWJ(?ejPBV!uio_J8o#l!sgSa(E}&nBN0DHyVYK z-K6sRcK-l?wmD%@^~jn$B#+MvdmHlG8i`NWh07e~Z&?eXM>C=)Wv)3ppP#Bjo4%)oMS4npl4_FyAj`+q8ect0~n?9R_@9 z620f{62uoDHg^2gZa;<^4YHWf0;i}oF=JS3 zpCT;gd!>;h*)BHiuT<~`pKtxC8%Vijbz_b))$Ie}&Wf=-QN|EEZaC^T{{VM2ucG)b zOwuPylwI;8Wl8=TC!y1a!}7Dx?PUGRtb^snBH-z{{VSv zE;|=MkU!1$YRDT0`zEN1g>ZN94;D;$65RXp-rlGca9w-a5@BYmniQ|R5Ax&2WmXpOvlO8CG( zF7NmieVYFO4J;7U`-U#Is!0lX)9A-S5}zS83cUzdA-wT_wX(xZ>|fAEq< zk(e3UH$tv|*!ItQ^kI*RiRVuPE1#I~T3kr`FjdEDzi($hnBcD6o$K_vZ-9Okmh$6J z5n|@!1$Y=tb-~8qAHV5WQ{WGTAP4ML+c%Q$)b;JjJPzN*%~Z1m(1_q=)cnY{(q{$1 zICuM%r*CJfME*p!NupL~%g{IkZwht(W_umeIJyS;_WuCiU)HjgCCDR&XXhQYh2*Tzl-xhvtMcg=5ig%2?O)+v;#&O{i{O8T zpoFAx4=}FRlNjsmOn-qM6?o&0b(UpLbDVSAIL1XooJSlpKR)fOt|d+ArndC^D}j^? zfNSnJz6E$@-f&Nwv-p5+zv1+$p!h4H1yn_4!{3doC8Qa3jZRUYu4ojF>l za}mtT8^l|Q;i!UA>x!l>7Dw9u04S*%?l?;jG5+mo?{b$DN;rxQA1(e|(d`*7C&4+2|+HOG0%3dIPn#&)V570 zm$j69>^|@NHTQMz!ut!Gx44;`C;tE*{3|wpgc>E}Pa4L^AA)~}ZCooOj#OU9cJR%! z$u**~dB1yq&fA;%P@l7pg;n5#nAO#^ znEaN>v>vTrqzU^!_$oQP$h6pVjlOA8&%f8N{yS9%?Dyd%k=l5i?rs7~QCHVL-v0o{ zY1GEX;`+SL&rLol#9muB%i6T!f>m@4b!o!5QtQ{IYpSrf5!-Mx z-{t$&^@JY>w20r%LFJOT!f?M_Q{(tYq}#g4v9|U6tD2={Es0opA2LBSv4HGGNcn!1 zp=~7ODcE;c(&yoBn(>=wAG>~j@7^m?C&Nn=OdNc@1}b^3wI9{weBC63E+qMg?OM7e zxoi7#mQb#xn0q#B-v0pMS7~SGU~^XVuZNbJeBxwwl&|qN-<5yhH50Xqr-yevyTX#2 zjW|lnw`l0St8tg3D6TV3y8g|8K@)LWgI7?yXRewx5V;WT994hqGrRqPTDq||lF;aOka+vFs^A3;#dB|~)rxn_@29?KR_H6K7~NiBK0OD)6 zeO6N*4_fE7y9L$ln%Vwb{)hNm{sUR5>O`P^aQKx(GED;l&D^)~f3;sfYPgQ{rnLIrvs@GSHvq86HaqJgPO>^K`)f z0A{@!c%>79rXJ_#TyHE(=eiRboud_I**w>26cw+~>wnpUNwu>k3*+{WJihZ9kKMNz zL6d{^V^F{Bxu7C}1oJ-wcJcwr^*J5AtEpyD>R}usKR)4_S%86uPW1l(E@-4hkl-Hv zmHHN+vk!&>ydGrRWKF@@hE@AF3cL?a{{Y^n!}~G#ZWn*GNcT#KwlUF5`{U-@>Cfj* zIgBhHRA=YK!w`Iv$}-`C_5A8s5!8s7e5g1LU!hX|%>ExREwU_#gZr}l>c8(}lm7Q= zRsETKBB*vnF5))tnf%9A-PmwH9C2Cway^6U%=ii$X1axkDgMy@8r8E?8Z0Q;+28xs z_Y}XghK&-GwI%{jB)0xOoGmsF*~3jpkS5oW2hLaJS8rZ=ZT|pzqw6u~3k=VVBO8}! zZITbW?^+gqXvd$y{vYpG*KvN%T5FK^7g7=PFaRp^+vcrf@CQPDgM6&0fENrmv-cy6 z1^nv?;t-x1N6Row;t_Ak?fbRSY10X!F`{MHt$ifF1*}ssL-NMC+O6|9;>}iV{t?<* zxVTWDh1>qgu1dP>O*}l00F8`ltfL=V(TaB6!hE&w&+x_%l)}4qkItk|hD@lDnKAQy zMPlO6{;uwLKbWelUxDh?r{T0&wVP?7i+=t!mi>6 z%UkmvoKd^EwuS9cwA+fVIjlt11AXPn(|@#3%)}hkDe{E(ItK*cp4B8TwK-j^)y+?= zBuKdBswLK(t21@QSF}iRNa=HmOgSG)=hInJ5|$r!n7Yw-+LS`1MBr>O%X3~8@!ELT z!q;iHe(*LC_kr9x5B9s)sy*-w3w`5UH;lB1d`)CwxETuEGW8y{N~*ath1V(hXX0De zdD;RnN6lV!J1^R^3k-L!y0!1w+Fg03cqCY}_dLextKTBI1^twD3u2Eo`cA($2pB)N z&C`#kHS18s!ZAFmn0a#_AKlzYpvDGA-8EXy&PaMOLx7SYJ(^k z>C0^k&*mx1`zxQaad_Wo-b{xIv6S=!u6_RiO4eAo*u(1bJ~k5}2j=^? z`{Y-)&HFuTLfNB^@-pbTZX0v|0JH5=!SFX%@>^k!7CpHtzolU*E`o*~o@HzHbY*4c zwUX@lVFCNU#a@>O!F$-8F_&@$+<)3X-N*N9PA`SplyNp=`PASI+?B3soW_cjk2yvR ztGkw~SOJ+?IcoG9Z-)2cOw2r<>OS%PD$L&xZ-8?nuLx56ow zEp#L><>XzZ+wO(kyKm!A4~E*SFj)9r?fu{Q4R(GF@Lk4-s0*iUg?s-1d>)~eg&%m* zg*|mXueVnbF7HZm=N~;|+3PVy2!=-Ce(gqen@#+k*snq|M|5Iuh!I9ViK?)Sd7fGO z)t&vZ3vD1%POA`;aWyv)pokgOeJSXRxx4MGi0|#$fnT~Q4zmvYjw+-L7TKgj^3BmhYs+#N z179utYWQ&{jIAaXvH6qjUo7tAKJU?gojO%*B5K98WPWN)@y95Of7XdZv#SnA*1fu4 zfF3u5ByiX}85_$x$ot2+JplLVQ@8B#UgR-Rwx^jY zOz=qAowsL|pqWf*n|?BsU`Rm<0Q004U?C5+S|zaRJCdK zh<7L0v%u^k#^%n#dseEy8P4Te^}CPR`{Eo9iq^59buJgp4(*R&n$wTqUy0rwg5A;A zZam?$>eZC-RQr)r4V9hI;G7{Ia%A>3*+uZX#R4H9v>+e2F^%6!(f4u6dyLF6TC~4j3J~zl->3UD=zSovWyWz?#5PW{Ye+HaCC%wJ`V> zUX2-25>s~WKiaHgK2t|UoWcU5VlNc?OOXRVnB4ZRjvota3Z~v@Ss808PXhRscH14R z?muzI-Twf-nzDxH({Sx5drQ^W^IQ3r>gIV9ca|HcU}~U&1PsJyf6HCvzr(K+voZ3N z9s491!QI`l?NU$RO=f$Pi6L-^c6_0__Bq@4YAk-2PZvRTM-yZkIEpVA9M+U@%C4SE z1M6K(o&eW8mshut>>0=$ZTitKfP79PxBkwD&1U4En`$Si{{VKX-Okuz>3=cLy}r;4 zZMlDo+M4^^tcPmgWB&lJT_EsZi6W4~_T`Xcdw|%cuY)y7h8<227H^mPwBr*`te%u zqEThT6-rw(G8cJZb(DO&y40~jZ4TTr{{Y`rcH6>w$CWL@Tet`KfBMwxPYCMLv!5)w zC(5J`Bsk3B9XZOuV{g0@_H-#uhX>!iKA&cclNHRRKCZaY5YhRaQId3wA5LqQn-zd(9BzpyI+eR7cQE|$NJyf z9i-H*E;rq704f;(z+8V4gO9tK{hskhh%HjpBV0&6`5EKo?A7?Y<1I5*@i&XLjcZh2 zFy3EIN~qyUd;kFS7#_9PgsB_0ev!dW*m=rb&!xUP7LxbDwoo!XitTY4$HEoz)CV0f zLEDYB>R%c(J5L8)_i+hOBE@TcE0yF$5GthBfFRJ)cT!!!A_k(XPrjqHc zmF^|MQi<{(D}O@xLNIyhp0)Z-;@=2p-YxKK{vOp}6WiR|Y{>&EanyQOms+i#Ezd(8 zol~Py5x$K4viRNb<3@93@dv>(i@hgR2-Cm=60ac0e5k<$^(Vg_YRAKWje3TGX%Bce)=S{3QIIZ9VZ z?7j=ltu)%qnl|{M^8WyOknY`%NJbsb(ZzTstEo?@>#sGmLK!Y5+RgWI^LOkk?5~4X za`+R)-XZXQu@OsapeMIy0I7J+-@n%m4^D#|SIgc$@II}ic^c>{%FJ! zHb4#SoPWJlhpWw2XwL_VjH<~e=6$d6n?ts__!*~O>4;~aPD?ACrv;!?!;(LXgOWeO zya)Di@b`y2OXFGe-BCu{+gS+>*C@(YZ}(QcC*jSGv*VwJ`iFt!)E#bY;x^EE+e&#( zxkM+>@-x&g{06*h;I!8s6Zo~JLwj#3C9T+o>uTj;9EaZCl~lA&FLZfIq^V)5QB(Jo z&#|@7*(XK3)1{kD5?kCEL&gw!goXYB=c4z>{{VE?o5A}ic#ZC!D`ndX4q8OoV!EH0ZHlpWL#Me+WpEdsghjs=wbnVB>UP0q;j~6;OiXhW`FjZmG3jLu!hDZMZ zo@Z}G9;2MsyLf}dH{LhY{>Ss$*+|3&4YoxGzDGhmtMj|Y{{Rkke}?`ky3r-Md+U3N z3A2>-l^n5L{{VT%L*Kn?LMms!mDT#oYO~b+OZXS@Y7dDzb<`6_FNm6hOAD>5zEVT9Z$EgQqtiI9^Y%`X`Ymee28H9@5DzAByQ5?B z5%}?5llxD6FxEBuYi|{3Pv-rU6u5(-*nVx`^*HW5D<^2wblDkvsNk{kqq2H_rx}Sya zX7E;~7+Y!$zSyw&V~}Th4l=6!`vN`d#QrFFa{mBA@h$X?ZqP$3ys#gaW5!!Mmml4u zmd}*?OtTdgQc!Qr7QPpF?$5zqH51=Ao2T3;hT*%y3w+Wqt~-wFUg7&hcn?g{-qXiA z1;e$js1(Z|-U>Dil1Gk!j-c1aNRDkxrrei)LFu@3-Csw1F!+OU;_GGjY4I*n*0Q1{ zjmP@30QpifdSi?yUNwEJerMQ!0)J@j9`nPxR*B*Z_^q`YD|CuaFqPaR z`2iW=oB@zCUd^h0(7qDWCxQ{F!6cUsQ3sl#P>$|fwSIQ^C*->azi>WK3U1g z-PX8GE5RC$pW+)0FI$F7Pqj#!i=!)SFRwigRVgjE^{KM=%aozE52L0CjnILgQ| zjAFi2_@(jk%fPygsIpOX^GHFBn`5FU1nnU6lk)ECT))NNi<Yk13dNmSLY_Puip5ZSGd*n>6(2;citp^tUC;Jz^rIfl-c2M{{Rd|wWV8Q_aouA z#48^jXc21mi{*KYa;`xmAMV$snH2(%cUR)?!Jm&;zYly%5!HjfjdBDxOCK*E&Hk_s z;B_LuT{Inb+gQ`B?(Jrd;v0llStB_|2j)@@cT=fn%Pr56;v9x}D(;_0vC@jaEnASIK}@}n_6Ko9pvJ*%e= zXC)IFt=Rs2C0pAV;+{X0zR`ou6xCadTtyh2$X(gRYHIgvAc^OYJL8SN#h>D?N=umv z<0ZVt-Ct0tC86a?uR~(+tc<>6g6q@k_)}imOIf_jS1`F9P~g>AQ(_P{wL@^ zZ&*N8ywh-#IYGBF#UpJcjx)5V9dX*ewnPALe4L&-AE#V? zFJ5YEHNr{>g-2oXuJ2#1GAodin}Nw4MM}!4y~p)~_FGi_yZ#!)KjKoiGqPaFr3_3H zJfE2Jf&LXAgMV*thF&DP7Pq=?qoqgY74xK2bqGFf%oVrbj(7(GzZrheyUeMOPs&%@ z>01#`X##{i5nq4Et?yMNib$V&GCx8Mbidp1 z&cA$d?b5##{{Ux?k9tprG{fMp5NaMpy1Sbebp6~uVap+tJR`R~I`U0@m!bT9@ICFa z+`-~o6@dwjjFTz{bo=3R>0dbLN}Tyw+Zjej+EzX-(v9iU{?dlwbMj}NK5FPcv@Pyc zhIwA~`J?e8;tW<%FN!n`Q4H3G8QbjBM)EWS?hms(qUS$K`cuH46tr&?czz8>P1GT~ z6DC;3cYND&MmuBDoFpWydp51FMQge}-~!)zynDtU7IeQ0Y4hD(+(+g|6q2Mx!aRaL zxX)qS_OF^gKK|1d9s=_;%TSYFpeVtP;2izMTy@AK=dl96EBs~S&lGs>`a8XQQl9Ku zArLIDyUJGNpvPW&_pXd48Mkv9wQPQkc(?Z6(X1uZEVS)8?rtK1HZsbF6_xo?rAgoJ zJr^7vYv#>w_Q&{(tND@XkuH@Bf{cOu&E>ngkT}OdyZ->K@;$6}^19vm3XdNPBYolR z`qK@^n{Z%A_JiN)Uqy$)Q?bPBPUq0xB>kekDC^pM8g1695g>GuC$~`yh(_(-I-H#Q zn)9oVh~7QaCulEq`{}&wx!rLiE`LADxY)2zq;0r=4I~pzCrAn|RDJ67qeeSe!c`@G zO_#m6hIE$h;z^7A#JduA4|;8o`+dao1`Mp<#0TeC^Ou|$h_ek&tA+g3Q zrZTq1Qj)#R>$7hN5yDElb=&^{pwtO55QxrDCpZ<(tkb-ZmN{VB-tPJy=_{{ZLa zu6b2=4peDHB$@MKVx@Q$UR!p#!%pll+lMs?k(?ZDMF$!F8j0^9-MQa-kM8}}W~g)S zXs=@IGTXvl8HW5WKyI0@yuV{V9?4_&%@*S6)1B`hsw`vT0_}|IT8NutC{P`fW zF#{^S{VUzSXO9*i4EX-m?Esf_QbU5jCdm&+Jy-l|&c@MIDe|4zI*l{-{?|}t#O^>X z>0Kc47>Yzd;hz~he}q@fejf2*mK2%ybN6=t01))9=Fd@zZ{9Br_p9WmLB-hh`H}7x zTHAT(LF@Oc(`{XDqgM^M8u`yfyWb-D!oAleJ!(LT3jEuvK{s*+5@&5gBQYu)t!M;0!1ezC$7-WHEQT_h$MT`0IF;A{F-Xjt za1A*?^Y$iD{f^^x+@n^Mn_AT*mz!bjW%!EcXY2qws_@FEWUlK z=glutOIx&mH;nBYtJh$;R!!aeQudJqQ`fDQ0@1>LU!{3Ax1|eq65Efz)U|rW?5xZ4 zoz;gtNjhwi0b0thEy+^1#Blmd7ji$%_c6_NOKs&u$|`GUqJ=!TlL)nC*n}gotdxuP zoW?AcvO6eN`@h|&B(s1^yC3gXf!eX3FOOPHyOGMAg%oHvD;zD=gvR5|fN@@D@h8LQ zQqnFVXi{k2Cl4EehF`B=_zistWH-ftGJlKx+UI;tZEbsQZOU#0SAG){$PQ=X?}#+Z zeFsvK(inex5kDjK$8NsW#~V1@J>ndBnI$@4SKc2U{uF7~R?_&RMnfK@XA#N<+$Kcp z$KKutBOglm2hVu-L3;U?UBy4WkKsFO>M#}6Rd}RGn>_7~eZG>$GaM3x){!owYgrl-_i_F8Z|PjPnjFaW za5$F}=({aRVv;z9Kf~U(tS5NomPlMLntG3$KIXi`N7gNG;}C^l{44hPkN0b}OIJwJ zF(%Nzc#8Q9WD=E+s>0W7?yRL$;O)3@LM06f|FE{p#kNtaZViFPtNdWIX#+PU_?LqiXi55Xh%+BXh6!s&tWN1TQK-@!G-`Iw1R! zL?n_w-SD981J`X{i5*xmIQ6R5^C)Q|2j-?Ev$Xu5l|P64Ya*h}mS|*#7U_m{qMUq8!LccGqByyRb z&Q79|S7sxB7_6y+72?Yyjo&RXnR|kr7ykf4rcA7e3-xNcH9g{5DqP7RcEQj1R5>Js2Ay!MNCzqa z>rg5pDDxk2Z|>HOobpUy-UIe2-`1#08?p0CgeR^$)y8Ct{7?M~^JcCrYCxnVA$z=Vi0)Qju;X@}y7oql3@`PoK(1 z2s62QdVX~jpT18fL5B78tsv~ooC=P+Rf6*4ngj=1P*{{RZ0gOI#r z`&AhoWt8E%_O95)88%Y59&~XoHxwIl^{6F*k|tc_^!zJIJP6r#5YbgeE^z0)Z%oQZ zIjT=^vB70zys^nXfOX=Tz5LknnNHw#{{U!K)R1H`!1~r?yCQ(3S>;6qgGuqiaX$z7hZluLBd5}?yvQX84isXbx=*wX%lHZpGHUuW()=UhRlK%sHb8S1O!pp@ z=`k3ZJ)mQX`MSpR=+|M$%*rwcVgCTvBE5&h8q?}lLPJo4_^4npvf za&hW;u77>RcPP6zD|N1mQ&4W5nZ8K+W53q2z)Kw(&9)B>6uz|;}X(Ou-quA=SakZFCcI03W$EVV|12j=OqaU5Q zu4dKUV@D(A^=_E;t^98Rf!ZDU~caw=%{jl5NSu;3ixpBwHz zS?VkBv+r&17xT_4x^yT-IYSN2)YE_@WVHlE>RN=pFukfp4B(xlfmQ9x=XUI3uG=?K zTZ&S4)ToGJI1C0eQOEMhnGYV-XK|4aVO3*0G7n0ZW+}?$@HZhlxLRRg;|tVMpiC&} z4M0g*SNpX{Ifrb!I~(dz2Nc20}h%J4H-msN+bP82Z@VP|U8CnY z#Vgn?V$#Y7%37Ed?orySlmT}S%B)7nTg_(MkKv_bNbFnOHmE;#oAR&S{{Zzl9ISa)+bd&;0jn-k+7-q zRB<-t+gM*G`MX2Rf|i_)i)?qHk|-l<8ZMT?Tm(e)eYfto1yRTL$aNExd!vyt2tftELdKP@tnR@M{2g`hV)o9feeCD2V{0`L)LX-AHf_RFxBcpwNZe7nEoT6SV$4mPA6khxYzmD}3}dJc6#U=C zQ_IRrMzYAku|iyIJ3jSitK;VRnw3A+E-3bd*tr|DkCDbH$^-6W{54uPWGtO3!V;f% z?$uL)Ns0`Q)MB$`nnjyqH_9saoFi-ns%+6ao<8sKQ-oc`5mM>5<23e})Q>i)NaQv# z^9pcv4VM+KDSX z%C6FBp;sB`C`d{r^Da*ZkxcXUrW37J3{`fHl^J2Nu|h;xu(t>0Ely{NnOOX|toYqu z*b0(46t_P$JC_1xljivjYDAoYf!?6VBvdEw^{T#>D4!*%5tM!3_!T5&7p)_@4W-5f z4nfecujTy6Dr2$NYYNZvL2fu&l^Z!L(yBKIvQ5R=lWzi|R!JLf+){a@$fl#rQM(2H z^(dl?Du0DXBBu^9f--A2f0u?qO0C`cQs!oARz=wuk-?!P3aiCe&h_Gyw%>YNm&{s@ zbLFspw4Q1!DK$vs9of&dGtFJQh~&}}HAJz73y6vKWuiGlh9uT(ac*ME#@d%I1_u?aCdoCH zK;J8TwF#XS_Ag4U41h1q$;CH%vtU(Ro=X}naR>2=u4G(s_eE1;gM&(^Bq|OTg!zk> z#){17HiJ<|E?)=c60;~o$gGL3`I^`Z_2e}=3m{a^rAc?e7|&5 zTc36*ibQbyz?Sbzh0f*qaZL!JS#iOkvXS8`oQDXKleBIhEl7rZAVb2nrUJjC08UbQP!9wUo}Ddw4mfnV2hiGI9}CENhetc z%C#xmDgD{SH6gc@5U26X3SacT`V-AH6HwiK2M-`ClpBwuX65-Qu9!5Gnh=?9|}ovB%3(?8O8? zSdqAVyJ!i*f`8yN%)~IgaZ|!oqVrXKs$}&dNQNA;pO@w0tnjN*M;xx+VLMa%wCM&} zlN=h=uXMMuU7K$yRfc6;$@f;JRVh+%Q_EBT0DRRg0mvgVu*v(Pm;f^T-RX9uQSDxK z)p+?hKYFN%7MK1p#&{pW&&FqjKy-s;e6DwxETA$?}@CRa*n@ z{{VKBVkO&I+S1grCU4$iLbQRr$rQ)@H4-6IV=2x)YLX!y)iM0FT8N!ghR$=gr$$!! znJOh_jq&_7At(ZXDWf@!$&B+#ClTlPiKw6EnMmgp(3?XVn3HZ+Sln5DWyLGVtF=v4 zR`U+h+zK8Xw(`|VO$z1oxf_>y{Gy_nxkhTJ(h_$kMWw`yyI4^f0xky%%BnX~%`3*; zHs-08+7+AlY1tC(0;^KJnQdm<7fsa=bMloH318tKD5(Kx*Jc+L3A8>&N;mntnQ6s? z$Vc$4R(1&LI+}DlRP?KIY|OMApvE&$IWO}t=}$gc01vz>F_8ZNH5V!|xW@Ac^p2V) zTz})WGlREk@lwE{CMWA9YA*k#pbi~+agrlhBS zc6_y7Cvw~!)PahfjB2A%lF?{fES!~EiS89sXiO7OuGLogsx8~O{uQk~q=y);#j!t^ zw~Co>pvPSaQpXBXQTJ+HS17ipGlEZDI=U$Gr$lt+|C(-W#PNvGwUonSnba#s~aBp;PXvfvd9 zw{=W!aq_Z2(Zbvck)?-!-P=@`V8Whp-kbnt;BGVrDnn-8SP*uy^rjHVGgAgeJp8z* zvyHeLzG}EVL9I!n&dyq#&Q?Atu7|hXGzR$sk-(=Kg;~g}6tXWZ#Ywn)%xXjBY*kue z7*!|k)Txr$14vhH+L|Ky`qKz4o!^B`8RH*zr!o_bimRi0z4Unqf$pveAlwbGx6KkjOy8 zkD7?dipa8%z>+HC{sT`Iw)i_xhI*yuF*ye;K3bkRn6`I()jY*}HcYm5dD|lNr!B6X zyK6^Kw1*hZ@evI?J+w>3_oE(mmy z!JZQhO%}Fo^X=w=A}Ge%6ovbv?^5Pt53}18+7s(eODjZG%yg;=+N<*#cg?$FQ|5LL zW`;>=Zpa^JN`-ALwmbbS9%%)=t0&5VaZ)3yCm%IO zzl;h|Voj}ye$8&n_iC(Gmg*bJi)~pyD%E(M@W63VCTSY7?l0KjWeO7_tH-9sLB9+D1}N4+4w#Iw4wp%CTv-<9EsO&@}53xkyJnc>e8J4#Vwx}8)b3V~ zOw-TG@D3?XpJBU*2Gi|UH;Bd?r7?&t^7f!!-dwwthLdLyXK2RLP5#QUCvb!T_kLfO zHGiGB?NJ#?!WHRFTz=kv%v6U?vP1r@cM4R}tPbPlt`AYS?^T9;FU|L;T&ri&ge6{m z8Axc_Y;!i)6;HRzO*&qlSLTUI{{R;1&<+%C+fa!%{pv`#)~LFfU)a`PF)^>xZ3juS zdv!w+?H#t(il305UX+O@(TZ_M)9W=mnKqhLyb}D8s^Ya;9nH0P#WprlH!n3JIDB?d zT63~_`^r7JrQ7}Is1K@XENuGc(QH4le0m}hxow~U!z zdmVr?AAefiV!K-no|M?uH5qOivQm9csx?~bB$hUkJTlD?F9*zpy^iYY*TgrzTBFLv zeLGh+lBj$inQ9A%$innB9M0r9-%?##D{WpcD^Z0f+4py^<5_l^O@vZzNKg!Iz!h~) z!>|q5pw6TCcU4`T6zfm9A%@aeq_mbWV~~8yRIN0vD^7Hl*4+`%6$L`>8KIbUiA|Lsok@#BYtK3%7FiTB&`dSYF;fpl#4f{{VcbA3xTw`EKaLwN~GV*Kf;2 zJ>80RYCfifdad+U38y55ZQ;hj{40(J%k5aVK;K9uymKx(a(-Rjl<=>)w|A*yBWo)B z)xWmT$`WNLCL}TZw zg;&eDvac@XpAKF@;k5q%iDGSF#O0Ttn!0^Q$5%R?zu6`k3;o_JhET{zQTM-wmN+FW z+g6n2<~LiLc3^*ESgqP!`9pk9<|iLApSzL&00FE1A+XbYRbdT|w`7+IZ=Hev0Ea&* zVUPD}{C4u80%3(}wHR+RF|I{g#It9a*KIWQN0G_!<3qM76jp=FPn0e9DU|Jx$XE@t&hGVRNejBPa#Fe?+02Xjh}O(8O|@P-`-*AQQT?PiDZ+!kgDK$ zr#yeW-!*9Hx{R6}vVEQaJl?P0Z}(cXB!VxO3%AmonT3QTZqMGVKCvVb%qm{@GIf~_ zw$U}(K6WTD-XS#t}D_6Dp-IzRPjO;vmnT9R&vD7`Wh_O zveh%h&%(bAqlpEZEB)0Wj_=g9S+@95qv_Yyx`dI3y0w2cKUD3U_v5koYudJ}jN_$1 z>aY9UZZ%64Q|&XY@g6b9mCe}C)o*{dG_UNfVica&XO_{j??waI{*~vld^Yg7DJ8v# zh19E(GxP2K7Rxv3UYcTGAxr)3-9GhLaURtSwSL}KCZ1r&?Sk!v6VBRq6Wu=C7ta5#qM+c9kBBX)!U|3`ZIJqjzljRxGjk$T+A?ydg42 zO3mV@blJ;}%qn6cy`#O4W?zjkM4^1AXC1S&ZvOy#Z%Si)W{1t+<(5o+-2C77)p&c_ z#3WJ^BAnK6{{YJ&^9tzt^-ZpM5yLIdbF=v26hXsBAR)Njw+sIOeAfx_AI17_#JvuG z58fk-JCwt0caC4ocK-lpzkimvmRO-ovTi1ZhMd`yx1^ zbn?_G6zEl>D-%XG{{VWuFZGWXw=u;ms-I)y`;XaQNV$eMuXTHul|tvsi4im38U7l; zxc!vvB7{hnFL}ntk03cDoH%m001RYc_x}K9zUB&>{&9u=8dVUagC8k+f9oDEzu+k4 zRJ$JxC+w-CpjMhxy;z@%d4tC2o4Nh$B{THKD=zc)Oo#0+E}f`(7AqepPU$!9{{VOX z`T48wH?>B%E)M1IQ-N;^jr`PqtT?N-A zr^`&A_C~p$$p(+AM-|%q()sF4ZvFhSi;w{R_fubc`4P?YL@|%}4I*2tdsLd*JVS`; z$o|Zu*!UYy{gQk^Yx~QcQqnln8}Ma!`Fg4ifPd&!ZNFxVueX4=;h_x7j_a2jhkS8g zeKJ~@-4F1OmZ?JoQVr5C%euNF#P!!-z+c&PkAU0uRn<({zSLuMbGP>@K|sCswNw89 zhD*9c@~*W#(mQpDcv0B4?)CZ{nr*&%;eWeRO=)OVPVbld)u;N=S)h4cF30A<{gymK zBRnw89E!NavN(+Z@A7S8Pp35bKV@BU);Egw7?K^nYDCW?N%M2Gl^EUnSLm73p;Kil0H+|kzesufq**{;F z`Hr9VV_^Bl`P2Xt+c#pkGjOJ3YYZ9{0hHKVAG6j z&vbt6FxgwAtm-h2_lK=Id{c<~EI+a7T>Qn8_F3_bt4^lk24o4cUp0pEe*XXgPBG|y z^;l2Y&%~(!j_T^o{ne!0Kk>@_GoMYgk#Knjv8rpL+pxr-FZWiO;=0e`7xp|iiTQOe z?7{H@DV|Gn73H|xU6A4MKJF0p%}Wo!UmID(kjVndIm#g$(ZAYO`F7Xo>gdp-V4MN{ z+G6OD0_IlFO3iT#Z8nRJR+h)+oSy)GCM~7KQ*z}+@dK`@-LEzybs?y^8Vd$y)jrZ{?48^g<^D!3yhyKDP$c#g@Hgu zYxQUQ5;jti5%Tq_O`*oFyN?Uee(hZ>{!3(H@|ZnO%VhnZym>OUvT3p{%MIz0HWl^H zPuKqdLa5KczZ?k?*ZV5yOFDU>VNWm+KKCK9_-?P&1=C^?F*s0vhx^rX9Xu>-7v>&> zS5!EfYoJdfR^0rx{{V)6_>*hp$aGl@JSJn3IVDX00C@o?>siwL5Aof)wZwK$G=qZ@ z25GQ+g;nPr>-A|glwwSI48v)_sqJ)IT;Pxo-u~}Czgiy_Rp^nQ_AG6=`6izRz9bNQ zuMgeE#yMSXXu0wjKApLVyC(8 zXHzU#1^WL0wNO8X(a9`;=jLtQGgP>)T_8fqQtEz7ABG+&u?1Q-o*}z;mah8~v3v{< zb=}8$$!`SfD6`0HXN}@@jnYWn8!yv_{u=#>k3zSxw2syl0yz1?{Ji%+Eje_XSryWC zS&{mO0FT5qCB+l_NKwkw&&Z+RO=LrLrNL(_+*pP)qKvu(jmNbvc5we1tI^!7ozwFh!iyJhIVj~o5 z@~STh`3@IV%c0(MOF>EG*GSg zw$eFx+f9eZn!NCCh1m;z zBjZ6w{cL0>LM<1Jy-BfByFCN&g3GuC5;k)&5cpr-J{{Z+*HFt}bW9m;+Ne_x|#QfKmy%I#R~Diml# zaNom7!DM{x=Au#|ecoMT?NAw3won`Nk=JrZ)BWo7n;B1%hdCm+le>D9j;#LxXwSa^ zHi{zIac`m6yuha;HJ|2!aqC&JUlONvQfuaBZIn&D#eU~QD;U=?{KBd%ra(vC1JdJl2m@UPFWj-L%LbdL}XdfQDaXK=fI(g-n`J^PIG=liw#S#_u1&Q#2PRqg)O zbK2j68(Y#Yw2fJV+TKP`>>Q_|0P&I3R=6z6bSo*P>S(5#vp*K*nrI|@V{f)p>+ZEm zSQ(`9=8e@CYi-8?yM8tLUH!^1X~w`5Nr?p+5Bj-tCyE=H89$+Wl1GxuxS zVfYHs0UUDdja?4!o6NxL?ONAg1EiL0+R9!pygbj8sPsEm^{<@7R8n_Gy@bWaJx?gm zY?Dk62Ho?28}~o{s_ZP}^CEIa!a7%VXYiL%hI?ly86#3SeaGuv8~iSp%ZUpZWaW$F zBqynn9zk~!tL&PJ@LAthr#-sQm}?I zA?~BDD~3^LbaM(8=DC!POsWfizfy?=b2KX3QLAMsD!Xe+EfMyYSpI(XDbZd?{?HE$dH(=s+Ov%|4>H50@flJp zMx?O%Rk#dMs0y1r&QI2yZCyqr=hBO7d7SPmkiU23quCWp8wb?5GZ_wfq=8)M-B!*>=m_|(zq==qjNomY9WDN9CR7hxpv^^iKU1(%&s)|$$W}hXi;3-T4 z(we2%f7&#Yw4`TRx}0xrMln~Uc6H?7ihZr4d4vef7Z$FPVb^6PO_lwphF@sQ63w^d z!Z)e;mZy{}Z7(5AdUva0#!Z>qk^Jhn*=3QGZ6t2(PuMdjo8j;A6pSI{$R&4F6I@7> zc_nkke+tr))<=*KpD8q(Jh>b?V{hI1)AkJwXBcPpj7OZvxyLn}$c&p*eB!r%v*iPx zhrLv7D(TdRUOj2@KBcVB4*t=Xly%@0X6u@WK)!ZQ%2aI?p)Q>(kO29r!f4Y?sH2JHa=CPCT0kwFQ& zpL%3V9ZPj17Ff)`>R9a`hH94S*f!D1*Jj=ym?$VnZsQdX{3BYV5)U{47=3#7G+dbC z>32Dwu$8n4obNd`g3+!BZn+q7*w>*qhc$%{GN{{*fBM3*&Vzj&$COY$dG_YID6&>2 zlj?GCPX2QT>+jyGNG=iEE*m}jS7-kK2$kHYl`25vjAFCj!g|)l^I|cV^yeO*jdsFO z?sHEcN4d;RIhHvVMF^*$9WhwfQHf$x9K1o#%U+Lb;4AlbiGF0pe8JOqr#&f`UJR5d zw~azvo;vZG=!~FZvD9y)JgRVam}2=@uPi&}sZS4+5~`0elh@SOrk?@o32bMQEu~I2 zhRMn9aa7{)X0X$F5W-}PedghD>G!dp!l_k@IO}4d-i-42U{;0VClV+3x|)$Dc-Lr6 zxcPanLmv-3K`eoi*9rm47hW;#oSMnF_eX%B+POUNNnJGn(A%50j`xXi*q1$03YgoDbRQp_6LzJ;V`Ht2e~7T z2cA5+*6SK|!A-I$EZqmCS2A0kJeH@Pv5*ikxIZWBNjh!9CNb9?t5RJq{yek9 zN{?^SnHG_#%OZgh1bWtr#dI>KTqa-S&&yPHGt7Y-Dc=>73XCGR=&@q4l zN{?w_E zj2Ev0oU{C@M>PX7qL2p_EPha4codjVV$00$w2p~O6s*UU>(Zg~S7*v75{zYrDq_Uo zS&C9Jhp4CdxWHMAoa+y`oeNVptens(q0;4x87EKo$v zJkI$34%IqJrG9ggDv~sNlmX3H1$ifoR=SpxM9V(a!&JM7Y=cyK9l+-_^nah{=~;8g znA@Q{o-^rE!z_#dAH!9^0JENy;OeK)nu)Yhjf<$~J$YJp+7+3X9Qsu#n+=or(*Ea{ z1CdHD#+GKZQh;{@w-se>V|T1Ec=J@%DV;-V5W%Zi9Me)Q;?F}pP_4XYLwR##%&RI4Ej#m0Rq zpeQ9HIn7uk20VPCrXnYTT*lmDgE_|E;`OMv29L^7Rk)96JkZgc8KDz7V65FLR+ZTO zDv~%+k}5@ZbMm$YLQA0IN9FtN=Mt1b5i_~dynu&Y4S84mSOLHWHX6>T0B0EP0pAa%wr3Hew7#6PR)Tisy=3ZW73?n z1j!<>_Id*}!?xAJ^`J7J-LK7Ag@IadaykvGP4gLY7n(*^!0AsH5`Vx}v&6A|-@I0# zjFvfO#X@}A3;ZVgTo9S{ra^nZYcSneUT1948~J>X;j6a1rNTz>y&2(Z6}b)6Rzl1e zb@@#yx=8Dvmu)8kRFS6An8v_2DXQ{aZ!Mk`YNq8`8GBS@qi$2ksO9C6P&MsmQlqe` z#H+htCnrcmiV~VV}QPY}ovX7G- zRIAulCwZ1IF;JP=(*u!EIgjp<#YG`S>GG{Owm8JNCn0u% z93Q(!G=R}p!ws+Utt-eIuN!(+SD70fp!?IoUZ%B!xg4g1R|jYBDZ=SM!j1)GO)`HC zIV22=wzN-QbZvAsQsq~c?@0Hbc@1WvRVoV88McPS7m-m$oL5e-vaNZ_tH9dEu+~u- z=A5$-SoWefCB)K}a)T}RXiKRXzDBI`a;`ZTT2^$2?sBzUqBVZgo!h?kNA{7G4auqx zAS;viY7)mQkGoijMAq|h%2NHHKYm4Jt-v3{oKq4{HQ1ByPQ^kd{{Wk_lgKp1n1`(J z>H@1%Be+cPeql(PHfpuBt9go3JGeC-=+TKMGSjty!)ip8{Cx_`-y~(p?jB|O7>BTllNRtcmEoZBTOsz4eNZZR}%~WsHdY5F8 zRhP@-6vH@wmP*ZAoWIS|rr!?j+p34kS^Gp$$%d%Jy6sL7Gc& zsNd~V7Uj12VRoxk1MNz#s@&0GSk@N{_YtZicz0vcvl3K^znw_(ERDEvR5Xji;5zNa zLbnSM$fy;SQ0^R6SlToGt*P8rG(^%CU{`G*l%$1My;WB^9@G~`>+-cYbY)65E&1-J zYkbudcQ5lHs**|NF3-GbI3|t0{{Rh3WI?L8K~=N!RAS|KDE{qKS3nfDCu(hTtuLNxTKO|6Xp4BFi3d-;HAlO14?5b(3#D-m7J} zm)d_X<%{m_{AtT{5wnV=wEg2qz`A?VOink{(@970&~6DEI~vGUF^m(MmL(%;KYFHq zLgY1)MO4RJR6l70rBLPb??~Xd!gUo~!N^`0Nb1@9)T=XYTnf$Ew{L1yca5=6m~IBU zOpDDgoV|Mr!^8CTr!i=T2Woa?@|y{ABst9|oVoU_pD={L;+wpDznu=~Zkeq2Dx8r* zT|nb*Ybl*d?Ixm*AcLN?b7^4Z=x!y@8=@yBi0%}wKZ>#O{6c}1=9f~V8ygF8kXNNf zZc*F}ZBbcLxeLI?Xi{qeWPjPkx4DW;4^WWqm0LvJ4)0NDLDCaQrP3M zc_(6acdI^c8x3K8^&4+`kYV}H%qcQlO@B9T;A%CO``t}sqqp5=`Kes)k7@q^$7uz% zG?rl-XRRYngl^qgXk>WCINMMuCxhOq;mULgIM|?l>Xc1`^L4BgcZ7girQZ9L4rxXp z(ltcmJ4YV1I>{gKn&)Jdm+uOaIe6lqDno&~mnf}+)|~T3Ijn+C6{;3+d1{vX3y|MQ zu)S(gI*P%HMsKSX+;}U+*noLm-Uq&&yMpiChjTiNw?M zP8gbmNTd(p&1V@#(@~j%s*k-*F>;!vmuA(ZVslyXP1h^7qiK%f!2Q~M%x!cvR%Q7E z8Vss?R$OhmHj#SMM6L!}p)#WlO(m2@a%s3A%{{Rgk$8zCd0+l?iS7{8Xg{TYsxW~$BB#_7QgUu_WTSU`_ zU5%Fe)d}C{f4$bLw5-Z;)}dRUEnC!41`)Dlro)n}{4|QYMO9f23G2G62_9qe?)hqs zqH3rFkkv{!u>Sz;ny4j_AFkjkRGMA;kKL)gf-c02zET+C>eUC7Hu;3`w5=nlEL$6@ zjATAr?-1M?WnRUkQmc~RdYJ@dGlBC{3ZIxeaZ!;hcxbMC zx8ADp%6!HW8c_(z4=cBrerBr+6pHwd<>IO)R54zaAl=;Vq*cpCGR?x~nvnw8BWnt- zl9MSzxmkW{jpufiV+z}SX^B2k@}LJRPkoz}bInmlFU~47-(#0yn2rZDsh0bufyP6GpoRvKBQ96wWv1hMZTqEaRAL*R zaZa4eu;~^hI3L4RU+-iMtx`(=056)0RpW0k7bA*fbFm|g$J8}7;8$XEgI0@Sc;M7x zRE%Vr6Jw@`p|)f{yl0?e`=w3Ot=#q%XCgcT~u^L^c|{?$Sve>uFrmu*)ii)|;Gi-|PN z63Rk?X|hUiBOk-ws<)RDE2leuI+2|pY-j%f*`oK{E`Uhxe)md$ognHq;;NN+<=y-v z_^RQP%vIgRAzXy=>ZI;kTtgGFWAf94$>p;VQGAZOyHmJ>%vk<#+|!ZF{{S%=$MDr~ zh>ogxs}Y1)x5V4O_?lNCv5}}q@X3QnQQYnws$#*{`@i0(BPCev`IdzvHpgtkZ(o$u z;pABJApZb%fU0BU&_9PCbpHT)t};dsQe;*tPAR2jQ0k;aM)Gv@! zI1F=9DlAA=HR{==TtzaVIiQF0{Z^yeSke^6m6|m9zE!CJZzW?R=Kl2#Lx)z~idY$L z6}=XrvneHVDB(M~KP_87IAM%cSk;eC7N=Gbf3;0c#3gMB1fm$5%>Ewq$W9k}_o*8g z1f8sDB*Kk@r6*Ugh98;Hu}H}03X4kws8M$DQb-?qjMcf321c^^N=%$8(@~YSy3~_G zjkMF!-3(c3P^+lo^(nh6H6tPh$m%N9wZ1uO9^Fis=nZL3rldB?NJOkzM%Ag<0DeW> z{{Zb%fppy%8C9uV@qzcLIowK2hs$RzfwySpn;BH$#_F4N$T|6!6%;VL7W0>HrADJ} zR_; zs*3_=Y7VtLeRd9_wvAl{QI{Gh7_MU+b*UC8&?}^TRcIez`J3+0_Y1X%I0m&$1r91MJ zsu&V!V%#dmqtMhNPPf|4DyTKRARb#fw-rD}9eALJRrO{$((RvV^7Bo7A`u`|Omwc5 zV^kPHOCrZA;YP+3p#tNHl3SefX{i>}BQ)u4)Qx~~TALUy7v?nK0?V~XscA%&Qc~(= zKAmWY7$8!5@l=}HDNYqW?@H)e-)Y$0DZ68jYYx?<2CKfNELJfhWTpV99@+**Mgq4= zM9-FNnuXCmZa!9|AsG4iM0tFbI0i7Qi;ZM*t`PT|hXk!22k zWnI;kcc#SC;ZuXwx}d6GAXRCUG<%n&X2s0Tb!?*A!)V7!m2}H_B2>j_7+awoDsTes z1Bz};QJlM&>80AK8`G5ORGUZwRxzKJx<`$bS(&p$aG00P2d!2A0J<+}E^W?vblB4` zjkRs8(8L1bwB^r~*ygDYR|MjPD;FAtHnO%cD3AhEil!{01TjI5+*Y(vWd8tmo=>0h zDs=UtFH!qRcQIqJPcfKd9ckhiW>z^5*b!Gew#XevdSO(LD;dIyag!RvOKX{i(g#D8 z=~Wj`f;QbC2iCUUB2`MBJJX?rF~K{9G`o}S<$cWWv7kjL0c?79s&d$)w< zA~01wsz||T_qoL`W{^6J#fwS%F<4I_X_r^4$B-+ALrI1$3ev#kMvUkj79A!zA^hb4>SW)#!i! z(BA&cyg~k~mZvV2caYB+1apjZuc42JqaYoF@~4js+rMAEo@?-xg?&%E_UQTV`#R6kGKXY5`%)&Ea9ciEucMEI?a3ME9@NzE zrM}{F03OuU27)zF^W0i|@}qfio+*o@UZKmc$SdhF;d?~{jBe>tuZ1o8oDhAf#|;1cb~XIiux)1As5QPaZ`^8+PKDYI&`Rx8Qb13nRh;ENGC&|EaSagTNiPiq?}jL zr@>Z)fB;}Uy43#w@Q2%@0*Wwt@lF(46PmH}D73y(p&>g@wMZ>)c6`yC*VC)v2yhv= z2CI(+Sp&(*{V7V6>{Mz*`OY}5q$<8qA6jg%%91H4!*3PzfbfI}-zuo|sUh$!uy>Y4 z54eAKijS+il~cg&3Qc_?-VC+iU~H&U!SQ*&>Vb`DbQsk{eAsO+ zm9}|itlQdMMm}iGeI&jRjGd$?6teg_-wG8JijS+iiA`Mj*UGrxmQ%8kET@osh->Kq z;EQG2+ZX2cs|(FTz}6aw!W5c0onP5(G^UccH~q?!1l1Bheav6vUJ)HXqoeI zwwONMgs`bn(&!8r%QyFH>5<^LBw;6(27jG4PXoq?aEp`Q6<*1i`@PSag`LnU3}UC)_3yMo-I+GfmDQ^nwz zK4K!~vyBIGbUt5Hxe}BJNvnx(b)4)wO?@mp2?K=&B?g7~e;?clkUuItix!8>Q8mLW z0EhdvWXE>An8*UYm51TPC{(n2y{dV>A3!m-KW>|;#}713)$Dx9156(QPyYZDPiU^o z=gThF|X==pV0d|{C0tvojf-cXF~ABBA^ zJ{sGko@%Hk+|b?wh?Fa)K@lli97=oM{JSqQ__gx z|G3`_ASox9iyF+yngX=P_oz5lYBe13RpvrOjSs{31$kD59|C@o1-AP^E#~OBg!gLmu1#J)wO+2zYijq z89cF*?NCMF2&0pj_kr^K)S*gb!K3ChTfAVzerj_^c7>D5C)&QGUx)EGF~m1iv3xv+ zK3Ouxw2cV_WRH|%itUxMjKZddE0WpS@>kWL@UJcMqssYD-r}1d!>A+N3S}|UrO}xx z$I0y-$D6myYOt|gN1xr6;=ZAm;q*T!F;u_sub_~uqCc2>R$j%G7LS$0H(eSsw0Tqf zs#S(->Oc5EB9QKqAG=6?9@~(vQ~0W*g?+=?Bjx`9F6m1X6BVY$w?D@bTKcKJ9ztSI z-7n=rd_96WNo3xi!^Iy}VeJv}lz(iIig|nrmL$8ABV%n^`k;6UCL7u>nEwE?NIo9h z}e6QqP@=70Vw99xeKxURAE9+GFa|uwTN7kSJ01D#PH2@%CR;fxv z-1!yOX4)Du2JW=vitG4Mv0qq^hfzv=u>!GPjA>89cwr{+pv{i zN?8Tg{Iq3j>gawP+w!ju2abJe()={G-V~_W--@+G_A8sY@|00dVZn^5{{VWUwzr>u z2uS|*ePlivTVRc&{{XG@s_XFP+6UMW5$lRx#g!SO<>{c3Eao%wds0Vlc30$t*VL`x zC14Q8oxarN_;(UAxJ2I~Ap*X%e}{`JGKj!af_Bu6 z;24rU{!k=*wEc_NxXp7PCC6=l3$$|~`u3(6uKdrs+}GAk@ct6Zx-940r7^xAS~dxX zc~6vo`npv{oRCIn`9&@6kIJZ8q!t%X{4Mg=)yLt@wh8jK`fa3dhVi0&pcel2Dpe*| zGCoaPTjgfngbI|~T%%#)D_>SY@b=#uUN4kWrucIMl1hA|+NsiE%#V}2xzq#^oNlVd z-sv*pB6io;R^JV*CybScYY&%mP~Q#U3y~k|Q|wr!CD8dMD@{oTWsKB|4Z;p1HT8)2 zX9~&lA;IsOg#0vuFO@={!@W4sXi=JH$p#C;z-=Qxc80RLQG4zD6O8H zRHxyzL9($fexG;!nog4=ogXDFrO=2*iG)AOnk;VJwh_|4xRc?`eo#_4@3d4=d_9UY z#9tul%}zA#H6(nJEUu%;DN10tDUgSX`u0DDFuQMVYBu<9XA3Y8sWLX^{{Vp1#*~`~ z$sZsad)=84laESbCE>skGOJhD&G6dTJ7zz>-lYEkg==V$2!bj88mZHF7cxFVdrQ;C z4k|^ox$@5)E9;N=R`7krja3$$J{nrF2g_bP={iyzW{;8+PrQ+E5RZC-I~&9s5l$=X z#Q1R>ZPOt~Oj8fT=ywoeRxSKp)|!h#<~~F=x3P?QWraB{?&jbF#eHsm8(VUGtonbm zQh&m`wv1sS&gvltamHx*AlqE7;k24Q&35a6roOTN0EK67BJPYCap=Kg%RLf&TS1J{&?fDx&Tm-u~?zk_gQo zCB2RBCBeX|@mgFgge+xo-oC+qhjwbC35Gt@NATvzf)?{QP?nI6#}Bs5oLFcjc+ zrmPpPqEe({zP6j;)wxAM2vEH$KloQRj8ZU)qy3TAl7lKUO!-NY>;+J!l&$dK#%t>3 z_;+lQE>nN|R42oGaG&b&{{Y0&_HN|!JD(|qyF-nq<*0UD9mSN_)dS(&d$3_R?NWcj zx3>u2CqG)RX3FPB$*UaX<6);_>^CZUSJkonI)WqSc?vV$ko-5cR{i1wyZ-<|rRQ?m)eQG8rv|; zQK%l`vy~YKv`5O@Zi(Sqor{D(P#>DUp8o)aaS!)Dl}jhXt8=un{{Z^w`xy(`A23Gp zk+*4MOo^@s&$N$f`eb}Iw^s%=(9o+w!WVq4kL5B%JS+H@X|fowte4vmqJ9sNcp6-&PgDyYPnm0 zHzE+izNC-g%mrBle?PBUSNLUT3ochGKK5#z22U~a_nR_>E~l+M{NuENkzY!`!+T?Z zV;fiBG=IXdjdI|8r=sWX)|`yLYJA4caK{81k26Md^KDxCWPCG-GJ?H-?~zV_hIal| zJiX2T0HD@>%3;l8=94Rtxk02uba!P)uce{*Z2?uv2HW>&{{V$+5c$;)(M32?VF{z= zgk~@DZqMDPhnISQhX%fgKMf&9-Xq+7aY~;KQMr;j94Bj&%#WMrnpJ!zX;tKNk)5^l znD}XJD`jKH`_zZwt-5~dG#LBUE}X{++jHkOdx#rrkCanmx}HP7Fuc6c7q+6L)Y5xH5tzvVDBRF5~{{VWl zHT(i0Mh&^F&{YWy&UIdTz+Ki=l2*}lW(K6;jC122(^ zQ7;La`UU|kv3h=pH}a2*fYg7uAgqv_eFgGJ{b&vSCRhDT2J^^agE9s z{`ws$!kod#`QXnxHq-}q@l(9l2Xu|J*U^#uGmbPY26r}oZq);PFjj5MnO5yr?B{T7 z`R+TjAYI zHXV*?Pxw}`hW+9&U-oMKlO`ues4Lv?rDDLD`#yq+!8U`z0tlO_DK1qi{YaYnPMm#r>#^l^A2Of zKYHA~K=L=;4bP=}`S@_aY+?TZ?9?sr$S`J6w{QD3QKuwaBzPM*QI}oIOC8s7!q>YG zhXZEUU(&0|@YVdL*fEZreed_EjO1N`4~SFoRk@{**l=~92fxMHmw$+T3?l&(qRab3n) zwzu7*?V#}&HSBBf(KE{VW7GT8;qcX>{{U8>EmMmdm5&_zSxg5#YPq^>;2QRU@a{?E z+E#~DqT01 zlk(T7ABUF=yhpP>)cHOdUmyXB>^_w-ixrYQs9c9{?|IKwLKQ|nS6hqCS8u;;C1%Of{0Gs?x= zBJNsiPJGS+^1>rPOXQ{?&R6e-H0jzTCJh#TRqy`*0;pHv?eoM=8CiNS z_|)7vj$iviU8neQQ9SP9Pnm|UwLAfORlKBWHua|u0qQ0!v~IsP+CAZ2oVdPJ;FHZp zx7+t1uDkvai={9BW+fy!@)X? zOiCtwDiGq1d|ooP)Awl>?`v&CTW#RYMGgojf9Xh`48Lai#s~W~qFkfg$y=haGpg>} zQ48gh4$FdTb{_{{BN$VVK5Vr^{{RSG^BzXpEX`nHo7h+|?M;VJNXIMlS45r-xP?!e z8)&MD;Tz^B18OZO-on(#{?i!SijEu2lJWA2*k1@TSNI6vnToh40CKmnrvZKlns%l5gFkar1Pisa;5yQiQ%4Y6idB%mVJIr0~w5 zr8Cj~>8CG-FR(yAIs3d+Sh&c~{?psZ8&`Ebui^{S?^Ma*Z9q08O#cADX|LhULufeL zo|Q`FH=!83jBrg!9-|p$`A^I8(HDm`LOimiJ@(Xz;f+ff+5Xj1G=#a3)t(5(=Ju#f z$`<)Y%TxaVU|-{Fp~w3|oIF2#7liBWLv}Py#XmMIGWMtW*2;^sin0BRszx$YI-j~R zR6ntA_Km<`pHB4H`HMl52AZ-&g?IhaPfri(o16G}^r(}=`m)K8rI*)l6cFZ#+E^8G zqvkaZ=*Zsm;iKFZ-cER@jSlg4f&T!Y({`|+%7_rY=>AoyfK_jmx>T#9>QRT40WmM| z2Cjk-?eoUE!j>$;_%Nxp%wk(2mTD`9*0q*A|yDNe|7nAMRH zu<4!O`0Yx-FDu@ldkgT&JhI<~BHLb}Gjic_=A7H(O7?4P%7Bw`*xRZ&qPt&^#zrYU%8ZMIBYV(5+@N%-!YlJ9lp`ZF*#*ok<+2tl zR5J8Y#f&?AqLG?DN}sz_40npYWYH7`nyYp9j75~zZbOWVacs^A=B617wANB3`(gGq zDhs6>Ss1N2p+)LwmRT1LcH*Qf7##Gf5yNpH=)s3ts(##l@?mO?67FBvH)lO6F&;*L zhO2D8#~8&sb=GiVI5Z_CG_S`nDO8J>U?^P%kq}_8mz?MngCyF9m`O(N>xDq8p?e^_&c#xMe=;R zotte6MxM=^YK*RnBGi%uV4(Fs!&nKZ0CF1(Qa#{^h{@|hcVd)mbO@j?3%04t6RFPJ ztz$jgBC6G9)a8m{4%P(x-qoct4uUxU0NSUjGV&X4YZ@!ZUzqo)2C3&URXr*j6J^Vg zDrt!xhOR;p5J6Zxwfe825_)86mO+JScFoFuL^jVT^w<}-$tZvOx()pILE-dZ1+)m6A; zI~(QAOBB%qzF(NNQeex-T2#qAtxA&}=oD>Q&s&sX^3#^%bLCs^(y^P4rKz3Su%C9D z7rN<}Xk6Z#yuyDP1kcK%gKmE9Rmn7=pX4zG-L|AME*Eht?OFE4V{Pryr(1+BNk8t; z_6U;4Ib|gO0Kj)tYFn(W^NOzSs~+TPVU{)dm+w_31;Z+$<<~VFlQ!I+yH7I3GH3Xz z1!O67cKb*GOqM}UK7(XuzJ!&&7nB3oXp%E*-^GpGklG$3WQj|?4 zk#_y+LvkeBfwwiCxichwwD?0sjxp&_kfyaQL%cJS_gAG#vO8oq;Z$T}^9}U~n1Qw1 ziqZm=tXoT;FROjtX&T_nM(^RM6%?-KI9g#5tG34ZjZ`AZl3feWHg7wAWvb@k09M6Uka@BPR_RLK@H=vo$8f4Z=%%MxSqp%ER;m$_Rg{m$k;w`$ zG8&ZQAikC^38W6qkCvhV*|!mjiOh|(nvPGDs_vdS?@}2hka=Wo+fPXR%rkw_RLV4Rxz8KARfKF<+^CpV z=e15 z9#b0aU&fInOsNNED!KW|sQip>1n%~t4cwRHT2qpC_U~2M$jKus>rn-4uvWmO+2zL1 zo^jHu>=7h#AQ(@(N{^k}Fg*oSja?UcJQ_p_GqdSWTN540%dlm6I#V|y0_Tuwv5ks# z&M6uuDg{=^a$sdf{o|dAoaCGj#+jKLk}$M}B8ilyw)oU3;}rA=vcYv|_MX*D%kq*J zIH6UD=A-iEfypD}YI4|dCI{sV{V9mUJC7iGR5EVPSAj@iV!KNf6+G)=SCKS^FyAd# zF0R|ZyG%etm~*>tN^?f1ImjNAN?HvFCl1FWII8b6rZT@RAYUn4XUrScl2QN#&reDd zCQiT@NEu1Ms6i1Y(xi2fzGdK^-Kigl_VqN}jVZE3lt+?3DuwPi$>?glNWpf$Emb9K zxW^!Iig9;F)TGOQXc2*q^p7cv1Rt$ajeu-+G@C?6C!lJjYaX=;pa0SOnIPI*0~FJ0 zz=>5!_O5^doZ_Zh`49DCEm_O(JJvc&p@_PBG2M0`&vx%92k(xn*S;;a2wr`%s( znS_v-Mgr!pEu5JQ%UY#cn7ApzBhMdQ$%Y zS5@_p{=Fr!iS|L%tvzEW04{M`fmfy~Wdl7bCBv=lAo}y_V0j~HeVD~MI9qmEc&>md zk&JYyg02SxiqHL8mG8`oSodv=18l_L54}znEyv1oE205<;-yd&@F~6-*8IW!p(V08 z!))Eh6*O@SV2*2`2$|?PsRVJJHj0(Q4Lhk1`$6_F#lB+-DlukPEw?LO9C1dy2R^kp zRU-supZd1kRob|tm^5=H+_6ws2iB~|3vS!ex)7baqV3nl^HqPQ>v=;08?Br@2d~(8FV>SwG4je6)3O=o|V&xqudD@H7Au3 z;H_i+t4q2s`$|VRwqenST1B)7a92K+)W;lY(R$RLQaKqND&GscUiyhMwi8VrD=nm*4991&Pc zg=ChDzwIa09Qxb*t$~qA3@avbnZwJ_0fl>XA7H#;btHRPv zIF_?J?u=t-V^uzs#)Y5wcoox#qh;Goj@l(}m$hv!8kUJ{%%hKcvjRI{d2z?RO4drs z3Je2X582SuqOUw>&ZAl$|T9GZ*N5d&K(2GiJ zLi+j7n`{lGGf<0j8XS(b(}++V*r|Tc5nZHYQ+W%Qyn$owp~^uJ-n)h>%EB42!veRy z#}Qm~#YWajFi%S2mQ7MB%^H1qH**O&5y`6B z{RHvLp^7b4LhKZbf<6=)=u!ob105txc3UCE9z?^6~yGB&v2(;nI# z+ZAhhZAdB`?uxp$%8QUQN|r}Ctro+0?o*meQ;upBw2@_C-D{$FLbxitcd7ii{Jq3| z>gWE+i|es#8qv%pzD{C0s#6FdbKbXB*hW5H^(ePO+={AsOG{DxcT=14%AQ6&szqKH zcH+7tZkzXZr=`3(+C?XlPWHHcd06I^V;>t+J)k3G1vJ5cbP+^RoM+2ourHR4d3Xoz(+IYoG8f9~|L}OJu zcH=ZEE?8rVmjoPj6!RMalhT@6kLvxPL7Zf@lik7qk*RbAzA)~+bW%EK6_vVpkkNkSu2xeu15hy!kD z@(4l$^Q-nqB3aJE0>^9OzY=T_lnwb}LxyKbM>_XWb)LB?1CRdW# zGskLd5JMWU*;1Dor!L}f-6*D&gIj7<5UX+)kVZ!1S3x-{qk&8Ff+qXGH>FRr=EquchQ>Pzr2*eUBW{7WAC+n&1berjtFEE?)O`kMRK%u19jb2J z<7qU$S})266*fza^c6jEQz&Q&va(yktj+xBSk>Dg3bxx+^Fl5;BCn85qBCx>bNn=m zZl|})QoAPss%Y6Qa*{eU3l9 zigQ~+%hT@Fu0Z*E8g@4?JQ{8Yo@P@>5pcmVwwSP?8;JR;(D{0DDYye|RA5?UBGv#r zvZ9){kY^x$+OWZoPH9m{dVIPC^eHu^xEorcirU?nl#iw>L>JxaDgdEhIKx&?L8i)Y zX$c#MKbQXiUZiUXHee1~t(FcxVbYv8cj-ciYG=b?Z~Oo&LDar!M3(XSoQ^8~-GKAb zswrk{vf`6gjfRNY8*~^WG~;g){GvSm6(p;{QaCg~#YWcos&~*XL@X`k`{_=7GR%*d zecH7cC9*zRd#ka|?wzPn(3bTwzq75Ogb_BQ+o(Z zoOG!ZPqp38-DWe{zJHww_fM#~CjSs0PtqQhh- zO}9kMX|d1oRcNdr+pwnwwAGjlADWsYV~xY59H|A7oBf*s`?1u?rb5m0rCZv?zF(JZ zIFb_t(HlJja+>LuYRq?pv}_M8 zd8@3)87uPC(fN$HZj}-R8(E}01pv>mmo%@{x%?=4jY zor6ezT1hK}8H@di3a9TQ6(G`WcB+J}K`S$=hT^4EbH0lX@2P-vYe{4nO`&?yK8bFU zea)h`RT*7P2MO~?w2~7>FZKWv!3A%`iz7Q9yGnV=o{L&V4J(}d zS{0X4DgoiURxPv&-rKRTXcDsgsy^*!VjavAp~nP@Hs-D!64LegeRacMr4 zRzkUix+SAzsQH$Wd_Myn?1S^I)dhMjN{7pDnx@8_$3DIuwnp25O#Z{QF38E(_`khf z8O(uSvekD+SKO^lq)b_bCW~$dmWhw=f0IiNgKX`Biof2jhm2=D)1xgLe80s@LauW6 zS|ndAamE|?YBlifpo@DCnQN?;2HGSw60S~nZfX=v?sBo{w*GIL)9#fO(YzR6 z?(V2XyA=NbYKDix`M&LS_V70Cw9^b}xVH;R%`sf$6GOLj z!wwpyT>{oHssOH_Bn!ameQ6#bhksQcg&eNsCXQu1IchmQf7+-Q!_lfUst?Y(WFWH+ zo2x}4P`gjeDcKbkaG%%_ZO+k}VesrxzsQ4WuI*7&uIgYhA>-wxVRLyLe7+ZeLbyP+ zTzFPF2rd`p`K!A^T^Qq~MI3vh%{wlFXyjAF_TF;4Ek@oNvqv%nA1!rrD#tL|b5h1i z#kX(qRJfIMhCUj!WKtDHM=yt<`A*f_UAx8!$T_Gs0LsVsXi+81;+w-Zz+^{*NZuKY zs98z9ucFBJJ-2P2R6s1?o!{t(MuyLN2FLl=bYiN}_w z=Jc;cSr{Pm7eDP(5iCUW&&^TDg6E!1;Tu5POiTXH6$*Gl+s(*{S3cG0h>?+o>c7KK zzSUp5OWC5iu6dyFR4(7@{%>4Wr0_M61W6K>{u=ZMoJQDcln{3j^DQ{jNE2t7r-JQv zCS~(u`K!`4geq#pn+Q@Dbso(GTiEi!;HypBLVez!FW&zEfm4ryAuZ;- zOTYWo=;cA-X~DJ?B9|g6GiR7b;G1a9=8LU3_!`<~R`PMT+Py#^`La4x@SWR$`G4LN z`4IiAk0nn9+d$ti`KoXDL+zwf5l@l&fnK6vh~$;cBmojkwLfNq+Ox|?fGr9LB!~~2 z<@srocoNhQvBogI-+H}Zg?U%9)T*0K<{4k%quHTzGs&Rv6{J!8(ScQyz}9Np(jCY6 zYu2X{GpSa}(m-|(nRim;L-w*fp}YxiBNFj#W$DFIkKy&Kq~<-_dRMcMlQ8V7NCG1% z#uAqz4{FaF{{Vyv4uU)b)}~K~x_Xb@+kj8Ymie<@zbge@sJL2;p*RDb)V-PyYa_@c z_;YCv?F8@5M30_Z;pzr*x!c<`FT=EW)%>lv{vZ9CzK;7m0YbPR?$cU0o-Lblw3Rd;Sef(6 z_zu*r)dzJ|UjQn9%RYT^Uqhvpy5Y+8qDx3V=@gs_jwzo#9|GHQ+94+Fe6= zOg?p{>5uDjK46pK^7)uQGBEz{6sz#wH4A~le8c#TE9rx!TIGQpe|Ch@?TTayY6%w{ zT#uO#!`MN>4WgAk9Y(G54aw_@`dxHb6q4BasUJpNzb^u(lTu@fk@GqDaT}{U1M;`Z zKgO%K!**8%qxpMR)Bgb3(QMiX`qZ&$iohg^z^SlD5i{jx_-wN7Sfkqi0PfR2;ae(h zQ6E3;EqzEVAd2H~O{-QHO|@^C)9%%B4mhbFCl7`|jqM-Z{{Uu~J{!yBWz+rI`rb=e z0&Ou=OJ#23%h|Y5$cOd0A0x%^$&~quI`-R6Uxv2~W)o^9LH(Bi+;;A2 zJ&_T`NclW`IGCNS9tALbIJpbv`ClgOzvNfd$)yt5kp|OOW6_|;PyQyfg(FX`%E!nO z{5X+QA{>gSpAT;%3Z@2CEyv6K+WQy#1|aH57^kj>5<3t#el#pQ=vUVrkB#K`adGov zCaQzL7czX`XKYv6G3byM?52UBTX~*ak&1^!qN9yx#w+mNSqA->2j%;}c9eWDknKl} zU3Y&E-mkO&0O208h++(7Tk)nx;rj*2a5s0S96KlLtoX^kAC&#nFn!*%-}qMZ%lDM- zPL=k9_;SuiU8)FQ_Glg(vmJ2X-J|OAC+kf3wLTrqD;=m#-$kU8;eEZr2zpZ_t zE`e&?fHzcdXfWqwtAR_|G5u)xu>3f>5-TcikMDnU{{XvD&+z)@<16HpKf{{)Vf-@= z?ZB;0o*S_M0;3CBdj>D9G<+@p01Dpmp(G6vst=C{b}6zYUAPU%M1u!K*RV{=BvTrJA)C#L~Zr2xu)>!ahz@W ze}~?jJTGps`MXzhed=ot&0&dW!!mdhV;%r-%lB!=!52`dU5xqpc62t@T#$RV$n|#jQ;?; zPE=TXbK)=fLGPlCU5Syg{54ScM^Z)tF~P67rSN=ge{_o9#Z|5R32!W!kwOIiEL8g$ z6YX_AB$LA0j_|5^9cl7-Q&DDLFnq)Nzr|l_zr*-eV$nphZ~N66_zD5XmOfe~NsZR? zJ}mzLgmY3^l#+py;q zES??IS(ZdORras1=kOF0Mds|u4f)dB_%g?5meJ$o+nOCCE@R^d@a5}m+A_bx#YF~% zsscojn6{pbJFR`MFM{m1F6h8t_E&99AAur~bB)M<+4-t{o7h~(#Oa~x2zN-d>9m{I zMJlBK0J~ph4~Ox2i?uR%>`j43(8=X5)`;3kCY8yzsjHbxQ1-@$f z{%?kmBIRQv-k3ff+pg9rw0?9bu#A!NJeqaj`4J8(7_{w8d1(HhEq#3-!YJ&O z_!`+qmmDeKs!xHfCE*ihKQ3xm{vO%0u=0R&_f9_TN3&p$lzf|yz2%a= zw1x|o3$Y4{`l-GeTg1CvbL;+lRd{>@1X2>Q?nCmLxI)8kQ|1DffAZ2cD@^8@|bm3-Gv-Y?5vPM?N$bGQaJ z4g5!U_i48u3?Mk!9#g$H3+z-R&zG7hcX7w1Ld$X+a|Ulp`c(WijDSk~tNE=>2g9g< z*vpXJDRQurTU_~Z1Ao7l3lj=#58L=^nfPXo+a?Ne&q{HM z+C;|8`OzdIPg+$s4t&Ceb6-TS!F9K=fys=l0j)i8*fK7ZXH0wSQTaM?>=P}3$4Vs-<@=B?%f0yCPkO>_-;++?O)(6}p=~K$@aEeFH z=2-wgDOEnSFPISo*x1`A>Q9LG~*xb4wdb(cm<>Roi+^pYBS&|Ny$zPRhU`a z@pCkYTaV6!outSEZF@8L5>}0ar#{sP@Dz&*$r|Cm+UrvoF*NRY^W3x?jFtPejVP3< z#sRNoUjdn8{o?1;dR1fK2NR%Sk=PFPe64+voKP z+M^x`c~6)k*|(|NN)daDQ^#6FEPSp?)M{KQ-`2gBPXQQ6WlW=YT8I7+M(7m&B9*0W z0P*E~jG^YDXOZzEabCM8fM!X&wO_x}+MjXo_TnHT$0T)Llv8rJnd0(Y2)^*fYB4!| zg#621(0(6~jIt(Jdiv8x!)a18BeE4vsBQxM%=PQ(;0uRivN9jOc&V4+=~)8JZ@A+m zAL~`h$hqUcYGSMX=IKm(n}%`-;8(KC;D%{QF#r~-{{X_hnnhzCcCTMw%8pi4VtEOb z{!pJSIputXVVd;j_<1hf+?F4WK2HJMZCBaUb^3c$xU!o(ph{e0u%WIc>VrPD>9hPl zn+U*l=M@CL0+=t{CO!c@g*6rlqs_!Bq&DxQ^PxYMc9V^fefuv~`FbQt?>rR`%_Ys^Cxciz` zcWCRSSs(w>`}uAmBO%8g^(eT69B&omX{k+-hx^^?VW~{L%e8)e{$Su~E4MJf50C?h|ag>(uL;l77@#|vd07x!4s|ze;bGQLsMHZ_$Vqc)C+fi%LW`IrpT#Ib-*;fnIK)#j8C+4*V5Ta^@~gs7@qT>k)&7EJq|tdmB|kid$O zXN2K*jGub)8+~4A*q<{hYRc<#ET1Xnr~Pl2SP%OZ_dR!dj1oYj?Jxt(g1m}v5L{rY zoYZ#Ow5kqH;D4onzr6$xB<&;EKGgs_S-?K@@p*0k z06hhGtB~Hx7i;oI zN{7ZZn$jqxk*=~mU|-tfcK($z-rF}S_2iQ3Y`7_s-Rhd^^C{r{+Ly*P*V#a_B=(W* zCjQia9%_HKTVrvM0qquBT~??x{whYDQJ7#G=&MfR{aMNi}vkM>~Bgml@Z!+Cr8| z9*p(R?MqGDcTrvFg~RT}IVg z@9|zP+Re{Q^`*7cr)O`R(|l!K%S12iC4J9tTkBTn;}qu9EtKHBcz5=!;Bv=`pZjLx z%H*6?J~PBMZd5|aBmBp+e`?xe@A2N8nw^{St;KlETE)lRCyHx*^W&XBSdyV9f?t2;5Z6hEv zezgAp?Q0?d^8hvD15lawWUy~ak{kJAVr6~9wPpUaVj8oz+)~M4`m@=i)-2d<-$B-G zR~(Kj#)hjQk)1iIUs92yRpyua&4?1oso!(i{{XeDSYSA)W!5dDKzCP-$Ej{zf%f8- zJxRw7*{P|-mF3uR$?2!L>@jP0fd=Q~)W6$y`*#D8UPA@(WZhA=rt9))j3(d=>S zmcuK(c&9_JTS>Y%aCZLy6?oKllH)Eosi3}aIQeK<-DPVs)>TcO!us{O0UZ7{3D)6^ zaQVUJyr=CoQa8ttP2^WZgjho2;B-!)i@ z@@I?%KR59I01Y*r)$R)`f$dMNTC79|2W>+hxoqWd*u{A7+hrdsQ$^&7^CM!b`(~@w z;r*Eek7@qcg%|JVH38RQ&eo7ukBv@dT!BtY=WLw(%TV*0uS<<(l-EPoQ(U!1<(8hh z^`={Fi(WLh4>M)kZYp7LbN9aOOU`PprM$M8>+7qcvl7`9<<=tkL1DM=Zm%UxMqX2( zp>HMmvNE*RZ&fYE^4fczx^<`l*nc{tb=!0)^VgPrvSL`&G2XG=zxZmNYgbJ|8Fe$+ z2D5MFmqWWXQaxTKT$A`$klS8O6C4s0)!}h3IBZa}O0TI=%ju)l6IV|#ayC=t)*%FQ z#d!$7xL3-yDf3)QEM8ljQT?e_*0_IX)4A$tu3H8Ndghkf#4#Bd6TdA>5}+@G*7*pQ(cz%qw6y6 zTyU{H9vyKm5AN7}wD~+i3jB)v_r-a1Gc;|2F-{i`BQyQeN7m=uPYVvmrp2$J;zRdo zU&K)PY|%D0*OaBig_(2Gp0bkJE!L97$t@Y1!o_Q2($mDT1>l4I>Ur@6vYhS&SC*V3 zWlq`|+inZ-QyfJ095C>G4^vMOKwVDk;-20ni1z^3mqzTW+YMD|o6TIe-K$uM_Y|!CA61FziQ;q^Y;~wx#E>)LTOz#KCEEKt9`xhNpD(Rr?c|2& zMQo2xZGBW{JXLh@JS;eEwdV25B8;);(vce{9qBAXzTp}%>Uva~`V`D<%@AwCQmR_K zRUTpGVc4rJ}ps@VB~MgP^+}mYVzq zJn!dqH~tbhnYI?qd6K&+AR0*KD(jQ;8gZ`IQK~8QJs|jjkbHwQka(UVpT9pndEcJl z@ZBj1UcYvaY|zyt_dO;JejumJII6dPA{Z-fRJY6c4cynAmnY>~d_N;GG~HLQdo{V} z!^JR#Rb!g3Cy67^$a$^=u*Q4SiP(x-hgL!Cmt(#jCQ>oSH2C~Qx8@~w*O|NJu$}7C z$T)1)bHqMtTz<(OfftEDxaIy@uzW=x{C~wda0j(g$jdZZDHQ6JB+>iODpCfOi8zsKeQw zjc>088(L139eN?$SDKcQ_YK_ADPXOZrOw63dV}lb216@TWAOs2{`aMMy3HePLHso& zkMm`lr4g+lQ0RIW{3JVfDxJglY7yd4qb_TL-y*KzRN0zE<+DlDXlk9$MxVq;Vci?# z(P`p{$_A6QdD1JO`MOdN{{a5Fm{ii^_D7{p;&6?TOdcj#7iMu@bgb;W3Q~l1G)8Qn zW|8S|>!}wqKIN&u;U~8tfjO@)5;Ah(wfa=bw2-4t`<|eh^0TH7?&=AAM;PG^ zdCYRk-5VIE3iPe%N!sn|W z5kO?gZUs}D#08t>KP`FMzR#8UHECbv+4pLrIdv70-NUV;1_$P0OpnBYK1V%!R|N7h zHqq2nD&)52;}v}D6i-aH@ddlL&h=8`#5tW+e(0}0jL6*Xr?ax~dSk6Fb{wqqgW_n_ zFdKF%l6aZh=3|Ba8sOFbZYg}gxf#V$n;dDTdIUZvUb1jM@#?W3iII;d<*zc4%HR%j zOOgg?_KcSldWi89Zd(!$%9wmd7?)vhyIyRv>|n#SGka%q9-S$wvJ!$lK2H(bj#Y(4 z7P%CiTQ%m7GNZ0D%_rJqgyjt$*5gn;DC^Neta|37w(%5g!^j1ByIeb_GxIe!cg?$Y z+Mj60?9u7%uSTi&m8q6`>|4HLUUFq@V05M|#Xj-FQdKNwdMujcetzXWDoFMCLgGfR zH+ir#o@x}haq>MiGPzqlL3P+SF2~%|^H6=0fo|*pu2^F~DKj}*TBmqN)`B&P! z(ldg&;b~-d`?=w|QOw84dQ@B*yv|P?( z%N{Byo>P(=Xca1`G>=fW*W!~XT~`%xHH%eU&iP+j@*SpLS+Kv|sTtkk*sge`?N~b= zz%^S>kpuq#F zi-}l#o4BW~%Le(4Olw>{nmthK2nb^8GuoN`u?h{y%U)Qw(lcj2dX`(4*^Ss0UetOX zt~GmESC_%2N321SvQN8SLmbmdyXR`Kw-O>ZElpMIIK=fO)|MU2UZjgwx0eBm*OWzd zDEVYG({VIs3V5X|gmRJphYoYbkQ%&&&6J)k()^~rUZnebcqswC85-G?h)O*P!C z+kwS0-%`5`*A+h0IS*SJ#jCqT8RDfk)~c#m_^%=U(33we6!pHC9i--uYpu$O>W2E* z?fI&7y^Rr{e--3^+ET{&R-}tpnb`S zE6n28Ze99(qN>TQ+#a-*O+lm9&D>{imftNbQ^a>2*{>%$tj!YS)NyMUOxP!dq17KD z>;ia7VU0I>SC>hyA1h#NnyQ-R!yMKBm$XCWJvv=N6gyqH`?Vx9#@{No?AMgdsk^pa_X=X`QmOLM{{RXdVYr^W zv)hA)6$jc_xEa;*C$y4-S@wWpE@g) z_0P1$w`loke%o)2yOzA2_31ZqY3-`GJNH&@tU@UDKebzk_N!s45jy#MS+ibhn#`k> zZYnm`t83CaZASU3F|5gzbIvI$f^h13p5kcEm1k4apTMRb%l2EZB|sYJA8? zWh$}cR7L((TIVFz(nevLuNJbW2<^oQl%sRB+zRA;n5ymw`H{X_=H%CvINh3sHHCFz z8|9|j8m8Mi$e0h19OA4i?B{mc5gqP+TG34?ipO&&191DIns;qiAH!T~c!^)-Q^QiHh&Q^AH|4E4 z&>fSk(es`uP$&1kX0ASO5F`HWA2kbjh(L?DWd8tqlbR|gY(R*H-S=q+Rwt!#>#jp6 z`_Pa9B!=THcCw1Niqk^Py!lE z_N)P|tf{atrp2qQd%4|8=y8iWJ)bUVc1zZ|@vXwE)0(vgw;MzI!}oes-4B(UXMWy# z(rpgEF~e6jb*SC&hvloV>b9ZOv-4W>Amues6gyw##W7@IyA_UgnAMmatx7c*N@qFt ztfcNrOxt9Vc!&Em)>)JWW4ryDz)fkk?9Sb_X*GStcN(~&+B9HO8+kGuD}Q#3Hr=S) zRx4_d$taIKY0_#7A9{%~a+|Rrb<1_ArG?MSAKk3)?O0V*vB9QEtw6hWk+!NbT%_!5 zTcnalA9}O7m5pI? zuO1hSR3>&0n1yB~+y#2ni>TYIxF)STjoiEyWIw+@cAl#eMe?r|n+5f`m7R~uaq`pT zytXQ(jZct^2um-`#@b_(<|@RreYV?g%rRO20BeRx7$Nyb%Tr)A?cG9*aKA0Ntj5(32&ZWcjMBnIo9~QBV71URTI>ZK!{= zA#ay;2$+I}j#Z7iHCWn_OcX9^kd+(o9P3 zj8%E=Lbnx62S_1x&!tsjWM7}=3s9u-w)~orUNQ4Ke6*io#Xg0|qJk)L$P`p|{#Ncs z6pMFl%AdMF@#=2cDmajIsUo@nlEXfgX@?^K z5lLN~nowh3lV@6U+^*y!?;2^AB?th|bVOpy%Z<*5b2GV#LD z;x%%!q6Ws^l^~4}ayI_}z-q8?4qB2+_;&TIOPM^e#PRf|qDL5Pray+5vqnkFbj2mb z;Ei&FzzhXSw${=euApM3m5}tH%2aL07@%mY4TLeV5-7t`iwkz#PzspI$2{Vj=50>6 zpsSP(kmrF>MQVd8R3BQrvMhfywM8t52Ic280ZvYkiKGq@a1UCsvWr^A>&O88D!CyPR3M%Mo<$~t#&oep^8Cw#>xzPFWLDXc&1uTY zc~#9;CNc99_h{xNQ@KJNITV)Lw=_Mni4Ox6aVGn~QypUjE^=sBWvH}KHfRG30x6=+ z8Gc|7YPeYuv7ft0uDQuL6>)Z8os6ckh)As(g*1lTJBEC5(~gyLKsy{}p#c$iwNQb0WoSzHg7 zImK1<3GO-|pyc(b<1&{!MMicqik2yaXD6j49fO^Z$y^c5Oc?D@21@gvN{i0kconc?=uU zt|j}W$eq;fWvAf&H4vNzQPkAnqd%dn0<=_x2E>@@^(x_F%H$2*sqwMNZ@Y?!$TP5TC|nQt6;N1|?#5NA zVhmf~;c=O$rdHW~+>gZ4yS_PT+p+ z3{-_Z>LruRBrip&DbjX^KHPUi9p)PDkCvL)TKG^%n$% zQ_`4Y3dMyak`3rVrzAocINL-^L)@V#@ZXw!?_bn zD#^69T5Faglk$p*)MXiIGZ&Yiy;B{;SrP_CCydllm3PZ7F-}5EVS6n|s-j<(wu%_m zJKHP#H6$*>aCX~Mg;4M2oxk0rjySgyj+msND55CXk&(qkzEao?^0hl~506ThZ}DTL zF_0Mpw$@XMo+aCiR0IcXw-k#m#@o7`fV;GH&lMDlh1fn?sppN`5EZEr!~N<)krKNr zaxf?^H?SWqA2X{c`Kd^WLXxx$1e;^VDeH5%E;(hWnF!o-@`@tBew>O1Su(o&RMFmm zyF&cb#a=M|DPf5ZIIDotM8ZJvWA3$A^APT)vMJ-zs>vVAglck_Sr?X6N8R_TaXKBU zI-16aIqT7C+;T5cDx)r7iY>l3*%bB-Pz>pSEQ6#Rfi2muR zRrZE$-!%}}WJ;x3lnO>hTq*18P29=XoYRYLP^Yz44r!ig zTomm>kZ3U!pcw{`rZ^&{aslF#bbU$Yl$+=h+;n4WD%4vJev}Ca`OP*qec<}mT}kLT z23~2)>eP9FF%8M6T1;_J?2BlW9F_oJQ}8p$#%h!k68LY%u1v_JVZK`3HPn{08UfFx zKLvPRYB0kbe-$_!RL_)fu(&zKc&OF}MpqflOS!&kXpwqnZD(OOVe)KkzrxiLtE+p{ z6~Df6w7~xW#mS&x%E#sY8j{)`-^3}Q)D_J-H)K1M)|Swe`wGM7$rP)X3{6C5Ow`EA zcv{h-AcP+(jE=PE(*;3nifAE6r8OB_sp(D;uydh8gC;vIDLsuD1m!+u6ptdR@+jmc zqSTFI`M=qv^2BPvsyOG3i9x{>=92>^qEPosgL>Reth-O$rY`k;wGW=h?((%anX{d{ zTAB$Hh{$Dc?$RuI`ITxjBM_xd;Zj8?kK~W$%?{fH6A{C(016N~{pv#^j=WP#{{R>8 zig!UZbV{fdFgPZoL{?s(H9}=?mucFyB0f3mS;ju_q}_*@OLys2ge;D^sl3w7!(yJ2 zhC5Fcq*C0?riOs~@Om0(Rv5|oMNSGGPDHz)hG5=ap4 z9Mg@$vVg}cQx=Tn8wd&9%xW-S=3=}LT19dEH1Nz$+~aj$DB>V(?elb~_ON`8Da>}2 z%_v}{aw(HOVn&IG+^tOcm#E08OxbP+%4#Q(PZ--uHt06AAyOJm;*oo3V5No+DO5umPB3&r1L+9qDeBv zQq9KSmXTnWB$2?U2HU!r(ghh_MM{ddx+l1ZkGpqDddB(9JwJKXaZb)YP$*p8g?2c` zs=p|v95+ss;`kW#p>|T_Gv^poo(CAHqi$+rY!8IZ}g;V@BO8rb&pfEW-sl*L&YV({WXT~{_hX;CPgPU|G0PfZU_Mf5e|5f-CgXMz zcC?N(h#V`>j z;G?Yz$Z6PWBGe`~GH^IFyvDmz<*A1OcD89njm5o2NTdP%(NQLLvHtZ;1847i)e|t= z)9%w`!tdP~2rINRRF0xR+cS!0Hw@9r9w;W_DiaV>^3s6HHUq^fNuK>`67mL6i;dK^ zFPZ!!vSVDxX!8|$U%gL7eQn&co%7wRwk@tGn8u*osxx_^B54 z+(^`?-dxmscz>-rIN0ZZ%eI=EcKq}X?1W_exZAp%2HlwZ#+@eCBOIEUBV(ECRIvPwvvJc@2t9*cn@X?47@MpBoLlEkrVU@mCf#$`ZY3oUA4{ zab-ChS!tLXbBbNhA3n4MMfpeaqRi3&u2giV0K0bm>SRy``AsMYyRqJcnSUZOvM9?f zRV%-5KQ&*#ae&*6LW-addT1gfe5d26$EOhzB) z`;>~I{{VK>9H?#lbftYr_ekS-!=2pc6*3|R$91Z<<1%2b?9}Y)w;#RlOOsHHdJbT% z)A(vQg7+^4YUhn+*Q|-4wB= zM?W2H)$90|h*JELlQe8H4)vZ)+&PL$~OlahBWX%X0)%nCNI-l-vzpP9aH)l{er z`>L^QxGY=mQrQYI_eaFd^9JqwRbzN7w65V)r1K$tvG=G%kFlf2G~mZ#(AbLJOa0nZ zk+@vus}^XZUB7yorPysP^He>^x4cibe7^qxdX$#NGrQ|gn5!1n=0$ACDn-A#Q<3~X!&K#C zkx_4!Cgb?3qQtf?3!9&qm-&rCx{cgtaTO}e0V%hNh%V!b&f~C;e|}`%TBJAkO`Nv^ zm4}uUaZrOAwg*>VtJl5ZbEyaZ}9fD_FT5{KYWG=KlcDY6iWz17kknNsW!PuimQDr#L2( zcL?ZPk5!pQ!%sJ}Z0p5mqN43l%TT9o@9$6zE``O`E}|-Wtt;x+E^?nMHCII&vQ0N+ zamlp(+Ad{MCGo7x6n_&6NVRF7?;rRLR8@*Ik@uRQSb+JE?fTH0E)cP@`qavs0`#iz z>ems!v8qW4W4jqzO~f`7e6%LV%4v;a>RGv5Qzz7Bk+uTZtid9~xDmFLZQYP}H5!S* zGhsC^v&FY0ucbI@*%+*ZhDL5rN~lqHWxwy5PE2+;(^h!PVA9E{%0jR_?yNOH`*Jy6 zl*WM#tWvvN_J8El%Mi$>~r2 z+Z#Y8xwu2J{Gy-bDfuzhh{zOqj+gsxKse|r&8n=&=KIyoMy4#G=~bCZ26*Z7GX0V| z(W)X0XNIU-QDsnLZNyhO6pqV`R6>89kw@b~Y!nmJ=pxnTW@6`xu-eLF70&E$GmfIG z$TD`7#Wf~hDmrG><8G}?I;zNmFl(6+F&oG5)C;{E=Hja1%8u1_VHe$f*rr@-Ea~%_ ziOEPc=gWP5#(uSLZ!znMpTC(`{34HeIo`OdA|vc4t-d zhS1$AFSVlWW;Mwf8WO10Aa-q}H_KIV+Q&{cFW)KYnw7ONoEqd@HvUiDsCT~hEO$~; zu-p?nIW*T|>dowF{;boXyo~(ixvnS8lz$Z=X?CBRioSMFvO3|b2&BY^CWqD)wt{ji zjwR$A@YE-nAIqH8bKIY1br&^fgpt%fts{Jg=Bu$^28=5ln&MU8aVtP+dhgl|QhJJOq2I%+M+;=O zP_@$>=MDf>sh`!Np9nlsHeiXl=419*0nxtHj%6YL#_j-#c`!E?Hf^_Xd#4 zyMKzN47k&0N_BJQ?fc179a0_NDO%#;^8n=MG{yikLCn4mq!(_LN>1U(c1@@P*)7FK zbAFiw9tCmcNjShf(s{BeUB5ThpE$WJbyI4n!9orxzuNdfpLV&K8bASN-B5?fIQf>T z%IG;xtZMMcFzwQ-jY=nw;<+Mxw+x;C07_3em9RQeyAD&c`*JA+HYz)fLN>-aS02-` z`A6Lq2)Hb(o-s-?(9I*TgHTwGT;`iC*O|(;E0TMxx|IGJg)SS+WzH6bS8!3e)c*iz z`6rW+QXNVbjPLJUYr8PX?MccmUy)1NXf)B&z39Q&_eEA0s2j`O!K@Q-2nxMwi!<)a z9k{J|v=T>TZevwBKT4tY?ZY|AUiHkIi80si^r#`aoHxzTQ5k}X)EmI83w5TO_}w=i zFcT%6~E zY5Ui32b$%+-lGF{4N97#DEXV_75E>ujnC3lPPno(e5Wx>beMt-;$PVv={*xUEjLCJHj5t}Of4Cxxy?Eo$81Rlx?VuAq(-6Od}+$edly zi+oBjX_82#u(=|+i8Xj*mt(gTaBB9c9^!h^kq(BqIAD$ zL>L|FQ!e9{700%t0u@l%+r~XA;_8Y+5OYhKCBg?%mjM@%LX?rb+~XC`E~5&j?fg?A z)FW`jz9^MV0n<9sB6mG$=K%izvTKm{1wwLqRM6_^%0f2aD?V$3 zq;z8E<~_%HSmsU5^6jovYU>tJ+pAW9)Klcze(&?6m`XM}6xbVfHr1s#IR}wk;MGKr zmm}q?167JMo#KvgH+;dgHYxki#5Vl3$(>>`5m6xBPqo!!BQE2bQK*eM4x&j8F`98? za-i2f`mL~K2=v3LM4MZGUeqaSD8%cd{m}KL3@eu!vd9%TjML7nu_jB5ikVcfnbN7+ zz|-DkLB}mzvg=XGqY^D5>S-HcoG|`XFqo81lg$c)ErQsq2`D?b;cJ-w(}9o3;ee?Q zuNLkc0Zvn02!cAqxm7qL?{}zUlXUIR3tZ%S)GP8A6$sU0X+Bv((rp)GtrsJm-@}S= zxI&xFa^q8gf%A@PRn=gLe8zFMpE_hyM?)RPcCn~SlgRa~IQ5HW1)`IRYU+{5xdc%O z1EzFnOp&rlQW<__Mn87B0^^GT#{-oQ+hb# z{{SAP{?>|3xqq1d0O(buH7+q{NcTXx;C!_woT^mr`D>py%L*1RxkXk@QW=I_xvP)F z3Y$9^r9UdE zdv;vBifR+CM;ZA@q~bWEtXb7%0P|8L$2tBQ{G+CG)f3+rSIQL~@!)B{?DTLf-2xs5q2bgM9TR~2ZafQ-M$jT~{>M))F|u z^Ayz6_=#xhR$;hjy#@Yy=3~^Nm3+!E{A!Sgclg)Cm>k+Qwzk1UD0ByoY-yBoDh04yL zOc{QE;;AET-zYrSAiB&`5t$WnPa3_vLkTY7OWFxVqpX@xxXngn8$lcz=0>@0sr%O5 zigdc<04k>5f4x@;A#&<;Ehbq>`=+C5Q~g^GJ*$?JUW|R_+&|f<{{Xe1lMH1PoYl&V zJ>#$Q)GE^+a#?Z8*C6_YF%OyZnvrz~$|(}m-E#wjI<}Y0IZkR-opYVNE0lv-fIBNU z3sSzhY=Mfm$yv%mQD*3MM&3E4j`3KqBOR#F}D>L_NBf)`Nd}ka@-EQ9k`VI zsyJH058DKXsP5NVWKg zV&<52sK`_1k%>G z*KJIyu{a$TNOLDodYA`ZUb*(wtL$4EzD>!-nqZ+J9w0ClQgkv zR<5nIsm)J0J#2I)cRO=PvV6Zc%bMoSs|*AEV$~QFYfaH z04*n(gxsGtE0;}LJ^uhZt|{NzNg3+9O;bWT7My?^A9kTx^_ljc!PS7aVq z{MoDnsHk=YxT_K0+r~0w8L6DKHJ-+onyRY9D^E$bE8o4glk(NV zMa10~5vlU}ttXj>`B|}8i>N{6a%x}gC_-)|Qk!B+Q*t(D>TuK{aN8>oUV`6$I*&yCD7Alxo)7esi^`sVzs!Y(VP3DC2EH?%BtB z!Z)bSL~ru{02Mv1?fPe}Xr6%2T~3V?sWsz0=U4&R!nM=BRmPs>U# zBZRUOxKpMl17<0Ted>hVg5U$lti;qHV63NgMLoo2!vj>JO+Ah8JOmzR%}^Pc&R6eN zGTkI?xSZ6#X+~CJXyqrC^3d2f3$vNUy;u=-?t{_8K>e*V!OT=B+ZPf3z zss8|Vs(qlnnWz|<7x-~fq=V*C+}2RLh?CCcT4P+`_0DRYMqE+6CELL1Rrjvl%6e9E zUc-h>>rwrxEx0Z6)|Vnsxv%Fd^ZYdLFqQef?PJGv53U#eui~bg*!;qQw*LTjmC5!@ z+4F*R?@ca>ymzdrZxxDs*rby9D=ClW0;cTR3*I(2GMxVa1wU@$vEo+}0$sHAM6`KkVBSLL?Soa|=lqgGi8H@eVn2Fxpb z)t4>KMh0u+o9k_-P`YSE$8g+scuSY35~&Zc~b4<>fS8*#_mNqy6Rk)tx2KRaf1) zXcL5T{{VN=mnj!!nVZQ`zxb)_%F4xCZFADzZ)^&1y)no03QFb1J&iV%nmi+a6*#eC ztix+oZMEuh-HL^z9$&y2c%|f#bsYx=bl|O|-y8`_G0D6$At<5%+$TowuX_2z!1fQKz z6BSLPr}wH@<`EY2K59@_Eh6H~BVvSo+IVJkS5KCzPSLShBB3P0Wb~&Q8P9UdOv^>H z`idb28x8AJNFzNl;t@e#z}^CsR%rELvhi!rx6{M8_rC6&8XBw(PUe+?wWZd}y!q7vv_S$8(k^K_(>Yq}5a z)^_Jd&)s87z5f93p0!cf)(E-&u5wScCVZC&y+4YpEW~Fm^9)inrMZg%H zuTBk-wn0?GZIgq6>r=9YHC0y%O)<~z{{V|M4UL*k z-#70*?J-?<@HZ`HiJmY7olo7VBa><}o~=NQ0?NAz&=rwz-!)KKGP@Odt1Btl^H2qb zSmY`1Rea5#Dxa32YlYY&9cmSu4S;^_G*T|Wz{`ZIP#w%ZS`SW@8JT>&r}(LjAlZ;| z1y#_=)?JOf9j2yNRp@?d#(CA)Y#%7AsV07Eo@<~)<;-un=@IhSUaeIOft`lm`|6`C z@$kG*q)p9TvB$IK`Ke;vhi6*LQpAk*t4TbWCB9v>6%POY+IqpiPazJ8Bsx zGB1|r=BLLXBg>HRDpMtS7G5o@LaRp_?yAdh%zkb@m0->CVEyVv3h@%dbvHX@avT?Mo z@Aj%_%EcIb^`I@N?XzP$sv@jcpS-mopDxNe(;3%es0IUc zt4u_wc~E#1VPQOc!kAt?`KP}u6b`h~(@_w+WU~QKp(h-4so11zwf^-p$Y{z}c!fF`T*Lr<%ngbwjghKZQkxSJ*~Dq(SC3LF84Yc4O0l zLRTn*YpLXXw8jzOh{w&=rZ1LkHx*7M*(OhVa3L*5E67+jHsY0u>Us*0s;?yOsM&*$ zlw&omg#IGG`mWqkb1z;65+mbiJGRtOf`=HT)GhB2fZso$sUiq*v~{K3xVAoA@rr~P z;S6{NmohCe#qraOQzHUI-29plqqYxPL7kazmWZ(?Kg``59B?WU<91YSrAIFNTc@QW zyg@d<8>zK%+T;o5#>^j>%_A|5aHEQnK%a4HAjuMpoY4|(VgO?)lHAl!BOReqrgZ^T z^N~@=q_$I@KPt_sFlb`7-azS4s~2Wv9Vz)NN)xu6yLyVK89;#-(}on+17eX%8yxqj zi>n=-MLP?TkiJ<)-f0WCU5&*&1ze)`rgU$fnnQ{!tc{goKJ7k0U0Hys_Qp;JIjD$a z2eQ>I#bT)WLk1ga7L7{`H_R$#CA;FFd=<}n8e>`!<*-AI#cDJ=nV;^|%0q@d>4gMf zFLOnjC9)00R~=~?71?pqy-F~ofzVY}V&%4Q1rh9MpDF*KDFG%tXU+5Lx3q>_R>?hV-@`Tps%_5ZS^?i(luS6K&KzhrjJI{-e--YKQCN# zuABR2)+Py_b6SU3v>RARI&)VlD%+CVI0vx4jO;NSFM3;DKT!LoGn4II(be?wawJks zEPAb&=W_6P#Y=+j37nc~x{O&S6Q5eIEuHjxgotateOAbU`_L+*YF1=`ToLO-ryk`- zRyZi2)R%~(avSumm~HihAo)Zmt#(VO**IQ+RI934xeK^pQ}%1QDZZzkOK*Pdgj4sa z=^miPQP7-MdNmC%cGM$1@+w%a^x!v~8XYYKdz?R&cOEt&2Bq>Z$pKg7?_IN9*dLf; zsxG0YhdY@9`_y|okp^+%Jyk(a2t!0)Y6SV2$gbb*ww-b|nrGTH_ua4pX~qk=tXjFs zLlyk3`?%QEuO|97B!VlkwbXRt6$kpyrxf#dX3A9Kilz*wBy1=+ z9+lgPtmRx_Vxx}Y$O0D&iczMYQ%JLmjV{cYB;(SoBo}h-AqlR}&a=oUg006btZ|dE zGg-P`@TIB3D7y-y2NfuLqql>_cA|Sd*cch55?N%EgOB!UN*5B9x*UiXn*#+Z4My!Y z7-Z(Vc<*$vwOy1SN@Q~B%{NeMHwzY}bB}p%7^qzQzLb;Q-t5?!0=)=*f+ZLW%>nf0 zZ~~5c@ldI;Ngj7+CDdt#QV6XJXT1ncN!?wbn@+<<$T{y;BA&risUzEpmrcEf^hXS5 zy<~0sg+kAL3~KP_{`#)?8*=$T7$5d(Ou(g3sG>Avi`?`0=e)R8ZgJ~Qj`Hd`7%^;D zqyu7CYXHCS8eO&_c9dNGD%=^1owqmhRZL9~k6=8nBsuUt~&rY>o%0;8k5Zwp! z5Vk*uty+S6$1Vst?Ou-(*@&CuMbEWW+iZ)%fuCxX2{GK^+3wYI<`w?+K$mxOZVcp> zuHnVIfC`R#ZKkYN+mx(8f52)d1_uxJiZ|$yH|y! zqlFHG{`su=SuNP|(RqJlR043~pAFs2vg4opdll;|ZKdOEkcQ(K+emD5<;aZ{LeUsI ziV{5DTdCi6OKxgn{h;h{TOY;qSE4Nb{GP^sr!0 z6>#0%NTCoGQNgbB?AF}^ul@2UQEL-&ilhD7n8Z1cIrHaJ!DXhU<=kWM6aN4LuHodd z^Ocno=KkoX80?{SCN<`zC(x-giWfJkzGE>Y{ok6Jx3|vQoy%k8`Hgo9ZP~u!?KL2V z$~it|8)%GJGlOf(q*dC*o7$E;%e~oB%Er6WwrH%$5{hIHS(e^YG+4))Jq{i3uH|J8 zq@TO@s=&Ivg-VUg7Q0fmau#nWFZ>3lNG*f0C^r89yF_AX1aN~_zcFmwSRa<7{@1;g zys?(AKuBy=v$Z!L_Gv_Rk?z`nkN0WD8txZ7{V%VSG%QO00JXZ6?=IXb7C+tZUBqJ1 z-M1>^{n~$(Ya_BUDut=!GuB56bxlGv@|H#bRe5ziLHB;}iu6^6%}WS^vYKa?VoubI zZXfK_$k8htEw-zuGN~+Bk6I+uFSl+PU81`=EiD035qDFihSE5&0`uOZlie+|f%|>* zV?2!2ajj~scB^D3t#@Y1)^z*0p>*2_a>~0|zV%%+h>SHj&+T1SR$nvj)uz=i<0}%j zaa~&5*+bcC8LTX1ZSHBcsa&TcE$!eNw=+~0@=C>sC-biN?DlGbT~&8dt)-p1`G~8E z)007R+~m^c`4a`$uid1U>ger0V{TgNJeW#?i}KS1a7Hpy{smWVqKY|zscIo{A=*7R zQ%0qzFab{nyCH33DsE-@sz#31B*+WJOnpi@KkXaPhhrSISBp`--I7VJ-qt%QIbgV} zDQ{~VFhm=F-KENa^OL>yTKKxW_FBKxKhjpRzy+$(u$~~K2~|u zceg0qI|6^&sMhxL%~K;c^shwwHL4u!7;n00oLL>AqaXLpRALG&;Vy3Pq}q2dTB!y7 z;mlHQ7_UR}?cF};1L;!1ZDbQZSoyuEHHz$TsWs--+{fms4K>=y<%T;=dW0(w3=C_x z{o1P{S%6#1UTHM?lP%9YdyBUl32*!An9|&X@-bF5-6VE9w`~6azN*ZvX#W5rBJKK7 z${eQvlV7OGX6MnU`(^YacxGMI+?9ZU1bcSV(O_?s#tlui3m$y8H)}7N81AWO)HMyo zQNDirtGi)lTX2m=-jw*#*!|>IQU1Ns%pAwTB3zr+ef{3LOW=Yfleu->;qtE)}j$)%X5lt zS5jlM%*_z$T9V1-ZosbXt?au*r2hcBRi#KH$H+PV0A{oe4p{0snjNW-DUGRKq0VyE z)W(*{x;G2{^$Txf5o{v!Pn3>ia<8fC81o5lr9#?{r1?9(U*WE-C8x~AK3ak)Z1Tfy zcGKk-InBqbYALl8u+Obo{?*h-1V2x`TCSF_wYK!8$8By~BZ28sTz4^=`u<;;r0G%r z0BLFxKIhLBw6Vgnbomynv{1Xd;c3K)BbrS^Q%}112dz9_>T0+LX#Vwd2^vrJfw%1Iy_M5Q7<)Qx1AIgdMYNK)v zd;3cKt|n|$k?OjHNyB7S@`(B4?$o9maulei6u`lr{`<@fJJes=dW?S~HbYj=$&IeG z(`gafRPj*Ni;P){HBCgXmbt|>FEuh*H@Ex>y2OSNw4!4a_@jVJjhGaK^f_g^)Zy9= zcKXu|-S9=pE-SN_$or*mY5*bK!hEap(}|loG`Q3wT*b<@JMGt`?8yYzXz@Wh?L^zQ zp^DB3$L|y7G)-K)T;r1V`ClX&m|f}(&TFp!07i{AgyDUu#wZ9F3-eQqSV>so4ep`$ z8?W%v{ku?&I=2Y+BZcW*WGikP z8x$z1ks?;#v0MHF(z1*_;YA!fUf(|;lDnxz)}oSUe-+zpgLm8ux{$?hAz*<+f8({S z%8ExI`i7z~qbGGV-rp$M9E5s`?0lGr{oosxnjwXEZAu{$Ut^XUj-*=#MmeVc0BLG_ zO0!@sbiPDUu2pumHYgyUaCO^GQ7c23YwbXVaQLVr)wL746Y{66b*9?e42qcBOqkoOLz_=m@Kr-`bk4I45eOJe|koTGxA3cE^|U)pfRkB=Yg{)Y?TE-`bj_ zgK#vd&>4oK(MRn$shn*>sSYHDi9wDhgtvBe<84FqZO0l3r?G-5WfsY$zW z-Ap>o{Ly~t{$JuXwr!$h!5=k5Y}anhzby?i4BLHEQCDsM0CuMT0EB~54g12!6?|DN zdsnqE+eBNYYGR%27cz#wr~=H}g+?{|=GvjYYSVo_DJ1^xDe-BLlZs$u{j`yzD-^8OU5 zV;NtZZCXw&Rw$;osxbynxIfP{r^4J3xK&0hyXaH@0EB~3 z-;LN6Bz_>jA9(Islv$${8$GI1Wgq&oFtioSLOesM9uV}Vw}|h&yavG?>e6YjsoZ){ zY+%a(Fe#8kn*I12o0^RHmiftYm;$YvNc_H)RNF!smme)}9>g)<@R44k?#RVMABk@a zM1Vs70OQotWeNIJ=EmGE$i@vO+6a)35?}68N6Ct?JWqDJRYNKFs1n9E`F8TPC)pv5 zk#R}O-5eIA%i`O`pBr*1jpECrhLATcNVb;X?u=%tHIJAwf}$~yMHUB)FN)?p)Jfv2 z{iz}&Is2t*vT4yN+E)grgH42-AG<}Q1o8Ny>OI7QR;3;)yOBW%Le(|2w_}i>D5VxQ zefA~tIja05lslVYWx*JB$zj~>ClG%P($KI%onk(%q%GKD2vhw(*=)U5c zf&T!z(^DRl@i>SsNu%_Giwrzzl+55tw zlFHrWz)jer>@h>g9cj};EVqd-P;MDf{n|zGUF1K#K!4q)eU=|9=3JV3+FL5{DN0g6 zBlx!E%D7giL*na}`2v!)6Ij5zcW|_yVu#IBvuCGJ~T(`_;jwjFKtyB;2&AqXb>5 z`-i<}Ci#UO&fNII5XDL3)|nrS<73JBJ!^tGFjg4lY5xG(D;oTQubi$^y-yihBDU9E z)aLP3nCCQoWLq zo~pGsmt#1dg&&P9Byx)7P2hTu|CsX7fnqskwA4^(Z`L0Zs87 zDgN~|___h}yMQaqTTGduP#&Kim67GimJ3lXVL~URj~3cGv0?!K0A`vzS7y>@dj9~u zUUBvkyF%w_`_v|y>T!?4h&CxNkr+ht)u&xQ% zV#*_7wvoI~44=ndNY*np+|@+WFPC?g#IO5QLRT|!J%sDl)0Jr-=K58n*KOHC@5U>| zt?X}clartJs^VH*lZIwdPEydg*!C3HtUwDR?#)cv{fO^gBNdg}vt*o9scCePJ#Nk{AeBo~Kj9*_X4}8;uM#VIU(Cs*R=h?kgyj3ybmw3_ z#On6455B94jB0S>CRO#X4rw(Z9>jf)d(s=*#0W0)Ik(`pZ2P%D;Yjx{pyk( zUe#AJxEpK3Qtwg1jPAuYYn@3)-Wd8(PGPa`?W)^`;nxdQ6ILYrj=Pq;N9~%f6bBU% zxYf5RBb5XDwKA!3=zENMsxe^Fu4?$ypb6#gQ(g-V-lvS`X{SeZt3@f3%nHV;a@5b1 z_jJ_YZPBr({{U#ig}st*ql2D$D)qiFJ)lcMRIJCnnfP(70hfgpZ96M zYdFI-cx-+o)gwk-na6rX@m=`JINQ6uIJpvg(YT1=xBSahzSt19!IiHJJ}T5LLlBJl zsZWXZ1`4J=KJ^^s-1k?yO`X5ls-}2G){XaVuNY4i-`qaPhS0RB;w!b0Q|1}#O-z>? z9^97*(e4JB_Nc_039l57#8c)GXp~=);*)`aK#_UcU2hm29>vb zqvo$5{{V!V?m2dSyuL3|zkBY~xe7@2Z!sI@{{U*CG6iDE_iM`}@mk?r%ktA> z@o_tO+O#>MBzn)DkGWjbsLji<wD{mOQNXq{JGLE0^QzG$rC7l~;)Tts|Y%w2bgw#(#Bi#xC!eiJ{{RUcv2MHyagdKj^F}^e zMY}-EKZ?BI__Em?M6Zq1=)6&8B*Q-KwA8s>#mlMb5zQFu#Xd(k(cX5&Awhch?GV)ruxcpaQQM{=}Y4P}))xxW|`Dt?tnC-sN<&Ew0 z3bXc=Xq#{GR{{OMXz~8;Mfy_1;;lVFgb>asMa5k11EPG{q+68-Z(ZH%j~eZp<+qQP zn4TcEcG|K4r=wE4Me-x4X-MM~%~`Y8 zEeuCRuwpR6epl`xzI&$5l-Lx>YjxdW2JLx ztJ~)p3=K|o1V-LnNFR2K^bx9EqdEQ>YfKr{>z|KTibf-U`?YN~8*rOl!tV8@BsOZb z#tSlhwF+D@9Gc7*kZ)kE_|z*jStZWarvOITm5Q$8_iAOBebB#lx$}7(V{zqa(BH%p zuHDq+t~(n7>&qks#wycXD2+$qSPOLt`{(7RJjz&`CCYE~Oh z1#21g8+K)1F>-3X&D>=PR^e++P)D)4w@dQxY^_*nh7gM7Aij=FpWzh6)QM)n%|_$1 zI&UzeWPHHWmB3$b_N$z>zD=Yv{LND>{C_lH{p!*P4Z}7U?^SU>0f_5aNp};4Kz>!K zQr-UZ_kS{qb_kt0xCi7X=Kk$Ow_84cy^6*AWxIy?zHljve*{UA*rMaJdLw#!BVRa-D#A3&MKQZ&U5nBBPi@QEmvLaHj~8y5wlc0qo_rwoJj7GQID8+sKn}xhdpa8q*NPOxT=!R65#i%LQqEP-hjP6T8VBDubI#a#D;c| zl^v-XR#WAkaYIaTU5zg=2i%?NBlDbtil^q4UEtJV%!{A9NoY8(<@0bOY%fn*c(_*} zbmFt)Do5`bf8bRD$_WJz9jT_TVWesjfNmU$iR6vO9dWj@-t6!BPy7e9Mdyd>!KTpC zHYJsK#}%LE0N*7*UjX+}NgSx9zq?F{7v!C`Zp|W09dM`bR(F{e0LaOz!c|Ag8VS_c zI6M>0S9w%!LDr}ngOJ(VnuB_(l?Nqg<*`oX^C!%w_-Tehjg!>Ye0Pr;vSab6n(-rL z4tG#Rjdgb0lhjmRd6Od;+gY;QlZH>?sExqO1J;@Z>}(fNw2Gzng3=Om$7;>{Qyw>Q z`if%QAj$^KRmm=-<1NSDrlAEHPg>0~C~y_?O%vhpdG)C3IL77il*aCq*OV^fo>sCx z*c9h(LH#NZw1;9C{HChSlVeS03m#8;jL)($w~W+O3e4e%4 zu8^_?O``*?OFxHWW!uzL#*~WY(BZtIQA)KnrIAsNa&gDjySsl4mV6V0sgH)@NeY3* z9?C$Zk>^o6pWaBv>6)_)rJIfv*LN3&(ekJ6_p4vF+X zvJamlG&)k)agsQnv^Vh+^Hgf_^?pusUV=O;42N?tA4+<7Nrq_i?sKsi5$JAqD!K0$>Dh99W%D7 z$KkeT!wwdd=rQwOQ;k{LGV8dH?$joEcx5>C_peGG8G(^T-j!N!4In)!`vz$VBZv~Z zZQGsLr57?3!6$Opc%C0SR4DnXVd0e--Z`c0CD^`naFN_HugvC_*s_*6Jom1(d^)W& zARYQvx_D3(+#8=tQ=uT|N1ZX3b1-hT8qFXr&TG*Rg*%26ui*wGJx`#leT2Ii#z&kr z%<5E^ec$g@!+SJrt-Y(SkHM1}akq+@d=mSM44vJ7`qb&dMZugun=x-NIpY;=Zs$r+>mBAdAZDXyg3mXqckDiqaaVyht_*KYm`FD3x_PjSULJRX?IU%6Vs8X3ss zlJ0&(xuQ8Fk0l+3>g$Ju3;gT56zF^*EWazM1J<&1nBydJEhjtK$qPeX$lxkFC|d4U z!OWj~p`?SsF@kqwtz01@;?cv$b8txc&lP{|Zqg=OHP|PDBwUt`n4SlfM&KNg>%gg} z2NqIj<=*j?GN+|j7mODN?^jm`gIve7q2`6~G~0H_KJ8a47c%Z~g62ithhbKd@=WEM zJ8P?N1+xx86w%=6AmoNMgM&coBbZ%Ed0B%u0*iaQn9D{VDr=?x0E9V{ZUNi6rvCth zQw{SaOkm08M<4d7L+&ljP4@ZraNR4d9uIdL@qtxGgdR4-5(O`3B3(p|bZQfW^1TsV z%PAz1E2bV0W3{n`_N$}8#up4T^HCVe;)IdKnOZp%RHjx7*L8L0!ZNs00~HkU;K@%6 zzbzb$rqeihuLP2LVC}%`Rz%Lrw|4ATWo_V>EZb44Ht-zGSyfIcdns6zB@>H|?V0xO zBrQz$jTQ#}E4H)n43UQUSbmf@f)+W5bSE_Zo3+IWBZ+&-U|fdlPfOQfw4K0LbN>Jc z6w-Xm2o+7d10Z~(I)$nBQn6}j9FttS@M+O%49m2d>!a{1O87gtsiW`)N8N4Rsrx24 z)QQHd?)<6SPH7rK2!E}16KNpRWAHgIkQh*@G%skQBhF3JpAO;1_C5G%cZ2BO84H4yMyPNqpa zRHfuoX&e&X$`8tRjw;e#<%nVFT|{08l}E^|>$;{M50XZ~Jbfv`l!eTWL+z}qxoHyb zyN{V`uwMuhCL;$cS5v_+A~9q;k9rj;2Qob7?&a9v{{RgZ_cF+Z8cYTCuR}fvTJ?lutjx$`xp9`J;04!$$ta;2%(tp{m*Zvjc(GWuML-;+_TL*1ER!f>V zqc9RIS^K}mP&CTx<*;V@SD;z=G2OOpXRF7+51fIW)ubp$PO9j6mh%`@Mqx^~Zu0*C ztYEe2XW{WxUobN_`!x0N8HlTdBB|17%}E?1U3q9u>;Y7s^=1mkpL+CH@B_Q#D}S|4 zUx)i!Ar9a6zlNq1q*t{(>N~R_032=faHI`Y6b8m$K4^Z{695Q zrznRyHSu40-hx4V#1Rb5TR-57Ksd58nwNJBap;D5u=S<5BZD#pul$TC}JFC>w z;p<5knBlh%mzsI-1W&hkJ4af6&RvZ8k>)nHkF(});;EkYRa_3Hy$OCD24+wg1Ky*5 zhvFtE31ixaNtEU8o^Z0Vs-;^uYQG{^aC{LXrq3<2NWKIim2k>v`mlRcdAmr;c|9ps zc~d2y!3_YplP+c@}@_N-nGW8v+)d$1JMdUMo zz5G=v_<8dy6xsziPN7Fy=g$ab&j5ZdirSKe%+gs(&%TvhFE!^^=?20nqFKR<@Vj0dW*x>kdB!!W;2Br^(+kbXd zPvKJ7f=~67sf*A2$zaPW3EtXIHmZ^`2cMMF!a_7Q zyL~Iy{{Z1$e7m;o!27iX9}ksZ%mabem$PBcta&TkA>2QToF-;X&%m!&pTJ4;D*e`| zCh!?ZL{V{{;%}SuqBLFg9BL!W)_*MR%{8VccRww9yj}`O;zcKM=kI;$RPc04Htg$J zxV?#UJd8}v3C<}5jDv%k_0!;pWEfS(J*mmy9f4WXc0K9Fl)4TwJbE{i`}JZOFsoj+ z-Ufm3l=+sGd=nUD+%i6t{gj1s$io8NDZu{#bmF~YUjwX+K**>60K&a!#z^{m(v1lN zsE;a1GBcl+l_%I#k@HupOW;IB+qZJnfB0AFDk)IGvx;8ELiUNCU}Xw<=xJ6#^B_Fe zsei%*s8twzw7>9zh~Fr`Ep6nzvK`gxEAaR@ZRDb!pZ$7} zcok7F7bQm&dlop&CTmhG$cx>c{*GlnR?PmKb5qhuU7v6gcPCNql#Gk298;na^K#k z3OZ^IXO;`HSx$ahKF~AQIIm0}4-ovRyA?Y8I$!l{7=hBJaF<|&;(0sW54*cGiFdSa zZY$N>;p?y{dT##!JE>pc=3@tLHqjbVDlR9KH0*wHOp5abx!qp6zYn9GeqqHezr%Q6 zEK{d?)7eOwNghboTy7NfyY}5)uP?)~hD0BwMxPD}gYuSc)O#5V+F0^4aCb2DryGsx zyT0vu==gl=!A-SW{uTBPQP?EZN&$x&HtNCiU79pdJAUE@a82?BrK6 zJgH;|KKI_I78{4nw{3cl{2+{tl7n~f{{Zn-AN(K=?~*V-S|b|;&oPd4box^Lq$_>w z3iS2x0ax71xli}1L*N)pj9D^&+2XSHQV7W&RejPw@8&pk;+tUx$w_RQ#KMUz&)*Va|ENxn%%DLA<`sYS5EvHa~{F2z)$n zxKWJ%0D73-0-18BJD2;vttr!x;?Fu+bChHEsX$ox>s{0M4otTVlloLv-UysA5;0@< zerlg*BsfUn!Cm`zaw-;e{{U3A=s)m)Op^Zh{{XE`PXWrL$;)GR+1Nf@B@DntciI0}ODaH~ZGl@xAhUPdG3(35V-D}Z5;a^I;mL+M2 zz%oBVe+quiLCksbTx}Z(pxw62ZRWe^z8i@c07}%8d_1{WzW23Sruv~CdmYB@y{Ws) z46S#O{6C&0%dsQ-)T{9Je=j}0v~o5VvA~H64AQiPm0G)F;2E;a0jELWJA}-QpQSfV z*k=%qk+Qup&Rfi`?YN7HK|Scpt+_!d4tk z0g93G)J|}`bgw{91ImLKIQOPO;F;b{n_C|BP)_8wa3P4n2c=4qF;*?h8t*3XJF9Ro zC~pKyvuf_eS1z{~GB^x#Ps;(bu&&{}4R*VF(;L9|tT1w|Pf+DJ(J3W&e+@v_8}0%q zEu6RIUDEgl^KR0+fAkt?@CE8fs^540nwY1!uFf-m8);Tui^$2Yz<37rWKwspwK=>4 zeoq`w;`)-CiN$2dIXx*BXI3mmab3#z0{vZ;Irpaj0Kx@-8wEwm_vV{St0r+~V&|T; zsVH6zc8TCyycWUA_NvR^O+cN*vg5WWYe7YFoUoQpl~SikOEx4uE2N*nI*XCylekkq z;Re+HWhZqegr&;PXxyn7BNZ2z7-zcIVBQP30a881u~pZ>7vw2FEhPg^W13ltN7p8! zSqmr))K^SA8GPtZE4Gw)D^XCVcg%m;qn6AYIeq8~?x$o&xlyaC9tpoJQHLY{079zc z!P=U;0sJ){&)&GMbGxJRvHV7ufm?!cT}t>vPz&>li~bP(T~w4@{Y6|N`vuN(djaJN zZDsmz!kU`=!{zp6rwb{0HT!u%e8Hkz4p`IVWT|{uO4}Y9)ZunryNyJAJ*l~D$A+ORJAuy$ z33d!VT9`k}y?*U&f5I=TM!SmcAFW0I00`c!jsC5+o|K)4O2%YGku&K^K4G5KsGc6x zvUjJ*Dc|sqYHXQB+@0y%InkEnC{QT_vOe$OtuOdTbshfzbp0_(z8}<4w@SFBYlIBM zlYU6yMM!01w4b~x=k^Ywi@?g$V$n4mozeZ;1lL4T+|N%(*x7Ds=k_+Ezh=^Z;5{j1 z(eKq%g}|rkIHp%eA#oV_m#sj4?@G`bJ>td*M(5gckDuE(_#*xT==o=~=hN zRflf%D2C^L9x@h_G>*iLC@+vIHkLPxqW$Hl$haq9faZm^xQR(f${`hKj+95oIpU!LWeTP=az`C z`_(+rA}x|H1=YUjr2$CV-*sv=M`p%1QV%g@$wTterulSb6C`TVD=(!?P#xQT@TeE( zKQf*uK6<|(kM7cLJqkmW_Xgg-{8dy?(mp#@f}wNw2&l?n2$78a9 zK2hGP#&Midq^wIcbou?^qRfns^7THo2FSx>W=&Qhv$*ARQYP^JU~G;mp28)Vs=A2R zBBG5VNf&7Osz%!*{{VD)(z>AAkKw3`unh>U#uQSmvIEG?R%5s4FVdc~BOEhsssj4M z8DKF?Dw)9<#W1%3)Mj-9X{8a0(FJTd`6{!)7T=I=U-qfQj=pAAn9?dLo!doe0mOVz z!ojzU?WJpY%H(n>V3IS+wn3r3T!7nycA;CSTS7SPQW*Efo2k%49{k9kH9{^33Y76F z+_`Mh<_==QM-+{>W(cWcfmdr{s&0+BA1yS@!{rZEakt!_OIY#09Mo%Q8Cxq%YqK{2 zlp2mnPnJ0Qw4H^aa9TtH>=>Zh#kqK@*0&BVj4Qep5)sU8>4yXd7rn{hb@L zHr<H=n)GfHxzcjZ>ddR?%-Rik? z7cWyCbg1K(<@vp;5R{Z)&t3Cm>YF;rMY@;;bgDR{I1W!OrTaEEP)(e5SR$@E>XhAIhRzl`7!y z!m^66wUEek$dGO)=2}B$s{a7pTC$Uk$^qtrNp=N(^=#s-RJJOc6&p&_M$oGKrnIAQ zyF)JmqiIlJtxRH1Ey^pWhGNf4{hSWfA1JH&W&x3DRgm$wm8TNvnGK}K;NiaQOqMtc z6a2!o(nUWnVN#a}xD9}5*#r`~j4VuiC*7wD7csH(D^fN^W+srbI92=DrjR9bDQzd+ zwO)`|x(&OtTBjZAC6p`R9<;1UnwA$9?Zl1qR4s3Dhl_Cx-!*PM#z)M*cB0)F`NzuC zJq=>)V6BbNZSNxyikTp}NxoKXwX-uuu`c%N)d&%WD<*EM7KWyT) zcZ`3#OTT{5I;|^QoBO6p$8xMwmEBc@H<7zAa=(wuTj=q5n0kccc6zN~siQcv9pb)~ zd2>=ESES`%_4~D~LH-ZBQH0obsoPp7+#@4A+FnZBx!`lnOBudI+FY>yD!L{4gmDs0 zF~Cj%;;Kw8XPEBghFHv-L0zluRBV5=?IBBcndB%iS-*()Z^pJ2dFhI4?cK073c|W5 z$9Jm%w7CS-?LFyr^BCt9U?|D?sic4b-JDY88oMg3-TJmevef5M)H1zx)rC;$kb3l{ z{_ZoftCVqH%u+Yk@jh7MrEB}?2KJL~-qmEp4%3{|N+#|)P~&kkIO_V836*XtX#7K{ zOA@X!-|p44iY?j4N{U-t9qaOr^+^J{9-95=i(_(YJ+Gxv7Vq)VLfg{F|q*maxu zKWeolxH4lLRavb@c>CYOOt{L!Q(C`N@|55nwCjCR`8Na@U++|jYqdUcij5QH%6-~V zM7Bv5w|K77^l!URzOQ=Uyv_wj9l0ZFjzte_`#>vzy=lhcPUP19Bf5-|>yP(oB=H5- zKX!APfI)@%ljYq{TXf4bW17B3I5Jb>3)v$KIAQmVK>GE`R*ky~8V>t##+WTtl$i(J z_N?3;$8nbW<;}Qu^6`$8@!~t)4mP)Xa@#5=&beAevQRg*Fonxw#CM=B(~4vGitTq} z?^6w`?#haSNJ^-1J*uqOXba-2xZ5q>thb6TLi5WtXFaehi~_Y+>}0>nyF%1j+l!SO zG5Cf=>ON|QPZeIP;fKh5D?7?<+d!m}*|%h^LgqtAzYmG$4anejrVkZQBkci$C1x$M zN{r4nnuV=Vh7fWpmCYTEseD+@Bl%8Kf2{{X^WBDY5QX%CC=xsgsiyVfgOFPWTX zqH9B*MODPz&7b&89n?5R!KX*!$+zy>*gxH@BWd@5T0v^a+gU>Y0Cygq^eszrMyDw9pXvQGre@B9YT4iTtUF4fs>XiP@c;wln!xHx;rm%O>Wk^Fkw= z8#px6WkxnSX*^2%f+^1K^-fO_+{g0v^sEsF`xyLamMyJ-oKuVbVVwi`nCw+{`Kgh3 zm6s)lO6R16#xkO!^3q0Mm*zBEs3l{3c&MQBm2!K5=}&JI2}f{y{{Z!?nM+--h8WF7 z_Bjx@99F5^4x9cGlNyD`9qC)eQOm-dZSU(`m)Qe8TyiO&WfApSOG4eObpHVGk^rqN zgE;)@B=IKLmSA$;ohzI2#_g;*sJ_I-K`L^+s$(WDL#1C8vnE301NEju;?2c;(}C?= z{FdX&z!g-%8QMy6v~xGHF*?~iO&BEr`G-G+P?yC2067Xdu6&@4xL&l3gZq_HO>P{h z-L>&sNM1R3+3VJ%UlI%y&tCP*8**g%6XX<xIj^gMtgRlPpTB47{ zrH14LXP$lQ8EgsQt}{^i9!S{BgH1L^vu5?bh@@GIOg>)KXZ{jx-@F4NxiM;8coc%$ zVcNrrYjE~#-A@n`GZ#N8tC4ty*E>sdT$5U;Cj$y<6tw}^fOCvh!?1fZs+(NN42PvF zc!oBN4E+7;mln?&?mPqQQJ7V}@Tuk(A^+F+_mNrhMsrezIlvWPZXc7tspHDI&3+pv zcF)k?F)U+aWQx*RqS`XGMkLDo#|DkNj^4tWf_o2{qUd0}$I_S0-JX9sY+*?GdQ;aM z7-MY;D&+e{O$y@~INehy5tdf_l~^6kj-XVo3XJ14npX;JbL>Cr+wiCPnF=brY769X zR#Zp+sR7-b=AV%*-%`SS!HK0RV;IIkq*6#!$4Z1at|%HcNFzMFlOmN@|`d_G{yl_9co=P_Y`H^vW%fyJm(cEh{#;8 zCbOYd&f~}xZE#5AG&nAU=2tH$Rz^TJ?Wi`EJdSEdT!k!g^q>Yqj@0=^=b*7=Kw;F? zvW)GF=A(d}#Tk0j@?&ynQLwqL#5VEn$sG5o6n_fyNhH!EZEu>E2S0tqCl19avP1zg z&(w6QF`cZkFKS{szS7H9PQ%DNBT^56me)}<VblAxs^w$AN`};IC%QiXXk5Y z<~1Tl7Byx0jbh-7BNGw9QVP`3%Of^q`9)Sh`^%n-PtIfGj%z1Omirn+#zbKBT2nk{ zf|Z(?{yK9g&V49wMDv&Alt`cvwyQ^jCfsfn8nID;Da!1nSPaqZ*24CT&{YcA98+7% zldAl+Rb39@QnMo}f%5ID_Gp68h)458H)f?!xyH^#QjX!H8&rI?Ihk0m@X^VsQDn-2 zA0TCFGBynLs?6*k1-PpRpzoTO1UX9MVwzG{Z{4fV%wv-*H)g6Tl5vbwp`Iq^rBAa& zT)6keQ)-$_sa13HR%1v(z+Sa7yNoi7;;WFWmxaqlFzxq$hNOaAw%IwX=^`wOd(`o= zh``P^RJvCKS~d%iqcjbtk_Ba>xa57>dd@HlXC{YE$Yz_6yqs}WH={mOVNFqy# z2IND)rR-60lPx0%)r(W)Sl@)Id%~TCe_Cp`#^E;6?AW=9qC|z81M{mQP0O`-YOKsc zeca}hNI}h4BO7IfjaVwLW!q+0&|qPftR=>F?jJ2>#sE0~0MM#j$j!8TwEBa37le_;FC(p3 z`%dhr8$qmRW=8piJxMF_RS=n@9m2-hdRVSjRyh0Bj^2>C*dw5sWb+`QEyes#h5Xy6vj zQjLb0X)c#sdo8S}{r;qTq9yhMFSAkaP;e_^J=I66&o~w;ZVZ z+iAqHY|!qC<}C@`U4}TPG^l=TR(|rWkG+~ik*2AHaj*`{v+w)2rxn1HGX zrya$1r`;7%rr8iKG^|%7{Ium_>y%zJiY6&lO)1kFZ+a0Jk*tM^CEO~6o=rHI`Vw@P?* zUz)1nzW4CcP~@nnE1JfF+!y(_)Ndn77j07vP%@8}g<`#ES_=Hdg_ArrBS=uGh}1oD zPu(2SZr&Bt6kmp;&WNqr&dv<)v0(!V1z52$y3!SC5vH%p0+uDyn?HA>yBw zPnky^wJw|L5|xV^*T3Cg?^M4i3n3pZQp|`ydCJnRHz;$36|7>3aV9QE`6`Pvs&@|6 zF$jgczSP`<^HyyVgiC_GSLUnBakMY@s)MSYO+9uM3*1t08@E#8&NG%?YRS2dL{x4o zIaK$k(ONdirx*@0M$1baJ3w8_OlyDv5w6|!ktC8x%B#t#z$^yl#wm`Zk!mSh=G|6= z`$yi*WM`f#NK?z1pFCB>hKtQJFj3l~Nj$NPQwDO_sDT9T%|242?(9yI0k~mli85{F zFv6e$HRXiWA9X3V?+cT(?NTfAyL|zyZps1Sjkw<1+^hh%6@8hofu|TT-7CPzG^_5n?H7lgC>$h@|8l= zdysToR3~sDBCU& zIv@ZFd~$>zG6Ph}a#$})a%FI7u|%{2y8P%VgaQ7n3a-9kU#_zkHf~5x`j&V@pR9Sz`MJn4WCv@eA>eWe^w(SRsQ0=z_bgdAXbUGni zr#|$>a>oEwbz%aRpD(;zS}(IIu2mGb`?V6u8*<16P%<{`8k5W)!#yc? zwi`68B zXsSqGn9_?IL{FVJccvr1-t9xNJg-VnMDvbY8$PU=s79Yg3VNA_)yTmzrj=qB8)^u&+f--DR)WmHF8Ysm z?|1g8j3O#*h8;e`4Z1Iyi1Zs7BHto~sdolpw}q<~~nC`>Ute_n6T3E?Tl#BZpO+kf^tpi2V#9LKXtwk>jjMQT*^ED)g37M^; zS&+Nq7@;&PHF81*&1gvDYUF&hqEzz!UMo4%Onk<9(Ddvod19+JgQqFsM%vdy+?8GJX_yuKK*A30D-YTaM&Q~b_7Ye>NYosrL<4_PqEDyRGg zoBsd^&5=e@02Q!h8@4IMJ#+j=<*W8_>}l;0i~j%!&5Fg6iN#kw8Pop&)&Mx|T`xhm zITY9VLYkKaYa%(0b^J4@6Og0wrniOkx8cxd{o3Cw0pqnQ?BjQO&Qwh$CXR7@DWL8)Tbqym=zQ=e|Ct|T?fq0WBw4W zE!!Xg{OPjzGfr`g4lAX}U$|-6C6^}^P@uXJ=OdDT2wO6$t~S$8f-GbKrcRwJvLr^? z#XVhEXSHb>3#j8z;(y@^)7DRr0iV51J_xb<=NM}39#v-Ik|IY9-mB`-6O%Zf_(HVu z6|gw%N&f%{MUf+%FK%nMm=L)<9@PwG!iDTA9Ri~^axdU(84&UU{{VD<4O54~7MUb; z_pb4|8649A*uUNek7W?&vBFQ_TV&c}T;uOhJOvXKbxo$b=vaZ)tgNK3Jq1_Q(Ok^) z*6<~njfwmIf~rU0J9!m%4wdNpS%>>H;OYk2nA45*Bib{~zu{fPWII3oRHwjk`CAGG zWba;!=j>ghkwRQb!>`L#8Zo)2J3Pz&5EVm$I@FPTI1d|4=Lg*X07~@5o>$s`xl@U7 z8Az#Eb@qkM&m@0`Xo|S`zux}!FZ?U0O0ix~Ge$!>M6%7;N0%dZ3%(<-z0=f!o@>!Q>JZ7^b|A7PI=e z{ic>YEB+8Gh}FEZLjM4@Q73?Ill|RR=wS_{4l}(8jey4RAI=hzOFRS36sJTBAl*PtN#GP4|Gd5(hYn5)Nj0j ze+p59BYcD9_M#YYa&|s@Uj<&q*yfSEEpr@9?egtzzP0p0P)=DvTBz{E?Sh{#(wDFl zW_S(1hA$jougy$f30^xk<=WrvSG~h)8apsfDWV9_=N~uwwJwlI@YsAIeHwu4xHU%p z624!XZ(8?eNe^$9n5dh-c(g*1S{@Ld5xo*_exA!#zu^+SRti^bd%6LRV^&|KI|@Sl zfmMF(ONEP!&jXXfm#T&K;IHu2bK$K>BQh^a`U*9SGZ#Q=5|F6*kbl5wDD))osQfd3 z8n?@m-|W<1@Qq!$*hU=te|Ej`23HEJwZGY^mKft*?5e~4+PTv~(E07WFR8~OuTk`) z{t?Y#m7iw|Uqvi&NO$ZXl`>B&8(1hGO4He{IPL+g}*BL zG{XiI1RPXeMY>CujcK|hxt~3MWZ$7-<+f@#^i4sTn+Fy2RCd;+v2NJQJADhZ9HigY`$Pa&tqRk{{Uy%ZYs&SDbZuU4?^JPkUrCLK z@|XL^-k-3Lb00UPcPQM%aA}JT(mNN3s*3tg{t^8$J9;ix4#joQ@K*azo3MdMZSD&*6*#Yb ze+_Bn06;Rm=!3(SG5oS3oYr!}$j!{~5eus{iAW=uFU+RB^!Q@LzUYS4sawL<6Aicm zoM^D;K5j!Qmh%QF%C2Q%r)_-?KY_I6jYdX(l?m`|jC);J1~k2djUwMuz@yBM@}88! z%*STh_r&mao{|>YHlDv#9ZP|S;}ohh_r7MYZf^$KHq4Gk zdKbY~tuqt>NB3zsu(~`xcaeVR`9)V#D?0xG3X1o3@SUJc9B1iOM}#d22vlLI#*~8k z9xU#_=e;9M(Mis0-7dTlW~!nj$USP9@EyNZBaYNYEH7kumzYbcZKzgFhkt7J@!+T! zHbAG%;F}^81{)8xOd`QE#9Cn?%sHne(!{uLm5qBJ{2;dRjj<8MR+qt%gN>V*Qk5sr zE_ndElO<352B8-&h^%?9VgCSxMkWE3bGEBDf}@?X6b-dptam(|UXi%U*;7t}=t_qj z1$vn9A~(pR^QjxaF^3xl&7jMJg;RnqXFpXp6Oqz*{qR^f;s zF40gm#M3rP^sc?UBPLm+>s6xgecBzs<-HrFRiqJUO>yO#!Y zYkTwIzwzpGT_;-GPYFy{6RT&pr7XS@m1D;3zMOTY<6<3-cu$tx2jfkWd~$mF*Fg`3 z?>2IIsK4PDx)Hom4C1CR&_)v7WMe!fM7P>zP4m;` zLFrn_;j6RBI3u+qcz*GDjz5~FQ74fYM(bg~&%H(Vwd`jz8V0 zbe}DXE4;;3eX2LOV1QMzqh7NJSqLNfRB~unBc68EMQBtCCgD`>`=`Ak-7m~!P1S7Z zmv0{Y{%ed=;?OS$M%zoYfZEp;}P=PYcEbS zNgsx<$i{F_^Qv%m3+QLH)MT(ydc%5l#EW zWw=Dos?wW)Q+5SPnmyX*&HKmFh0<=rZ7YTBYQ3C^(5WQfyV9^-kW0OSgY5er$VFgk&c9S^v=Y z!rA<4)L3turBsOrR^(Km;cy#@{4xz6p}LHid5Sj!OEF-?WK~rRtO5QicoG5aMYRhOZvlo6BChV-yqc&K5syllM=Or>#MyCnG7Y?9 zq+gSis6brf6sW&21FF)JB|fE;c8u}PY2lrIUbPlPYk}6E7f{W`O~Dodup4_*u*}CF z!%@k*>IFPVsMrFC?p4PJai5ntsiWi_{8cdAp4qDi4+T#&Jp|W6bW*#!3YAGtJ5+m4 zeshWeAYdE{K#5fU0C>{JA>my7w504|{n`}#{Qm$IF&7CPb4wo}lfe~G$FcU0nQGFg zkEh-=0V}XSIPFr~K2+r3aaBL>q`?ZnyKVHT6_^}##RKGGam5H!jJI0n8rMMx$=-U? z)p9aAnnhFTx`51$&)uhBBP+16J?UWva&kUee2Uw%+M56<#Ez7kD*6_3IHVhk@IG2! zymBcr!<=Ij;!6;WJ~Pb?ou9llBJ;SO)lKAfd}AVu4l?LjD5aJ_e(ebPf18Sh$iky= z4Nv7T3Qu}0H)3It&NvjYmSK@lv1Q|^rAG<=%@IXJw-jI&1n_A#ZDlIhq=iBGk9w7c z4o_-K%_}jHw$qbHqXCXGDGK1I6!{p!akp@-At13958XdDHh;YX%#GQmB}AUsI7;|`Bt8pEuTur zMVOVj%|^!sz@+CEwc+;AT* z<|7|kh;9iHXA8Icv?wmap0wc-N4vP8fyQI1p5U0^S~0Y+!K7B%N&;hZD^zTt^rX=0 zY&jFBzLMsS}>a80|5{pF~z95HT{cGOMSo+G<= z_j}V$GBZ)DY)@)-NKU;eG%j_}UCiI^(?Hw+>56JIbTr~N{KtyY5gbM`kl#6_K){S0 zv`C^t8yi}Xrp`u179UZ`obudKvHQ3OZAA*5rbb=`NV}NlJX4b*S~6$Ga6VdRL7(BM z!3_Ier2Daqaa9f2M_~r+Q=L?tRdtP*2CN1f`5R4AOeEFFQFb!-rzi{BmG>$8w1Wt| zn#rNdMmr6I=~AdG)aI+~ldkS6!Z7>Y7OEtn7D2VJwHZ zRZE=qr>6acw`zCGvz6P5wID;Wo?4N6?deD&Du3CaVn4n2Xt?Yq!bVBO0U1?E`?TJR z^7Lw$5ZO+`lw?ha9UJc<`9(Y^VV3)%qXp1obv(1GvX#w4mBQqTpp1b@9^dh%A!Et; zR8-3vpPLvprOIRq$Ob8P;PKL;1;e&QTEWIZsuCh#bN6X5c9rRxSa$)eTJvYCVz!#%EO;pRU3xx;+cY{(u$8#Q@b1( z0iLxQ^!n2R<2mh5AOXPOQ3)B!BR+lKFCwKXRsMQpc_VP9GdsV{o-0VZl>)#68&5c< zgiK)5RfaaGX@|%CJMuY1np+v(lO6{MaWx^rE!{hc66q(xvF9 zZxqO*D%-kJw=!V#rzu<{?jo);p7f`M`MOl6Bw$nuS=VkVTPB=Gs2I&RCYnZDZ{6Eb zxfxY7TG1)32jP`6Iiw+(vedvBjyhAz6csQgVh@z&r7k*ms2I2zQI(`jb$X`Bj7K0O z$4W@JW7#ka7s^SI)`yW5!b~e+oWs53M(% zZ9Ixq^4V0aQk0l-lN{%-6v8;hC{;UiN-(dA1mkfrwBS@yHqg6|G_2Smk7^jJa#xzA z%M#kuYi%Pc+5V;%^RrB*Mdi&CXNhyvhXRtVu?`1hX zMIe3Lj+8II%qgge`%#^#gT`sVhT{}QE1{IGDBFxU=};>ue7D`J1&7KIaC+1m z0OFbyE;zFtp!A@IA4+K$iAO_CR{1`($I3X6IW*N_x8*$0H=z5p#Zq}IiVIwXh}jsY z?&lPtFx#=fq+Ui!^GV;K9)ouux_SzCA--;u*$bpR*w7`s=Y-yP&P6AG}0ZBDQ_z|sJ`n{NNwEw)UF9R z?Lb)*76CFj6o}-E^r+V(f!>ixeld(vu#^z&@w%I}WeQ({4n-m4{J(ac4#3AfDUQpa z<{)&WM#nysI9#(DgSQotC6kXefZ$S<+JTei6tp7n zVi*1DuCMavH2vy>C!E%Vq=&1O`~4|Q`;O9jQVg>EwH#`saZ==wak4CKNf(9b){rnn z&MFPPangVoC^+JtjC_fX4tttHdD;gR7e9WUtVr}~%5?5UoJpad3P#$Aw=?sFqBSS) z{pw_BTLMlNl{k&;SWZ`KcBFE|B`v~=W?9DCXk0j^JO2RBI;Rmw$g;pjFr3p{ zCN&0CuGf@+xlPslgQqA-KTF6q0#tRk~FB$>F%gK*I%# z3@s6YK;~9)CgHRAYGETB0zUO9KPv3&Kt}Tzvr}jzA`_UKb9bak-*4{$BCI@W!0xC8 zy5Vt}aYmOUg^RXWaaWc^Qn;$f84loTXF$XNF-I>#AUTT3fa4VcuFiW3kyiw6rB9R; zZfPqaI0!^;2ekkMUJgYIu&Cp$E2jli(?y{cJgYmm$yLN5h8mt&s9)~Ul6Vxx0lcA( znWfwS-`1m5UX4fxmOfFq-~s^9MdhyD>oiEN2rSjvG+E4o%FaZ;=N-RY|N$>~Cfn8^NCVEt)r zP{P^Y{_QZZR?kvuTy0)OLt2_ZT<BVO(yYyyYCu>h5#Ua+CUW)Z~3uF#RMNhL(;0dBOZ9GOUNzM zR7k2MX2)8X!XeJak&oTy{{Yufgp&mvZrx8(cQN#*$jraIJmQaLiuQGIU+DcQ;EOfR`Alu;6u%DGs}Q=?}4rlXVsyN3pmpLWIvZYxN|5?GmjT#hQFQcb^Z z+L2pvuRkIPCVk7pmlOV}bglOl-( ze=B^oIaG;2LGv1?=RBWya4G&{D9`ZIbP7y~)dOzX(vcizbe$TPEKV_zL50C291hh} zq-S{%5Mww*8%;G(1l&-3)hdz6mX=aUQT#PN$rX7NStCaCHg&1h6t3b2H3P_3;Zt^d3seT;zsJZTDKa$TRm2o zs_dB~IH4d~q9~wP)mLpYMTx#bxT(>Z7t~W^RS3q2#H6fJiZzY)fmT}DBmTKJ3Tk|# zrgu^R3HiI#LYS^JECc;oXB6oha(Q^j1Eoekb{G+wH}@l&J&F*>(l03QjBh^Fz>sai zB9bY`emc}aatS{v{`DTn31o^17aIl$^s0?&fqbDITtOUh44#z(Fjj0fGgs_@r-h7c z5%ct=2^5N|V^S&Mf&oo*kS-A6%^uEO1vw%aEFju(9x9Ss#RKCXPAf}$2)4Hvs=<+? z5eZli?vs)aTv^A#E> znoqmJ)RNj*l^$Y(7Lk+|4nGPWvGIapbo(U6^AaW9wAnK5ul0+oCSqaZbc&p>~dYQaj}ac_Xbe zJIEws6&70}Q`D}}N57RHl`vYOD>lKOdb7EA4mhEmmv?nMRVd$K^Xh;9(f6g4M&OP> zsiJMo(}Pu0ZaEk=JPgHmZQI+L{5#!0K_^gGA^Hjtx-#?>q(_XCoKnWw`Fduro;wcY z-fsP^(w?%7_{U0*W!?Vsq-lc zmG4ob?ij`~OCdPsqAW?0m-%vgRIw;=xUs5nZq5j+eo%=6;{}dCDr1Qt3JyV~SxUZh z#YTX;@_N(q#AFYq`?7-1AZAX~Fra;26&w)H0eZpOk^Nq6B9HwI=4p zD((X`MOcX>SlY2D=ZchLcoCnyRhI-{@G3?e zt1c>doTz3erAFMh%ThvxjvMaQG7}YKIl<^^P|Szt9cd+2{1%+p$o?!)tPfG~7cKMD z#hJcy(yFP#oKxc^3Wgk3nuUoYVn)I8im=2fz^Y@0!02jlHk?v%xLAD(N}f7XSMO}6 z@=3tyRH0xHgV(61#(Bx6s2~hdat>)mAdxaDC(P|j-xV4-z}eocF$d-CN~Yw-HW(Wq zDD6l$MtP?sLmQr#C?Ad3tBW;?B!mQ)FY^OZ$O@gsa4Mn}^D~Yrc5>hY$Q7KFSgm2{ zxq5M$K^Z`DX@_xakKw0+c_y=*Nw|e_52YA53rM{6=}J@%GewEHB4s{NPfwLe$6AY$ zFi%Q$Kvl;zDGk_sZUD_JgC8*dDvufYO+06(T6PPS*lqy*-L)#a5Cea}YC_)JW};xj z9m4jd61ho8+yQR%EO;spD^g$rxfLclW4Br^J0UmW_&Ci-Nf^si1yr7T)7Pd&QJux# zu;&ys%brCj2fZMNX(p-$k+)H)$KM!Qw9T9lIH*q719ufJ3hUtxQI(0+&Rr_0%Vv1%2_(oQ*=0!?+R!KCwB&((lBkTF-kt@ z;K@$s3PmB$SNpW3pJIXcMF|^4&)%ZKv~`B*X#X!9oyd*K3t|nUTV-VmR@nhPp&|y&x+X`FvaOi^f!^u6`k^O4Y*#Q?*o3369KRZ<+_wU z6M;s<*YIgR+a7~D|<+F#akN{`*-Y^A*%5F zs(1O-wz;(t!)dYP1KKPsU@sy|KUSkRFQ&@9M&`;sgMnec^V0WTOzcd0cbyzKaet(- z{+{N{`~Su-PJZ>=4pYTL--lSNEfzDrn0WaJ%AgloH%5_R#a;EC;k+5CgvZmr4}DlQ>MD8-c!P1i(jU&=d0SG4F5l$9U|dz&>LBi z2|j@|moul=9^s1aNQ5r(3hLM3LoGYg*qG5Ir%M_JJVSxc7Qf2Riz5C@?SY|UKHP!C zJ`({(<)gf_SML`7t30N9jXLfL_HpwXlc5_4#km_@Bb-0fLmH(TbQV(D7r;0>Y-M+a z2>Ny)#mh%zslKC{CXbS~%eJFEMWU+0@jX(mK7~EX!f#I{JW0de#+W+(pjvjvb}o?`l+RZ znTJ0G(m+)&!iFvFe_(L%ee97qgR5!zSBP8lSHBLl2Zhs^7x~FzJI{wyjoPaIZhu+{ zIG*L*cHpS_;rFCYOBnhOrTvbL|0Y>R_OGo*kuR@J$6O_?r)XCnF!;vVuRh*dS%jC1~HjKYjUA^p$F?op@xG1ve#!cQ=)oz3e40%#eYHK zL*mWy4CTfSoQ=|s^7DY)FCVX@`4&N?^ol>5=J}`xVX3Bbuxa=F>|PEPoBBxa&cClz zID`eqI=@V-O3D3sX<^)^EJ=Qst=5o{Hpdm=N9H`bm7&=qv=u_8#Aav2 zn&G~k;ynz)CyOELv5<5K#9@)=6yr&h!tGP$X->3Sf|Kk$RInwYu1kcuih~_O?ey6;)5B0J+pgvX3v&(FJxY;(Ca~QTZ$?b~rl`AbH^G4^L&VgQ zo##Zsp=fJDev|*6%r2=Z8s3TY$kC&#mnQLe(D7K6Sb^MTw47TrV2*VzLti`3oixl2 zIq|Q1oT*y|PqwP-E54;|#lv?Z<}%gyiAsqHJf{`W?rw9V`crSsd&0(cI>n#= zQ;i*oSsxTn<>ihcw(Tfw06%ku&(Fyzf1VR^-5e|K*gS_6p>stz0$5ct#tItUY**z} z_3f?eI|b^qjrFEz#0#aJthZRH!O{kqy$^5D86o8-$A34dXq2Km(XZAmA%#l4J@TSV zK{;lF%lP!}mxaqx>F75K_ZB6Hz=3x|F24R35|V_mvjL;#EuR1UK32?}#}q z*stn+p`>{a<`3L~xar?x+SMkq+dKo0&8~?v{^#CIyLW0zilUo$27zlM*tSmdFx{g- zc%yy2p78?@pSf`Y2$xtnt%%h7B}?=2*dI3CsR`VJmsPNWnVAnoVoa{dnMyqBf1j(s zPU|#ylODQmblAI7&PoEf?P_gt{zdqCiEleshRQNd%~sN3jstk@%HAhWA1`|nnpct$ zvGr$?sA9)uCys9*=Kn0L5_abmFIOUu7gZs#rE8D_45;Kv?{Ho3VafpzR|0d$XUAFn zhNq^&rYv%#6l^?gpscg_`+BlC6Ixk(lDTWF4*NBYUjFMN9a4MtuwWMbrco zd_6bB034HdCc%E?#{idt~XN@!u&xA2WN&9qKK`_YcZTLV!&<2 zk9I^OveeO0I;O zRb{72FHdk%8KcZ1(K+lOjEaX2#~4f6{9!o#>(+d8?N?R%(gobf3Sf@!9kG}HmeHWm z9dVAtpI!Fr30abu)8F|OipAw`hUYM*DNYEj>nk2iwN-cJytq)tu~-YC_=!|xi-oEV z*Q<6rjvS+y;j7SzYW6RY4rbNrVEby4zK%Z9^4Yniq-;MK!34*^`^4UE^8^MpJG|@~ zE7+DGz?1QSQ#kR><+QJ>@)uP`%;i*%$2*Af+}(Z${Kftqu*67^!!<^#pWbM>LDIHr3YS}xc(+8EVy(}QNQ&e z=G_;hx!&7)g?g5#>IluQZ&vNgZqv5JbuB-&ui8yMq3`b&FKC@4e@EyjDBPRd;$=ZT z=~FRN{DlDDgB#hAEk7nIZiM-rAG7cS7xR-H%X2NG?GQY|x6saG4NjjuUCQs%561tj zd{+q@N_>^qX_XR?+gS3xToIwH!!>g2wJeOxoaI2ae(~7q(p+6O-G_&%kU{D9y&xZ& zuNIM*3;O(aVp-MwkG~xi8Cb!%nfOVpj_Rb@$S!h@RYcE!Gp?D{!{i%K|afms`50rvX85h#={a@f)iiWGY59L?Wu8l4`8lh0Si z#BB~22ONaym`$2_+;AUMqn>Yj_)!!{X5(*xE)rBBlo)cx({o)yltLjyJ(0}`9;-KJ6QAAPNtB=%B51AbibH=3n zrFT=U3wAoE2qmorv$FY30@#8%jt%6+2bZ(No`;m)@Q4l!v&3aZExu+I_FBNRo2$}_ zQ=m2B68eL$f&-YTXb|Hb{ZmQlBV5_TZ=Hc#eCbryp{R?ho-TbQr*9Wpb-8JamUp{p z(l^f!F0LgcQW0XgYrs4YH)%_CIm}rDcfDc@$wJ=8pMlTbt>S0KC_9(hUXNk^IoN&W zKoAI*<8xbS2d~Fzxg$$8>GBf2;A-T71CqI*N?94PCh_8QV8KLglTq#qLaNTm+-KGy zxmLd3?^9_5pI9XYujptc_lv52x-Wm}1C{`1C=VG`_ykXr`{~TjVgshm8LxA;5?jQgXx>@`6Oa=9$>ZYw`^MrB#Ienc z#T=}#*6B_9gqt}k@<`cH+d1=-f4x)f3pe_N5is%lCI~dGd)+l%x`Hz3_4DMf0?wFq zxW>z&f5J8P0yVq zt2m)J*Kjm^x!eDSw|%Zw(cZJv5H`-q>%?74ES6Wb@OXl@nr%4|W(>kBiH`I)GgF0fd=*h=q+)3K8?c zRupS&|9+Vj6MQVTADutkOtm0&;`RdbQW?_RGIe+ zNwsPR`Cgk^kNfTxAOBQ$pIm8aAOknJZ;v<&smTX{y=b9%u#A|`a}{3tdBAR4oS>*A z6H0ojRzk73pp`%#{)}tC7ASNu zIraHL8P^MX1X+RVk`7Jr+u`StYjVvQ+9QVqK_7I?bv?i)^0)6#m8SmsSq?Lt|1%MB zq&%W4^g=6pl;JPxGV|3y)F`kv*qu73O=UdOD;*ixg#kzG9NxZa6V=q6f|9SovCO1h5Q!B+^nJ&dAA zRvs+#S6S)-&X`K3Zk6V8T^VbUr*OwDIb+99f){?1Uj`xGKRl7VFrfhxU@t{-#=HRof5%Kwwm|Qz<_f{_ zHrM|nWIceydiYK8hsZ&>#%So)W5u0xcv>emw((j(dJqp#riiu^bZL+0MU&MF|J^o> zvdyR}6vxDiSAN!2%kZ?zJfX?X8!l&dz;#Xh3Dz7bg9I23Lzdp@(NgRL? z@2?-s);=J_x8VM9m=@YdPww%O9yp*6{gz5Dn;89|{9hxirv4zdkgWM?$EcZ#ObecisPt*PyefQl1sKSTT}oszr&BU!(hdng$SGC;dY*Zx9b2 zs>}r$dN}v&86qWJxp#!N!@v?HSpzhS4OOx)3@tJa#B^i6GXr+mgChVC{hx(LJUidx+> zzh;J08j3j);A3HT8xG_)pX_?_qaGf|U)m1+*J)%rdh)Bn#-9a#_ufY1DE;WOvmAb$ zl1^cm$a&iW@?MM+wBCg8)hKEte9o0?m2_3ktNfTiYD|@W&}dv!5_Ul6NT-v@ZpIGf zUDVEPudV79slHA3^1SRfn;WAvLxY~*_qm5`NXCTsXA_y!Cl6vw5Y-rG`h&xaeOhrU zwGDYOZ=cl@9A>l@@wd6a)YEsHc!%+ZodMZi0R1Rr@!XHSdW${w<2P2k z_obx~?`Ik0i7R~3NGN*TfnIjX=vG4oxW%Zz%EXV+7_{~YSGU`T+^8IL^;1Zykr&+< zG4oUD@cJF?+;AY1oT%t9r-Z1g3sfp)Z*leY3pV~EYDvp0_nU+N2Y~II^D`_R(GRis zob;ti2e_Ub(_&Klh7*~xLi|7Fh~j1 z-!f5Txqm7l!FykT%bY~02n}0$7Qe?kXlnq`VH@@Pe$D9V3jt99+77nEiPNU;`ImLf zRpF}}vV>_XQB#-AFc@Q_~=ainRXY)&C{N0wT%g>mu7w-JvBNLhU zfUuxHBNLgb80wUnbz+9!4lXpsV>0s>_jC(R$o$WHA7afkS2Wh*=0WH2U}u`NnK{!G zU2AOKQ&vnao0C~u(0IuuW;$N!zT^HZh-%E%wt%n}sFEx$szf9(#uQhu_p^@FXEJ|P z91Ar$TW$?c(>!|DdsbZ;+pem_loPz>nwdml;y4C zAZ{K&&mOfpcTC4(Xz^T{hp*1s@aD(+C*RD|xdu}*ezBLRiIIC}wyPlSYSljQMSiY@ zg7a?I-5xldE0MX3P1js%KtJ?7p!~{K!9CZ?PR=;x?#?V*>T?>&uG7d(&@D#k8;>ed zJZmB!5cg5}XYH{7`KfAq@Au`fbuVv@Wk_jGf0v=1FE66V4So^2W%mcEq`phqaC08c z&u+io?#H4YmM@-VkL&ARtORM^>aDg^35}Ef#oly8&g8u%VJu}C^s(s;?{8aTU!dRP zsTe|~O2}?{15(_}pLQ(wLa=mDhhC+A9WM-lh62+>fqRzl>U*fNSyX*o)y<4$_OSSg zN7Pc6lHQKc!)X#*d;_$IxoyQI?o)>QY=RYG{BvSBVILjDRr8uPMob+!<>^robG1Te zqep@>rtiEl0^?xN{O=X$%AuLgL$RChx=2Q8Pl5^}hIT4=u718@*@t(HS8uIb3B1c4^WtdGORk$ zsnOPC9`j9m7bVno(*zTEPE`(ok~dSH`TCkCF;%Pps*l7 zj=@AzMHCt;*&}6rsnRYUK5}_i@YQ|(S6N~oZ6@3t_Iv8j2yQCc3fl3H(RQ|3;6WNj ztgTXuq#0u{LF+VQ#!&Y4fic$JEzBI$`@9(U?%C8bxrzqy#gL~z+PS{^5+hK#7Q9}8 zZp<#277^GN9b~=54_gzqVqWAQy=w!wm9RfEchtdxQ^H4p8o>DPf9uDTq0AAuooHFR z{<<2>TAn3!>M>ZG-;Aw+gYrEZo;R+qLdXd)LyvSNCjoPdEg<@JTIL+N5 zM^k*TzT1KVy3{w=L@SyPd~tEMV(|N~`=<3lBu5jC;%GT!Vg-jXFHZA>fmogqXKiDS zk!}QrjYUtMP(s*sDh$zvToXf?jOe%O2_&@rn4Z^kt3W71Br}9C(h#8{sNX!xapKOc z+5^(967XA8Ye->}m3rY`$k4O_Zf@xyDW%gmTgZ_#M!+G3Yn4&ekMF%kK6#9W%3gw| zT~W6lxxDV-x9#?FFMPXd10+>+2c|2si3PW)2`)lURknykZ%_4*cj|;)p&4A=6$b#M z^y?QVEklz{_u?J#L8kqN;LnXY@;HmTEy>H+q=5KHF;3yb1F#tBeoTk@m?6ATydnh6 zJLfL_K?`G`21sz-Nmehc%pNy8@GZAQ)}ad^Ag|h?tFABEReQ+J-oM~*`#L4KX^v|Q zurF-VYUZc5H2*<%AKStFf|jSuwPO0yx@U{rRI9M}&bEo8yAa)O80fut?|}%-h{%1M z!k@bT13X96IIMQ+YtF}2R)p-pnt{oPxd_0VnOGB$38sYJtu{fh#>PERkz3GjV*juR zlb3ZE7f5;Jya6kzj#aEsp5gJMe@|vx)L2|yt%VI8V=*&gpH$z%u=xMd#tbu!Sx~?N z5)`~M2P4Uu4hNQYzrI{;GfNy1%-h-b1X=u5xqJ5&VwE7Nqbw*~o!_ciLp|KPIl*DP zJmt>Y|5ssX_@R=c@CUK3=;!{UchZJNqr7Gi(Z_(exAkjg*{)wf&=#lU56hk)HBV&f z+ciYPqNj!3t+-W>mDeP)Nn?MvK*=&JXVicAOZJ^}z-9bl+$!&ZtjQb;%m&1Z=jjY~ zmqG5clB4>~9)6AQ{$lO($>G42P~bWd{`g~jr@qc7*14#zE5sqGDuPUxJ9n@*ezu@U zdDZj(_Z!N?H1&sm)Y*ILHoth7ba8o|1_M$a2jO!2n|y2B`Kp!}`v#pTSm2M38IkZ% za~*i{&weu|2OSWBo@=C%nBtP+F}c-N(?g8wb>T~_VgvZFmG=#(r2L1#QbCsd7^XZc%a)bbIu?iFF{raG#C70AIDoO!@Z1ZMDvYgYZ5?PmXh|I3Vv zj^}CQxeJFm;{$F~f`359h4Pu>c&Ma5`~F|(HwiBx zS|i&G)n+H?D<99ANgxNwRkupos60x~oiSLdwOyN&>-52N1h@E9hJ~hDlaH6=Jrkc9 zJ4^2#bR@a=HCJ5+Wv%+&@VFB*Z|?BsY1l|bh^j^cH)zj=LFlu?6AIVIE{kWE#~H79 zeJrIlLc3td{U!HI;Mnt(oWggy3=@RKUSm0Mv$8GtkWZ&-d;7YF<{aw|-(ysQy=so~ zkXqY3p@wp=f4r3E6+QX5ekKh3+6zSvlzJ?gJcy(3M#pZFQBNg_b8=X2^f5YD8DyjD z>p;`^L6q{H`HrY6-}zleJgQ3H9UVEy{dL2~Nn|R=wXGRYtLQrpN{2V#Sl3e0 zPZiW1o6==(P-{tcihAsoDL6*zMPS;n*{@ins(Lm<~a**LKgyV7()73 zKDNd)BeAWh?D~|q72Q)sSlFJ}Ph6dQ_gdw^a@)ir(28I<67AReL_zX^ytB z)Qa`H(07Hn+CKQP(`9E+f8oJ9#bFJmT1P9m53>8iBfC*t9``VAZCpy>$}nT-aE;-g z*-uxXALgY?fUI-k_+mGx(pksmmxb)y8AoW7@`cZp#L4l;-Q{ko$0^ZDP3u0<^NMbl z&P0-5Tn;WtS~X92w&to%EtplJPQOtl_nX2fW!xC#S@gVL9~ z1%ybXAJ>8sT@t$K9o>A|CKFG^s9o2G<}HPrz0cbeQN()NBh2AzJHlbs8}&53yqn3j zIdYo5`bHvs2AHdGd#mbg1sm07)|rT!K>xj@s?^?A-g(^vdDsSgE|eKryD1keT_=?O1LN%5I$WLSBm|NL1^@gJDWnJ41y$NZG7Y(r}M zCQkslelQTMpLh~uc>&E2(hdgUC?END2-DW4)%Ps;an(9IDMa~c(XJET9!TWtABw*} z_wqj4fX+c=i+02qCdbQ{g`WQ<$oD-w8|B@$Q>}xLMlTjSTkXU{Gq6DIn!=y*Ep2Gf zR@H_dEy@+4g`rwr3Vq6zaQ~|JQK^Mg(&m|bm1-L!W(&ThZ%cS5=TG!9Zmm|_qog~N z)5T_1ez#JB@{^~QuEUp#pA1qVBx~gma1% zBxuXT1=R)kXyk9SaF2VfjB;xxok3mGXL;x1TTyra(OF~B9M6k&MRzn{2FRQ3{5l&` z!i@FWh2HCH=vwS%=CsGz)30(UxV3dA*(LoTcIJJfQ_*eV|3*iG zUdTiN5Ofc>i;{D>oJ$xTSi&vU;IPq_A;|& zF8TsA-^G%a)=89}dKL!ARFm{L^U?m)n6!fu`M=RBuEub>OP+Q&Ic@ys1H|S&&fRK> zEV{`Qqb{2bWZAh#B&ab0?k*btEeh=FAKh)G;@M&?W%p0yEL@*NI(|XA_7H4TvOs$p zxppy3Xxz&2y4weUfGwzwNsrLcJ>?$PSPDc(LtV53{e-6qb#&BY2bEOR#?dn))8HUZ zQDWI_ZAjaB#+6lp!YI#Ia6jLYE(nzcHF#!7`!_c|>N6k=#N02_s@w?`B_LVX>qMkx z&ZY`2euCoLsz&$!zq7R0ea`HsY+>7r%F9>qBC-Fl4H)eohYlhWk=hi&0&CGF zj58Y0uG6ArOTcjO6_LV;zfT~A+yx^>*<#L z+Z3T4pdVX)GrNb9gui_x=f24BgSvkQ&DIByprCChEA>H-ZSbAL1CP0nLNX?>jQs2 zp=a-C#KF&2UVrjTdVr#)s{6OFCbM|JFAev>S5=fP#Hl29RU};@9Xl!3?WSP?q0Gr` z-x5#Dj3iVwSuHhqX3^d%h^8b&lQDE&^1C?>V%+A5aDn#>X{!D|fT$dlpRuD{??8)} z=Bw(rO1OCs9L>3>Fx_IV@@;ur05FJo&`EZZyJa9Q8^@Qn_wlXtevwO=DYTI{C%8I4 zu3mt+^)s%ZjoM~L==<#pOP!t_&Af{Vcqg9fu1V&?V<$@Y85}h_l+%5A!4rPnDnqq# z9mF+c-%G%PSF3h~ep5#?tLLW@>TYx=WfOaDi=sYjV)YN9ShtO8Eb{UV&G!pIL;lIc z*F{Bc8u1Mna7}g>(lM7_@Vwd%BsX4X_{hk+x4-4y9dql;%x~64=A%yy{w|ngYSUWa zBPk#6#*vQIM>=0TO0PJ+AN|8S%KIb)tlH}OlUL`l)T*g_$-J_tyH5M(R4XVT{$SN1 zK|S(w0Q-#NwjXrOCqr(-WVH;TDYZ(F>vIlW8|_YiviY97tKFi)e|yLcM_JN`E=Yz= zdij#iiu1sWBz_F^^W|l{lmBBNBM4OW1<~uo-s&f7?@gXPenY+Rp9yY6w@@RYLiuQh z61Fh%;bEH`#I&1s!D4Wy?X$KfC~G_FB&x|9+Xt|MLD9M**;;na$V<_P>QWOIT2~hJ z(fMK}F?Qtqu}LNODF&Warf9(_{8Nqr#vt&jcq;Wt4)t=F|9s#oY2Yj7M%v>jPN8<@ zoy9MR^@e+zW4B7At7A?)L)z{aqn`S(N+{sqsZn}L=0OJ@uX;s%u+m`!=?Da}Y=D*E z;yZ%M%oCAs?e&wYr4*vLH3acS-1^;H+VhBr*SjB9NMRbS!)3$+c@rFdwAGAC)0Z2` zj579rBgJmF3LYhpCt<_{vRwX5PLa$eNV6H%R_UXY<~3O#1a_Ui7ZB|z0XC5~)6P$d zDjed|7hwWFI*NnnH1k1cVLH*(99WWB8?&~#iGO#pdDUk>BMkKr#FfO*(}pYC^f?9! zDfyBfwWEW%;eFDR7|2=zNv9{|beUkxImiB|WmRh_%mKu3U11QLG}cA{x>05UosK8{ z3G$(-2JOo%Vq7Sb&{8;0e)iu!Z>kw*nsUIFQ6xQpUBOwTbyqij&<(bg$DNa9&T*BO z7_`tvRhox%*D+uYLdNQK4nnLQiFl`vHoNy4`1o3jdkY&JvN4@N>aO=a zl?BH{;cQOvkaSNOM+#vAiZaj#GQ3mbT#`k)w@?;C!|~(1hgn}O zGo$FgYPC~Zq9oBhc1ZK3d}QF-7j&gZcn-?FLK)K$|9iUAM&jj6w4^EBKj$^a9hj1G zyq-)b(G4#*OI9dY!AT`;<6QMMP|MCP9kj0%8s>V_J^e0$b;9qXC2d`l4V8_rX1DIr zw*=tx_6;yi^~=!NKi&7eCGj7XOh>^^u#JfMoEIcNZGJ)XK0s>#yLOb$J0rS&#RsM= z`^iWe6J!7vq3M8VYlcV4NP~7QiD~Q+Xya#3|Gt7nS?Oim9B`3mngdEW7sk2FOHM-do0%So zs$ZN*VV#QsHF)^ER!vQfPEg6!lV7(cRM`GU5b78WKPVJS2C#1FIi|G#gvI_9-74S={>V~-oEPZL^Z|J_vOkW19$Tbd$Ga_Xf~;uEi77E-~oCsFWzfD!3<&9 zlUBU+fZcYe;bK@pvgxscoP?32MZk)?_JZMc$B(8HmGJFKSt}A28k;l94UvS?+-y{V zEHPmKFt_i4r_KpIm$FCwUTtlIBrhGSEhUIQ{1SA+nol{_(#0i^L#6fl17;6O_fows8kWng~OCIIn88PCE|g zIp}fn?FT1Ixa!iNW z%|H-y#B_7-6@nS)w&sx3Cz|6N%Y>gh-l+-AL4d>me2qF`t|@yo-iAOC;}=eP{eD3X zUz`8Q4>MRH>7H#~d(v%Vz1@;0udg`P>R~$*hBJvEXy^RC zA>x{aiRXS9^1{fBC@;L4g*~)nX-X+ai_p&^_`M`Gz0BOfIeg>jn&z}uWoKX1oPGcJWQy>o;BzaDB z2n2qHJxfZKdK=2wFZSVOjR9&D`TibgiEa=nAXneJjSq11#+DTnOx&S=q~SW-D3i;g zCqasp6#vYMOng)Lk2A!&Cn18iB^LfA^pW@-J}%ULY{!-8;XPi20WTJdg>F^7cXCCm zRiGDnZCI1!+gyUfU_fy0GZTcDgEC*i)&Bn4D&zW}xty&<8~b%FM zis4}@3(j+dzZ(+KFc6m{w8LR$T?dPgaF3KcZaIQJwp&VFOZTuCrmE!_dVW7^7gpl^oA|l6hpicN-*=xML7QdDytx@xO!)f}|O zhGAmA@dxo>gfrSanSxVx%73w#UUS4aT&8~XoF-i#X1Ib=(gns*!JBN-SNS_t(``BN zyaUQ}d0r>e=b)p+e1&IumD6+#cWj^Q0iic{|7-4?>AY&6aDlEEj$ zjwi-qC!Ig%TO+ZMY9bI_S1!Z1t0ytnCiu5~U`p6SW>pi%|H~;HlY3U2eum>!q^T8W zB1(?+WZZd;v|`TW)NiJ2{xbJ*mg<>TxeF~wjy7Pr1{2tSH@Kk%O&6<5&rV%~ZSi($ zUg;r}#P)4d$9aXD%D!Ir?*MI{rYw6O0Ob+q4-+vHFCe3%B@B~10&2;u0&w^3vj?m% zRpMHXE#|6d^c+{Uu3%T6Yd&?W5Yk}hx^^Afv=!jI@oc>Lr$Fh1ve_8kD5;_HN&(S# z?}Lmk3e@x#izSo&^nIx&S`z=h!5|8fL}J}K6bFf2A*BsSqJHW3O)tkP_4ewM`@Kz?>YBBYBk4bGa!$>IpPAy>Xf%AI#aLL18(;{Y*oi)Ev1Z}#D75_i} zNM|c}j%VL27qfzL8?XM||KM^B#G2$Df`yMg^VkDDkeOVl>cW_AQs_xgM2}S37=)cd&F36xz@w+J~k#p(k)vqCq z-N&|h1x&GzWre$wAa6oB_XdY`^VObyWmvx%kf}a;VNQ(ZiFth@c}B#|$o2|k2B}0D zH%YMqTy~P%lqma)Qog@Bj5d3(dDt3kq8h8fNO1-ni@QIu&%!`UBmu#zl+^@Te5s1y zMzmdo#tU2Qn~Tfd$|hd%(0O09Fp!)S0MZ#ESP1iFX3J&rdiu@(dVz3E6jS^tBfVZ* zhb)^sYJIokyvy$n12ZmTZv>^_U@)e8hZ-D~_lp&QKIImWt|_ze6YBc%en7r_VO~zr zeq+2@RIEmym0Gp&2P^73?PixL@La8B^`p1Up=z14UnCuLHG_Vcn;d+ZjDg6x<*syh z+D-nO?c7w&+^%-jdh^Ze9?<~kUuS?jnDg6eo=Z&k52?F^_fsJb4#2rlJFcut7QzSW`lD^u7 zNcrFBuj9%An2RUNI3TXUX?AF>DX?fcr*Otm!zc-%yEZs<{9+~$#&w|NtP?aiF@hTnaZOUs%a``&p!Qr?|omkydluIgchcN%1#hL71RXXrb=55}DYaOV zuvZ?3chTKC*aZ@ywCSK$i6|YYv3}nBjK}XZKh~~J@R+MdEww8kZMz*Qq_w%V#QI^n z*d#W{ZJPfku7CqrCTzB-Rg)*ORO4$h)Oy@>A<4ulka+2od_ZDQjvFpuyR8m=-wNexkr0AlwiaBMK;4Cxr3`+CHdHd$GsnRoCv;P%ZSl3T=5n+ zeGF0k$dx5E$dyN;Ka0<-@eMJ1ljY5iW0#H=;mYQ8XGHicox(@MHTpW2NE#hPL8s(x z!e8hHJ=e6;y6ZdRjKaU=sTFh|X7o78L6nPBJh!%t0{lLGdXMgf5;M7h0t>|`h^*<|X z$RK0MW7%zDXKZev`C3z0yXEv}(IDtAnDR1%7Lazp{zL{a%@1dw3^ey-WPl!0{ijpU z-+wRux>?nYi%#t@d|&1T86jq#(I2in7tA4F|9mry++j320}in={K>a6grTR&z(U#I zMCinnI^ueg$81p`S}enZ8+$+(S6R@25i6@&(ku2qqDEOx7O@ezCyI+vpDsJ=gbypjfapGV*8j;nsi>O4yeIdxo4%* zD*Z}oT+PHb!==|m>AAUOUym?B+U8o^uG#A*)w+I%8$X(+g^?VpO`p=hX4pq@ab(niI$W^`2h*=x_ z@85M8A5cj&d1{dWjtFhhOsr3}JOPdi-@f>(AY`t=MpYznds=nLp$*eQ9z12Af5O+8kmFW{n z8|G)r{O+o~(vp5Y7xVo1?~K6nVc%;1q{-p^`A7NAP=KnD2HfyVtcp$S?T7tO-q`W>`h_d zh~EX6n&Fw4lj#!qF9?(Fi@6AImU!A$&7WaaY^XqAlXh%jZ&H%Xs@L1_MQGMx%$gzA z%_(=mxzPx>SKxhQny2^ehu6o`nH7bJ9ord(jcX%{E}%Tz*XWl0#aE(sBCyKV=z)(^ zZJwU)#v|gx&cOcx_7N3p$O?HRs6GB-R`GU7ae3YCWm3U&k~iuQos(Mq-}uchR_=2Q zXZ4Ps+(bpI@;aEW+Ok^^W5~;~(^hh-X_}EepHw-LCe|pIG*Y4Qkvz>m9O&cf% zOgpM#ftLybHdr4mp4n1TH*tr)u@g%ILFYPTnT+d-FG5*&7KBFwl(tRhb*{dElXCU` z#&h*kI#HHuvqd)Ye{4^w041ZjXbBf7g#=>I#bwv*!-ub4 z1B(SkQ)F}+z$VRRePuNs@0xvde|U84Z{yz(cWc1o($NRK5Qi7?3k^lf1$-OGp_&I_ z5Pe=#kiu`leHbbE_qqE6@TDnUJ=4!pXWH0CTEQGhL}I9t?7_NxDQ!Wx!dvESaa^hh%;uaMjUom;*>ogL zrHfw%)}j-uX-;=5BDku4I;{o|=jGITxS${*2_I65UH1sQ6eVY{Q5WbbB5nW^m?|V@ z!pO5naygWkJCIZN=dbNu+96Y=sS(N{*x7qc;mhRP<>%z4jPX<;zy$HhvAwcaBR7t> zA0}h8iggF^sQ4Bk7h@T2G@MFOhaJ(*t?NDmCt0X9g_5*CXTixm5qjOlQK~6(AJf%t z^jpRakiSdXonJ5$$1KMRC8ofN~mma6JLim8L#o{~r1STGN@3*Ks>ia5gC&7HGbW8WocIAw!=+u3-KzX@`HP%Xs*R+Y z6)%h(Mu-caDBO3CmAqH2d44vzX*Z%v1j(ZfDlb75q~KyXg_62438ZLwv;A{9qx)@B zwkq2u8PMJOywq=wUl9Ho@(aqzAdv|Q#YzH1UgBBo&X$0~6BF*RlU_!D2ReoX&oVN8$-=&$@fw ziz8GI0QMV#Bmxt@vt?e1HgyVzhU-YBHo->%B=#<78gKI~#&jWD!&qCQnrOSsKC-A1 zo5xTprAwMF4oKpZT1LhZH`CWAiqi|aMI`2lR{S*YR-qWfQ|8qZi8IMvl2$$`VO8HR zTUCmd{<=eauYx0}X~jWea~b;zEs8R5x+Xm~I6WxNj%|X_+%qJYNoI>`@>H39>9(8L z+6<%7oY!o--y?kj%ERv%HYN|mKS!e*3UQttmFtMl(zprGSydi_m8Bl@uv|pBZb1f_i)~# z>oj=Za1m;-0V{Hd=l}p`p!ZBd?c_lJilkZnT8WQsO7Y!XO-O^n*=eCBQLuA$`AuH5 zL)$WT->ut4*vWs)WM|Ii@t2rr-Q7yDxmJ~8H`>1- zK103dCVyoEV9YDq$bmv$T9N5y}vM2m~W)eQ)kUbUMOpM`)`K?So38JY@0- zSX&v>7}`0_xvXR;j)};Ah*k*ATg6E@9~2Q82sI^oxvNJ}YK8%k2Mxi|m*Jy~0}Io` zrKtd5Igh<0@mEPv2^B4ca+W&X(q4(^)@e9Q=U~oZA+kwRkNP`ZQ)@Rkh^c+eS>mOe zit)2gzwSK<_%DQo!B`JRy**4R4zoIS_iO7rw^@xYfNcnqGsy7yRX(_WKBq|aVe|p6drO>A zzgFa4KtKA4CW>qzOgJ|$mgA|j;Ao};H?X5LofB|{GdYFn3fX^<*ny#AkRoMSuYkLE z9F5#K39`d(Eo*a|WdKM5iF7%VQ@C2TTCOz(ku=aS=r{LY0yWsgRW18?xP&WtD_b`?|5w4u)rGEl%{CQ5$gMPJgSy}S>V|U-=|Io2i&EYc zoz5wO76-G*XL7#L1&)&&p^QAOYU%l3%UDn!&8gf*fCs8cnoC)M`OgvvtHR;pKLF^w zm8;PFh@%@}scIf#??fog`%?BIl ze1n5U8Ct$S&(rtHWpTC`eF+?j zgVoM093<2iz2btyMtEln8_bh}T){Fc4n}$7tH%hE)Jx%!xV&QF6glN*<+{)y06@}7E$K~>tyuML~lokFD0b4PD6zZ=WB13NP2 z)DREM&MZXZz7>DVV1A2dCG0a;JW|Mn$OIF*Cv&8ii6)FWP?) zp7is)5fOtlHps3X*usfbit}cx(m<;{UY^HLivCA9vbMX>R(S2xLxDTtdH*G$S}GmJ z&y`K*{r6gHRAe;Z~*=-t^_`67ZdL%o=y|8MQm0(MLMV|^cJD7L6kL&u)Y?EN~{ z|7;0%{B;+CUS4X;Ne@jzHOrVT0*71-PHd_&0+mek+wSpstAV9wV_~~>cG`^c&Rr{B zkm3dGK9J$>U?O$E)a0g1=r>-Hu}Xt)VN-9@qPQ=17;M|4VnA4)EFC$KUbA+}*YYPB z&m};VuCD}UrzSw);(pV0@+zheQ|Cp2MjtUBa`g#IOY(A-x+&eDJjEY-$PDB{jc$IM z+4LJ!D{Ha4N`EBW#q?>$Ng$PT7bI(|J|7iWvQlV@qy@~ z383Zf)dLxn#CxVh(JrS(IjffBZcJN|VX9!Ur4M%1uc${lr-eZaluW?;X+sOUp=QG9>Ack}gt5XA8HCEqy zoW?Ri{Q-tQY9O6cGykGeub;ECCXBrA2hmw_dSBn-YAsjXxuIq{xwh-w&#}c(9W$o@ zXX>|_nK*$-64sWxusaKN;l@gtO``rDar{=RdV*_)S2^=?2ULNyMY zJ}Gk7{cCP8YR(RgNEmS=p>06)?tsENus+(|Nh@tmh?YX!31MqK=g1NiOie55Jfd#R zoz5uz^G|&`=~>WCOT>74@&Mi2)x@JUY_u9VK|Sl#_6eQHSFI_E)Qy5HI%iTlv#WK) zf%Xqoh;D&nOfRDfGh;R0o#Ii7+cen_{*$^8cXwR5C*!c6nm_jUFZ;r!ZNK$>7eSQ*|B+8Sb*nvD zN+fi#WT)8^pbLaiKF80+b#b&L?0yKO#u~l9;m&p8HM9-Msa~xQFWW11+hEQlxvR!u zT^1yW;Z^RkX}%7bEVu=FWKyk)_^DXPw}0h7@a(f$7y-U45%?%6N3yOCM!eq|mEWNc z1(2pgZ!rL7C?8t2HDnv!_~P84|GuMXin^a-`YUFivx4RmdL{KQ4kgh#;lrvZW9W=O z{n64Y!JgaZb;OvtsXzCqg`g-tfv)QLF`CSA>xF)r0Du62&9YsKrAJc{Y^(ak!;N!# zs%-S_p&pvMgPmK!yOWKzu6@12$UvG&GfX=+hBD-{30vv5b5*+81F(7*K=i=DsXhL) zYox0z`bdUl4nF~A1PgD;J8w3Bs`i*$)>3h|*_O232{Qqu<(f{t;?$<+{qajWNrE}s zx=+2BWsd_GeKV`oT0ibVBiG;rUvq~?#2lW@ZHye&%g@-yhx`U5lAlbk~VprH&=$&&Fyj$bR)~J9mvSATat@bf@@% z&tjco*ML#>v?_|hlE=k$$oc8H8S)yh%-*Fsxcwfo(b;Y1Q~1j@#Fc74_77!>(kR_> z7N%p0!`N=LeWryLygvqhcGC|k4- z1I;RYalnJ9RJ$#TVaOdYm7$Ycy^K|92hLF?j$vv<#e9Qfr{*L)R&udKaQMu^jRl(g z95Ty^%s521H21~!sM+2PwlJFa`t~)octOS}J>?Z2%nnbuka+ri8`fAYM=bi(65j8~@8q%DJh|VH=L;rck zbw{W?0Jh11eP`#fGASvpZ>BA<6Z*P8s88rMVk%U)66?!%AU;y8+jz2AKX*sy*P%gQ zq1gU}f$hy8FwlI0e(k`^7hjW5E=dejmy003m~$J&_L)hk1AW+I_lUq&meIVHPr;{VravD;P8iW8sNqAyua;=1Ys<;9aWK{m_Yk+NnY3}l&JAp*&t6WK8Ud6i~ zwRc~rgN0p`w#T|@@QMV5Cn?fAzxU0Z#A5d)mvMy#1?kOPI1~Y1C*BNXlR==xl6ZnB zF7(cS9e7v8yBJeoxObu)gCiKI{5=(#(Ahg9G>33kXNtAAQukq|jy10HYkIeH7?>4d zhRb->R-%cgc@o@)ca_(5CI?CdxDClPLT$}Yx^=?fP&o|1tWVQolMx?Vg?d@$F~yP_ z^KZK?5ec2MB_a{D#|(TH3eG7))me2dyGCSv>s)u0XZX`xZ`qE%h~b!py`cLAdt`rs z>&JP>b~*DrW$_`rq@E&FtWWEFe`cv1hYR%Tb=5Oe^FH-;; z#q0?yKHl5B+d8hO5!l9+2CLgdb2La8{OR<>a`6fcXFd(XSO>#+ow8*DhGO39ae~ zBeuID?0*KXp{U90eid0$*Tc&}m1TbIg{MHvs;x;vTo{g#>!(QMK%&%K@r}O zQkWOIRTux#Yv2)r6(m!hLC%icO^nDsJ9H?Tc*Fqm5+guL+sXn=t)8(VBk!CMq|lDw zF~;K3AK`Lsx$X1INAybm)41XXE>a{5j>AP|hu(ww#2 zq=N`#f@tAkOpDR{*L0|re9{xv>4=%Gvt3d}cWz(i`k|jM_QDWCq60`CD@yk3CA$BE zvm!^?)mHo-phe~YnR%*t z#3wxYQ434&$)H^D#%g|hlY8x-&CXT-uzK=Ex$`Kn`pz*BWrM!#)B4o*7BHDKgKRpD z?i2xE9~KBP&eufYG=#77qO^L6eyz@uhokAh^EWMdlrnB;21k4skgVLCH@)>iqJdKg z**=j?X(%VIdcjbaE}aT7;**qRn~EIA+U9I$oXW=~6Z7oRw<)8e@B_|c53H60`lD;q zU1!U4yOhoQaJiVx9}s9ol8q#r-Z`6J*&*8%cpduM`3^C_=GT;@R{x*s%BzP#HXAI( z;$E8f)YH`5DM#K*k7sib3HR?sU>)UpAwm$ihF78bGktnbyxzTk2+Qn=6C{C_sZwD} z`hern{-FaU&((PAZr?v%q~Bq)x71I`Fxg}_kQYt`#Y_7sO1qaXJZ2?DOt%U4VMjg^ zT*&gU(4NR9=C9#67I;2YWHsIG-~`dHQ!&KkG^-J{*2yUSxLY6Cs->w>Pt(GGFHKOc zMs4-BKqg3X+M}bT{ptw&^C)YdnbFo|R)!HMefClTisj*8QuT?T?}Y+GH}Et=ODn$O z8&uATuiFt5?~`N|2RT^V>8CHwLXFs4wVcJA-dYiY+Z%YOba!fz%VnI|B9g1nTBxu} zytA5OYer7;hNi%KrFijL3+npS@80AkdJFe}Oftz9bV)^1(iNa6WV**|M2M16E;Q!0i*275qAHKQmm4u8N7guvKB+Y+M|KVwWhuwl)`=RBa&VmZ zWROTR?i!|N>`gTrlrb-vTbxgJzo%zRHghnG*ToN~#c;;&YNuLl348C;-k{%=WM$J= z1H7WN8kl&6>n{5#)+t{x7L*MTOxkxP zqFwdr*W3uz9m-PoL%iTX$At!@FL}lP6!v?K_TiaSfob?KM!ffv-60FN{%-J9_I(*j zzU+CMz+?keOjWn{`@NI&WnM&HPjYX^9>aSE0$KOc6_#NLA$)m*WIgyu)M6%+HU|h= zYSImUZ_C^h(V)+$wE=cbc17}vZ$v>3Al_GM`VIEuoG74yZ{45*0qh-%Q7R)1s4$aS zVMyui8ZRA>;`gQ1J3lDQFsbsAkFCM3Wy}wMx1hyt&6|XGH~6P=3T@A`wz^f5u>^8?LY8uhjG>=blxdn3jr>}Il zG;ae!BABT(Srx752E+M9Hb(vt9!o`2S#isMV=C<5S1jJK?6uC?f%Zlm(-(W(NQ_11 znOs>Hw_Qf95boWbSoMQnd>rQ!d>QZ>RrYwKE+L)w+a#zoqI1P-#_B!#Or#-wjqbNm zSzN20O&#-psXrYjJ|x{5QGKc_UUKXcnybH|da>O@N*JXtYn-X3^1k%7qasAUDDgP3 zRjyDX{Us;oI5wwxVby-{qB{GRw^79oze$=^qWtwY>#A{5I`lH`(qSu@iloThXPWH1 zpUv}BPDiqo@9$}17O(mqK1^PfaQ*cbYGkMo#Noye6@^x<)~_fZa)%=YsF{TCWK!^B z<6q6O4SopqQMvTROOa3IxWqNn#${g;`S?y9^=;|p=CbsRt4L=GVISixh3Mvfx5KPf zMI{XLFsb=>bYpL9-3tGA2ip7mOzrxb&7$WF#nPMi2dYh~lqbO6M*P#^SD(_7C8ZbEUpkJvUY~hoh-8jZy^7`RZi0N4 z2@O41Q8a+;jbM%;6r(jPNC@&$^X<4>=>NvC#);Cb)}Cj-kZER^6QziI>b1D#BO-r4 zj8VB0OIQKa)t+So=8E-my)5{y^V43oP5VbO{AVV0@dR7wz?v``ht}E?iubY;j|w<% z#jjf@9jSNW>YcB{CgK}sFINce5#IK6bsLf)raU*(m)Kd}+M)*sboYx)BBKpKjTPdP z{Vxp2dbDbSf13x_@0m#T2LPo7{Zo(zqrx^7ze)JQ#gJ;$z;k_e%)QTv1VB9ZypsCw zXZO^5gkeo8KIu(#V$h8AFwSC;6bK2^;j&hpDIW6?`VD{udEYHKh#G!&Z-KK_;`mzJ z*Fv?@2Y&eIokqM3nF#K5ra*hkk5sG>C^}En@v6FYtA(3~Rp~rDCiK6Ow{e9x=o+ko)FqJ-lfg9s>8u3yeQ-cTb`Y8#%q$sIM&@MGsk0B2DyPmbVr%|f z>qJmZ4OiC#$P92zDY$kY@mk;KzHo&SNZj5!7o z?ZbN6%pB6dtu7tNWQhZkmES+?vrHN-f-@io8{D26$1nr*rq+64dQz73EHpQ;@PQ=| z&=7nIO+xoDdSN>AYYodRBa<2X7S~kJQEwxW9&`SiZvwON?A@Ka#uxwhW_!ySM00I> zSH3M19o0*xC^NZ}PgQfbVm`E=*>3`!*%I|WDtavwoeyas)>+HkR-;X7s0jS|xXII50Vd`ylOoL zGdA2LJ38n%pMgn*a|pA7t`Q1Jru&=544*7@?E0!NU_{>(86tnjH7gX?T5)Ite0w#I zAUMdS#Y`D$pI&qOW?aO;14-T&%(j?vT8K$X{}g9$e3knkckwpdy4+E*P8C=8B1#Ow z1QK-jttyPC2!9Q-3d&4zamoUNl6y?eFg0Km9Qd_$KYn$n7q*}M=c5{wj=tPl&vlz& z)bF|_v8_?1Mju?YWa~gVN_(GW&!zA_ecY$m{L__TPEqv2*kRCC&FMmr7%P(N0!TiTHm~A>jdgFDBwMOTNxE85=1dT1UlCOcS@qg>$gFJ%QTh2s{zXOo2qELUxG8j%gR`IZ%8?5(HOzW9M3_R(z4Xm zfReiQ@dx}AVHNo8+h)Z($ka`e6^N~hKKXIj((HMVi1o11#D2YWhByn%1|FF zMR>`kuLnfUQ+%9~IbP0}3W-XgAhl=w-b4U&QG2p|)z|F8_w-ucI3=TK4FaP3PffVg2YPROotDK};}>!0 zANf`V6GoOuJEMDZn=Ic%aEF<)dM1T^UNY(78{e?8C5p$9W=J*O&J6^DFCgcAvJlX8 z2>NloG7zL(q10LbQiHkMqLx48v!jHOX#cZ<=))&6sKloZZ-fE+PsRu>*@=XsbYSPH zSRaGgiF;X@7qAcY>Twm~3=Cx(hwBCx*4CWsWL-waN3N;-(fLlWgH<_k}@D62u5Dnfbrx_`Oq%Q}CxM0-UQluZ`@aejTB z+`2=UHC|H-P-r=3URrVcsf}V>=|d~wh370n(LN(hte67^C;J_q1S4&;=A+mVRdu6& z91Hpo@+)|SlpO%G4_4l;JMr1-mhQbd9$62OBG5TCd&3xYl9*h|B~7G+-Z$R?NYNim ziHzTaoD$Fx*5KrWJoNmcK>D;H1)5XP!-s>JAw5U-I+=5`gZ^12Cw|~^N~Ve>#d{so z>d>?EF}9li@5e`Tix+|5i)VycpXcc^Y1@wj3mtJeW=rFNx8Lf^+OqPEPg$$dEbaN< ztE@K9H80x~{#CN$Q`@AmWP3?toD7}5{UqYrO>n!=@2*A8jyY3u(;BYjH|YaVF@Gz= zY@yiTT`uEayXDrlwZJ2^V$8E`(R_>*1YyuTSJ=8j&|91*+ayFlDAdx+;48rh*q+E^<)b^+#U`b)%h8+M?&5t|lsTK|=G^_sYW0a>p21s3-b!}eZ*v=FI1 zHh<&9i0^V!7$JhK>IHs&9|^Ci=pUiUEy`%BI+6Fx$&hcq9Vj>ZRaN}d11A?5yX-ym zUNGtCs*6M{maC5OPWPpn#GC1?`(lxkWlw4Wpfd34r~9<4 zG)A^Y0^C2D9HN7&+5Dz2^BXXdDTn=(fOGnU7{vIt8NF+{8$L4lo~t;M2xWIV^!L@7 z$wxbnY3D6fiW0wMzT!(SyS91alHx#pTNPnh-g0>#)1m4P=mMY@N!}D@B<@+;hEs~m z%|Lq93B45p>%{pKQ5bhqwFDS7h<@3r8doUA65hYo%^PLKv8$wyk26v#<98u!Hf9AQ zfbzaXD@vDc09o_Py{u{o*3)rc@UMD_`FKB~wp6V`{>Wf2bp7!Y{+LpW>C36_!irpd z?59}sJor4R+K3l?Ad-OGLs{$6%xSA6%mBIxc-y^<{LtfUSU^#KPWb&ENkVk;qX*`lms|r!Yc?R42;531CE)xHjv9>L z;U-x7(pL#mYO~_Oux}Dxn{(sh&5D46&M4CACi7hf9xg%(4fP&m@{VZ_UvBCf5jq(2 z4Qh%pp^7O{6@%l7H@luMN%EAB)ySgn5AjmnRzf_I3Hi;d-z#D5DFXDwbUE6~aE979 z5Z=6M_+2nOQuYtc)qPw1PdJmT?&(?t4BGz%_~)@xm;ID-+FN9kE0f&jT9obQpbdjd zEqdqU9!6oUv9_9V)t3c`nV)13g3Q2sVRn~|D*{nixk9Z!G=?j>u8{pGP_3Eug!uRh|w`}d5YP^gt%Ilv;!RUWC5X&A#i=EtllHO;RKZBT0 zvN?0S6F7hkZ$lmpF|vt@sT8gj2QDqvH1^l!+f1bo+P{Bx)BA)Y=|%6e&48{+RV$vJ zwv#S<8vbp9GLecyWksK_ed*S)es1ayfE({*Kl!AenhSe z;)kt3;|<@HjOkwqn7L;ac*Z%UlDfztAuL65WxEFg=mc+Ph6+X&>M4;AN|xjq&&d_u zuk5y!QdL{>sVZumc^)g19IzX`c&ib;)L^oKSAzxmUfJ)O?L8tXx#q_8>4)p12xh>u z!45|Mz+84eCjc6*zfWaS=9Y}VqTl^>H=p?Yp-Oq%mSA~X&NJLiJZuVtTW+Cgt{D&IP-STdvfPph zbL3;l`Krg)dfr<}D#Did-^d$)t5Aps!)_rXChNe$VLhGM!oo~yw13(~6%f&1*6L8C z5!WSp$Qe`(w>$1rV|7TagQD>xm}-~^^g$--P$mVH6aOLox^OBM1mN>f!Mg{KCF8r! z%ZA>E-qlOQp*OZG-!*?STGvx-tg5(@3lvBeBg1Tfj z{dX9x%jBcFo2#7hO!Ai{WThY|s1GKH7;x9GZ;_uZZ@T{ha=OKiZz1P6uJ|i`Eb zgmx+{Px9M0JPge4yl{O%(WQTAIJhS(`b6`yc{X@sOq$D2fd-SWv__l-`ix((7`0({ z9jQ+9?uRy<$O&6Et>2~f)a-PDM)z@+e8LD>r9mPZm&}9A7H=efTlbCE9-$Q~C!v`v zCNiR7oN`3@t$27b;l*M(2E;9F<{^x1i!L)*G;^O3T4vG&&JX>Oy5Ayv<2y3!`QFE5 z8!5RAvUL&Y3yS_^o~O6AN1#E_mNpS~B3Y5=@^gk!-Nk$EOzWc}r`Q*-=z=UN+j+%% z&wirKQcWwa>1px51zPFZ=ee|)x6f0(+?IrgV#lW8Kz${Y(Tl7Ux!-1>qDb|R?C8g@ zXunkGC7}Tes5FSI{IT}#a~%4DmS-{ChR+#qFUf{ef@6~Omo*;#772s?l{hMP%6=E; zC3nr1kCe-LcIIw%JN;2fF0@zZ+?{$eO%qr9?t7_J)xk{tfPrXZGj%gx z<|KTd>$CW7{RcLLdllCU&j39kr_QVf+UyD=)Sb`2D9@VV-)SdWV?HT}=Kx+VXNcxglf>d?jM#DHY)_}#gPy_nJ{)>L$0u=$W=Bj zPcFICdF(~jIVJ;bgT%kfa(+$I4%FJ0qnb?kY~aj_bDo!Iy3b+cO7g6zhSD9jg)b66 z(f(RIu)ry`y!c*5`kS!Nd?mul%&Rxj?>Jj6oHjoY7Q>(8|uB?3J~8v{)e~ z;JMUf*GM2b4tc5Sy#r+r0n{B^eVMSe(@VZ#9tcjeg>)1LB`U(lf@|C!0dYG88nbJPcTmG zLkc}NdjD(Sq`vN1@ZzM(Jc7x`U!&2Ai`y$|@UDPaZb7xiWBNs;sW2#lFy%;H&&DMO zO_Y-AEFmF9Ro=r6WG8EoTi=$bVvp;pkCFOqM@n45UPe1Mp%oz+a93vj%}NczdxzZH zN%ZN~@M9ySHyI%D@N^r*m~!*NI)oSb5gw6u+Z z_(u$XU{5cme64SHR^29DS8MZ^RRRC+?`zU>M)XU6R{1NN<>WlAgbKbd&R=r z;5B%i&tS%DZtkG8H0xpo`XuiKHAF(4>25lILe)0-?{8|cn{DZ zFV41F9+mX?%dZ|iBjx#yOEv^Qp2-~dDe_QttyK-qh7jvNkqw@r=IO4d03{ZKO)U8h z!TMVT9jf(wq5p(r^T@Qt*sW=kmxSpP^W%*hDv_GnFq7l{&xcW2YO~7$M`Uh~3(T%- z6?NyK$^L5?nD)pc^C5!XZmUJU8>h!HnZh9G7g#2Dn}vQWFX8Fx>+GQ=<=)`5D9Q{& zjD(aNPHEYdR|w`Uz&y&=UVyGv(}xIB;vTaFFeS^X+ec$>hgG13r9v$d9J(Z;`Dj*| zttEGdz|DIz?r&sCQ|me{J7;S>?;ZAgIzQK;l%1yarZ5JF5h*jgiI%rYb z8kgmp%u^oJU@Kbz)ODn(&|`SElTLv!N_O?*qYWda_)5r3YT%7dfVR2QhN}$)65lr4 zqI-uDJ~_TV6LTVy+F#`AOfE8+-B3M`TIOyVZ0k0W2c|ziGr)dA8}*(C|M?HK4*!Zn zdvJS*^V<6Nlb>T(O)HJEMZB9*0g}pV56{->|CQ)88fb`h=BZ9)>gI-;+tWzNtFEAg zR+o}*gPBxFEY^0z@-5VxesqGLH@ORa~?mxPLXhnFHD#^r2}Zj*7w?>Qdr zwkXlk?D&9U#Z+vl#zKWgYQyXe|DphvXb>1NyNTe;dB*n?pbv-~q@6p)_ z4akTDM)Jb8oqAWiVus1b>{ej`_&@y$^89Xd82tV~MyfCfXVr~|kkF)@Ycwp}{geE& zB1ehVrTKaSa{I#?(d)=Zr}uVS;P7~o|)yQ&G2`|?9%5A!&``XPfC!9#-G8NfcynNzBv z_h{F$`%)H!Shc6kDLl0W+ZL8V)f;vPsOX1n9Ndf2;vp<=_scvb3&&(XP5rjh&q}b5 z;eJk^jbaL?ok$gld#^z|9MeRGeak~9Tkr`QA8m$Y=C~4`X#b{iL{5*Dq#5c%&9cVS zWIy4ti^pt*OeE~i124rQSxj$8A>x2?Ae;JM)WINLaWLTYS9we#VjgR!^>-8>1HY3eg3Zt}ibWs#PA> zSj-p|GR)BK_n~utVz+A+nwZpAF78$QO-XjJ<@ec=nayQC-=g!MV*PKKMX$fV)iqDD z1WlnTvo|s*i~G1okX*uf*Trg?$Yio+a_8)2L%q>WfAZD8D{DAPfx}<4y1nkjXnZi# zw~PbhRAiL11E8Zb>Q=rrZ_Re_D0i5S+^ynlx}m_hWVrX<#qJq;!TWlTDhZVgf8Q9pfC!7Lxq zovit>5_RXlnk_QFq7gU9v&~wj9ZGACB&r;cf3g<4)*pZANeaIH1;vO}%2_60ipLd| zu81((&^-VN2j~Bp{nf_DiS@5Sk^{(VkJ5(@tB`V;uxRg>8NBG0il-?NyfugnJs|YX z6Vzom5}|k~BDm~U2C2hA)B6px1OTW&+C=&%m@siX^^gkw8$#t4SN%l=EU97i{TTLo00d4>MG8U{BOrmm)LYd z_0tABpZ?iPQV$g{tM~x8FlZg033R0NW(1A6l#KN#=%Wr<%`3_;x!09Ir}XfuIzj>5%IF{he+IAwskuMI9}Cg3Th~lTtm4i?q@fEK-vb$ma^P(N4HK?)k0zCKFOG`% zcn$hw{wIa71j3;hsktJH)bNb)llET>@-AhOKtM|7-_J>KeY6J~%(+;K$$F7!8FvLQ zZ&Z%g<9RLd>>Op5;6^uqr{Cc$#sykN*4Xoe&!`vB6+cFwfZL63iV9_&N`fU}jd*A0 zw*<(qB595q?d7OTs!NHOA*Y=F8OkxxmVk^k zXzuRo2Av7zkKI`yWhw?e<2X?QUMfluG66S%R;7QR0I!OQ#BnX|R^5V)g6gXwPiBDe z8DU|$(`;d+GdrTlYs@{S$cb8+g$4WpU@Z1G3ft>T;Vg6q<0H9UU7{Rz2F2Le!d2j( z#o0=c_bfBc;gtNXqq8N{abxz0yRduxW#uUo)Gi1v4h)JY2d)1-SuKrVN}4Yny5u82 zup}v50_lQEIM_xc%hMy^h~u6mJGs42)|pom3nTU8#)Vz<`q3Q%je z>A(?411JlG^A?)j>U2#aBu=A_0P?Y1=*L`NP!ML_ySAe9C_ue*&E$65-hht~>4w|3 z|AM^S{w_y(Ak^dD>O(TvV#;QU2C~f6bJJ0V8pKak4!gc@$OeZ7d~2G8%2K^HBD8P?Fg3&4`exwYbIX#dq_?5Kjj(vbIFc26 z?UaKaa+WW=BAe@StC-2NP}euGVRi{;qJSGC2r(LTcF3srYkE&yh4L!2>E4%_4U{U9 zocU(-@+N4tBMAjMeZA19h5o);*;|EJ1wH@9DLF5So01D@q*5N9@}DZ8b={8=#@w3u~Ql|*SIJWt9TzvA(O5m(8v zZWh#iW3y;{@!K91S{sq2TyE11_O~{Bu6}+Qyj{1?Uy;A*OAY|0`~j)08t>NfKTHoS znCx@y)`PDchR(zzVc@CTa-TC@{N-0D3N+QYzTm$?lX+x3gC^hqE*G|EKBDDU2+LZx zf~{#q1bKA|R5muO(ZJX7aLt>-ovTVYZZb&_JH`6@Z$vsZg)^3TjSCk$fL>AqI{uL6 zdOvPC$OjIc)94N+o&8C5>z{rs02qq#_e1h4n{iYwn-cs#5J)64255fCd@AE}3_Ww6 z{;iTtf~=(TVv2ot zA21ReD22nN@>sgnaeY9EC&!-YH%0GuU~seAYGc*QfzZ$>u7~QMV zJ7gu_4hgxERi{v!udmI!=QG{RV%U~<72XP*uAR3+D8FiqpQlJWN5aK)YjsNxrlkDh z*)5Tbd+YA!Zf{k!-!xxs3ca-VvMW|-2pe`J|8Cv!9`r>>-S=uiW!`)4ZMeGXm#}oZ z6^8EVv%Zb0Z*y+LsIpef?OJ+M)PraiK=7P71<`L=gni?yG7}rY-oACA@=bzY#vve-j87U zxN~;Z-*As_BU}x?kRrailov|PQfG*mzPJ9atWD!|y7u+=>7!o#H45zVgVA$ustvQP zJoVsjCUcm+(tDcT^Zn(5DbzJMaH@2SKG2;3Us?&QhaPmWGwfj;;k;HlGc~=8-9Av5 ztZaXnBjWlcR9Ijt%cL=t1f%CVy%_Q4pCYUJIQbnPKH_hk6QKs1(gT?&?vHUHHACB_EL)2{}S^hbL<*~SHM|RTAsZ5 z!D?gT%&L#oHE_wd;W#yx>wY1%wukGbLk-28(gd*Z73OF~jE zBz7c(74TlV{SgtqQ6bUVSo?w!MBQ+=-K*`CktU$-b1<+W*B3Foyt5rZ7eW~Bfo*Vd zo6hV_d2$+J?ACYsn-aD%^@h~b>j5LYfLC!KK}(#R}Py=-Tca#CEp>c0Q%%Hml~j;TiF6EIar#`gmN z2!QUiNlS@N0VcV_PFKTJOJ4s}bhDsiV%jzoQNx1VtwziPP5%KB?zhB9|Dq(0XAWqR~;z|X#9OjV>CPD}Vo0JW`3 zhH(SNP4^N2&3jOjS8T@l<$Ep(|BAECn)IX#y+gPslQ8;dnSJ<$)yXV)7&C`j#WX&C zq;o}bJLeIuj(2@2X;w5fko?-uGp+H-Rlpjo-o0OpnO>NVhcOAt0 ztE2;cjOSQU?Lo8fZp@G9{rx$r4pacJGFyLhnBhpxeJJ6#$mRb4$q(5gbi<}7oE9U5 zdH}4<#Q5`2UvEg0PNz`?<+{$g`@_Bd{saE<>csA zQSzM|#Y70s%;JYJ>1}_lw$<(4LYn?dc`^ouemIYwRslEklS*g4qWr-#z}E0yHM1L+ z1Q@&7CF<|Tzt~TmfypZ$O{Od<9kn&NUokU**sAr2K?H>Y{^6z#W+6RDJyNQ#q3v-h zEK-LYkXRa;batNdn&WCGm8peZS_&U>w#OuvN@+rV)Q#-lbb$8kF)!#9x>(E0Tq~i* zZ63g((n(f*qQ;L07I)zXlQ6YM45^1&pBg5tQXcR#gW9yh-#x3ju!i>7RGz)*UK*+! z9}~W@d6d8_QwwZMx3kuNLfK{ZyVCGK-6A`+{syKJa&?k0%k`h@Hop8d@DLo5^S?Dto?A`Q?z1i0CwWF(LFmy!+IfOEvzLOo-4IzJ~ow1K+MM zCKugS(TMI+K8XGn0Dd_CqmtzCaw?*j{!3ILf`8sSZnMD+th<=XC#Y=K+#j&cplT_o zDLV3k3>^T`We{9GZf1Cz{)T@%zxcd@Ptd8DntIe!Kt@!QrP;F@Po=J9GN~0Vn-6gM zeo>5-N0^g$bh^SreA{peL9WhhUB>O3E+x<2$`nh=uD{z%X^^>{Ut0PP^tCKLIg4gE zW$|8xVC@QNq5ACI%j`jcM)qMV&+6df-1gMr(N;aL0t};e6LWVL-L)Z$LAxNVQiDLR zV0xbp1P1RkaLH|O*i*J6zsjIWOXz!P_y~g(I#GWG4 zzQcMx`~N>z{k@iWeYc%Q7Tz01EuSTJQT`v`6R1*~!)Xr7$x64Yr5E(ey@3xYmq7-S zc?HD09kHrIR7wSmi`495U~A?Z7Xf}(b2VGb&7oC{Kp`t?)+Xt1aytA$JATLmL#~Q0 zq2NhAj6XwG?j4VTzUVhzo#nYfQPV3DLEzt`RPbgwn)D0b**5)?az$f4Y_0<>hCuG0 zKs$p{e^PT5L2p;wJ>BxV=II2tPZ{JA#V08h{Clz{SGAS?oFa2Kmh{m$VY)ueE4~Lp z_xJqpUiVV?0~BO%L}_hIx7}V}?)uSioCaONOg)0B5 znBgX~?0MXPaPWk`cS!0>bv$;3P=DviMMrm4RTbH*Mw`tncGgfgHt^dfVwTs$FLtw; z;5vfhQ~`xgX8!?16I6+-A|tz#!E#mgz8}H}Gk}En3udzx8Y|d9FK5J|n8sRndyIJG z+$g@<15xB(_Z?Gi32{ zQ?tDGtfdN(cIBnWTI|J-iCf%N%C>l5hOIpIBC0$AclTpLH0PRqlP}E!wd+& zlj|NpkPt zbT_D0XT=v;&R2~?ni;zLr>UZ-zk5ntj?|#!ckq~s@w9UhyhFRbS41H)B=^?vs4Bxt zzeKj0@_kUm9JEdqBnZwxkmifvij3dC&rhBn-W~S|wNVTUckS%2VYZ8CplD!S&R{^G zM?)({;I;<_H_E*Z$YhTB$k4~hCp>?3QpQOY(oFy5Y)6u%f>E|90Ci{z{ffF2rV&8S z;Gph4uSASGM!Eu~i6^Qhmz^VdF43U|TU)jUPY<{>KU1K&KiL+UsuaZ%d}uNZ1>5$v zxnhsfFpN=Ia};=#vS0yy9sWHR_3_f+vpy)iv zAT#8=7yKu!c-5#iRR*Jqrv|ZYn-ijX-T)~c)tghdt2xbCrE>_~!-f`TD-sMdsk(}K zr!nG*B|yQ6sP?T#jK${@pUEy^L~=+@4=+u6jFqI<(d47$r*X&bn9eiqp|)Zf#fyO> zZmx!^u^u(pqc=B+9Xq1mPfqcuQdW|z8c^n9_1oq(oC@}zXQP+E**435x=JnJ8K8_i znZ?bB$d#^%)9H-sVZ=IHWQ@8{`esY!TBzQAS8kMFylt)yLE63^!Rq{1GMB@7?Zu&R zc`+wc4j@@4Y>I~zG=?uD6Ug3JadEqWs0C9yf>SYr+o@Py>S+&4bZK6DU++4#1YgXu zRud}326w~bIbKc%x0fqs6zNlVLfwSlL|`e&X2{04P(|UoGpFRsrX;r(Cj0!F(DK~< zUg-{$sk5XwTNVYAXQPuhRZ(|718ID39SoA`3sR-?UukKm4gJ8!by=E4a!Y6VK}~S#*lo!VvZm#S*CD>l+y-M;dn8bh|16+&U~!VE=xp_$=#;SE)5Rn-4cbnbyn z@BbekbHCGs3}eDZMJ8J)_scMLD@o;6Y#~E#mE)32YvwL3=C;{Jib5Q9n##3Y8g(Qj z*H-9)9NoUZ&+mVK`F!?yzu&L-^Z9t(X%y0W3BIK_EXQiTDVq%`ji=**=Ai$y{wt7` zWDz!A+$(VcC#_@3LpM|C79k@pDqE)LK7g>ztToF~hHOlmyQ*Fk0 zU_Kz6HYMP5w4Me&;Higbr0CIbzTC7lM9)D)o`kX5VM57ci&W7XdZFEh)~QfmnR_FRdFdG2O52}tm1bqj-1yoQ*`i=$8)FW!Q+lo-34|Or}MRuHw|Q&rOd<@ zQy$l>Cx{*+VazIaweXG+`w&uqwgb)I{fe2c^G4vNZMvmFzDu#L7^mdbhvtH-Q~7N! z&iu10P$DVXE`7Q5vvL~~adR@(BhWunv&##gwDdPIHDb0Xeq?qgGH9N2nf-yTTkJ86 zTY*-l68fgsA&26Q0JJtNMa62#NTP3blLzwBp7SS9=2zLxm)#28kK6=f2PB0YdjU^R5tg&8UWKBGjvgFhSRZ6ww7$S z2)H)zlv4UNaly-bjReQwBIcP$Nygum6Q?A@u}odqCa+du#o>c2`!8h7Om-f`-R;to z;4H@0CqMBfmy9{auX>jz`KwAyLR@Nmk{J+YPl|N5f_w@3^?ZzUp&esC(RjqtFfOb=#@E9d*+M`RBLM&Ey=nFEu0C1noyD?V z7}8N^IkPdKWQ^ofG383_Q5k7qSwCKe`nTpBJwPQJCWnka@=g=GQcrwSb@Cf@pLWL` zChTg{kPXaNJo>`TCv=r`Hd=TCe*^Ml)g^kqYyhsQeeARyejt13pu2%th^WH-f1ql6 zA}2VR8Y-Alb;2n+setC#HH7brG^ZyyfR)396#a?r6-famyV+~UY_t7A{F{U4-fg=b zp9b{@c1E51{qAZ78g%JmgRPwtL^ye-ykSJk0;$t>0<2GC$*gZyGJz@-pt@yEho`4R z*k}~5pKMn;7Nz-T&((6}Hd_GCtZbk4`y+L6AqiWmS6@^)LFfc0ntQH=+3KZaho-$p z>j}7Vl#{Yj<1#WyHdg$PhSGZZj(Yw0&DxP2nN$+2a2lFHy86e^=PJ!-|BU#j(@ud* zMdRb-&6>DGoh}!vkYOtcn82Pm@+zimPm3zRazE(G?DjXn<{gAe*WNOvh<%`k#?ZA{ zT4sjpTh#b-=UuM2EY*G-;z zc}CXDWGtTiKnAYo=A$`T)mH;DkKjXeiuD?K^xUEWh?*bdW-t$Oy}`ZDCpZ?V*9C3I zHD7(6rWsI}cDCm7BDJ5^Pfd)a%~o*Mc5YM$(k`2J&EGK_y;Z9NFPxrmQ?X@d7Ug&j zE)tX;45h7|?mbm!`=sUU2TIaX>nKEwHuS)(i2X13+*5^IUG%}JC?5;fVI~W%XIiGd z3RN(8&CO>-S!<4J$`4g4+@QsH1ZGs+c$(PgW`aF(I*WB49&MN`a9W}BlVt32j+AOR zJ}=4E3BflOr+hl5IWQvonxPcq;C3=id=NH3ATcRTh6CCFw!CNWf5WKNKgje`c`iqO z8P2i7)@Rra9HDGR#wYx9p)}4ddiQN_SFnX*XrZQJRu7Qgj)0738>`T;Qy;9lAAC8i zaC^EF-0nBD9zuSWp_Vm>iUJ2zTVDtwN`)DqM=0VpK+N$<*9x?#X6=7x6a2rITSkWl zp1)@E{^d9RXLp^VeIFY8eoPTafS_?6ROZ2qG-}$C z@;8--BpZGJDeSqrh~qx{(LF7YnrTNPFu;StCLKg9Z%Ol<>9p1B``-(KUUfc~K7Lx+ z#|Y@9<74qE-+B*7Y!{^}kIcz@wIL1%d-r zd!$Nc8yMl?m87r>#4+O6_6HG5x0m)w$C07{+CdCP>I+hDXjnK$eD%O=LF`SNOkIp{ zK+J*Sr>=(HJl#)sJ}fa+>(uIczw@(x>9W%C*T5+rvh+6H3t-*{<{u33Du8Vr<@(&S zjxegjojg)zCwT%(Kdi_Xw0Amu49Iy2nC`Qvg8$E?&J6A=pnB8pyn)q9ldenf{+0l06wkPdmLsSh7riW8OkE> zw$rFvm1N5TWk@-@K46J0QdBLkR4esTN!BlI93In0R3N=f>9OXFqGO(Pi7W4(APJ44 zto*j#opeb?2Td$0Nkm)_ppr-a75f3+yT^%jq?v(_$Wt}P%me`^g39G5CvNv(i^!qp zbg$`X8nq4;qnlPjUEikpfcbVHwai?~1Quuty)YGRlES6W?9a?20`omiPQq2TdDs|Cfr zl!gb&qtv|n8Ce8?*u_U-kM9btq_JXmaN`?<{VLYp50tzF*hR!aj0{>&EL>duOt`b# zCf@hkw>PI7+Dl_1uX#;14tw+qxAQR@P2o-VD~HA15|Z`+)i-M8l8Yi0^l$Jeh!iV0rrI6v*? ztQQwRR;dX%O*!O=zoioXs^+~BCH~bUz zPoeo=GgZHc)Z+i87Xr!ZC@Dsdqfy;ppR}R<5Bgt*SF(M=g4OR1DE~R2#x@c!tRb2fc6_r_6Q=Qd{j6%y$eW*w~Plpx#YeQL{X`nwFU@;k{5F|o0S6=FW$Sk@V~a*QiZB@QY) z&UeMk70WhD#2((P;c2+7R1Y!UcP)-J6{-MkXc@Vhidt-I&j zdd(A(y|~0bWzqdi{&X3%_$Zku?b;iwmCw!3;| zVbDxa1DH)KG(#E{ysxR$r?|^;aLI74l;XsVSAH9SY+A8&CggFNW>!} z^#>q-No4UG6z9G#=NNoiNU(2vgo;qDe^=Ezha{w=r z=6ZoDAGN?oWnZ~O@L`2!a$YjPAE?&FS3nJ!J*|`eyQXjG-gw?0NKweo@atJXiLhG` z6{!?h34?fDqsu|s@>kvE#qDWm@^62w}W2#R1Gm z!JzP0a13@q{w*T`HOA@iKy5I>Ugr?%MS0AMTdjSEN!Q0nQtHgjIn^|?C6tW2!(se} z;kRMriYd!>jf{2&>35^&4if~AgkfioNpJxy7mxcP`>;H|OF^g{E(Bs1moCzQ&L ztTa&4%@$f3Dy?Hy5n8n~W28fp={p894cT_z4if|)>IzGQ`2JK!G?Vk4+lO0?MbyJK z9HSrZk$N?F?-@;Wvn`3M^uie!f9slWXG`^{f5C9&fIt|;6uzWWuk<*f$fDq_cn{$(Yg*f`l&^)`4em=xW`Gcx2q>&4-ZBD^@aq3u?{SN}F z0bC{g-oQT0BL4a@ap?-RsA4%*4myrg6lHqH9mbcBER2y@M2JKm&R1&dt=N~m_kn^O zY%#GRUv@XV-7xH5C;>dZ$(;s4$we2EsjV0X{t2tHUIk2_iZpVrMC|rsw_6UZsMqJ} z+K%A5a0M75o#aX84=lQTdAh#Mk(ISbfpB}ozHzz=h!iQQ1N{O>#D4{WjGovPLMQaPm$$h7xb&Bh}^N>>p(PJ)0}P2f4gief42Swf*?K2-IMVUM=1@Qdutz}x%^|$I)GVuO zO^=O#0H$AXjHF1vMFEu=fzHU@NCVrLi32`Gbn*^Pex9)a z+qAJ~U|gRkE;9z!MzJJ#A)+2Jj<%`iE5o3)sS=BaVf0utReOTW;x-p|We^mQSOaYl z@-l}-H;Z*a$6$8Z7|x(W3I|`Z0dxhD+7ZPOMow0 zL>c5jj^=TUvWxtn`)tptZ0+z>TVEvaP=saCfECrKg^hU5Il%wcN8XGqHyi-sNUDTiRwi8o*{e1@2Oo=vks_4D^YiJ-c*W4mrJC__gY> zrC?wGh<6enlBDyb(;^wNZGZXUd~KP0EaLJb9W;lh3i37yKF;DXh z?+4)hn1*8Em%~KdpRP}YbD)d?0~?#`G1Exb&A0eQ%geiZ58XbL+cBQ$XS4qmEY<(z z<=dY8e_@3Pp}Nj|)vFG+mHVqr4s7?%B?7g#M~?GNZoZ!2_`Z)mdi;!9uU z6Gd0G;jKLI(&g%zpKac|YNzeUDJnzLc<372bLGJ-Z$Y|BNCE|?*j$-Ne+x#q9$_Na8uG&VoO9axrAqOA z$a%1$@}&Jf*WP;|y-VX0yQB78ds~m&uW2w4SW>HFh&1-iayod)u0kkh;Y5+<>1+{)Q70^7s=0kaWhB)Z8wycR^Osq zm#ibeN#<71Lj;F1z4yst7USJP#_Ei5+%u;F1}YdjVS(*%lWK{ss~cG;naYavQpG^O z^IIV56P7jJT^%jkkm<{lfzAbHd5uk*e9rUzuU1eSgUA`GePLRu)V6uyyM#^6Jtn$n zpfKTg%WjHg>1PUA_08xSSo48NPp9Gi_B#H#c-q~>;ZcDNC-hWKNZOWF97dKou`);w zqWPlTq?A;#`=TYESb0;{$N=$?j!mm02VQRN>Hxw=<+JtZ(Ol5wFIoKAZcm#*RX zG!7|az6}hMO8x@cQF8bX$kG!Eo(1c{th{@bEk7rAhdPD`8>~RUFmO{&c~(pFW^CStm~zfe|>MD6ND%?0o3Rg8`JpJ;QIR5kN)`anx) z({3p?Vz3`}?y-)yU-Hjy+-C&lEE)OnuUjJ^li{#B2Jk;dcXi(;Y*NVr@V^cZL5 zCzZ9?u)xhZp>ftSm0lW8hUhokmW%~HA>n3y&wygYBR3y~Oo_%k#rOdmblmNSG~erl zk#CN@cCn+w!^b21({P)u1Kkfh3@n$6CogG1;!Aoo&mI!!=kR59go1^z!8IR({*fJE zrgIavIDbq3-%;qxV$Mo6wY)!W>L{QpuWT;g;(JZIC(GpBVxQk@F0U28k z%LrE~J9yvrG_qt&!@?bW_GGhzf5tdH$2w<}S`^;rEGo+yD?3U1Lq1q3!A5H0fW=@) zJO&)VGRcXkN{}?aqcpqom7~ z3XB*fq}8`V&*2jURfu<|s&s3XsNvL$dMG)BQB5s7xww$!8NRp}Er3sZ3aN-I|$==EVt?Zsyeih)Xqs!`ogaN;nQu1FgYn3tx$*HWD29EYiF zsl+|Js7H0RyMa<9L~}i1D^s^+LX-CJdCi{Lj*4`jy2PV>7>J-e$ljnSqxbL6T?P5v#B5M07+ha=!Jb=mj+(`&r) z?8+Z%@F3$(rlmxW7$=3O31(3w?meyHd`B8JWlj?(i~0kBE91)X?UXRuA~D0YMl(j) ztLhz=&rn@BrrtunM4<0-t!dm3;+f3HQZYh;1#-X~4*p3M*V{4C%M zS^2Q=yd87l>Ag%3>@GINeRXTT^ek?HJY-^~!}BP!lbf$q&Jg>ZkY8%DTz0+tG}x*) zz~hbj0&GHQj(_?|30e=W=^G?pwr$YubFOb%w0jHk;{F%6a|^+)Z(Hc9s3rs~RUuEU zX7OUZ@&iR7>VbN=bXZq%FM4s$T`iDGh2T0+CZG?w&gFN)>C_gh_jV-Zw<7Lwg>J{; zAY(c+(|8r9F#c<7rNPSIZ11B-hyg3ZO|A**j%?z$c!J5C1OF^MzwPS11}hfE88Qfh zt#L_%{eijC9`+NBa*2DXzbh)fbw(vZU{U1`R-Sp}*cow>aTt1$Y+I8Hz{bk+0bwZ9 zPX~`>=oTLyuT~%xbQ9%46$?CUk#^ntE*aL57+IzET^KSn;q&o_>G!N2+?5bqV=OXW zCD`3!mxWpM5Mz{2KW%9(%CAYF5{^VSTCu4T-zda=ls;OYQR^v=Enlcyjl zrZt@=F7cEfInF(xy?9ZKN0#e)lBdw0=;sY^yUV=v1YJ6((e<;6s&2;nWX~Pq^E5XB z=ur&X=JePPi;aY;%?O^A zXKNFIw0d~QVTE|T+=j?$+c;#d3|iWJVAwKU2q-*&%#o;2ADqYyjoI%A)J@!wWuTqz zFG!bf(Nt~%dQb&=#}{UvDf=G3c=0#lshw@c>*8t8{F4-P&F|St(OmEz;?RbZ`HRb^ z9*LFCo^+t@MFZ&D2O7R6cTClw7WT{n0LzeD+DP||J_@@e9@VVob!aK?n5OvSeB}AF3KHJ#C8yaU~_mAU)27&PKYRF*kSCD zB?giKEMUr3nao^!g^JqC`WcjTP>Mi>mO*SORh#KtB!(KZ+a8PR&-{b@JLu-RxiV)D z_*XYA;}cfi;S%wn=X{;WJ#6Twg45tiB|Zntx)#)=mP$5#fqEGs3$zhP#czyidWc1Y zZ!**~mQ+Ky&KlMWse*3!A4t{bWl4b;_f6uXi<+u7zcfDkGd4hA`nuTC@e@`;%J4~e z1}m0!zX1u$POY53!LFEZisJ%IgA@1tmb4=tx#@!!+K(!a{ecLzMA7IERSAiNT3_+&siHE?M zZvl{QYQ}#ijWv&frYJOkBv}Ga^z1Vm00;}5O}#AHnh%ILOQ%oX<9jbnoPC^g)uc_| z68*`W84DyT<-S9{C_?v~rvWWk|Kli8^S|vNP4Tc%h~e#z|7?Q0mr=psEJxiRU+FS4 z*`ZbiST`NrZlX$j#@l8yB^gyL1%i^1ohl-4gT=%v)5Ng%8!WF)wFF~J&di7^_C~Yo zfKCntBhT43-k05=k#w z%1g~LDUPx%^?Pqp)oW(|P zv{dXBGw_`$+|@C8Sut5d&r%Vn<%EHpMlph9xTZQD7;kq@de4N#Go-mee`!&zvlxUz zjOinD=D|)OFYR~+;Yv?IAhlAW$gA%UC8*A^D~KL+cZQ?n0U~5xy+p^G)Qv&E((@e` z_1g}qzEFmRTCse(6=Wn<=x!m5FgndX-2SE5U|%4AK)`;7$t+cb|F!Nh*cr#AQ`gnD?+CS)D-JfT4Y z4EabsbmqogY-q!^v~aPgC`o-CQJ*CBm9Rg|bT-RdA?-72%ud~Xm0iJGTws=}&0keg z3npeoJ%D>z1v=>i3?}a;NzHt4BkT@_D z28qqe@bll(1sqb)Yd?r!{fa)syJS3HWkd^fu1IZHiSK(EX*(qeI6WAlo4khakagq5 zjN%LJCZe2ISiT^usEBA3Ej@J)`4hWloH_2LzB)F&KkgEtG3L8|+h6zD2$?1O&BjSm zf3Ot5TaN2`Tl$-Foqa_ad=#rJTe&riKBOfzp;*ZK2SLjHG*w&M=9vObo%zkYnu425U|5~V zu2gp}D1pp${-T~R?%Z!ZP4eyP{GhDZ8Jj$;9hEgn@R51eV4XFfX_Srhh2K9A=&z`z zs#$lrx93ug9DdEKdvUYZrp4d_*XmwCI{Nm2UJ(qMz$>0y;JUT-9Yo9AmiRU=kpBI$ zW=&f%T>%jKjieG7>_-B-EsziU3IZZMx8cm5Y-l~(j7VPvGT$NeJ}eJQ=?Q1KHtA0EZi~~@b;ta_ zL+4o`(7+RNk@d?a6>&$lQ^7KOse-8`*Cb$yqk=XA<^VPzn^2Fby?3Z}M<6VGypQDh5HD;0L$q|VGP)OW=2k3J z1e1!1L3-so+dQo<4Q)U!{r9u&m7CMBPd3@lhNg+pym7~YGNeVBo~AP{I*99$08$%N z#WB|gHWj5B$)@z{k&44Gh7~~tS-d1~r!2puR8r2JK29+z_M0i&X^nGU%b{>E%+J9QP?LldE7J zN~Chw{~);s{YyZX#_r_E@W5oeUY>f?5 z43BtSlz7C_3J`87{58l(u;HY5#k?;cc|AwmRVZApcXo+(KzbOuJ5WQqNCPL{N_ztn z-gIfx^3*NJtMGn@#yQNYS)8Kn8LDrMAP%$UGl(N43Lr~ILg=y9JPn5rS+aMjMP7J( z^wds&VCkITOyFxX&g0UnWuZNh$IoiVP;NKYSSxM#!dBqz>Mj5Nja=PVg72J+|7F7V z52^U3?0O_|VSW7N>aNrRG|=a}y3u)HRsfnx#WO5pN?-IvBdu8H`3k#peh$-h0m*RI zuv44cB!~>12%b}CD3qmLoDq{3U9$VBdH3?b>2F4jZtvck<008}*Yw;}GU4IHMw)e& zQPSJjH-*c$HQjweYa*XqL7@7Fo*k3~Xp#zJqa!azC|t`%H`|Eehp}!x!LG(Ie~d|K zjd>yEDl1ZNgRB|1WG>kf!p^)Qn6Ee?2Znqusrf|8mNB)4zYe)Li9U&%&^ z@441p+VDutGsYcxfCTF_%wpVvNT-@@E2f#Sh44+I9h+ZqSHZnmzcoF zDXnD#+t-DIT^qjBNwnE~+2s7tfjCP9_@DQl?+}B$_enA%$hsq*jHwg1WLZr^D^OB; zSLpFt{)l%t3&YUP@FV`KM>%oA@^Fdgv%8Wt$1S`@%{^c1f4Ci>pUj_5mpS}H^m)1~ zq#7GS3MuyNg~5&I^!sjgM)0u5dmOE|{Q@IF(B(UJki2@d?9nnCb?-RJYDyo{zAnQ4 zM`%;H-DKigJ!X!4jxfF4aDxJZ&DWEVxMYapni8gOyq{}5Qm*NKa(tL{C)9}Nd z@-q)K!Mm!tV7SFx7?kY1KFY2TOhebgfLzSw?v~U&B0I~x#@UDT{G9cZ4C2VV%IvFM znMCFP<|`FXR{w8&vv#{6wG8)~pC#$14f)En7CqkcnE1IU%oHx-`X?4mHI?tAe~|Vr zA8kjsTr)cKve$b6ZKDv9E)=*dt~m&V;WzdE2ST!}dyh3)DSeq%Xzg?D&P=~V666ey znl#2&mvzckb5BUe_fw@hjCJEjsby+bvNi@%F}+?|N~sxQ?3^gHXv9zQwuy+t%A&!t zMC_X%9x8;H%7%ri$H zH6VojkX3$2O8@BLOq=L_8)UYtsi%3S?Ap{NKS|9 zQ$8fU_aox(=-jg-G@aei78H55aa}eSiDmba#rPa@7<+T^Eie=~5NhnJulc~n^CU)3 znM~ki;0W?PoVUo;Dr}SFbdh)G{huV4oPInZY5`8?t(OOYn5wC#gdMYG8Y^&FE*Aa4 z`jg9E4J8#jVjrzdU)nvDC=|~8t9eKV6;YYkr2B+PEnY09Iwn6SN=`?}vQ)e!Q%UG` z73vUU3ta=MtakEaG%4-L&I7G|@?#(j_JK}Zms9wAi{~B-^xoz^?;PI{)JvZP8ga7& zF^4sbAbW#|69s<*VfO6la(EU&vZ=q>ZD6eQtmgoCaD)Qhm9gFGdwhBcw1|(p_9x~b zk_=P5#bP`Qh@)_68DcNHjEJVo3v@s0eZ#JIjqb7A%_|22@M$?ElSHF*+f3xy7-8B) zwX-FQijK@k`obD0DdT1zz=Svv=$Mo!fRn+$S@;m`Z4*X|Hj0~>!J=Dw z!P|Agago<2d^Og|Aeg|GX+3=Kprs6&YyZGUWPN^>2^`031P>$_`baJ5JanHOag6qX zIyWr4rZWfNLl8l>HYy@d6ZR3uOD}b(>Kl8m=d3)yR!0DKv@pLR4l$i3Dh;qJxudGh z(^M4IjzFLrIFAEWPc?&{O%_JSTp~^|QYG*v5U9Cx!Cjl*FSAral3#o>n%WVKya5GioEJ-rYqyfE7ptmnGKjza5ui3 zPUsxhugx6;UZV{El&ghuVuHZJGPyY_b76kx9)kQR(k&=@lRp6sLp2AR=$r#WI2Uf- zXO_A@J?bD^J~LGsaLu}vbg?#Wn121J&0+f+_G`VCdx4_<1f5gBVoCHEm7OX+k^-44 zpDXM>p&k5HOwdxzJo2Ss_cVAxQ^m`!T+m{1XG!O?FL7dAZJG1rE{;lU^~&=G67^9X z9|1&uhL1nOr;yl384y<8{YH;)uyUHR`bCa8miN+7kzKm=whYd7Hpo;qQTS%IvhA^K ze`i%cv+~Gk6Lc$-2!U$+zC@zdJP5o&`Fs+9Jv|W^9Xz~Tq&;7^(|3t( z|A=Q)G9j`6(!^pG`DgzH>Nz=(=>2HB@m(V?pbgOrtz@}}I)WdhhTZ^-hbJ>Cw@d&l z^}Zz)Kch0{`UJo#W1V-dP4Mep0-CRt3)+wu8Z?%NU92iL7$ZSsPH675vJo7%)hs87 zb84_7qx80daVDce#j0s6X^xI$DqN ziz#hWt%uNV1<_?}c1}m)eo~yKvu0Vfg)Gkon>df*sWM!O_%jwg3YnEWgoJwGeMd{_6Eif`Y0wF)owJm8`w%(CBX_UG68*w}P zUA(?5l_V`Q`$}4QfXMD+Gi)zUh`Kx1yqB)(IPhaF`FA{dE4>~}nxi3cw&IM07uWY@ zZvcMd@*^vs1UoM=@el|`0w&UT5(s6z&SXbZG;dcCD_E*h1?edH+uSqC#0Hmo5z>@3 zxaRAo;I)Pm5Agj_Iho&tK%4$)ww{}U#6WFqoZKQ_UZ>gVpE8ZlBS`#E7*v$iry5w7 zt`r&Qcl`fpYsyUdgw@hR{Ip!szvD6UOTZ=N1ALiR@B8dTmKILb*s>?O z*S3?_{D{oQfuN_sN_0jp5Jn;5mM%gQF{9iAU~s!TPkR)#%A9StY;en-nH&cJA`peb z2LNBx9pP)aht65&0rsf3u^>s7HQU{4mU$tyx1Xj3hizaVBWe~f>lB%!;@@`1>SPwz zjmq3{vZ;~A5vVV-ZSu7o%~2YD>0PeB)wq6{bwr7O`Q9EqY1i*EC@|X(d(-2&SNchd z6wZ;(`YMg7$<$VOhNwhJX_=)BfJAbW&R`o9c58MN^;0b+pktPt3sCxhI!08Y=SucEd?EtUj@l?-QaN3o^EP8Tm20L6GN#N|AzG~sVduj)dBu(k&3>5up=OvGJ)Q$4`<6~aaclALH~N^U=N-HB zAu}?T19CGFX@T42uN7aeFT-$z_7l{&!^9k|V(QD1Y+<D5KA`Du^Zk2ST# zm_pp{WNk{)Q$^t`rd(60ua2PfM<0WWZk6SB1TfKD|D;{OiyljvTSGT{f9LyV+2sPK zOsIaDxr|~Kc>q&065lzWJeR;*xA&JhDaLj?F0P=A>g@`Y3#qW%JfNq;lmSvQdht#z zod>qvBd6R&$=vIyRZog~?Ac|i<*%&-Ep#VYFg2# zA!uQ$*c}6WFfE#UVRMUP!xW9bfEbnzV;H^$0i)N2gbp0ENw zvSlzEwTs0W+&e8hbU1a~m<(Tr64RoXXn|bl%@Nhw29OMbeHsW`=n2Ex(V32Qb9Rhq zNUrP>Dho-QV%4w@pDP{kF8ym-8_b0n$59S#4)0fuDP2&1VuX&ahmyRz6JP#9t-Pl+ zV()I>2he-0TLZ?-NW?ZSnG2H079W?a zLt$WGzfi9qBnuuRk?XU9YM#hQEDx5IDT}Wp6ng2b4ZBrtu=a@Nu$aCS$+FS2VjtZ? zfajmbeAvpz_Fg*VDF=3lbg;%R&=bxxA1Z{a?xYVu3BeMh*uESvk6+l0(euy$(zF}$06ypf8gKf!Izno zZ_!iTfBz&=6SIfC4uq1UUs%Q=Uhu~0!NF-CdU!FWImX9|pfVaxVZ(MUpagF8Q;@

EvrFXFVyI_Gmg9(}EQHR39Dv7AJ>gF5 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

3jdfqGy=%EtD99KWRD07qF9qRK%9(nyK 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

6e08ZRFHs$O4c}2wl^6ifNoM70F_OSHO0nEm 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 STyVJU>szh09Tj(LAOG2cxRf&h literal 0 HcmV?d00001 diff --git a/drive/snippets/drive_v2/src/main/java/UploadBasic.java b/drive/snippets/drive_v2/src/main/java/UploadBasic.java new file mode 100644 index 00000000..22732967 --- /dev/null +++ b/drive/snippets/drive_v2/src/main/java/UploadBasic.java @@ -0,0 +1,71 @@ +// Copyright 2018 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// [START drive_upload_basic] + +import com.google.api.client.http.FileContent; +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.drive.Drive; +import com.google.api.services.drive.DriveScopes; +import com.google.api.services.drive.model.File; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; + +import java.io.IOException; +import java.util.Arrays; + +/* Class to demonstrate use of Drive insert file API */ +public class UploadBasic { + + /** + * Upload new file. + * @return Inserted file metadata if successful, {@code null} otherwise. + * @throws IOException if service account credentials file not found. + */ + private static File uploadBasic() throws IOException{ + // Load pre-authorized user credentials from the environment. + // TODO(developer) - See https://developers.google.com/identity for + // guides on implementing OAuth2 for your application. + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault().createScoped(Arrays.asList(DriveScopes.DRIVE_FILE)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + + // Build a new authorized API client service. + Drive service = new Drive.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Drive samples") + .build(); + // Upload file photo.jpg on drive. + File fileMetadata = new File(); + fileMetadata.setTitle("photo.jpg"); + // File's content. + java.io.File filePath = new java.io.File("files/photo.jpg"); + // Specify media type and file-path for file. + FileContent mediaContent = new FileContent("image/jpeg", filePath); + try { + File file = service.files().insert(fileMetadata, mediaContent) + .setFields("id") + .execute(); + System.out.println("File ID: " + file.getId()); + return file; + } catch (IOException e) { + System.out.println("An error occurred: " + e); + return null; + } + } +} +// [END drive_upload_basic] From c6e7cdb1bfc7d60ab0d2f97ee05d7b8080529036 Mon Sep 17 00:00:00 2001 From: Cameron Gregor Date: Tue, 1 Feb 2022 03:55:16 +1100 Subject: [PATCH 036/262] fix typos in GmailQuickstart class comment (#166) Just noticed these typos whist doing the quickstart --- gmail/quickstart/src/main/java/GmailQuickstart.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gmail/quickstart/src/main/java/GmailQuickstart.java b/gmail/quickstart/src/main/java/GmailQuickstart.java index f6d1e569..650ba0b7 100644 --- a/gmail/quickstart/src/main/java/GmailQuickstart.java +++ b/gmail/quickstart/src/main/java/GmailQuickstart.java @@ -36,7 +36,7 @@ import java.util.Collections; import java.util.List; -/* class to demonstarte use of Gmail list lalels API */ +/* class to demonstrate use of Gmail list labels API */ public class GmailQuickstart { /** Application name. */ private static final String APPLICATION_NAME = "Gmail API Java Quickstart"; From ba566cabae6c666e326654fbbf6e6fc3a18e8255 Mon Sep 17 00:00:00 2001 From: Rajesh Mudaliyar Date: Mon, 31 Jan 2022 09:05:19 -0800 Subject: [PATCH 037/262] Create Draft gmail snippet (#164) * Create Draft gmail snippet Co-authored-by: sanjuktaghosh7 Co-authored-by: Manvendra-P-Singh --- gmail/snippets/src/main/java/CreateDraft.java | 103 ++++++++++++++++++ 1 file changed, 103 insertions(+) create mode 100644 gmail/snippets/src/main/java/CreateDraft.java diff --git a/gmail/snippets/src/main/java/CreateDraft.java b/gmail/snippets/src/main/java/CreateDraft.java new file mode 100644 index 00000000..411271cd --- /dev/null +++ b/gmail/snippets/src/main/java/CreateDraft.java @@ -0,0 +1,103 @@ +// Copyright 2021 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + + +// [START gmail_create_draft] +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.gmail.Gmail; +import com.google.api.services.gmail.GmailScopes; +import com.google.api.services.gmail.model.Draft; +import com.google.api.services.gmail.model.Message; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; +import org.apache.commons.codec.binary.Base64; + +import javax.mail.MessagingException; +import javax.mail.Session; +import javax.mail.internet.InternetAddress; +import javax.mail.internet.MimeMessage; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.util.Collections; +import java.util.Properties; + +/* Class to demonstrate the use of Gmail Create Draft API */ +public class CreateDraft { + /** + * Create a draft email. + * + * @param fromEmailAddress - Email address to appear in the from: header + * @param toEmailAddress - Email address of the recipient + * @return the created draft + * @throws MessagingException + * @throws IOException + */ + public static Draft createDraftMessage(String fromEmailAddress, + String toEmailAddress) + throws MessagingException, IOException { + // Load pre-authorized user credentials from the environment. + // TODO(developer) - See https://developers.google.com/identity for + // guides on implementing OAuth2 for your application. + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault().createScoped(Collections.singletonList(GmailScopes.GMAIL_COMPOSE)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + + // Create the gmail API client + Gmail service = new Gmail.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Gmail samples") + .build(); + + // Create the email content + String messageSubject = "Test message"; + String bodyText = "lorem ipsum."; + + // Encode as MIME message + Properties props = new Properties(); + Session session = Session.getDefaultInstance(props, null); + MimeMessage email = new MimeMessage(session); + email.setFrom(new InternetAddress(fromEmailAddress)); + email.addRecipient(javax.mail.Message.RecipientType.TO, + new InternetAddress(toEmailAddress)); + email.setSubject(messageSubject); + email.setText(bodyText); + + // Encode and wrap the MIME message into a gmail message + ByteArrayOutputStream buffer = new ByteArrayOutputStream(); + email.writeTo(buffer); + byte[] rawMessageBytes = buffer.toByteArray(); + String encodedEmail = Base64.encodeBase64URLSafeString(rawMessageBytes); + Message message = new Message(); + message.setRaw(encodedEmail); + + try { + // Create the draft message + Draft draft = new Draft(); + draft.setMessage(message); + draft = service.users().drafts().create("me", draft).execute(); + System.out.println("Draft id: " + draft.getId()); + System.out.println(draft.toPrettyString()); + return draft; + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + System.err.println("Unable to create draft: " + e.getDetails()); + throw e; + } + } +} +// [END gmail_create_draft] \ No newline at end of file From c3706625fe079eb3b69b424d3a020798f1206688 Mon Sep 17 00:00:00 2001 From: Rajesh Mudaliyar Date: Mon, 31 Jan 2022 09:17:00 -0800 Subject: [PATCH 038/262] Added file MoveFileToFolder for moving file in folder use-case (#163) * Added file MoveFileToFolder for moving file in folder use-case. Co-authored-by: sanjuktaghosh7 Co-authored-by: Manvendra-P-Singh Co-authored-by: Steve Bazyl --- .../src/main/java/MoveFileToFolder.java | 85 +++++++++++++++++++ 1 file changed, 85 insertions(+) create mode 100644 drive/snippets/drive_v2/src/main/java/MoveFileToFolder.java diff --git a/drive/snippets/drive_v2/src/main/java/MoveFileToFolder.java b/drive/snippets/drive_v2/src/main/java/MoveFileToFolder.java new file mode 100644 index 00000000..c46e45ab --- /dev/null +++ b/drive/snippets/drive_v2/src/main/java/MoveFileToFolder.java @@ -0,0 +1,85 @@ +// Copyright 2018 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// [START drive_move_file_to_folder] + + +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.FileContent; +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.drive.Drive; +import com.google.api.services.drive.DriveScopes; +import com.google.api.services.drive.model.File; +import com.google.api.services.drive.model.ParentReference; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +/* Class to demonstrate use case for moving file to folder.*/ +public class MoveFileToFolder { + + + /** + * @param realFileId Id of file to be moved. + * @param realFolderId Id of folder where the fill will be moved. + * @return list of parent ids for the file. + * */ + private static List moveFileToFolder(String fileId, String folderId) + throws IOException { + /* Load pre-authorized user credentials from the environment. + TODO(developer) - See https://developers.google.com/identity for + guides on implementing OAuth2 for your application.*/ + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault().createScoped(Arrays.asList(DriveScopes.DRIVE_FILE)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + // Build a new authorized API client service. + Drive service = new Drive.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Drive samples") + .build(); + + // Retrieve the existing parents to remove + File file = service.files().get(fileId) + .setFields("parents") + .execute(); + String parentIds = file.getParents().map(ParentReference::getId); + String previousParents = String.join(",", parentIds); + try { + // Move the file to the new folder + file = service.files().update(fileId, null) + .setAddParents(folderId) + .setRemoveParents(previousParents) + .setFields("id, parents") + .execute(); + + List parents = new ArrayList(); + for (ParentReference parent : file.getParents()) { + parents.add(parent.getId()); + } + return parents; + }catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + System.err.println("Unable to move file: " + e.getDetails()); + throw e; + } + } +} +// [END drive_move_file_to_folder] From 5e9e7b8c3f6eba00d78ab5ddf7a3d7bfd38dd6d8 Mon Sep 17 00:00:00 2001 From: Rajesh Mudaliyar Date: Wed, 2 Feb 2022 15:34:57 -0800 Subject: [PATCH 039/262] Drive touch file (#167) * git-on-borg files of gmail-api-snippets * Update build.gradle test12 * Update build.gradle * Added file TouchFile for creating file's touch file use-case. Co-authored-by: sanjuktaghosh7 Co-authored-by: Manvendra-P-Singh --- .../drive_v2/src/main/java/TouchFile.java | 78 +++++++++++++++++++ 1 file changed, 78 insertions(+) create mode 100644 drive/snippets/drive_v2/src/main/java/TouchFile.java diff --git a/drive/snippets/drive_v2/src/main/java/TouchFile.java b/drive/snippets/drive_v2/src/main/java/TouchFile.java new file mode 100644 index 00000000..4a9e56e0 --- /dev/null +++ b/drive/snippets/drive_v2/src/main/java/TouchFile.java @@ -0,0 +1,78 @@ +// Copyright 2018 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// [START drive_touch_file] + +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.client.util.DateTime; +import com.google.api.services.drive.Drive; +import com.google.api.services.drive.DriveScopes; +import com.google.api.services.drive.model.File; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; + +import java.io.IOException; +import java.util.Arrays; + +/* Class to demonstrate use-case for touch file */ +public class TouchFile { + + + /** + * @param realFileId Id of file to be modified. + * @param realTimestamp Timestamp in miliseconds. + * @return long file's latest modification date value. + * @throws IOException if service account credentials file not found. + * */ + private static long touchFile(String realFileId, long realTimestamp) + throws IOException { + /*Load pre-authorized user credentials from the environment. + TODO(developer) - See https://developers.google.com/identity for + guides on implementing OAuth2 for your application.*/ + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault().createScoped(Arrays.asList(DriveScopes.DRIVE_FILE)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + + // Build a new authorized API client service. + Drive service = new Drive.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Drive samples") + .build(); + String fileId = "1sTWaJ_j7PkjzaBWtNc3IzovK5hQf21FbOw9yLeeLPNQ"; + File fileMetadata = new File(); + fileMetadata.setModifiedDate(new DateTime(System.currentTimeMillis())); + + fileId = realFileId; + fileMetadata.setModifiedDate(new DateTime(realTimestamp)); + + try { + File file = service.files().update(fileId, fileMetadata) + .setSetModifiedDate(true) + .setFields("id, modifiedDate") + .execute(); + System.out.println("Modified time: " + file.getModifiedDate()); + return file.getModifiedDate().getValue(); + }catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + System.err.println("Unable to move file: " + e.getDetails()); + throw e; + } + } + +} +// [END drive_touch_file] From d225911103ce5a6acf657ff4783cecb730d2ef56 Mon Sep 17 00:00:00 2001 From: Rajesh Mudaliyar Date: Tue, 8 Feb 2022 07:38:16 -0800 Subject: [PATCH 040/262] Send message gmail snippet (#169) * git-on-borg files of gmail-api-snippets * Update build.gradle test12 * Update build.gradle * Send message gmail snippet Co-authored-by: sanjuktaghosh7 Co-authored-by: Manvendra-P-Singh --- gmail/snippets/src/main/java/SendMessage.java | 101 ++++++++++++++++++ 1 file changed, 101 insertions(+) create mode 100644 gmail/snippets/src/main/java/SendMessage.java diff --git a/gmail/snippets/src/main/java/SendMessage.java b/gmail/snippets/src/main/java/SendMessage.java new file mode 100644 index 00000000..204fc5d2 --- /dev/null +++ b/gmail/snippets/src/main/java/SendMessage.java @@ -0,0 +1,101 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + + +// [START gmail_send_message] +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.gmail.GmailScopes; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; +import org.apache.commons.codec.binary.Base64; +import com.google.api.services.gmail.Gmail; +import com.google.api.services.gmail.model.Message; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.util.Collections; +import java.util.Properties; + +import javax.mail.MessagingException; +import javax.mail.Session; +import javax.mail.internet.InternetAddress; +import javax.mail.internet.MimeMessage; + +/* Class to demonstrate the use of Gmail Send Message API */ +public class SendMessage { + /** + * Send an email from the user's mailbox to its recipient. + * + * @param fromEmailAddress - Email address to appear in the from: header + * @param toEmailAddress - Email address of the recipient + * @return the sent message + * @throws MessagingException - if a wrongly formatted address is encountered. + * @throws IOException - if service account credentials file not found. + */ + public static Message sendEmail(String fromEmailAddress, + String toEmailAddress) + throws MessagingException, IOException { + // Load pre-authorized user credentials from the environment. + // TODO(developer) - See https://developers.google.com/identity for + // guides on implementing OAuth2 for your application. + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault().createScoped(Collections.singletonList(GmailScopes.GMAIL_SEND)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + + // Create the gmail API client + Gmail service = new Gmail.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Gmail samples") + .build(); + + // Create the email content + String messageSubject = "Test message"; + String bodyText = "lorem ipsum."; + + // Encode as MIME message + Properties props = new Properties(); + Session session = Session.getDefaultInstance(props, null); + MimeMessage email = new MimeMessage(session); + email.setFrom(new InternetAddress(fromEmailAddress)); + email.addRecipient(javax.mail.Message.RecipientType.TO, + new InternetAddress(toEmailAddress)); + email.setSubject(messageSubject); + email.setText(bodyText); + + // Encode and wrap the MIME message into a gmail message + ByteArrayOutputStream buffer = new ByteArrayOutputStream(); + email.writeTo(buffer); + byte[] rawMessageBytes = buffer.toByteArray(); + String encodedEmail = Base64.encodeBase64URLSafeString(rawMessageBytes); + Message message = new Message(); + message.setRaw(encodedEmail); + + try { + // Create send message + message = service.users().messages().send("me", message).execute(); + System.out.println("Message id: " + message.getId()); + System.out.println(message.toPrettyString()); + return message; + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + System.err.println("Unable to send message: " + e.getDetails()); + throw e; + } + } +} +// [END gmail_send_message] \ No newline at end of file From 3b5f480d6e04b1aee898ae05709fe14ee5ce4e1c Mon Sep 17 00:00:00 2001 From: Rajesh Mudaliyar Date: Tue, 8 Feb 2022 07:38:48 -0800 Subject: [PATCH 041/262] Gmail create draft attach (#171) * git-on-borg files of gmail-api-snippets * Update build.gradle test12 * Update build.gradle * Create Draft with attachment gmail snippet Co-authored-by: sanjuktaghosh7 Co-authored-by: Manvendra-P-Singh --- .../main/java/CreateDraftWithAttachment.java | 122 ++++++++++++++++++ 1 file changed, 122 insertions(+) create mode 100644 gmail/snippets/src/main/java/CreateDraftWithAttachment.java diff --git a/gmail/snippets/src/main/java/CreateDraftWithAttachment.java b/gmail/snippets/src/main/java/CreateDraftWithAttachment.java new file mode 100644 index 00000000..bf2d8247 --- /dev/null +++ b/gmail/snippets/src/main/java/CreateDraftWithAttachment.java @@ -0,0 +1,122 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + + +// [START gmail_create_draft_with_attachment] +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.gmail.Gmail; +import com.google.api.services.gmail.GmailScopes; +import com.google.api.services.gmail.model.Draft; +import com.google.api.services.gmail.model.Message; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; +import org.apache.commons.codec.binary.Base64; + +import javax.activation.DataHandler; +import javax.activation.DataSource; +import javax.activation.FileDataSource; +import javax.mail.MessagingException; +import javax.mail.Multipart; +import javax.mail.Session; +import javax.mail.internet.InternetAddress; +import javax.mail.internet.MimeBodyPart; +import javax.mail.internet.MimeMessage; +import javax.mail.internet.MimeMultipart; +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.IOException; +import java.util.Collections; +import java.util.Properties; + +/* Class to demonstrate the use of Gmail Create Draft with attachment API */ +public class CreateDraftWithAttachment { + /** + * Create a draft email. + * + * @param fromEmailAddress - Email address to appear in the from: header. + * @param toEmailAddress - Email address of the recipient. + * @param file - Path to the file to be attached. + * @return the created draft + * @throws MessagingException - if a wrongly formatted address is encountered. + * @throws IOException - if service account credentials file not found. + */ + public static Draft createDraftMessageWithAttachment(String fromEmailAddress, + String toEmailAddress, + File file) + throws MessagingException, IOException { + // Load pre-authorized user credentials from the environment. + // TODO(developer) - See https://developers.google.com/identity for + // guides on implementing OAuth2 for your application. + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault().createScoped(Collections.singletonList(GmailScopes.GMAIL_COMPOSE)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + + // Create the gmail API client + Gmail service = new Gmail.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Gmail samples") + .build(); + + // Create the email content + String messageSubject = "Test message"; + String bodyText = "lorem ipsum."; + + // Encode as MIME message + Properties props = new Properties(); + Session session = Session.getDefaultInstance(props, null); + MimeMessage email = new MimeMessage(session); + email.setFrom(new InternetAddress(fromEmailAddress)); + email.addRecipient(javax.mail.Message.RecipientType.TO, + new InternetAddress(toEmailAddress)); + email.setSubject(messageSubject); + + MimeBodyPart mimeBodyPart = new MimeBodyPart(); + mimeBodyPart.setContent(bodyText, "text/plain"); + Multipart multipart = new MimeMultipart(); + multipart.addBodyPart(mimeBodyPart); + mimeBodyPart = new MimeBodyPart(); + DataSource source = new FileDataSource(file); + mimeBodyPart.setDataHandler(new DataHandler(source)); + mimeBodyPart.setFileName(file.getName()); + multipart.addBodyPart(mimeBodyPart); + email.setContent(multipart); + + // Encode and wrap the MIME message into a gmail message + ByteArrayOutputStream buffer = new ByteArrayOutputStream(); + email.writeTo(buffer); + byte[] rawMessageBytes = buffer.toByteArray(); + String encodedEmail = Base64.encodeBase64URLSafeString(rawMessageBytes); + Message message = new Message(); + message.setRaw(encodedEmail); + + try { + // Create the draft message + Draft draft = new Draft(); + draft.setMessage(message); + draft = service.users().drafts().create("me", draft).execute(); + System.out.println("Draft id: " + draft.getId()); + System.out.println(draft.toPrettyString()); + return draft; + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + System.err.println("Unable to create draft: " + e.getDetails()); + throw e; + } + } +} +// [END gmail_create_draft_with_attachment] \ No newline at end of file From f9c684dc381ce402eaf4892d25edb854559b3d16 Mon Sep 17 00:00:00 2001 From: Rajesh Mudaliyar Date: Tue, 8 Feb 2022 07:39:16 -0800 Subject: [PATCH 042/262] Create SmimeInfo gmail snippet (#173) * git-on-borg files of gmail-api-snippets * Update build.gradle test12 * Update build.gradle * Create SmimeInfo gmail snippet Co-authored-by: sanjuktaghosh7 Co-authored-by: Manvendra-P-Singh --- .../src/main/java/CreateSmimeInfo.java | 63 +++++++++++++++++++ 1 file changed, 63 insertions(+) create mode 100644 gmail/snippets/src/main/java/CreateSmimeInfo.java diff --git a/gmail/snippets/src/main/java/CreateSmimeInfo.java b/gmail/snippets/src/main/java/CreateSmimeInfo.java new file mode 100644 index 00000000..5f3b7781 --- /dev/null +++ b/gmail/snippets/src/main/java/CreateSmimeInfo.java @@ -0,0 +1,63 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + + +// [START gmail_create_smime_info] +import com.google.api.services.gmail.model.SmimeInfo; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.util.Base64; + +/* Class to demonstrate the use of Gmail Create SmimeInfo API */ +public class CreateSmimeInfo { + /** + * Create an SmimeInfo resource for a certificate from file. + * + * @param filename Name of the file containing the S/MIME certificate. + * @param password Password for the certificate file, or null if the file is not + * password-protected. + * @return An SmimeInfo object with the specified certificate. + */ + public static SmimeInfo createSmimeInfo(String filename, String password) { + SmimeInfo smimeInfo = null; + InputStream in = null; + + try { + File file = new File(filename); + in = new FileInputStream(file); + byte[] fileContent = new byte[(int) file.length()]; + in.read(fileContent); + + smimeInfo = new SmimeInfo(); + smimeInfo.setPkcs12(Base64.getUrlEncoder().encodeToString(fileContent)); + if (password != null && password.length() > 0) { + smimeInfo.setEncryptedKeyPassword(password); + } + } catch (Exception e) { + System.out.printf("An error occured while reading the certificate file: %s\n", e); + } finally { + try { + if (in != null) { + in.close(); + } + } catch (IOException ioe) { + System.out.printf("An error occured while closing the input stream: %s\n", ioe); + } + } + return smimeInfo; + } +} +// [END gmail_create_smime_info] \ No newline at end of file From d2b1d40f64e86ec28f08a4cdc02ff92bfa808ad3 Mon Sep 17 00:00:00 2001 From: Rajesh Mudaliyar Date: Tue, 8 Feb 2022 07:39:50 -0800 Subject: [PATCH 043/262] Drive : Retrieve page token and list of changes (#174) * git-on-borg files of gmail-api-snippets * Update build.gradle test12 * Update build.gradle * Added files FetchStartPageToken, FetchChanges for Changes snippets. Co-authored-by: sanjuktaghosh7 Co-authored-by: Manvendra-P-Singh --- .../drive_v2/src/main/java/FetchChanges.java | 79 +++++++++++++++++++ .../src/main/java/FetchStartPageToken.java | 67 ++++++++++++++++ 2 files changed, 146 insertions(+) create mode 100644 drive/snippets/drive_v2/src/main/java/FetchChanges.java create mode 100644 drive/snippets/drive_v2/src/main/java/FetchStartPageToken.java diff --git a/drive/snippets/drive_v2/src/main/java/FetchChanges.java b/drive/snippets/drive_v2/src/main/java/FetchChanges.java new file mode 100644 index 00000000..69a7fbb3 --- /dev/null +++ b/drive/snippets/drive_v2/src/main/java/FetchChanges.java @@ -0,0 +1,79 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// [START drive_fetch_changes] + +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.drive.Drive; +import com.google.api.services.drive.DriveScopes; +import com.google.api.services.drive.model.ChangeList; +import com.google.api.services.drive.model.StartPageToken; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; + +import java.io.IOException; +import java.util.Arrays; + +/* Class to demonstrate use-case of Drive's fetch changes in file. */ +public class FetchChanges { + /** + * Retrieve the list of changes for the currently authenticated user. + * @param savedStartPageToken Last saved start token for this user. + * @return Saved token after last page. + * @throws IOException if file is not found + */ + private static String fetchChanges(String savedStartPageToken) throws IOException { + + /*Load pre-authorized user credentials from the environment. + TODO(developer) - See https://developers.google.com/identity for + guides on implementing OAuth2 for your application.*/ + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault().createScoped(Arrays.asList(DriveScopes.DRIVE_FILE)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + + // Build a new authorized API client service. + Drive service = new Drive.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Drive samples") + .build(); + try { + // Begin with our last saved start token for this user or the + // current token from getStartPageToken() + String pageToken = savedStartPageToken; + while (pageToken != null) { + ChangeList changes = service.changes().list(pageToken) + .execute(); + for (com.google.api.services.drive.model.Change change : changes.getChanges()) { + // Process change + System.out.println("Change found for file: " + change.getFileId()); + } + if (changes.getNewStartPageToken() != null) { + // Last page, save this token for the next polling interval + savedStartPageToken = changes.getNewStartPageToken(); + } + pageToken = changes.getNextPageToken(); + } + + return savedStartPageToken; + }catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + System.err.println("Unable to fetch changes: " + e.getDetails()); + throw e; + } + } +} +// [END drive_fetch_changes] diff --git a/drive/snippets/drive_v2/src/main/java/FetchStartPageToken.java b/drive/snippets/drive_v2/src/main/java/FetchStartPageToken.java new file mode 100644 index 00000000..060cccd7 --- /dev/null +++ b/drive/snippets/drive_v2/src/main/java/FetchStartPageToken.java @@ -0,0 +1,67 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// [START drive_fetch_start_page_token] + +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.drive.Drive; +import com.google.api.services.drive.DriveScopes; +import com.google.api.services.drive.model.ChangeList; +import com.google.api.services.drive.model.StartPageToken; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; + +import java.io.IOException; +import java.util.Arrays; + +/* Class to demonstrate use-case of Drive's fetch start page token */ +public class FetchStartPageToken { + + /** + * Retrieve the start page token for the first time. + * @return Start page token as String. + * @throws IOException if file is not found + */ + private static String fetchStartPageToken() throws IOException { + /*Load pre-authorized user credentials from the environment. + TODO(developer) - See https://developers.google.com/identity for + guides on implementing OAuth2 for your application. */ + + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault().createScoped(Arrays.asList(DriveScopes.DRIVE_FILE)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + + // Build a new authorized API client service. + Drive service = new Drive.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Drive samples") + .build(); + try { + StartPageToken response = service.changes() + .getStartPageToken().execute(); + System.out.println("Start token: " + response.getStartPageToken()); + + return response.getStartPageToken(); + }catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + System.err.println("Unable to fetch start page token: " + e.getDetails()); + throw e; + } + } + +} +// [END drive_fetch_start_page_token] From 25a0b22082da10c35624d30a6d9f3072b86e9262 Mon Sep 17 00:00:00 2001 From: Rajesh Mudaliyar Date: Tue, 8 Feb 2022 07:40:21 -0800 Subject: [PATCH 044/262] Drive : AppData snippets (#172) * git-on-borg files of gmail-api-snippets * Update build.gradle test12 * Update build.gradle * Added files UploadAppData,ListAppData,FetchAppDataFolder for create file,list files and list out appdata folder use-case. Co-authored-by: sanjuktaghosh7 Co-authored-by: Manvendra-P-Singh --- drive/snippets/drive_v2/files/config.json | 3 + .../src/main/java/FetchAppDataFolder.java | 74 +++++++++++++++++ .../drive_v2/src/main/java/ListAppData.java | 80 ++++++++++++++++++ .../drive_v2/src/main/java/UploadAppData.java | 82 +++++++++++++++++++ 4 files changed, 239 insertions(+) create mode 100644 drive/snippets/drive_v2/files/config.json create mode 100644 drive/snippets/drive_v2/src/main/java/FetchAppDataFolder.java create mode 100644 drive/snippets/drive_v2/src/main/java/ListAppData.java create mode 100644 drive/snippets/drive_v2/src/main/java/UploadAppData.java diff --git a/drive/snippets/drive_v2/files/config.json b/drive/snippets/drive_v2/files/config.json new file mode 100644 index 00000000..3d2519ed --- /dev/null +++ b/drive/snippets/drive_v2/files/config.json @@ -0,0 +1,3 @@ +{ + "foo" : "bar" +} \ No newline at end of file diff --git a/drive/snippets/drive_v2/src/main/java/FetchAppDataFolder.java b/drive/snippets/drive_v2/src/main/java/FetchAppDataFolder.java new file mode 100644 index 00000000..9820e21c --- /dev/null +++ b/drive/snippets/drive_v2/src/main/java/FetchAppDataFolder.java @@ -0,0 +1,74 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// [START drive_fetch_appdata_folder] + +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.FileContent; +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.drive.Drive; +import com.google.api.services.drive.DriveScopes; +import com.google.api.services.drive.model.File; +import com.google.api.services.drive.model.FileList; +import com.google.api.services.drive.model.ParentReference; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; + +import java.io.IOException; +import java.security.GeneralSecurityException; +import java.util.Arrays; +import java.util.Collections; + +/** Class to demonstrate use-case of list out application data folder and prints folder Id. */ +public class FetchAppDataFolder { + + /** + * Fetches appDataFolder and prints it's folder id. + * @return Application data folder's ID. + */ + public String fetchAppDataFolder() throws IOException { + /*Load pre-authorized user credentials from the environment. + TODO(developer) - See https://developers.google.com/identity for + guides on implementing OAuth2 for your application.*/ + GoogleCredentials credentials = null; + try { + credentials = GoogleCredentials.getApplicationDefault().createScoped(Arrays.asList(DriveScopes.DRIVE_APPDATA)); + } catch (IOException e) { + e.printStackTrace(); + } + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + + // Build a new authorized API client service. + Drive service = new Drive.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Drive samples") + .build(); + try { + File file = driveService.files().get("appDataFolder") + .setFields("id") + .execute(); + System.out.println("Folder ID: " + file.getId()); + + return file.getId(); + }catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + System.err.println("Unable to fetch appdata folder: " + e.getDetails()); + throw e; + } + } +} +// [END drive_fetch_appdata_folder] diff --git a/drive/snippets/drive_v2/src/main/java/ListAppData.java b/drive/snippets/drive_v2/src/main/java/ListAppData.java new file mode 100644 index 00000000..704eb9b2 --- /dev/null +++ b/drive/snippets/drive_v2/src/main/java/ListAppData.java @@ -0,0 +1,80 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// [START drive_list_appdata] + +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.FileContent; +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.drive.Drive; +import com.google.api.services.drive.DriveScopes; +import com.google.api.services.drive.model.File; +import com.google.api.services.drive.model.FileList; +import com.google.api.services.drive.model.ParentReference; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; + +import java.io.IOException; +import java.security.GeneralSecurityException; +import java.util.Arrays; +import java.util.Collections; + +/** Class to demonstrate use-case of list 10 files in the application data folder. */ +public class ListAppData { + + /** + * list down files in the application data folder. + * @return list of 10 files. + */ + public FileList listAppData() throws IOException { + /*Load pre-authorized user credentials from the environment. + TODO(developer) - See https://developers.google.com/identity for + guides on implementing OAuth2 for your application.*/ + GoogleCredentials credentials = null; + try { + credentials = GoogleCredentials.getApplicationDefault().createScoped(Arrays.asList(DriveScopes.DRIVE_APPDATA)); + } catch (IOException e) { + e.printStackTrace(); + } + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + + // Build a new authorized API client service. + Drive service = new Drive.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Drive samples") + .build(); + try { + FileList files = driveService.files().list() + .setSpaces("appDataFolder") + .setFields("nextPageToken, items(id, title)") + .setMaxResults(10) + .execute(); + for (File file : files.getItems()) { + System.out.printf("Found file: %s (%s)\n", + file.getTitle(), file.getId()); + } + + return files; + }catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + System.err.println("Unable to list files: " + e.getDetails()); + throw e; + } + } + +} +// [END drive_list_appdata] \ No newline at end of file diff --git a/drive/snippets/drive_v2/src/main/java/UploadAppData.java b/drive/snippets/drive_v2/src/main/java/UploadAppData.java new file mode 100644 index 00000000..56d469d7 --- /dev/null +++ b/drive/snippets/drive_v2/src/main/java/UploadAppData.java @@ -0,0 +1,82 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// [START drive_upload_appdata] + +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.FileContent; +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.drive.Drive; +import com.google.api.services.drive.DriveScopes; +import com.google.api.services.drive.model.File; +import com.google.api.services.drive.model.FileList; +import com.google.api.services.drive.model.ParentReference; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; + +import java.io.IOException; +import java.util.Arrays; +import java.util.Collections; + +/** Class to demonstrate use-case of create file in the application data folder. */ +public class UploadAppData { + + /** + * Creates a file in the application data folder. + * @return Created file's Id. + */ + private static String uploadAppData() throws IOException { + /*Load pre-authorized user credentials from the environment. + TODO(developer) - See https://developers.google.com/identity for + guides on implementing OAuth2 for your application.*/ + GoogleCredentials credentials = null; + try { + credentials = GoogleCredentials.getApplicationDefault().createScoped(Arrays.asList(DriveScopes.DRIVE_APPDATA)); + } catch (IOException e) { + e.printStackTrace(); + } + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + + // Build a new authorized API client service. + Drive service = new Drive.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Drive samples") + .build(); + try { + // File's metadata. + File fileMetadata = new File(); + fileMetadata.setTitle("config.json"); + fileMetadata.setParents(Collections.singletonList( + new ParentReference().setId("appDataFolder"))); + java.io.File filePath = new java.io.File("files/config.json"); + // Specify media type and file-path for file. + FileContent mediaContent = new FileContent("application/json", filePath); + File file = service.files().insert(fileMetadata, mediaContent) + .setFields("id") + .execute(); + System.out.println("File ID: " + file.getId()); + + return file.getId(); + }catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + System.err.println("Unable to create file: " + e.getDetails()); + throw e; + } + } + +} +// [END drive_upload_appdata] \ No newline at end of file From 9c1f379696c033eb9ae7f59516a93094fa5a0174 Mon Sep 17 00:00:00 2001 From: Rajesh Mudaliyar Date: Tue, 8 Feb 2022 07:40:49 -0800 Subject: [PATCH 045/262] Send message with attachment gmail snippet (#170) * git-on-borg files of gmail-api-snippets * Update build.gradle test12 * Update build.gradle * Send message with attachment gmail snippet Co-authored-by: sanjuktaghosh7 Co-authored-by: Manvendra-P-Singh --- gmail/snippets/files/photo.jpg | Bin 0 -> 1128108 bytes .../main/java/SendMessageWithAttachment.java | 120 ++++++++++++++++++ 2 files changed, 120 insertions(+) create mode 100644 gmail/snippets/files/photo.jpg create mode 100644 gmail/snippets/src/main/java/SendMessageWithAttachment.java diff --git a/gmail/snippets/files/photo.jpg b/gmail/snippets/files/photo.jpg new file mode 100644 index 0000000000000000000000000000000000000000..98b05d35ee5af0e111177c397029593f553ddeaa GIT binary patch literal 1128108 zcmeGEcUV)+76%IN9Xiq_3KEJ0DM64>6PnaOqV!Nj1p-2l5<*8sic~}Bs0c`h&;%6) z5e2176A+Q&i_!!HrHNp>L0{i<&i9@B-16@|E9}hLYu2n;>o;p=&)z!^KgWJf13Wkk z76X7F02tFhz|XfV#)cupa{yps0w4eYUmqhY%1Bm7x zzCLbZs(X?>&wlmut5j4#s;DcV)sYHf3Mh4DMRg?<0Ek6p|M38#9F_YIuNg1?FK^KVF1!Vfc>`@5U(`IKlTIC82*u8 zOk@0qzmmrCcfWLu(%Amy1?W8cKW!;#{J-RMBp?}S7x(&NP^a@bX{o(ED{=yxo8BMlTo{+93Y4FAS6{ml#0 z<;?#kSN!EO-A|^`Vx?dH(6fQ*bFuO-UYyQVOdqa=g z5CB9*0Dv>;=g-A<061<&x3NciHm&FfKbswcBE$e<@GC>ah-P#lNY7Jty2f5c?&(43 zA3BZ@c{)#_N3b`>9`y5vbX5N6fb?ko=0Qe!UjLEr(6#^YAU*T<#+#nW4B~X@AN~CR z*B_onWfumQ*eVgVG80Mr7$02X)z=z{^E zDrgA0gGA5`bOJ5GC%_4y6?g#L00Mz7APDpZ)4)csAM632fOo)R@BnxUct@`-rT01o zyal(w58zwyCD;c(rq`E(F<=`20bc+abnAQ|2ZR;!9b58;AaTVN`9<=4j%>;dY5>i`$10PX;X!B_Nt1i(Y!63_^I06f5JbnZ1h zq9AYjb3jB_5w|S6`R@fKMa4 z2VmtrC=8c7hN7<$d-Q8E?=gGX`R{c6=g*IB0Kij8*Le*9)<1s!{3Zhc!V7ezUo+|7 z%3m{;e*UZc&$U;~#hGwkjNt6;Ms^lcmPe|1dyAbrrYNrn&}RYoYwkl#_xk<49@6Iu zb1!|y>|HG&wtI5MU+c!6e3s7bq466L=3jC;&-{%(=jbcs-aKPr1UP=TJ+ar8^N$V- z4ETN3f#CP#y#L50fP=sFf5`>@ksk$wf63_)u_*5~q0iLTN+^gZc9JY693!D;NW2SU?q89 zvimV48jU`tpmNp_{(IQ`^3Xp(m+a>JkB$Fy(wlV5A0J9`JGQ3-|I@^I zZ&xCBj`$yq_GG_0I_FGqBl?{4{SQz50}P1X|Dpf?mj%B&qN}<2`0si6t2>gqKE3Av zHv{^iCBBzbatdfUqyqlWc4yBglDdhnEAd?D|Ao>oOTJ{hudkPuIDHo;F7^+q>U&Lp z_e4*+|JDsXVSb~nZuuL)U!zTOCi}bX0i-2v>E`bnNG7=LCB}bfo}^zB|4uh6H^09* zFXG?Kzvs{2&3@a%&|&;HTYCc__Is?O!d!_tS? z-g&QE@&8g|>FY%Y`QNMbeSOXmUEO>LZYSM>+~}3`joZK1O0O!5=qKH&hQ${JN zDy#jQ={-EK2K0gZ<=wHpx%O|^(H;IJ`i1K+?l;!Q{@YOeE!$h*iEgfV-+$#C9ZmX) zIvpfMWo6VJxO=DcAe9tV>G|^e^fz22Vu+j9Z(shS5C1=|{1@-&%gtWxKkJsZ*#GE% z2>cI${~_={1pbG>{}A~99s>Wm^KtW`?>vL)_cg%J6#zwl;`jS@Kuk$q0YK?tO&IBq zoc8D!zjq5qzo#7$ro2uD?l3M!uwDP~MKAnk3&6|Dmcr4(0Ez<;UXXzo{MiPG(r?$8 zz+d#M8U5?eEjJtcKDt6Z{hktJV1O_(Ffr|Q176yD%E!pd#CI5}%e>#hnMK@>UokSZ zfEBJ+*9x_K@kv6-g&f7ke&C>h;GrXuQqnRAWffI56k1*1zz}0(jKx{ut!-@W>>UWM zZs*)Rh@SodfkD9`p<&TiVq)Xs6B5(XGcvQTUB8iCSX5k6T2@Z0xO4Yj{rv|GjSrtb zYisZ5?CS0r8XkE$`fBX;_}h0gvvczc?-!TW);Bh{K5u{7+1-na{@Cw#SoH7Tk^TR~ z#Y>M1!pO+L$g&p~2npT`oR^X5Fp`;1*Mh~_Z@;)=BrCsOYC&Bq8(hiq6V!$Lg8hJm z^4lY8d!hY`?EhY1QU9+Z`zNq}#Wexw1CU?D0D&+tF)%PNF*DJLnU#5uSlL;B5&Pf7 z@r$_ji2EPz;R&5woI~= zf=Fxer*4T1nV!o3T*7Yu;C{$^*|miCuUB7BhW94*Drm`c0RjyCFN5FczQ2I4$iMg` zlh@lztW^O1N_j2zIC2?#cVQPF6FN|W6*l0FeokhxOWF_LH#}UgV#`2U(aSo65Bz~2 zzCSHve!Gjtr@}(&VyG)giV!`1lsJPh4TY-N?&Dgq11Xm`wug~5R&%@D5GS{T7aewJ-AkW#(v z$@bYJq}arNn@kLC+q} zqB5Kdnak4<#uY-FtNnm*g>BOM1uh(Na=b+BG1K!ne=4G-iG(x*76eKxqSH@o`%^hj z=sLHDh;3;}Q&LoCN?3w9&}D@)*$!;Jq+}Sy-_&q?IuBdM=K*5_?l8;`MZ@$XQ_Pw2ol%lO1UtQztgx=x0i8KVjB z6AdFrQ=5s?d_Y-#d?u?{YWvA>7t)g$`BB+aEG*=`!i85VRt7c4vUCOJQ*AjnEEim8 z9VTiYF9cUcOrxC)cJMAGrcM6o%O_jitW{c!UQgqxbqQ>Qjl6qn z89y=)akgC(C?1>P(+NsyL@i@E&S^5f4=u39YCp-ZM3ytE1`|r$<&3ndWb>UE{1dBo zG{J2y&$XCZyKIj@!xq>}OI;H#EKkKX*yvP*r9QPjqV#yvsW8&T7@w$;RiaPv8F|WO z*DQEm+wSMvnX3|w=U->f%O%}TnJDC6=9c7tZ-{x?zHEBeF&GyXR0M=UZVa%h%(hS<^>~m>I}w)nRMY z2kKS?i9CBz1*5u7&b%Lg;hrH6H)wmgopj%-zKM2ex_&peI%j66=5&X>AhV-Y!|llh zpP97F^5zW)q{Fz}!0Q@=^azb)ui)}CdK8{d2Z{{F-ki^wb-E<2v_w4La>hW?UNI*n zukoWJMLj?xbKinop4my8&GjxQ{K~~Lbf3_T(g= zYTo3i^|uoW<5XK=9aO)pPjLNXeA324t|u#m=M8PN}z?~eyOxKc&D$2-*MQC)LOk$-Ar_D57%`P0!k?^UKDqkE}w zTA#F6f|YvGJ0AGuTTbs!oSFHG^38ES@1OVb(F0it*+Vr0zMg4?)B``hiP7Jx?h4r8yt_kuB(+{el%m?-XZ{ITua6`Yq&l>m+h7IL z%b=PH;!6A6X4$I*?Y@=yytzSxKh7IJdlbXrdgWotgM~qcvc-?`ixhu_`o<%eJ-ZvW9w{(8- zNyMp{7q_P~qK;hW7wrEl1%jM_L)Wu=d=7SdsEW;sj6t_LTS}w93bcV@8p1z;zl0zA zy0G3>QcYexi99i-mGhv)>~Nsxi39V};WLLQZ4mF3v;40fB`cod7q;y^ z*TFs2cl0#d<(82&gEaZ}SuWz*3Wkk(phlXit0S*%F%;{_U4pyIq2`&8&^^%09Yzjg zh#y=?;g-B{-=?Rwt1LxnopSD$AYpy0jLq|$wOtUS~z@#2q~=RcP|PmIT8;&mSM_rHq6G*rQotUTr|XgGRcDA-HX<=N|fr+*(ndn zyrI)S_nsKKs+8F9`mV-U=mL7#jPk)zO$CxE_ds)`Nq5$gc0bC4N;G2RqOUP#*QmK3 z$hlZ9L`eF%51Un4y9fE;JdWvB?Lx&ND$?wKDF~GBoOu#Fo@SGJ%o4etW0h(w(CLsq zH-XKKzU`0|AGKt_6S>5sZOsv(q6uOBu>!yAE)-HNl+|wUqdzAO=BjJEN+Tt)+$ z6b1j-UUz+y2FcL56gFZa%hc1yg^M04OH?S%E4+TtuT_iqRO#SQA@;tcB1U5Nlc#Xm z9DaxU_C}>|eFn@W_0GXm2aKxXXIJ)|t$uY&nWIluEQ_7|v&|_eQ<<-i+Hq>)XBDzg z^V!TD{l^n)B#eUP+K;7awnJYqo{R6b^F`Wb--C*B%p_V*f7q9unz57$xSP;sVZ3qoYAh16xIo?Alu+(atFZGh1Y}Ob`X~eZ^ z^;G1AFc$?e1?9iX>%}V(l&A8I)d*1JTtg|^#&O{R|2s9pWdPrHn9)6vR{P-jn9Y&> z2`tj}{D{u-r}M>jkLtT;vz>NWB9(7ejenS+9 zm`f$FV_1bE3YB?j0<%L;(|W4dT1t0PF%zQml9?)@Oq&gTHCOLy9>SmbxPjQDbMfw zr6Pfib(zF#DExIC{axk?i%-{>I@cDWX7f!^S+!C9wIdq%H8*F)$S8!nw+Z}HN>91o z++$C1XPyqFY{E*WX1nA53Ho3nYuT8QrknxHYNWZfZCZJ1+tN&lgDYx$X0Bqj7>TNh z*N(Lrot>BNT5PQ-RY-(y(*gf*q zb-ZXumMjHdsZx-sTNf?3!L9u003(%CavIH$cx z6^cK+(?Cn?!2IP9H<#!bVO*Zrv_GOffr>OE{RE`Z;w1@Z%-$RmBHDlcWLpA7N2X{x zqh;GMYaK;3Mr9=?^BNcP{Vas@g};|a;*LTgG4K-1K}BCJ0RnUN!?v!2rP3|jU+Z%3 z?JgO-aQv_lm3(q|M7je*ELEKpL`i1vtK`_Aj-#-Q zA*L&6k%Gu=yt;%#d6k!6^E<-AptXcQg3k#o=6xX5Y?4wSl)4hgqSb^?vUB62T3FTE;p=LC zLwU71Sp-Tz+4KX>p&YR*MI*srgYpo?@xbnPgmW!KBU?3wA&}RgRW@mzI<+!5{Dwb1 zXUM0EH$8Iv`dmcoBL1x)SC^SQ)MBn&$TVc-q*myxWqIqk`cNhsu1URDAjCZdm*&WG z-h7wcAd1+Y&yA|#HkU@T$act{udNf*i^!y9`~)t#Qw_C^b3+Ftvl))P(Nf2EH$erq zpo*_q9^kBXVswfHY+JNENNP-);I~D&)e~PLK84IcdAYb|=d1UHvi2*jU}rPD%9k`o zFo>g8ZUG?GxV2JGbEdbelU7=MGHyXEeb@4!OX#A*P*_@QSCf#(iuI_3?S{_m$Sl&Q zY%(a{oui?ka2)RV5nfl~(J88Cnt7<~+EXe*_Z5eBrbBGhZQbwVSMmqMtDMN#X)Cye zG)GyoL(lf%I&)Hmr(zTu{mru_K6cubeudKM^pi>q*k(i(kZW$qDN1LlyndB4QkM|% zoFtR3#88hxLa;ROEe+zf{+97xMsTEAyy{`KU^PMX)yUCXvt8}MFz@3y_l)*CVbQzh)^Z8=AFmVZBKl|Z9jT^hv9KS3^4%z1P@ahIvS_K~QVb7Al|JpIMIqC7Z4zV!6YaWAaA#CY$5*;h zbyrLozUInw357eZ;ba(DZnZ6XkrNZL0+D|Ixa7E>Ojr!OztzoGLr^I}nGQvgP z-M@PL(bSvj6~HGf9@8HJ3sPZAZD@_yfdzfjTC~=8*JMA*`1X59Sp%A(-ZI{yE6F8s zGSeb=%B&v#SgFDFGfj~7qj72uA2x z${1M`+wzoO3!0=Bjc4KopEt~fS*Ob|L|RA#v!hAxQEin9>7iK+(aHTemDr&RQPvQ}@w0*PWS7TB0*3Tp_`pqkB0io`;>b;8|!lt3x?50_9HedW8ZR;*?t{PJE`=Z)Pg4m=|>{ ztJ<g|V`<%ec})M(_~yF!S_f92oy?AoX!oMP}ETdVwo4J3G6BRSy`e6yG54J$T}9 z_E^$f#Z!eO|KuhM6EOjc!I9Mt9WIHtjTNiC`FAfqQL%d#*+4q(;0JSygO(L2*4gii zU`0(?R%9}6bvoeR+RAn;+4F>6xveKNb}y0i6#iVSTe8|~vhlsyg0*Y5@lW7ohh1>z z+1t(bI=we@rh^MsXov%12!?>}l|;)t8$pbpm9kx+6IrGmB^AXfbl12P@1^7x*Mm5I z_#huwXJX^in$}nKw)>(JLOz;hY6)boYRUqxT8-@z5tC4jkTae^Z!2(osFz4#ems)gfQGvIc%@At4nD1! z^K4iWm(-*7V}^}sv0P<<|0XR$z6cI)R;b8)n#NLcA{Zf*stQB8AO!SMx5F2^KC3vp z?2yz)>I`sD)PSeX174^d&&U<$EabN5Ltn0o0|Vn#aEO+N-d%(J3i?rsGSPCezE7)n zWW@L9WR~A|dr2ZnT5H+03Ru74cDVW+&e2>kSrUBol7%NUPwo3)KQa2u8ca0;yTIGH z6rAMht8Myt;0p8IxbQQpT=x|On^o!Qk#<5j?hTZ|{A z3^i6tq(O;3TetF_AbVqDgmX@{;9 z{61n98DHeY3@(4PE{xT7T)SJ3O&g9%`g*_eiN!i{Eka16Zqbq^wgS85z{mQ!0R<^? zMYOQ@m60y9o%MOGwpj_#!ZWB%_q*~_SFFVSBT&$?!&>ZDoRi(o+*`TY|KejGR-*_* z+UHVq;d;#nm}_Ff=sS&=<1+D7|Lw@10DB$wy^Up?>mW2^)ncex z;Le!v(%qek>HX`sb(eLO#z+zm`uZ;ssYOK`KLK2AgyMl#lwk20^Q1>Jk=Vj__hjR( z8_xix`LZ$-El_8IoTz9>IP@%^PftzA!lGUx%mot+F@`1jUJQ^dkmHu`_(FXiP2S? zztV~8@fMui8vpDzu9g=&$?P`)-S3UgOy1YegqCE3mY|l3>5;iQ)mckW!Y(`93R-(2 zU^P^9Hn+Bnp%H3RdmqN{7QbT6Cwx0Eu10HF|2e{}%(J}p0fD~0r7XUeha?RwM_fWQ zQuQ;tr0O)+mTh#`TQH1+Ul>I#EQC8tdX``i3Bk^=gfSFD?PB81?HjMV`;hM}ON1gc zqPyDBxUWzm2RvxM000{f0g@jw;RG5Ozdh+MO4WyQDS|9({Dz(c-w=aY_pi;gL@?tH zMa48x;H_V~LHkHF#U`c6=4i}KCq?yXYFsl$h&*=fOt2W9qm0Fy%_kyh z=17Q!S$Sz^BTL_NUMp^72G=v%cKNG_5D6(OTmDE#y;IMR8fhWFd*0AvHurx8B~>cY zx`B=8SJ{ydAjrY3!Wn}jH*OL*-sPDG!kHtg%E*+NPo;pJ2y1uWS=AP!sHv1 zn6C>y;Na>Uy^V<^mUqJypQnU75Gl~7w>nB$*h%Wc1|~^uUnA75ubGjLWs({uhRc+@ ztv?BJVUI`fZ^qBvVP@-7z)VC;b(-m7s|}@>4nLE@oSD+Vdx407S3@Ns6Z4E4<2Ubq zopia97xf-<0XH^5qtNNeak^Gm+%5R&Y&(=Z?$ry>u|lxrbW%w$ph*oC|dL$wCp$a@D;rU_-u z$fxlS;MaFx)S`_ongE1rc=X0x4e2|JGS(hE)lCc!+%Ywh$__}K!wizq+kH4i-Q&TK zn2Wce=2uN;4A>de@6xQO+$XeED z1gFvXy*Qe`%S50_0x9b0o5cnEHBv#giM#@eJ`0*(@oCCNM1&b?+OojAKMZ0vW4wym z3H|6WJjS}w65b=Im!ReCjl2#IKA@^Cqrk1A^R#e+Y4SYdmlChwq>+)azIk*$R z?3{uwnaDE}C~+*`E}dOvXuRD%5LgFs&!5e!SEo^8d`wu4eKahmv$~7N3>|O!%&f01 z>rSHjgn~GuQn}1}6%RI}>dDqMCZeLq_Zn88s=I`V2hShgF00`OvtjMdn$3w^>LWc@ zYQn;-px7=g_2IZ4`tyJ3Ne}T=WTa^lKvqgjWuAk3vr{y}RpgIWmefiUqL`6pI<^`~ zN6$y;s)!-TS1cWnuj|TncltCX*Pfu-kGlZOZ2Vpm>s;4MM%&F?O$N4~yf>)bZS`T`l_onTva$8uLtXDf$#O|Xk~ip{cIz6v`dFaY+oOO>M);)mBGzXg+%2o4_!_f0YnNFX3!>3OUi5*@) z?vRU*l3~1Hp0%L-WxW79BTUg)>@MY-mV{ zrLeI>taRf30jTT69Ilc1G-*c}P$c)>kJB=^)mAOq`{Fb+U2|l4NrdFBdkbS$88BC> z4B-gXxTQocBApQk8zS7gZh0rAMW$UVowj1t7r+34efKmeLw}HgtTKxJ1Ws$pE6OO# zwWtoF-sN1GUHf7c1yPXEg9>U@c%KvNZ%vcw>2&UfYv(>u_k{eV#Br|lbxfflhc&8G zvP=i>E>QkTBJxc&>0oM~D!ZB(V|vS?WoU@kpti*@bBT4AP-8or=Ls8e24OR(w0E-% z+)-Po1ZS@l$o%ZRv0(|uILj2y&vi6Mri9*x1g*ck*nPbOx7 z5y-?WRGSa$8E#zo@ZvZq#wZSgG`nTY#5 zBHnKILPvJHf&^8+b$vv(MLe?mT`9M&PF?0Re$4v+?Ns8#PB z;30=1#ggiQOk{HTnHwL@hZsTcc^^)fJma@j<8Nao{@z5Y$5xP`vAlYL!!|w9WUS%o ze0}|R;}Pbr*4Evx!}7B{sW4d9vYAAv%;(DwLt7oKAjNeNivwp%9L(}3ajy(rB8;b+ z!m_DI*yxomrP|oD=9dh0%YmPOazUQTBDM5JaVM;DPSIQV$?m4sQ-uT2w9Bdr3UQ31 zQG%u;_}Sn^YbTrftTSXq&-UI%jKY(TY>SiZW_6xS30VSes;{IL%!RZYS2_Koaf;Xm zr%q9ej}91pQh89+i=;=e8IgK#<}UIxvX<f+LsA`W=2+_HEuto%e0(l+gU zVb+#4{RGJ^%`ETat-}4|Nx1U`L9$muANQNO_H#FG(iZM!p{>hy2wKPy-er3SS4$&u ztO3V|*OO+rm1DQXlTU_}=`Y;jM{QT518eQ(S56}(N1luPD9v!~OyJ@Oyg|^=dE)Nz zsrj*wp9A@nOnlEIs)VzPm~k%lphrgXn@exMSl_&gx(#9LuoAMfK5@0Y(BkNmXB|YR z$8v&fB6gRirjFwzHu*N>?aZK2nn+1FW}Ia^=;c;p)(KlDW3h|%kwkZKLG6)!sc~J~ zTO##!-rl4$y2_Ef+S6NQflio9cW{)xz>Nb7c`t8CpTC;G9E^FCd^>Eh$SvhS>K&`H zpMXPS_Y7m#!8y-hn}av1{n^{gBzmZehuMvH?!S6*i&c{P`q1a#omt&OV2c3@s^vCh z&;eUTu{z!@@U{NKW%in()5Ogp-d4To&qC@yv@=_;SGLTx9S_)5#YU64pJSg0hgqF8 zgyPFQ72yJ%xGxo1^O}z>s!r7evHJtvxl;(3%;h(v<4u;hrK@wGsoY_W!*vid&1(5K z4J&5J5&`4DvQ=)WR@Ak74Ldz4QbD3PPquy6SbV>#$an1MpeOW0aoT3hxRYJ!e(*em z3M+^%AP}C57f+#PdM2}wA_K6lKak2*nAa_qC@b2%wU@dhh9k&WQ5z~OM&F6NfT#F*N>#&n{>i+5!n#wl!fP-!>{8{=i}pg zHS?EGDx~Q8#1P$JWMk6WHf-?Dws7 zDzAKP5EP(Q)I*p!Oh>ghJ8b23G}%Kmigz$9o*^cbQ|PLftLFVA|pR&C2H0S{$Q|u&U1K!A4`AlcOREWeC+T*D+Ytnct>^fM{!#c z=&yoCb-)>PMdWtZi_{!{Grg`31tt8D3$`n@!E--5O4Pv`llti!*S)fR(c^bBKj2wk z#!YoFNxP+Z^S=~7NwMq{eM@~=40q|OC5$&4s^kb}p?(5uOSR=s_45odI#|KA(X3RL z_t*yl7F`8*gd!s?GMsMqnE;dFKABf-q;j0k`CL80@44K)bF*68PA~Iyx|#LiOGxXI ztD-Rp)bZroQnyR?scD=lFVV;h#wf^0TF0EteCXY0ZD-Yw;D%?XV%<5%2BE1FP92EC zao6S;yjxJayq)w(C##g)MyYhO_qslQR%-d|ZECp6S|33|EG?IZ61{=<+$Wy&O%4Sd z4J8R&8aJ}%;n99yrgpO_?8U|bu{`5yvE4`uvgsv6%k`a*4km*X9EJWAeh^c<<6b_0 z^>jw8Azwf^=Sd!eP&AEvqXSi{?)T_WxeoOHVa0D#s1ilaDi(ApvQuW;%)xH>&QD-w zWU(46Eck{+pdAUJJsW;UF@kfBsT{p=G~^qx??UmLcLoj5MUciT@GM|+MOVWQesP4- z60l=mc|_8Y_2Asjsb)+g;RC`~?)gX9Pr%F}CZ)|ZgukHSs`L{j|C8_Axi34Up{?Af z<_p|xSuS&^TT$O0KnwXtJQKqg2mbX<1yYc7Ld4Tat^AFu$i3Cr%r2zVn@$HqENmg4 z<{+ljloU_eR#@kF=T4wEzgS=KIsTw#`#UXyha`QGS*=lzDUb@^C>qzem%X{ z!T8noh2k@wZ7trd%?iXSa#Q@Q1v%8No8_ZkWINh=#%q&*8g=?FIb8Sr#iqv&9mQQ@+BPw2h}1q!At3{I7?EZY>p8DWuc3X||^Qj2(Gi7B=nA=4?9 zn5v+5pbXPpH)q*7m(RVBs6fxssJ7Czii>RLTX zNHWzrn?ET&~731N?E6oPcVF!7GXf-hh6w$`z+lrXHG040wT-ycsiz zSyhSTMv*njOo<+=;JFzsgb~1zmvJ*V;%xq+eIs`Uo)BfX+NXj?G3H&8q2+wg;>O*8 z-1cmEe?tF=A&NuwWl(~D_m0lHvS&vhZI^ZnwlZHCTH;NBsM?ZA(gsr-=nk28Dmth| zT#;DhXywg1#Y^$$Bw$D{cI(V|hWvueYuCOubMh9jlrd!2xLDbY5IGiLIaYegX?7}7b9vg{g;+tim-*mx`sxLh5;Op^xMYWk*TdClRCXz8(k|n z(cFkNW2{8ccMlDGL>mxh6$QfvQDBtB{BWKA<|gY=|EISZM(>uKuDXy|qic7=^qW9y zJ733;>wb!5hi0wnI`^WD{V8@6jk+akbd{!q&NAO^5wf6QOCoEW@fHHLElZ@tUQ~aioG}w{zK49fV1cuQ=V>=+m3P zJ|$m5yf!>HWx;yiO=tYlg%{*^T^R}z;81F))R#*pCkbQBW}Fr|A5J$a%SA~ijYRPW zC^PcHQgf^bM#mbyk6)J+4EdUoF6C#?(}b7T7HCN z*p^jJjPp;!f3C7lGnP=iGMkt8QoD#$z83LK1at^*xgv;mHe5ZFbzoL;*8Q8zixWb< zJhw8!Gj*qK!h@&yC(g(7o*vsQMP-c!q~>7A_?bmZBiVpWpZZ9C*7R;=ub|y?x3za% zG}!dQ4ta|$((YBg7ZghI6raYN<{Cs*4QT5<71-%?+^*O#Yj#aWA-4u_79OXvu2j8W zq{+)}>xu?{qio+7v;0rm=1Y4K!1g5Uc&Z)&8 zDh~FAZU8KEnSKWV^Vev5o^#iKbJtq+O1et;NQxo?mTq<9+eRZmmSsM%EbSKCmpYpg z6>crTHJSIa(sLmsQCT`H=O+L)xlw(U_t?j8JBnwAHQDd-G`gH9dp>py_sE7Z$< znA#g(l0)*pfA8wxwThz?QIBfj)J%@UL+*S5K9^$jcB^yz4(d0?c@C)GIdMQA6k9eB zxz87*dU*uN_$iD%5qqk4f~N(@8Pzj8npWkT^)Y?Wdh9Sk>V}E~C1%iuFb^@_7OAK2 zB{)b3hVutLlv#8Y$4E`ZX{7w%f3+Pi*8y5Kwy22ptNSln7dxu5Kqb5uBsLsS1s!uz z35A(Ku<7|MlOfL6v-l+M{&g(l!lFSHRL3G`!=U<8{MA{xx(n<&t+r0+9~r69Qj7%H zaIa^$lLCtauX-v+M=;fY46its6R!A~FdcnwbW|WY4U5 zK9X6zefM9r{?yV!kEjN}i4xiDv%2Mw(iR07W4$|o) zmO@)wSS0*cEOHPB{V3MctiBmDyCZBu%;=TnlUeak?J&lbLWk@|b)A)fC0Y|Kc7g2^AT|$o-oeWF7uyci`+ZmRw z$fqO5HIq%E9ubs^Hl9WbM=V=JwLzErhzIlSsTuj;!Bpy{4U3A3$a~)1E0!NlPv|ZP z^0#$Z+s$X_oWJ;d!|#4JzxyrRS-B}=(U8q@OEc;C0r_XB&CZ>7)pZ?*8?Phb0*fXF zF6z@L0xWK z#O15m$u3(k_OQwok!UKh$Y-VO0S*=jsnqn*n-S3RaI%l$QB8Kpv)G9BZL#F(OjEcp zY_5BdX1;1Oh8BLD@uC%(f(fmxi02me{uDteohI478XLG`F zTPhZfMVuM4 z8l#;sR)v49fuRTGyu9cjql~rqVXx3^E4YjAEr>PK?UVoTM8`~D@4i5RRNjqc z%*1~FY1-n%C`B!XS8UFx%DGk97M0SGL( zA2UthFOh#1BxB6x2KK(-aK_gZfUSL_mHK<|P zQPq;C^p`NLyvlBsG4dPDyvj*JA93M@*;H8C+~Cg_J3dNRI>Ry{>CqMlzT>&Lx+s*& zml%l|sQ;Us8gxdP?8XJ_3@~N?Xr+PaPatQ`^X&EeIxXAPJ`Z^k{2$yW(*FmH`mT9d z4q=U!05W4P;AvdQh7qelc5;W^5GC(cCW3lzMtfG$G}4cqI=LJ`tA7=7Ek{?Zkz!wR9@S{%A3e)c!eEf^WMjI zs*`l3aQa>2qIa+T8?R!N7b%GL7)&roBjEImTXMRS@PCk47RN9I+JqXhVQ)KZ6Pvncl%>bxUybn8jvZK|MBKVEib0s>xT|BFUwYo?S zz$Yb62hsdm`V^#((|@k`GGwOYWXfS?<6WyrDIpAoc=4`jGWp_E`{8(ttm638?IhVO zzsPn~6^Xf6nP7;ew$lYGQ-3paLqt+_lcr7ZzQiI1sqz8_-j9|%#q*iAur226H<>1j z;59OB_eq=IuQ-yXS_g=y@%M2*g1-j1x9e(j4MN=J9WhNH3=glQT{-N-Iuy<+;U zHe6t!;j}rz`~TNNF+8Vs9a!G&++Z=9Q@<#%r9&Gq*cb zLjv~Ari`n@J!rzGi*TmWKMJvP#LwY-}j~XGhAHDdh{$ders>@Av4arX5IX|xY5<|+` zwddm!nv<&Sx=oemcrrfx;M<*J@n2unN2J{^D~kJaBBd&rdoGPI7Ajt|bnwLlE~QP) zOH}REo2>D6ydZYWtlH-0`L0?lW&8NdnJ4mD8hla@Zs?^0>C=c9uAI$@8AX(~_RRoy$!p`0qrD zp*W7KV~poYA3hrK=}G}u1cfUL?+gQ%@9jkDh$?6exFApg<+;64CegP??_J@!Vw}n? zmv;~6FzMIGYlE{a3c6wG5ZuRlu-BW1` zrEzLOrK4;2wZHVED`H2{Y#A48auMD>n*Db%K}N4xP9{5)l$j2Hs~)+GAhU?~24S04 zveq@xLK5-cpV~HVulz8yetaQCwS0Qp;SFoItL9q$!^jo;pn3b?{^WHoq_vRvRr6j3 z3HMm%fqLsF$UD`gZx22RYvj;Te+UR(7_}Y`y%U=mawe{Ez}!%d>A-E53_hjP5+@!R ziKx+k)A#5!gHOMX79t0E7T2~r6dVlN8r^-hcpimdt%4mP(l*24e@6i>h z%oOL#LEqbn^*J_ap`S3NRwG|84BOja4brAzBrT$SfmBVbOZbY!jUVTd9ed!%2`57(PJ9>@CTE8LZzwub(tIgY3 zl#X5av{w$*v;FCn*KFR`7lP0gLjvdApE~i{s}*QmV|rnT)fqq4e2C&=_joAjDc9vD zyRf7Yzt<)A$X+cgiyu$RUpxP~nhh2!eWTlFtJtOLG}Up+h^sC6=)@gEF9VBrN>G6% z*?6VC{cZ%r`!Uo)vbk&nRZ6w4h=w4Ujb4+)@AlJcg#V5y)Bn2K>4~BMOb-zYLKO+3~?eerE>bvya z?56Eg+ASfu1UF4+740zhbC^Q)jSM4^SxsL1gtUp9tL3+2%j-4E6ifTjEB^-o%Rn^0 zQpSN-1XAo6t^t$L;Xjk9Ve5R*SnEqqUR>X>MgRMPZZawMBEYI3piIZ>4I*NRT zLmo#I7F_d4+sgY@&FC}$GUI6CoHjVxtAj$TNTZw%l<q)>tAv<$PCgcLEgg&C2xO}BBUT7-p2xvk-s3|R&;=2R0BAsrZJE? zr+m!#1LdS`$hb}kr|i%X$(1={^rca^p45>fxWi!5$re;Aaf+LJpgFhg+z--)C6sQY zUc_`1{{WY_6{gDI3L8F{r)}hu#WlAMPi~aP4UO5UbJU+^NU{Cq%{x1|#t5k64uIq4 zCz_ZRclib>x`-nYfmv7_=9s{NOcLh_j+B$oqClmkARd$)D;35~E(j+BnuMl0edE@fhz}@AWbukrI~Sgm#e;7- z-AbgopW($RM#c>mW07PGz0atm1sKf>8D%z*bySd__5FVq9RfNC*6O2}lNO0Im701dt zP^;yr=Xh#lq!tPZAor|l_UV}+f<-TWHDkPR0G91QaKxu&q`!sOz~0$X!?EQP7x>= zu#;+zw2rJtAKs^#K1_}cG2;qBTFz0np%{RKZ{7DrGFZXJDa|8=TynJ5k%Dg=id{eu z6;&YdQAlKYdu^qS=Fx;k_YzWm9H(k`5cTH0~Yqv4=H4-5afTt(DHkvbY>?Dw# z>KNd9RB=dhLH-_h17MGGS@LDrfGX6ZyC%U2{++IMyKrBy6){{SsDU6+B<)1L{zWM#Yg5L3$&f1tx4tyHi{es(2lM~+G0fCc>U2pjmoy}2&Syh5W|d* zdeKAqhhjG%ecrSqTxb21?@j~E$Q?auRQX26JW}UE=S4zT5(%TrZl+1`2Q^{_ zP;kQ)t)0Z~K<$r}h6MppQEEm&2*)7Pe4?$i)n9W+y+#ZXkb2YM+O5grnj?7jfzppD zTO^DccSszAX=lkCQZ#4obgKwiAnB4iR7x5CX5-q6M!|cGAG=_!o+$w?O7byMsri*; z>(iQD&lH#|kSc~D$ru9)Dk7wO&(CpF@AEPUDn&z%NNm%S8i^vN!?c|JDF@!;kSG!3 zuUcx7r)zei63~kdA1h^fq}ZpIH7HQyG>;Q(+&?PTBj;mLaHO%o^`smdT=58cx3w3a;Sdz&$R+Der)n6_HN|ZUgTzw9qKdpMGC1l zaQMf1jO7M8flhG-$0;BY+qD4!Uzxc6bkK3oW}^hA4{Dh1DLqAq>>EJ9sSISVKQ%7! zSQF6G+iP&OQu8ep_LObkr4eqBu|2wbQ;$C==M^L>s0clK)U^5uvb?Dyje)lN)3$;( z<2d8%QfyO<90S^+8`4p~{aCGH^ae1-#ECj>?NboSpq>Rki+O zhwo&HibxfT5=h%l@j=R0=gjF>6-%kX=9?MBgdp4nHvj{J(wGfnCqwwuCND8I$(oWP zp}8FY06LVXnS;=ZASkjfB2A=H4loCLmvAq#P7OQCanGe)*HE${LQHP0^5MTac*tF? z$fu?T6_+BS2v$SE_M+oNZbsfZ`cg(i@_5BqF(_>3CaY}`y9^R3HE>IqX={ZUBjxQ= ztW2O2)83Xa&M<$5g)Ug5a0jg>^st*NNwzmtUbNXzyN29B9fe9p_dCWm)BJ@C=KlZ@ z=xU>M1ycwkBlu}mR~a8pYR1PSa1|eH$-o_HSg6={ls06rHA+<~jE9WXvSU^X2L_uY zSd5UpX`n?okxJt=B0xq-8OKU&cCXVs3cOUHQs;_ekzP3E{w@VZZOb+fBvrrzMBZ2; ztES{6o=pv+A7ZqT`6GNskxCw4EM)WF>rzHR1+$z|tS4&~?^UIOnkszZunux5$^>I; zjDu1lvNm?${{T9fqhhiCop*t`nkwj>4 zzcp7-#Piaf9Ohx}Wsz!b+vkZmB8Bbri7 zxWrdRAmDRNRA4fA6pS5?2`i4(D+Vj=-!z&fs};yQfhUT2Y&TwgDmKctQ|1Dsjzw-* zRJnPKdP=IrO+>4;%afXNtUC(<$>~wx)uthrTclMAc+EU+j0l5cihNO_`J`Tz3-JE{ zyZvafq$E8!K3;Q*nBi9gsi@*ODi@ROQph9OwD9}8Rah>F!l&_ZSvQiTSc*f8jEb93 z)NSpc;lFq}#(DbJo?Po~b*aLxLq?ed`x??T+Z0zZ)_syDPcm`4xCW`b@hpTp7Gv1- zsP44{OLHPh6=NC6T)O|j+&_=0kY9nUeM}GeRrE)V|LWt%wh9mC}qY^QFg_ z4*o_#^a7?dZ?P&iI~&bH+SzlR#Pr2+lWNyDzG`47ljUA{$Gv7<>oyDW%P0Xy8LnO} zZo_-rLzhPGDm{r4XHOm6wjjc?pEs%Wr^~4`zUAt^5;_8x%y zn$oe*=DWE|i`~GWI1R_@D?fD=16s-MXy@gTixd9W@}}t)w%TR5 zgrB~0?EPH&oOiB+?G`Yplg=9k2g-QK?L-%Hg&KTEDIA-wdF|) z*~VPIQ}n9$mwKJVW-G%|~5*=Cf44-+1@2zhLpq}P*&*w-Ke5ZFfsUx$B<^IngAPhEYoz}CbY4W6U$Ru(z*VEFe z!{e(FDYk|KytX$0O5^$Fr`^5E^rp=C^br>$4DnIwc`jC$1S#AiLb8n_NSmXanp zZ{Py5Af8!1M+b(;^~Y+l=3J=cZr#%#%B><0$t$kX1`oARiy>Fb%MNO)kfUxmG}&Z6 zZybaAQy7*w1D^F;3gli_mI)^$_VlKJ%D*=>;Esfb=8+V(;n0ebmg15GWb!Ejs2?{b zg}I7cLa40$n$&EC*bbwm3$|RaI0B_1cJs|N6peGydsb6=jIS6VoNy@_2Gw49 z=qlnOusP^|O0V;PPjS+%vZD1ERYD!y4%G~Ch9d_%M_%GcDqYBxs4P-itb+6PWeG~{#B1CdMNCK?PuxptBDsLF*09Xbk=41aj1 z9+{_Y&Ivd)>Bmv6%Kl+hDg`rvz&x6;VhEn5oA(Als*FmF`VcoCBXy{^D;=bCr;bT2 z!9C3~Gz2kYxQ=-2DMs$)-7+U&8))M+k}!!zGEYt^*v<=lzvD@i1S1Y})~!jRTCpBV zFU`n5&Y~fMe8Yjz`cv*Yj31>q$ir%F8E?{?WFjr3FfYzON@9jXWo)NOJPpmdX^*%2t5TB9g$U4mDuB{sS&mkxyrEO zm(_-N;}p=Rf=5r%j(|s!r-6`9LnMM9<~){*>n4WjN?5#S{{H5lSeYq;J9Cbf}A?NHO=Z`cOfUMh-L9oI)!oDVD}F zj&c4J;z3<-#K@p-A1-|dr8Ybb$KNKVV42&VK*ATqLOHmt}%n#wJ;2WoaCM=!5zWK^r+kB`sehieSnCKy&DwJ z8O~UeqoVfBJSbM$Dl@r>+SmiAs(0norpoiHGpSL?JdbLcITQhr*Vd78GF0cd`c!K# znt+AD>^sn+*xDkKu0hWcoOh=Ij!33#Yy;Y*LON4~OxhnBsKlV1e5WU+M!dP}#ZRh6)r{ku2RI&!#5Acz|@0!<;&Dj-zBd$hjWm1{-q#&FUDd-seD2#O? zaC%c)3P5h3rA!naJ9epKK)DC5L8q)l z9%*)vpGtOe0rjYCU|TEn>q#4jQdHy)^Z}8M-RX%FCm{T}=sMC#GGt7vfzNt)4ag#! zmN+0EYEooTk};mgwM~jhawx~m(w;aQMIyOuZWS)wqd2LO(?L!muHY~_Q&mF}dkTDe z+mpx?s4_u4DqxJ#)Icx=N~d>fav=n_@Y9^CF69~a6;QU!wYZ!WocQmM`}L~a)BD2%sG0PjHRaoVShb;-slp%gLn zG@C6gMyz3ZBQ+r0PFtlYUBd#Ds}L0NiWP@#NZ01z^c3)+MsvqpP@@Wa)Sv+w&q@M& z4OTeLFbz3Xh~k>KDlj_qsUzT!Y8nVIF>d3%I1Q_eQ=?tH`qE`evYwTkv_+CIRz)<$ z7|72xB7o8DBc(bKv9~`_Qlw{Qgo-uYmdQ0a+^@AyS{0WJSWyz~T=SF7Qm{{Pq99!7 zjMRcM4i~)`JY%g{jQ{|iDrF%j)M}o7akiygD9h7ww43=X*``B%zOFiBcWZT|oY z`s3nl?W}rtn*RVIrvuQFz^{_Tf=j0;nH_Up?g6B%&rc0K4XJVDU~S2+f6Cjt%{*{( z?@kv|TuiAdHAT64X|T#dNz>sM808@Ij|l%%$D6=?RL z=}i+0nRd5s)U~iVB89_C_MO|Zv3B?OrpcI(+GIFpn#DLyd z#(n*0Y|qfQs)vW?icP`#dsSAE8XqrqUmf_Xk6|&llIlay=N+psz$E$6a^Bq4ErgvcCd4B3?%w@=QxyD5Zr=F(iVk)QD9x$u_uYy_%9KO-H@Ne$eRK0*0cpr~7lB|TD0 zi5aa|mkc=`-qk;c?Czp@CcTURxX1U1t$3n)>z(kX>{W}f*0O^$l#K`Z$E_<9$j53V zT|%lGZ}Y4u?b%}3zbW+0f%2H)TLR@R@VDj>L(_r5cM(>~M`GJ9{bSns#Xzi6E>|NJN(8wWc0;V z)Mix1+;#L@F_sBCn|JnpXAWf3vt1wAuZ zR@U;zbfHu}4=38X7Pqz%2`7w6upcZpsj8H&IHb&(Cx-SUf(G5{dxPmn_A)enN{oB^ zRCaMhFD@eyc?%ke5&r#~X zR@NG5ZdMf?Js&+y%vING7;K%irOv;d7sCOZai-MGhCUM z@ML3MK11vapks&txi}S+a(Ot#ZeHzBxf{0uTrI>(TJNE<@*XiN`=qN zw23A{v7uGG&oTMWr)rqBun4=6S%T!}`PA$f^f|>u%EaItF6xyTkQMD$1ST~%s(ix& znHJ_@o|KIHgK_{(7j0I=vDMGjK)Y2w<017j@qa&VrRPshxY5CXnF@gCY5G(1w}LtEQ#cDk6+T+GKP@^oQa1sN(l;tUyXi=SYIEAOaR{*k zxMID)ro$24mg;DgiEnC=H^`akigJz0AF&WHCz>(dKD5oAV9!%eBtyyNjb#RApjO)4 zg3L$`!?d2Y9H>{l zI7ZC8(ll}@!RboqHVzUsaw+Vp{{S%jX?A>>>xu%lcAhHqxddBqzbL0{Wb4VMvY57k znvhEvTu454=}9XNT8Od|%vX^@5ZrF!nH)t92RY`fC=v30Q&B331Q5VL;Qi`_x0x3M z-lUX)jlJpVks6h&=l4bCFtZ~UagmCOP0}cM*pB$Ahb%MFrPu=>j1;7-Uq2HXt&eyHP1^#125DlOjUMr3MEX zrVNlX(v;wzm{KCHaCoe(ZOE{>2jmr8Mpu(k@Wg@-6!ZY(w>YPvq+*5!%HVNK2;oYz zaZ&_sNa$&jaz;*Ra%xIi=rTMh%Wx`a&g_yZ5O*4BjjP#~CR&QOED%-o{9N>D>Rs{>S2R-vz zR7e>b?qj<>DPjr-)|m0*h2z)WqzDjfQPzuDCW1c^AZA>F&{7r$r8gK(J5yuiZ#)X1 zB7By{F^ZpN>u(}@S=#&JiMH*d{5VT|wV zn$iV9cOx&b1|O|17?Xp^p`$K9Kb1WW#4Cz+b_)$$s_h3RqZnp5OP{FHZkI{ z+3FV~bzB3`Q)N~^b$F>=LzBOd1voa?>tA$S!~}@IOk*_}9T(QD81h+&;-T_fNx9A! z9Ao;@Xsd`|U87@X)}&QsiNbglA?9+d8f8wnz;CvoU%0koaj`U6VR ze4zC;3$gQK82X<|sK{xeSyjGK8Q5u<0fMh;n31@V*A)u=*2tvLmg6O48&jOo8--Km z)7BM`b=!`#`4Iww4@#y~WA6|bV%bg>oC3BFGB8%UG^8}0O^ zX8BZs#W7q7Kqz_dQF$*To!li6j-s(^V--33zO_m~(Xy+bm(s7I5S;KT2|*=z;8J23 zvye=9=e1Ierg<4#w|bU9%)yuB#~)gFWmV&?35~mrkwX37#*#NH*NSM3N!}05+#Z!A zYQP=b)94{rJHBJZK|622JrvZWY&odk2)n<%L7^B`U~%$})WShveJL46^(~RdLDHO| zNXrZn(yCDIM&l)amu4_cN|GI-Bsr?435(#IfNIQ38z~%v>rz#^4QSM6Hhy~IvYJ1e z5*oWB;FNE@jh_ltr+r+X9jD`h99CU7V7~BBn8iJoR3l)f*wmUrLp@kp-M8 zlN^(S&1s0*IXy>OAx*2a4X69~=}B;A1Exs%g*NWQ#$<-w(>yQG5|>MEn4#_)R5eq@e{LOxI_$B;A26O2?U z#Bq))!HzZ=9ee#MToG|v4OqlyIV5^|8hmc@KE_X%)|YnDA|oL5H84^}?t-aC#IeQz ztI6P2e5l26rv|MV0gL4CSoaqxVhoa>oxi12RmT{Xo^`fD%tsZ(>mDgs=kj82FVT;G zQCWJvz2@Om;khTb-RoXU;-3;5`6IQni-yn5-HeDDb8r@8+C3iOs8 zEz!~J{nKB>ej{6pIjk;@6@s=i@_P}3SXM6#FxyXWCQ1%7)K{Ifa9u^VJB+LcX>Hv* z)b_WK7=@+9z_%kC4(?7Uoi4_09`B~=uqg87UGfj_bv3#6YmlM^VnyZL4)a8DoP);)#owyWkw6UcMM{Nw@Y>6++lwH+%@3HIxb*i3WR zfz4+)D_DmWW4_Wf=q(@?(>alsyK|pR`-;_Rnh@$!D<9nVuPD3tm#0}~-p)B5P;ts1 zr(Tths`%ejyZzOo5WsVe=hyJA3DA-=Nv3)|#l_yKKb7VScq8QFsXnCpRJJ;fg=0EH zeQ+|Vyf$&T`}_M>irL5F?+_f@Ga)Vhtda-I_2##x_;ssaNNy*&K4fF$_x8`}LyESn z)qi;GwI7If*4Hl`pe0k1Sqp62RFq;qbYsJ#2aSMY z3H0q+BE?Weyk(Vk=CmRh&M9WeQU_kupD^s1mEcn53!L@#s}b#WMSdF` z{c1RKmsdi&2^l^8$F*vVtgb^Mv`Lit>QcyKQ=YvA86 z89I(=2(n6C5->Unk>YFSW(Id*T$;Q!vjs_}Z!xqOG=8?Cbm1%)+IIW$bpqR!Rh8S`>icE9`bM&c1XK@|P zA|VoDM&qy2mogl6b|J|^OLz6BjiH9_0jIJ9^YvPZ)sTS@8R`M{a#T|gEge)hn;>W4&Qr*E1AbD6nokk-B1L;#L-F6dOV-V{R!f z;=Y7zSQ3O_denPyg{d&*j(HVd50Veogi>No954zy_3cl=WhhQ?KPqAw-Eu}0bf)=5 zNMdnD+leN|$Ilq)#VfYg5&Be%w3D|Z(A07!N6prr;%I@RiJVCy;Et5-$})r#nwW<6 z$*S9B4Ul*g_6>&YV%tX;qD564a7R;9W&ZMv;+wE+CQg-6lNx1xpee^*+38Iiop(sT zcem1{&ItbL?@i!7KZO33uOb-~MTsXE_NO~z78D~QVy z2OhL-2%g~6rX^GNLnXNSRAHqE2Hr+E>_s`d4W>O$Os^nuQ5DPNjGB-M33A*6(>;g1 zAjk#RlDuk0&#fbFLKS*{D$Que9mSI%=NYJj zGqSfpJ5;R9qaS-U0p6^je-NTGu!{S0J7nTAI(yP0GDu1`bJI0ws;@h7x}$7k<*ic! zyC@^?9Qsl>l+pa)lC?Uh$P{@b1CjYq%_)?ALN@1f4np_Gu4zz6e)mjq^rw-*>_3$X z50nXPVvF@N8=R6)0)W3R5cTGo0O{*QV;R~=KJ}z*G)0CCP=WQP?QVW-`eLOdWCFuA z0aaI4Y>b?KCYXc)lnuZBzpX+Q!xGJr=zCSC9$Ss8oyU`m^ZpdmjOMB_F4~pb34j}E z{&iiXTX~~^g62hHF^mAX&UyE#iWVEOp8oW>$@|&wOGUVa*q)V8A(e^)w2nyjshI?a zkIed06$-w49y3*-D~Q9W9O9!~=aEm19J%Zpy)-C|*>jxpns-95%w%L9X%rk1->ppJ zVgLZgss6PF&FneAG}5xTBDdWv7q427u?ia*VcMU*Hkg6QUJ1eD+n&FL4637XZaPs2 z>tJLLgd4&F{8A$ZP!HoyF>ZBWao--jseyL3Nx&Vc>a+qW80T+adWrX|sm4e2_o;|h zaoE$O8DgEidWs>qiW4(~oMZ!@l{fm$thood9Y4vbz*S9|$@Mi8vWDY19X%<<=u&8j z!Tu5d0N1ElurrQ*Jt|f$fB?>FG6L}ZPfqo8^%}E8DHsDX9D-;e3G(9v4(GS|H1RY~ zD_g0{Mgb!S13dRCJMgRJfI;*?>@vPkLh^N8s{* zDu~8cADI2BPV>N~4UdC^o_IZ|E){|v-Eq)T{HnmODtgh#(BpC^RUo%OJu0ws89!%0 zSav5BZb8cc-zn^Bp2SHpgTT&x4GVorNB`6Lmuqi1;DgOSV8?ot0$&HIr5G74Ux-Zl zG`bN+xX9c{Kcz|r(m*uO6-Iq(Kr#XKspiyUuv?K*FF-L!k>u@9{{U5A5Vsq8(HRoc zD4~4(+|)05xcs-$a@q!I@;AoFsv0rCooC%QbmLpr$7l?3xv;g4b8-lMWHy}B{( zDqk&!PSuI#NfJ0-xamr^;%L|(n|Dn1rm>JH-OXLJRs#$;Jt&g*z2l0k6^=ITB)4*i zDUmZW10ca8rgMW^`lY)o?rO$VT;!gWjYX;9&vG(xjOR5V-?%Xp3?A9VOsZe*(M-f= zJw;6tl5^64te~l-1wwLpJ*ZL|fQ4Hl2Z2k}aSkxs=%Hxp^dAmDmY<-Yzn0;Eyqap^_~Jx>)YL`o#d18#CD(XKhq0+_o= z_Nh^@a0e8YfS#bIaml6U@TH7yaywG8ki~mdJ%oW9aT)1S403Vbij6|<3DEYbg0gUV z0+fo3ZX$us4o9U*gFh+gX%$9E#yzS?z~m8(bg5Bx(9-CPE_2vY?PBUxxE)8WJ9`Gk z-aAv*=IO;G?8Y!I8-c|=zyk_6J*lo$4jYWrk>S4zcQa}tqOy(_oB%6ZH1!z920`mlHK9Qu-a#ByE!!Y-T4G&qB|M45z5jvi7Zkwo>w@on@4Xk2s{H^)xX{+sIJFFQMW27z`m!S zd`~eOFpitPz4*m^$9HO$ihQWLp4=a;eP!_leC?o(+i-sx`Dest;yIdF*Mr;Az03p9 z^ssvoXz>Xhz#u8=t=!iApttjy5}YSI@l<>}ZHRu+Csq7~Se&W4JJSQR``4)xv8@Hx zt@lJ@gyRDw`+8R|YjbXqn6?nZ@io-TbkYKz)vKAO487Z-|*m~8c&>~o6Yl~sD zmE)yRvx920$bM?mxOIvojlXx6=A;j9k)klqekqd9L&Pzvd3P*!=jF-%m5XPstWrD> zgTTQ!!Tjp}r9AqqlP=IBgy0W)%K}(hD|q4pGEbO${uJG;Ok%Ej9j)tK*{pBhw_{1C z={J$d9$O&xHA6&&*@xOTpxwY9rFx4b5!!j=;iCiSYD1LsUlHQoHB4ee@A~mvjl8~a z%zr55a6M}8jkO!OoXc#x)9!>n$m99d4+X<@bv|y>%Rn=e7WmIP?tFUSw^K9!}d7_Ii5q&MkYlroE{1403p)c0CNK{GxLQWu>d zbi~LwM(S&+w6eOmLoAVyPefjv`_;zKeAG+0t--h*NCSQkTJ&8ZVS>d`fp6~SoL-|! z$CVw)dAXRRae^3sw^9WK@LcU?`M-*`{8=;+%99`oo-yn1Tstgj_H4tm}l9D1@v6xf@1#toc01l0D}H^+D8B&N}QT785#@-@N&U zjkQBWDHOsBU@JiE0D#v|Jn=J-ag)atSj8xXn645&bM0C{WL6Cll4aobG|Q<1w)juTKfT!2 zEzY-Y)A=esQCgOhB(bpDxmb6pA1Q$)%dF*D&UZ0i?(dnplNr9w zepwst{{TwtH2YaBtQDk9tZ|Xtd(~UHCQCzfB9V-nS$hTT{c1*li!8C+U$b}m)|K2W z6l^~}a%*17(Pn|n$-B!3U_P|e>_Spz{*$C>DmMt#bI^Pc|`XP2A@{vza z1!EY>G26o$)VqvLZjv|MP(Sh7&1V5YJ?r3Vt2-V=L{^1e14P`4K^l34gN$~hkh|{k z%{J9t6Ze=c>r0{?3KHa0o>&+u z&T4J4DuO%GA6*EH!G1*?^fe0YBOL_=9r||bQ7C+6sl~;hNwRp?VjP-~=VlaV6pIT*^l$ zy+}U)089#(0i-eDjhM0Go{53Y05d6W!lGs>3B^=oOGL&XJJU)8$?82RRFNK6tw$to zQwM@-IlGf-4&E`0W73r$2M3W&Sb*9X)QKKgm8tkF8*s~aH5p1M_UvdO~R}j^3WNJ7AtVcBZ!ArJ@-ohbG29EgEILDj)-@yVZpK z;(;eqQ7k)HuPg;*m9!nu)d$R6aY&wHvE9&AtFZ0|6wjaTBJ9m+7_kjj*~KRETY-b? zQ~6tV^Ya>z@}spt4#&%qDzF)S^7g6x!;QOXtQ$Db{06j()Xlz8>=SRv&%IVy2+6A@ znNtZ-11lT~B`a)PFVtcHI85rFi_M>6!6HVvBjz+lfsncADeV`?Ffr*<8x5=IAdvq6 z7~|5KitgDxC`ee4N!kTIGxHIR~Y3oayK|@ji06uOpN8Vyb zY8_Zf>r>IgLZmUj#*I%8~uH$o>_GyHx%@Us_tgRTvu?J5dtHO z=QUz2(z=2^?M2F|WA{ZmIF2%$6W)^0PvO)iah;>JLL%PXGwoBAX!(9r^`I*PAD|UZ zLyEYng-^}KX$adU#yf=pl#RgUPeI8!?=1^1$g&2*EJC(xYtTrv{M= zZutSh{VKNtQS&Co`AXAA1Dbj$Jx=3MpS`m@Qj9r7klZ157^@8cMN)VIqcZGeP&ZV7 znG}rf#X6EI2w_BB+Zv+V&T2(fV~}x5j;r!WI6tK*^CE0CG%0}Qp^IZ2^a89DSKzT? zJ*vA$joU^x^{JeJ$qh0gU@?rltxD%%AVni ze7}V~AXF>~&$TDt)WA_s%ipytjE(7^Y|{|F^O3-+h@6O`-5X*~eJBYlrM%|DJ z=}t&|))Aw2z$d5YQpSj&6WXQ#FbqcAR8GN0dVx_i4UQ6ElHDpMmvZ~iSvPG_)|`FY{9R6VoWn%UrVp{oQKpoBmNTA5U$@yRs75{3DB zsQzvVrk#Pwg2VTV{!~c{FbGM&=Zchu+`0R-)!arifmdsS7@;^-IL88}kAim$3XV8Q zbGwg9c>tbAJ?lBZS4d2(XN0D+GcMCo02K>0Ft5xr(DPFmmli}~RpfN1tCC1z#aRjf zBR=@{sDddVnoHe57!B&*D_~R-#tvByMOiyaGKz&F1Ln>>s-lUKA^G8ri{#_;sbXa* z<}U!$#F54_YCa<&8>JAIrA98zN#?j-K?!i0%!ZDo%0K5l~KBViVi0DMN8Y ziQ+2RC#^~}Qd$(HVpYn6oU+tALvo`c ztiIKZXT4XGfwWef$qM8jDzj7KcE~~Ag@_Z!YLG^x44s(#=t2>*5h_=YT8DnnUHQjK zw83_r=bETv+k$>^-m1#LS7?i-^%V+#t{5B+wS8M7%N;vZG9g4IPd$YtZh^ScLq5b_ z2UAd^FdTi+){-#o@^sA}UgNhs56*((FZ#7I6S+@7Y9^D;9|zKU#t>9KHVx~3yqS*RU4nWX&u;Z0C7!Tal4OtVUNjX zAu5{-zAo7jcmFG`VQ z2Or9-tSjc9Lsm*8XMa}dL(w9M%qskmhNVPk*9%plATd@sJ*m=8A^q5HGuoldxE8kW zAdGyyss3mvN$5DmS6ho?`_z1PIj(b9*DWj{CgG03mgC#h)|9T@kV+kmSCv*zGiVX7 zTJk>`_`=`jj@*z5+Umo%PAiV_e~(_~)9jX{u1Rgd9O0M)+T#R*8_PYfuHfO zcLkQa-e%CC{?Qhx;!D}?WrEbdlBWk50I=!#R7-yL>X#S8?*iNX{{Y6g`8-4;Q|7KC zbCNv|tzqh3D-uE@HvVo8$aCA&``5g%cIb6-D;v^k^3AIYwUhU8jAyH#Z1xq*wy6tC zJ1G6hE~JCbYZgsQeXNXe9&@=rg|l3+j&*@iK@E;T^{st|q|}kxS=^wF zjjX{T&HAYGpQ`7jTGJrBHtDwAlN=A?C-C&Hn@#Y&%aCu*_}Hr^I^g#FD>=f_F>K@J zOT>Z&nOqdXEWa`OS9PRXz16-zd}2Zp_qEMm$T4M1|SWy*r)0wVME0ud^(tFY<)<{{RZ~%?H4m z{a?AkCB9R`p|-ey z$!}&1Zs42_gyOWc{{RN+y0lS8G+PH!&G&%*we-AS545Q++FgZMj1GEj^sdf5D#F!} zEMNubI|}A?I|YxLA^2l_E)gXkXhH{;Ps{%R10+|eX&(+@v5dtxD&sr4kzT4qAconU zw2W1hmTjDLt~V==r^0gSz86?I1Vg1=K$lGTszPz}V@;cToIIo(M+8SYYBa|0?y4&TnKE()}GXUp0DiS(#-rxVR-IU3GmP{iwMkmSxcCwLg!7aKAZ{L>pj1*R zQIWtNood;_1I9=kR9IF4GoC7}D9EXfIpCj4abyd#ZgWmzu(NI%@)KySG2CJZ! zrFP06obcRKWjf?$tmh|g+>crqZe62{R5ULlF01o$D!WCwep8CDGOhD3$|-~pr*8+f zD616FSg9W<>rGMtDt__rQ6C5 zXvSA!K2wYw=QybgG7D`R5&gfNXAEB zYKd$Du^8DO%xS8vx96oXgi)|(6z%JddiScj0=ZlPk%~yNvSf~(sbvg|8$T)iDee_; zSG{CiyOA(F=bEb{Bq@>!3)cXWJ@HnIZU6&;)}vsg6P#kIG9ZBEim*8Yr?U}%=)QuQFb#Q4DC>S?6=shXg+M_OZ zMYs%s&{WYOWjO0q+A_m9!Od8SiYVH0D@H?0p#!94gKgweV|Fq+aw)UiDoT-nOF0+- ze?Mw^?=DLY7q6vMWUeu;PajII6b@4OT9=_#(ingsE$C93<7A7 zn3=ran;FG7p(u}b21&>RpK4Fz7zC;PD1j1HEyxE46*9i;w?RXYSgRlff^OrrMk8?Q z7aK=Y?d?)Y8J&Y;1J~M=m0SntJJ!0mjc!I&nB!>2@~CB1QMFWa)cTs8BXnjt%Jvk- z$xvefj(u@T9`539<$Sl@#t83BUE5Cn)jk}IKL@rdG+cE#_M`j5in#)O!+$=*wLjz- zRy>}9o#m5_yejie2YKE{BaHW{ie#0fM`CuVz#JN>mVoYK*Nhs~awCt-bC5kb&*fE` zAp2kY+~D@Dp|B83h@&!uGGvU7;1i7F+L0qFgUvgM=RLXUR#{KoAPiI@Csx{iWgQ9X zY9npNhy(x-V*z&OkFQ!83H!V^tyl^M2I; z%!ju$p8AxC2;4qib4aEcP?RSqc91~?A5LkE*edEu#-lmMCp{`mv#%WoT5d@@qGhT7 z)cLX$Wk9TVA6l8B$oVsl^*Y+fHQMlxvoC4!SEM`&9Z88v6@t`}nr zVy{~=EQU70#ag>@oyrCm^{rt;xxODNoVO{#Y!~GmwOJPA9RC2E)mW}(Uz?9WDse5t z6O)f_)YT-9MmZB}R$exwpa-a_RTWe#a1CV}nbp2bka7vD_T{#NAk9jp6LpfoElEsq zAjmy>)c#GOhvi^N?ca()ZN4%?a%()rBxB|nAmcu?DhlXtCWW*m5y!&h53N{8QMd!8 zVqNEN%h&l;OF5^=3`orw=Gjh-++#-k*- z$E92$WOrb)=u>wha#U|4AoZal^AI>Z9&l+;t0~-ZjxcHJt_WoNzsjBZ9;1DRfwSZz z81GVpw;N7#PL2j=Y@RXRr6{1`J5>#BsU$In;0|iYj53sNeW})8yp>Q^jFv<`@t=Cb zpP}L6pS;m#(S$LseqU<5o@9q7rBH}*j-XbpxnQ^=x#c^ae3;2lDi52bXjwYo2J2O& zQM3{{6qfFa>Q7qIq^`^=Ge=XlNiB}Sk~`N5>d7Gmas_%=iaBE{4;Zcr?l~fqs3RGy zrxtj1rt?NG8DWK^Ir>S+EGkxl3kn9guAdQ`x1 zh3o54Dgc-{H9TWz$E{@AxL;AF71W00(j%Rt@~5!I2pm%2t8VX7pGHK`(!&Fam3Hx- zXiyIdZ8ia2k3VSmyG1T^<)z<|^NU2smtQ?Lgb`|c&Wn)~LMU~j+92%4a zX2IxtQiK5D@U;n|p>Cu6&InPGDoBvHUodk?8X_sd$u%r^3dEjiFCdM9L}*F$uG2*d z(SzQ&fI~I_KK0pYGlWh$j!fj{g8!`O@Lm>z7>PrF%EU z>wC>sDAZ3RTLWS+epwG~-%9XJEpOHhmzWRVX~^QeoGdgwTrSo-Ee6_S2Lx?AWBh9y z#20Z|TrIkj*RQ>Fnl$m+z|AosQ?IRYI-DPExof+Qn~q0LwdvDVIwo7OkV095z7lIePTKJ9`&IOermjvn!yt!k0asGTt*e86yDvEw{b z#%+}yc^J>WHyMfPzOE9D_jIZSfP`$^>~;8#?}V&f0C7 zStGd{RWY!i|)BNe2DG~*R<+^$1U#=cZqW0v__+PuF+)fy>M7vL8D z?@cl8+h`qe>?W_rz?<;|m{i!LxY z_NUFPwYo9#@-g1AmID#lD}1B$tSxTpSt3hVAInq0KEI7C-Hp2xZmwTYKWSr~zcBRr z*F~nq47Tx;f-p1gYn1yWsH+qt1;<}{>$IDB1+qmxJk$p}d;T4%S&lmBN8*i^8gzHa z#Gw8VGJd%Bt}5Q{OTvW6c1S-u?)B>sN{*);8dRGCw+{9P&)z)RYK14#KG0SSF=^y<`Xw{Qm$hchL1A z_9M57dwrfy+)hq=*GGA%+{tEk^l^*Bq`i#C0WkBFuy)x?N{jipe~49qtFjut!LcY%F;ZDJmSsx zR8CAJ`!-Lz#2R_a6L_r}~*kw&1daw<@Z^dgRp zv{6hOxf?iV!5=85@VNt;Ypz?f z4iDYUFr561IXx*hJCxpjQA!p}jlHSNm?6jvLoHK--`1f72gc5oIB*7QB{zOhp5$dW z9yrA|)-%Pc8p?(kwfnsig1^_REILC8OPyIa9K9}(@0~;$m>wMWO+n% zs-?M{qjE)7Vf)Uan6R-TqYE;Rm!(XK$V0Pq?Nx2X1VY(a6&TaYI_}R(P{_x1Bd{YK zJJd=xERi3}U!T1)HW8B9%C#gQe-#Bw@XLczCWCx$_jqAZf#veUbxMknwhuHahTI3t zD@h6xL~7yAISMK~mVZhXHfCY}04&$70Ry?g+lo%>K#Wl`@>zOR!#j32Ue#Pg3g>ku z3~spUDpDI`&h>05ra_I(>r1)AY;LBR@`eaUKGZal8D&9@TaGF?+stf%z^j2uNA;+H z^3W;e56whX#|5cbqhj05SdG)6UAU=SZ`$8=s+m$5NjqstXlF51er6lCihv*u$LCUf ztjv1TaKHi7Gf@fjGeNsx`8!k6IZFpTnv5nGl#ogym?dzzDAMuXV?TF1Q0jj0`?TGGtC2QSkfI9jUF!PiDP_Y}pUe#&i2v=`1oYITb(rFQfD<0JyX%l!jZj})- zA<3x%oxW#5)`&7w=r;?U%D6e}NI+rS(g1dooc$^1B{PndY1|};#tY$l)sTuo{*_%? zAV$NLrij}G6%@Lex{|27x_nOi9wKL9%=qr2Wjb7&K^ML8SPP+!Vp30P7&?} z0s2$0sxWz}xo|_mZDlnN${n%atylqA44#!(aN8JjRZc=kag%uZQ;}N=cJWX+#t%x8 zGUM*_p)tl|BULgxj`c9;GHNhf_25%C1o_zUSGZVKIT%BXQ_-{XUFtehRODq& z4QI?pF*~ROb8tmMRh$Ai6b9eH=BGy49>y4{Z&I7kt^{#{7m{g^sEK(5l4@~iH)k9(!ab>QIjNg#UeK+Y2>L)@8^! z6y{UT{{X_2U;%~VsyFH~kXiRDDF9TBz2s8eD&bAw1Q_?IK??f^PME6!tOwn5oK=6b zub2)vrG2JCqpy0lgb|GN>rmmX#8yZ=ka***ITSD{*!t7fPcgPP%)ROUS&fSi!lr9b z<+%xww_%1rs3yX;;l@2`*oPfDw9 z>nF&gkA6CPRrqDe^7j4FQ3#O`R5&>8+|&fC5CI%i7cVS_5uK_&@u(TqUuZo404kRT zi*N~}i5KVOmZf9mZESp^qD1mn%#riA)~+Nc0Y5P9>M8}1WMZl~ zH2ai|VI|Hm)z7}CWoX;ym&?cWtmKBG*{eJKolK9%@YX!{mhBNUFpnPomBMR2IJUfn zn!%WyV;K3D@#ucF)irM&+F3RsAGz6`{rC3c z{NlWe#J)6>RAX*f>`{|~*w0~H1pXmwo4I40;33Ns@7z`%r>`#Niq*j$>)+QE^;v#b z%F}4-r$O>JYRWL(uQqm@vz{Kp@Kb5dUzw}}VHqviDDy=Tuk z1WM(Zlipnnc>nOEUo&gZMgcE!#D$qul13>WmpKZXKgo;xFblbJ$l$;q4ms z^HUbOl%_dyT@e60AkSLvG#?8{vx#oxNTB6e3F8>jT2Z!`4?NyQOAt=%O$K}S+?V9$l4frn7S@z#H*1s|bwDzwv`B|5k*@)D<>XRQed*^gRbm@J*$Z zg(O6{M*jZ*INRx6J^dRevsuQwFq%pczO^r~=tK-46- z@~p4HMs1jIJ9ivrylU~C^f{)_S+djaqP2};to~B8~o;h>_vzdw)lN^!U z4wU;#8-|4L%aM!|)C%eJ>vMh6MaYkA&5OGyGvkW zC%L6WE6F5}dYng)4@~u^3zsKyoXA(^?NC6@-A2_lXyhJ|b+lCB4Fz=q#ZlNHt zx2`ePn9wQY@J&205rku(T4@MQ?fiNgxXoAwC}WhBNdu?jQ5fVnE_!qoY%&4Qdao>o zGxGC_xVCldoQ!(+slnKHV#n8tCz>r0Sa zvFJK_3S_@K4sdf>&FTx{8jHB#oKsjh1fBq+YXOtn)2$;0*uOPq<*tQwDj68Mra10N z{*?S-um=?4y9NNr?r9z-7}{_tt%+!AyQAzp@Mo;d>M|}EKws0R|98?Sl zBoj{Uiaf+y_I$kwrm7Nh->pdLu;lghrfp{*HwW6O^96{9?%4kTbRH?>4hozx=}F{p z1cw-<+Nq4zlADQh+^%;thkwhrr79DHyR|Hg6lWbyDUPU93<%F!6V!o13^C{pRcYZ4 zu`-g!1Y~|0tHE%=Tb$G_8V3wP1b6 z=Wxgs7Tw2zxGfOnG=d=;wyPZD-kQt@ErNSen_UIVs49VuMMWY5 zA#L1&#Y*Z1Il-#o5y1>Pb3|ofsP`e4f~R>QE z`c*>ce2k4oKxP?WIQGprZrD}0!RhNrvMWB-A9UiJ#EcQrssuHuSri8+1QFl03fVio zDo@@Fl0H-U)GHG+l3NOYhO~~s8{A;bY}q^>YB`!vfuaG9MnO2^zdoX+VvN8yN^8Uw z8J9eBPUGemjE3lH7t1gVIQOSTA(GrVQm>8ysDzG<`|jSIsJICsUBEA2Y5^zZ3!hU` zNgm^rIHgcRgj^{0p~2OklS1 zaf+4M0bGs$EVg@iX?t4~|gRl^yD&!6ay+tBz z!3(!bE&e7$cx^i>rQ_9Na2{&vE4MN9snIvugzTVX#e~>U70m!E9 zLZN`pI#ta*%Z-S{cvh1<4&UKbkxNJN%gFci$4Z7TFh1-P>6*7NX%L4UYw`hvioy;Emk{Q;80EIIARZ0qa3UmAhMZCAw0~>u`oeIUTDlhT?Y~1xS(> z9$JxsQltvTYQb|P=YBSW^8Wz!>rBPB^RoYHYN$XPt zBxAUzraa%9{{Yof>?|A09V%}637N_^H?C^J7Uy`tr%f4DQU-nMH^Y?!pISPPmgszO z$bN8m6%EvZ6u#0*_8n^CZ3%(ep?I>sWS+G^Y4~wkS;EQOab1Lpi=|e&o7~~3&2@Y~G#W*jw<4AY+ zp{)Z@5x-->r=V!ZJc>-`80ac&@tT#OlNuCt$3C?G04(v&b4J%A9gR9PWnx*gnn~Of zxgvwlsizd=3{#K=&QCP<&NGgbYhfNL_lOlE<#Ym$7XQ-!b$I_xuK|IvGizh%-79;-vtw|_33+qEE?V5Pq#^KVl zY=|L>yG~DPlySGN^&+fv^2SWMCrsf}KvkAu)A1C-4^y6a zyw5HfBmLQ{Fxf{E3wRR=-)(LElugcYv~VhtAXWwjC6DP<5yTSA$U22zergF)+(`!P zi7k%g$Eo9=&b3u`utyvkj%#h#1y`W&OQ{^iYq-AA3&5RE`T46V#?kGRK_L0ZUvXVE zt*A+SqTAT^{{Va5vF>fP81+U=gdShlprlF#lY1Gikwp%6kf4Eq>UajWW11^S)mziBth9T(q2-VejPu9M=~iSD zEQ=hGy2T!lHWLn#p1Huy~PJUt1tfud| zKwR9xDx@PD`kzYCwU~*w#xP0hIOeH+kR$nFx^(odn;nqE;g{scQR=mEhrOvPMsJ93 zCy<~y2!oORGX#p)08HPJCQ&mxh6`79gwewAr0EHwLYWBuGik6OLN z+?mbAr^u6SR^zKyquWNS94Py?{Kl-r_Oileg}{*K3H)Q`?@4A*NKOgQ%4!?vW}?w8 zyb?tVY;BqTRZYaOx5>(e{ux zD9OqH0CZPJ;r{>*wcV_mz0-c@1SEeq{r0W>D>C|dqJXRqxx4*4*RJ?-#19Xq=*)fC z9y?U?YhZ)9=eK%f1_e3CqIRmb62WL=nmnjOjHvv|iodJs5%QLpD!(tSV)=4G51%(9 zjL|KLm&9)Cx`JH1A~DGs4Ov=JsJ>KZ+>E#(x>r0T`#{`fA_35UcDJ+-CQJB@!Nh7+ zhr4zLrOVxBbCucp1)<8fS{1a>DaOHp(~NOUc!)nZ+ee44;~E{f2PCK^z41~>B9a@{ zz84t%=6Mr(l(V(=5tOG%_rMgrTXOcO!espYzbe8@-9|`O1I*;{Q4|^JoOi1U3jjgs z+N(1%@ly*0hZxv=+2*6#Td1kmGNw;zAyP4l)0GG!Yz!#iQzTqAPZcDafxziQs}QtB z`@o1Xvjh%J3CP$_H7*W$JPKk*gPPa}fE0`hMkhHxcAt!zX4fF@;0ll&goA<)6y43{ z6P|+=A_qNw?KNUxH#bVFcNAJ9iCI`~sj-8-{$Wm7@S_dICJxX*$f%o$-h+Y$&f|({ z9BmoEr>QO56sj|j+z!=Hiwl(Z1aQRksRI%>ckNO@hGW3RM$y0e#N^bu$6C@i60s7oP;xqVr+{(^JRY<#EQNY!y$Ke`@TVia zDu|-Hd13J1GSvGBKtSS|<*a>qT9lzrn|49%O+79s?_r~G=xTLPvE=lq6}ON`>r<)? zst+Qva@1*RM5G4KQBiNpbopw}ml}<`c8X(e1ymZYbjg%%DyQ9H{{ZaM0CL#mijhz% za@wK5MiGMJ#s$T5#YLv91F%R=LD7{H}wDpgc(6qMMe^(O$j{JdhI;Rhq7PK-bb zo$9GF2{zWS90PfcesP0S7B99m`z6O6zr9K}pu>FIsj7A*$bn>(We7MPwKmL+y)#Pr z`D4umLHUX4ReMBmkw`@7*e5i}0mcS$D%?mGMgZhfL1lA}f}c3ZlsoksR0@|RV^DZC zI^lq9V4l?&1zDOy#Y8}bnC%I-ihCmz+y>lHAXYep^raEVqdwH(CDa%|$PV0MgBi&q zq3camX3GJFN^&E4Y+L1`Z2=d}$Qa_M+sOVV6&fQT$owk8CezJBkvyeeoHK8y#TZ82 zw=OEeA~QR$@cr5lqmAWu;+vJn$)MC(ckj<0l+DA<{pU)V6##FW<)%lS+%L;X$c|P( z#K_F?{l)!h$+eY1UTKXJDfth|TBnRWSw^UAxI}qe+nL$IDj5?Nybzkn-u4@UpE82Xqe!% zE6Bx(0Am$0Z6R=tx}}K(Qa1i7J*3LTPu{CR$~gZ34%Yj=wOHVSYG8}CvG=K|3n|O+ zwF!cW8Yx9IiUOZE^r_0o#XuPpo>M5_`cW10MoXGxZJ3IU`U}?Rk&Fs* z^TFVDsf)0b1YDHLj(gJryK|fY)}`1ZW45C#cX5y@a*^zVK3~cXMMhsWKO4GnPB5dL z!{x_BWPE`}FmX5}b@?hAW+;@v4^g1~nCs`h!toVp{{{H20IsMrPqh zT=uErK!fHPOjKJ?_H2X|2MbdMLy~xEj7OF&)83wtr*5=0sVy=vWJB_fJJf2;yKD6A zQ!=s2gVLf%q*Gf{dIVwzAZ!4dR16d5`MoMeTrbJZH|E#^gYQ|+BC#5)_vmVPI5<5j zG*;b@N_QKN%YrLJN_viBPBBnNxkG1~lX~MA&T24AWkAI~QSytB++w1WBWm-Gl`5tP zBdsQOWm}rgDcE;=fflp&;&-l|CHsFJUO~_&j^K7+MBJ{LVH z#aVsn10i2(()|Gvf*X#)p_HO2X6;G{=z3LBxd$zff0a0laxmGpI+XxaQ%r?bW5NzQ zQ;E+Wl`VlFR*V3HKDq5m+@~$llzhX?9FFwH01gLwh{I5^4<*3ITCjF0+l+hDVh`qf z3Xr3=N{q3po}n0`7v>@f#6DMMo3@J*qL5 z;;k`EFlDF_JhPBG*02ODd!u8te6*fecJ(8_r4Vo!Hzd=Lg#@_4^`-9yq-@O*!}E%b z9k=CyA*$I5{4G}zG-?~DHBd~brcCWSh4M%o@=syyM$n&~A!Hp7;ZaK?=Wk<5Dcn&) zx@Gf@ltzdb%qO2pj!lYJdE9DHRGv7i7}Faraq{MuEOw(D8j(V|C{09=m6Io&cdX>a zu+fkkoMW%nowRNql*dMInNQ(KAY@VP)`$)vA{g-5r6i{-NyglffZr`n6F)9E9Vv4p z5=exxXnhH&jATXf^)+wF02VEhDiw(`TYm$!5Mo6&h17!}tpaAZq_<^63YA&o)hr(uADvsb9OXT zRF30Y*IUnbX?<_`TND%#nt?CBy*U+BYO@H9Dp|dwZdv1Cb^iIAqAP+oSre< z)*aThBykuWx48uFJu%+B+8HcT_l~I1iY6Mh)!dD0E<{o<`n{);2T}C(tjnE3?bb;r zmm#*PKDazr9V4aO=6h0M3D9>Ghfuh;g#PdX*;Bv!r-NRd47Qwp6HZm2%f>R?MsVuN9ydO?~hyALlI$EicN!+;p5V+mCrO;OrcUC&f9}zsR zNZQgM>UtlgO5QEGng{YYk~4rqeb3Iggi^{r&bv!>#VwlJ%CaN5fziK^N*2!;5OXG9DqRN1CGG-t^WY{Pdrx<^QM)-QVIx;&Yr(h*08P9M^phMaVQ_g zIQ;3T>e4ZcWc3s*JvQ}7w+o(!;h&6tEYsHPYA__vEP%zotZk3K?s|2vQ_#LT=odCJ zzP)5^wGTC8jz~F-F3x1-vYeA&HKZovlk&7bl|e0-atw^Sd;b8nSyjuZ&t6icO(X2< zABdLoYKaz?t2CZmd6Fp@4i96V_3D-$F*Do3ZIC=z%#wcszhvO&pI+7Zv16p&MXLR- z2L0rpE?b-odVMRr()>x{iyN6O?JuN`+c=USenZAO8uRL8vHL8^d%K@;-)h7uxYOj> zyPW5b!`8f?#GW|uBooN-OsQr-O^P}moco?@%VF`G*z9}KV}dkcoE+!3uX@Xu#Bu8{ zfghAU@F3(pa>pl8=xq*OW6?Z6t6l0YCAeZ_bN5@E_OeVo#{hiiX(PUC&&A=nBGEJ3L(()$i0zgu7~H>> zHpV*PJu}|A^*b{kQ`_2|Z=peN3QHD0bTjz+8k#tSt>-u~x$RyBSh*N-F(O~Ho=_bA z6*0Y(Mdmy|D)-L=(={5%8bJso`g>LNk8}h$`F#y?&2oxP=6ttT&=|a^%+Afvp!(JM zWsu5$c2&I%J|yyhPg=0>IbiwQ^{7nAqb^sI%gB%Sib2O(p4#MGjH2yj>J4bDQL6L9 zcBpY0EJ^Ea-*d| z68!s{liSv`Z$Yn|jren8|U{t8!enepC8YDL#adINZviI34{d za8nAP7AKQdvmrZI=)^$A>`_KBfA0^zaTVMcLC6cMl-8k81Mz#}4~MGl5n{u7K; zMX`~PUABe59q~{)x=Fhk6=1dr-Nt&FtZ=vylG*j4gi{{40JAkl+j29|Q<(;SVYnXD z#vz8>_u`+Znqwp-Kp=5Q2_Sl!YQ-uSE=g0+8fs-m38ePWaq|&X+H;RP=?9JYSlaZLm-j+ zILP&-C3fNXr>J9-kD#a|g``l-+X+9AJ*xT8;kb>ku0ZKcRWe2&_(<>8r7;8;ZurFq ze*lV^>#=Qnx{Tpe0zQ<%y@3IEJ!x~7!5I{+S$NJV^H{-2uXLtM63NL6O28B<{{Ww* zON=&pQ253eWon$RTV+CyfGH(`?s%X{xptl~YIzR!!93M+nOyeG5dKgatF#fjuWCho znN%4xfmASI#&ABg*;%)Ii}f_A)6}@YBxY3%22CF`k3c$7D(?HkKGX%5X*+h~`FhfH z%}BN{4I$1s8KxBiOpa(#yb%8YbkvFzj+hBq9OO(HPI<*QVwLODwK*ToOy_7H%9`p7 ze=k$twQ8fKfUeT{S;6P@08>ulcPnmEDpY|Arw9{g54IU^4K^`@OqDGMo%sCo;~X0roxSip`5h{N1t5Twa8cc`TrG!0kZu9Q7C!tgcvvZ^E8I$P34<3(R-B7(vKW)~d8D>_Is6 z^{Y8$8=ZOf&X7J`H8SUAO$$*CYCjn zW!UG?dQ^-)Va5h3Hg->C1B2>l5YxCfn9G6FnsE`y_daZXRTz<^jDXlarickau&y!F z+>ncKSo9r%?@ylU#YWvq zyB%ebc-VOdzI`Z_Ld19Qqp78o9DtmPkh;8HSwSEeBph|^NzTYLKmXS7ML^hofC`lg z6(sfPM*Ypl9>b+NH9K%C@k&lBL-#n`WR}BVai5x<3Uf*witJ;OI#PVmu*XkY(Mm0W zX+ekqQSJTbBP&)^1zeH1k6M5REJ)(3OX?@NGT}fN~Py0Ih!DFS5Oq^6e_6% z0rzPJ1LGAt3t}%Vqf-6NOB0k#9y8Xhostdt!5ylu#ACGbdeY|XJ6t7&v$!0qRB%Q^ zd2LU3F|k(rql$AbHoE+z)Z3VmuNtDZ1^}x*SD9`LbR#t!Wr4$TD%z1M91LQs?H0Qj zh^~@v18zIk-JRi#jqRUL#;III$nV8N5|$Z$wW?hVr%E!>o$M2CL5^}M;n`0W&R9-i zU7_-N*7dA{Q;>RBJy=;D4krlHZ5k-*NmfyeQ`yV>gMm>v*iHv0ty+Q=WKs=bBg?3) ztWRpphZx{iCbt+_H>u#)Rc{J~$rZ`#Qa1go(v#To>(%IBsn1hWI;?w5M-(M-Bl1mH zWh8*S1NEkspT93Hgrr7)oJO0mckHZf8xdrsy#skNAf#1s-w{{XI@qd#}2r8$(U zvXMxIQAZgxbpgEy&q|Umn8!+3#>VH7Qf}(YMEer;226~T*V3GkV1iBn?MxB7=NweZ zpkpK*wGvGtJcn{m6re77>qrJq6(<}99D344ErK!6wMm~!6ce0s4Js>!Eyqk!5J|^jLgaE!G^wCoW3WXEqkkisa*i|G)}D$0&r)eSTm})biN=4ONWV8Y zG@(xI+2W@1$s3ZdWC8%A8@p7wUN-OtttmucH}$3g&mE~Za_N$VBo;LYDmlh#NXY>1 z?@BgD&#fidlHK(X0x-s&TP^jVA6}ozjk#b?N|@T?jDU0WsUr&{gB_{GHxZtc^#M+L zRdgq*4#KU#&#g=b;q<9C0yyB(s3^NnT;id!k{1dW9MO&e=qWRS&uT{9uvTr2!HynS z8SXn$s)hiHP=Q8!iejMzGUpYWY=UH6gy7N;N%~TO*wc!r0FTy)h+V`dBbA{dVnh1W z=emw_O&C=e?M~Vn!4v$gfWvMm0UI%)%`Z{MN|SP;e7qjjHezwHByBP(sX6zlRdU;n zRZlSjlTT3lu;(Dr%2ho=GRw)&9V@QWj!+frT+mOL`d3k>#QRh&PQ^u@aq&0Ic-A;& z=N&!k!z8!z?TBIqId8(fi{d@lwz*UzB%wI=72&#_J8Zz=i2j1E7?irldvFPP(M{n~)pL>=ZJ0^HZAk-P3T28vhQ zj8(sf*1AhjfdqYXT$PlGZGN!2VOtnJwdk*Agl<&JAnHGaRc^vD)aNyKp4!*Sv4~8= z2N}kB=k%)aB%%$Mb#mt8mQj`Ur=VFQM&8mJc*K#7tljI7)i7^N zktuBb<6VD>FBeF+NCpE++#l}O2@|=BLvr0m2iBFfDiLU_AdEH#L)cbyR#%UCBN7ta z^!Kexcvf&3$4X?=i#%lIg;>k0ZEFM}H{^=xtYNp39f5MguJ3x}w9g{y=gX5nC+l5A zmv)vAmOpto!1bfqu|}QDO=8y05=?A7!Z`!4K9$bLJaNP=_I$sns9r5bYp1!qBlnru zi}w@!Yacg~U-=?E$M}foYGoS zIrgjxY|M~J*n7(zFg z(fqE*soHvKUm)=Zib1&cj0Drlxn|amC?)%?%uIpDYn4^Wym=U^q zfA#8u2$%P+HpWLKxTP6tWy(W)EySqlY;m!;HEP4{lGvH9uogD~%af#2|} zR@Y&jQZyew8KP{(6~4(e&grwT_s4u!sc3q=#F|=SQt`G|oQ|A-O5`-%Hg7P^kC(k^ z3BJZWf;jE$D7rU-(B;3f#g*&G@_CtOIsW!(0N6k$zqhw{8S+=T?bapqnE7qD;VOrNxKIk$-z0;PZ1^{w3}?5e9N>5;uUpUSX9S{ZgsnSOR{ z@BZ~_Y4Uk80|?n7KmI&wWMNTRpL}>e*v+BZ-a-h9Se1}BTw{vTbqcs+k}EIa`FOlD zXm{>UDKI~}!Fl~_VsK@Zo27g%CHw60=YC>?8F%0eikK-N9MS|VSksk59256z2{&Uq z3dbqQs04iEw+5%>21v-L)CV~|sETY?u*XBWvD=!KHFJg{g8PO5;*}JUfOsCYP9Eq) z4q3|+#W#_VI#Lk(usI#+HWVAWig&a^*CN{M_j}ZZ+yRa;Qw#+k-8E4B?Sqk38FLL6 z0q9R!O~jT1p`lSmJ*n)cab@XJqJ#=jMh9wXWdnndYBDka98{SHXva#@Htqy$7=l3J zq>3CwarNe!2GViUu&1#g6g+`a)#6ozL=xMl8Mmkdq1R((8qSn;Vc^Nr9Dlk;L6ZdK87@VG! zImBzn<682rTbWcN+P+@w^HGvV0QISa3ZYFQKz?q*h|?+qLJ$?@|IswLsvjZYOP2DGT8&;GU-}Da+|lD>E<3wH%rA z0UyIfgeZrQoM%%b!_t|-KPXQeq)t29GNYEJ?cb_)p9yi zb2KLTNJ+s11mc{}^8B4@QSyvqZB~^F6)JcgX{XFM41`EYVa6&*kQHp2bSk?Eq-9iK zI~vfjuEYh;0+m9$ZamUS%wP_b)sO|pK~UsMfY82MG4yJlC*HeXts{k4PDeacag(!( zB9)2eV?%jI1nvf`k1f-0VMrIvhZy8jR4Xn3!zDXuc1_2O0IBzC1G!m-eoA;oNjccM&Qt;)>4_yf4x#FMxQYIwO!*1%yZ2tNg6>gl16SDj8mX|9OsH- zC`j4J$@CRGaTaAeY9nr=ltIy#?)}1Rp9VLw50^Coaz;VsoC5)r9MG&LkgfAD2k%tAT9=Q^{wiTWoE}=Fc@u8K_m}R_ zx6l%>>0?nhn;$3zLIMw&cwhFaIK18e04+y!v&%Si`C}a7npfNjrCq!~&6;d*{hVPG z`qhY475vFM3L0p#S}ua61O_LV(ysbzsb|3LNfY^muieLbK#Uoe?^8@8xh!hqr_EEM z{{RaewO-$P4aTH0VVRH1LUsYJq>YZ*H3;6VpW<4!u?cq1_nB(BC7g=5>;MRfm%T=J zxZKp?l{*h2q*2)y?{uvx0IGbrRS)o*jU)hW9GY>7%PQlgB#?$Gv3I51YBwd1F|jH> zR;v4qpbft$YL{`_!1kgqzrBt(R&lkgWd0&2SNTX>RfH~)Z*D1OMv*rT1y@hIi9dp_ zG0?WenQ}K~nv4h=$0D8=c*>uegCCZ_H&H`M!yA`CLX1>f-P;{aSvyDv992l5!7?bv zr4hA>iX;GqOE->wFp&Hp7kR{ z6#8*fA}W={GGsC6D3(lN@zcFIWRU}I`@IDxKgZs*NrYqw%d{U}^zhzV>I@$&I+}O@=&@fPOV~fmN!J`N=n+s)`h%I3pm)A9kAR#N=^L+(Ft# zb5D(Sf@w$M2}j){D#K|XcB3q$?yCVh7U|xZfkO$iCnL33JV>N-O*0g3d-kf5 z5?9!8n5zQAlloK6@G@$!VAEuZu!=@^o_kV_G&>P4`APFQ6sqUU^1#3!El6a{n?T@I zaCWv|psf(gyAeh^nyO=9ayeR=W>@J@#Lgu-IIPmMxU5PF#JFDmwE`I#80Wo8VhsNP zKSA1;$-{7RJt~}rRCL)dJ*m+|@-|5MMJ%wkflXuPCrlGj4b37(=ob{mjn#?I-4$r#2))*+2~?I1)7q{C z+Qlv7EUefajX^G01X0$kTzP0fUX=?e>c5>eCOE5^s_Ptv0t&Eh#xyHuz8miY)PGu`CFQhf8i@(>P60Kc z5`-a#VbYsgYCc3u<*{57k&J#7B#cr8NRuT-YO87s4E|0xzo(^I7S~cBVgMM)=cQ9> z!N^Z)t0IR9js1`C(LCvB7)o{z_G>C#N$q)$_k?!o&0>AF?@@EPbLtn`qjJqZFSNX7>pDz_*Rn0?MGJ67>7ouu0qnqaaHagmIAH4%g8IY8f$;k1lM-2llX z;=G^6e-f>&EX}Q(=1i0$IKZzu@#n^9bsH0>>EuTa@`6E?d=8&nn()2%m+~8nnJ}z) zKg8LuV*!G@_l}x0y0fjD#uu+Ui03$sa0X6!{w#N_Up7mKM>mAt#ha`Lt!VBpU0EI_ce5=wsU)18{Q@H zV|il2CEC#(N>umz!)LX5ozAT+qslAy+dp@j-&<%(wcXsUBC76R;`x90n#>ka86IH2 zB$eGpnnx{G+0G@=ky-#*Lbo~Seuk^d=N4ZsLWld+(9H}VEwDg}Itt5%HV-n7x`+2? z)E`>xhW_cvXL2Je#!3OXk5m2Xw;6ci#lhX5o969R(ZI@W!;j%^qL+-j?$WX>iht*xIjoxQ zDBQOW#zW>ela8BuwMs3aWnp%^*_%J^)p)HXlJ43tHllpLFU|PY%OhKoTx4`sBfqJv zWxb1w*HUPswaUOE-6Qlqn`=oet(APN;lGHjSGMy~BKrXT@B3c$Y;D=)zsfQAlT9RR z9f-Wy*^z!fKdnT!6kW%gsN$F@ z-U#WAzy7MZ_STbYMahqyzPRsHu15Ebyu35^_N?29C6IpN78^Qq&1mh^nL_53#=RuY zXVehS4)DHM9PT^}dwSPJXM3gFfp2ggHURm1c|{|pO>vhtm&tDp%*vuN2^@^Cwko7@ zPd$u~DgEyJ=e|4EQi3ykp7{@q^ox{+T|y7^fT0LM`?5#Uy%$Tc@V>sEX}7xqNuxVr z1OkV?LFfMftzRWrOL=HFGvyd<=bTqav8*=nUFYUp5Hrqu8uIZNJM337vGt~zr+CXu zNx!qTnH5+KnQ}-Y7~`Sz`d53Sd{OZpm#Iakc#BU-E!beoA1)aG01)RG^%e0hpW}}d zo5-ennIwV+&eBNebK9@=uc15@@ebd_I+AJnjtfikFUStz-;Tz-j7D9isBu?5rqeuE zrra+4hLw3BS8EN`z3sSYj(g{|c!TH`h_cHHl#!F=BZ2dKRh&}(Stzzu*o>s$(* zw;^aYH+FoHz^GWUW^gc`rmn6N_e?r>sGKy6P#=&}gFv<+1Q^>sooYWNn`qruBZRt@ z0~qO2q$44Z%Z@6b#^z@j)--i|>;tDth`E+s#C_hCrEsz{gnVM5XwZGb)2QuQK_fXW z2+D>-k&-*rVlXkkr{`J;8x{T8*lGtzfXDF)%bkQGVinAe%aBb<(U{@|ze=+ERmR*6 z+*G>?N3`?)G~oT?c)+Z)MHu<`&w6>v@}n6Q8$;$OSvwrkq6OjGKGm{)2$0D#vEX#6 zu&SYldK4DU(0+)B93VmHH@mqz#IxN#lB&ZKS~0W z$?ZhZNrTH6EHn3b{A#cT8|M4HY4f9yflnFcnIfsexxmFph>w_L1d*_Qd88q7$El(~ zzzlRB&$T%M$T=8lH9$mE#5W$jGf|dAVC*>QQnDS4nf&RE5s&~#z@y9tuwTC(4r#K+ zzG6S?Q-Be;Tm|fDncVxEfDUK@g*fA`JM^dvG;FHhHt#`!R*1{7>6(d@t_2C`H1!}W zm%{Kn(jSqroYao0vTiDP7~+_v7-w%zD%8s7Vi$GGFH_c;EPiZbBLz->#-6L5N3AY$ z4&zpuCOeTk76Sv7sB*vtC%rva0J?NOw2Wd^%!dk2J!rZ{kKGd>pO}N_YCkN7&g}hr zQ^H0V1pB%CGfvvu_#6s|vp2a|5YOdz>rZ{bFh+C8r3eh0$i_QVEh%D3uq^# zBBGfK1L%5GtR0^lcCW2UVmMhYi3XMs?4sg zcH?jIs)V00r#c+mC$FtUtQ|lHAcK)Yh6+rFAoQk~fLtiS?0qS}h=^`PRHKFd1Nu{B z85<+vl=GhArYJ;vdydr1WA6&iYQ~x}FOVOYed=SV^1#PEhqX#%2*B*=_|s1IY~vI; z+=)iTU%UeH0Q~6^HW&wh4_cFGb~}$Fnp9HRX7sCzx(E@fh~z9+Ja_3(Z5zuFTX%EX zrSh1`)Z@_f#UUXEIsx9P>?ooaLJ)TTRSY{w-1%di3=HC}23Jto2ACKlfI1Vvts=o8 zq-+Ez#%PUO9P()&d$1tjDg5aek?Wq_s)@abm>yY<0HKR2f_Vm!6~Mvdb>@%*yJPgH z%v5Em23^>1#ytS3U3l0}0-2Jpu|OboK9sNXAw%A&4V4jt@`r^uKE{+5ago>Fr~C13 z+kyJjK2TKvxlpG+U#$sUiIF)S`TA5(x9*Ra^~FpQGJMoIQ;Hc88!SfV;)It*A)+M< zm0m|dP6{JXSa5$zXPt~04}1@;G#77~&q{pFJAp5jGle`Jezg(cZYKb62YQk-xMfav zboy0dGa)VXspb%lpmpz2giYIyax?h*)Y!u1xdNJ6HVW9}4*ryM0tVcKxZOEIJSva4C#{Ntnp@#dX*E zf0+?59jCQ&3vDEF?J7ol(td>^%9cD-{4i2;QLI}V2aMBDWbBM*y*}j=#>5;Ro|J>k zGBkL{_*9XM1tfH-${oS+?ME<})f-R@bn0p&wOoPEtyyTnO}WKXL@`Ku{NA+>K`4(3 zV^Vt>riGeK$AGn^u(B0Bs;8H<^N=Xr=xrNBmDIP-oQjQ*DEYh8h(n#ds^dewI&wNw zv$ctGxmGi|aMe5~s^bbO2&4V()6O}o!WU&Mrw7ujl$k4PLh(G2m565pwPGgX#T*sK z;ax4Xj)Nb8tjmjN=9IT12Ru`gvbhRr>_vu*`G6X~rCv`QyAR!LcH~g%>uzJ&!4*#0 zL=DiX_u`Y1Xqt;nPV`6}Hz!)twT+oVC31FKp^tE4N57?YdK}3yB=83V>sUHP;S8j zqydS}F;L7K9?b6^bA$Y;Vhywj4qBQR1A&^EMli%uY?jH0Cj-)>bjMzXoU(0hdQ;I^ zmo3I=p>-SRVd4uX+T7R6YI7~2P^?M_89!YYM1>+4XF$7kf)_MF2UahoQMwsq+#;}H4%=wnb{OMQR;AWF(sN0}1=Odb3pyL^- zRSOUROp7f!1KU$Zd>C%<$sF?0a#xNG69GnAFu0i$B z=}ZU%aZILyHE=#^cmxh;3661^dZ{CU(z9%iP{zy?&S@S$mn%{#06F}rKvJXA(uj^E zYPm%xtvGNnDFOcP6(XQx^Kb=2l3EffAz`0NR#I@y*V2qS{oaP8b~yx$QOs0Dw+u6i zk&r76X|Q+X)5`CDMgL z!z+=}nyTZ1awsl4lf!^c4qCe1Ie~;CcCKC(MPL)PbXsx+08{H@M2`>nr7`<_QAxo- zegi5$B*$IYIAii_;(?q@;0q!{Co#az>3y31`~gmukD ztjpZegM06eT#eqJ-mZ_sw%2n>Aq|lL-b!#tUvBl8YM(h0f4Y9Pv!$EMM|6ncB>q0w z9lsizk;qHp>rd?qNF;s?MgN4Jq4p;$z)~^#Z(>Elz0}yuZFX z?f#WXwk~9K)^FvsayQGLPSqpGZzXuX?%tW|MNooSZbWXcoOR7l69>3y6Xrhjq_rGb zA+c#K)Rx>*p;mY$Nh25vc_ehldf&C#M-u@aWS{=MdbfrAO{ib#QrJT)#*uNu z6dzBPyjR8A9o5y$rG8g)yRU84(M}?P#=)x3adw_$VU5RjBj(L|wvlZuv^y^OBe3mU zUY(#DI8#xUAs~nDoNmVNO7uuo;nT#?xsbBwC$OyQAkszHV~=Y&I3(j8K=!L8L`6)0 zDvq4=s(N&h%^o(L;OFM`t5=aajEvy*q9~~BP?q6--6WXF+qC;FSw=*Q_X8QKLO6-s zr(kcrp7jjY3n0wIqYj<6(aLAe>}I~1b#-tjZgTkxy1IQr*U7dLvMs{#_r6|z>6YGJ z(31_j1~dKYx2ekv7Ko9Ll(!{~Np4zP#Up%5BIEnsoYtO`WpyiV5Qw5i9QxHbEmG}O z5%U`S--UWsfNY}EOmcOM9DDx&6-#y^Qn6~@*4_(!ya-gtsXjpDcc+Mn-(pQx@@J3lgazM1zE_jBH=I|M3pIv=xKSlp%Dhah#q``(*P zYwG%irlF=~1|Jw1>MNd?Q8K_F-o$#=NVtkCYm!OxBKe2Xn`p`{#Kmb;{Gfc}_`dBw zOt`e0SB~3p!TCvFn;w~}x}1oRE~J5#K;^>v_NrbQzKL%F3r{cY1QQ|tRh3PQ>QAxy zIq(u+^y4es$Sbf~r3Gj`N_7Y1I?}A+XhpI5({{SlVJD^yV zE4scmzr@cPce#|UxBc2kSIl#}r)sfqs1aCmQL8v@=s2!^Qg30b3JsXa?@F0Lvuudd?^N^!egfk-kFe3)1@ftI}VU+ z89jScesJ*tO~bWnm%HwdLdJQ>`_&nXamc8ZGW*X;uvJJH?ODaUksI7Z zIV87gdGhiLaf%Wm!kEx5{j6|nPJKZx;=T*@=}cdnBNPQbVcv0%%A_h$@&^?TUhv08 zixB6%O|~#N?^UBD^88e)7{AN+Yeu?@?2)u%Zqw4C@^iETOBFx>?qi)4kP?^q7{ z6#R^hslXKHjq(9}pXE}bk@u;R@XDZPHBaFI7%H&itvNwckUCSDK3%mON6TXwJf74- zASrM`$9jr5SmBRRPDgFr4mVWj88UNHqs)Zeg&!w4=An*7V$F}1oT(y=vu7P?Htr1B z`F$$P$raJnO7Lnu?VNSREKwqz-*{AEHa7FfG&ypW0N5S90H=&ZeW}N82^>@ruwvPy z*<_@!h$%ds9`pH3bnC7>3}=abLITt zR&fZc4GuGh;;bPGfPtJ#p1?V}oxJ9wAtM`Ky)jdBV?Ql9lX%2~ z?)0SwfS5^t0SX&9=rW34$NVIt?H42mSre@f0p#cCpXhiNq+M3b-H62GT0hG0QRgw99yz+>`ffF`!V<4E8lNEETiTtI9-75zhvM<9=JU zQ&wh_som;%pT-XoU1Icj#-uyA~M@!djqkZWNr{xg2+T)$P`u-L9(;3v^oo*9v znU9$}Fco^^#22?kETTBs@}AAQoqWCzNSm+N#aJa(7!nWK#YW&UPn9rt}J=?@D0Qqpya4Xl@G9Poj-J7aflGuFI1xM{@s>eL)h zWHRhkNQFng0}2m4>Z})5_Ynt-_2coU5UI3gxsy4`OFT%UtwLf(UCK^saT_xyqfm<5 zn{VA(QIdNJ?Vz#7ioZ2IBuB{UQc66&I*NrMWApZ^MJ+cZNP?>pX{-BX zQ71I3=6tyOwNRL)0nChe&)uklkfh@$(w~FWgHa+fe(}4}8Q4u+L=C%+m1AQOxb&v8 z0#svd0G#JI6*1IfkdQh2sx=Jzw$p(*%8b;|p+eifU*Z1%fm2SwvLaHXmguzb%EKdy ztnvQ<2srtdvuVQQd>x``X9B<%fwIE|4APxmfAIORiTG~63$O+FG*@}6xj*c zmE#l$N#tjWWPpSI$f{Rld&J9@jY}MgZpLmGjPdlPh&SC;;PX;ScBvSujBF-VKoLsF zcMnrcS0Lff2c=CMY9mn~p*WKzc%>_f!z7O+FHumj2uyhSMOr9SU_UF3TiGJBc&-=H5NGvD9_AI07-+iVSOlJotpy!x#vJCz0ylz4Y3rBzaLqnZdM2wtGlDJy{VJ%ZlwIZiSvHIH{W+esow23L_% zk2KrvMcjWXi7O&xKv4XxoQj`*5ltchqjQXVR7^y_C_EqKPAxEs&~E8Wgntb=W02=P zx>U;uw_S)y$8%60F*zJlgph}zC@|Gglr)C}kye8<4hKqy$}D`vI~aAL$*^UWjZW75 z>S)VG>wnn?N@CINLa_t3H~ZZeVN=dide#?-Q7KEypt>gEy$?l zWRv6(lgXh1Z7!*`g;j}+rzy}?^+2J6@k9iQ*pUWJJ%K5+IW;V~#yu(&Tztoh(5UPq zGe)t73>q#2pGB*XPebHXXf>cngj#{X>^2+h^Rf$iQ+0V^cGdy!hV_807&stFwNbV#+ zcCX+5mCxT_T)g54K|}+S+O-YDHu0C7e9Q9WEpxXwTkd?=#|$~eZy231NUUUh_Z-uc z$cS$sZZwTL63oXNd9Gq<#FKeD@t*zv0Nt+2P-R9Q@uoEAp5@)-!b!>7?b8*p8@wlG zcjKw9T3tp>KQ{4Wa2rpxRIt3%HL2F#9qSdVg7PmJ$8KwHV{ypsWAajOI&~QxJ!;63 zOMqiju@73P(Hy@Mi@~WmuKAnHwsnji% zvfa7H@8aldgx5T4r)ky`-%Tlz<0~J^GWkBWci!A zC9gwjbX(l?PZ9h>x6_QV$98XM!Bl>yIj-nk7%Z?#`aq!yB2 zosZq(pKkbQnFr4pY#+LC-G4gwDP^h%>!(c=%r}E-UZ#CiX1>&QavvvVVJ~>cfXpx0#B_xhwtZ^eIx2 z$tm+l-8Z7h2vO9decG+IEkfDC$+ydIn{{({3fC-HJ``oR?^kTmVYd$m+@1YK>gtSD z%-PUb+oL&*{_-umQ~0q~t|3V?3$DiKyLj7*qi5zqyHxpUDE=?J)XQ|5+x;D%&0xQM zzV;|uFgdI3GW{K8UB~!%UCmi91^u+%ROrb35PKhb^r&uap^cawpEvh&TGsJt*JT>> z=L*}n9e>`fV_8RY8B)H-jxXAL!cn)&+`oUV1{Hpo%?nS|nP<08 zB!GVJ-TZ4NT`TN=yDRb!n-y`b7Qs+x8G>Hf&~sLjZ- zjy=T2TaZBA_*FBiyt2s&AAO54H5MYpxmw)jD`BuGbr$>FCX7g z(y8x_0x0?9Y%3@E?N=18RWoiYhPfb z@T#WnSmIT51n(R#r54ny{{Sg$Tz>xmdmk`VUVF2V9}+inRoi|GBJRo0(uQ*$3m!)x zQjnA83#OeE8=%K$%$e!WwM9JMOlTwGNgto3Swr@fZ#>{0o2sAK%qmgN@OloI6gUde zB(Unmlzwmwl;qm|sI?ssH5Wz7ddy5C&vT2#(Mn$;=S!-it^vh*}Z#uf`65MU}>71`fTW7 za~r82FzUGUudMzY{A1I9wFZ-_U65Tv5Wt+CpLp@dQ(rfk<&CatNHu4+TIsrmn<2Z? z#})=bfm0#yzTgk0RKr$T@FLnX2a-h(X6%l*i0K z{ICbLJwezv_u`R&ZhO)e=%=+x5_TBvvkIdCcc{d25%S5jdehi%IPFrZg&gz6T|2Og z)MozxEMdAIN{Uy*f(B6fdecfdB(rckQYpazecIOI%%3O~W!=8K@I3`I zL_EGu4J!gFhHN&|&q{(Y$ahK4y;xv8(x7rX(q)+ChAG3ah~**hLFw9~R+n*LF-q^{ zkV52>jw(!Hc<6f4kty7+1G*fXZmFXPpcB+oq-{;aaZtHJqb8J7u}eY9>mVu*6wQaH zN@NPC2|TyBO(&7Ai-K{wH47evN7j&|a3^O);*hZzIL?16WP!;-qk=|$l_!_BK*6vv zSFh0*i>ObQyy`iDMCQ+)Q_0=DCByY zA8z2iDOD9dQIm>e5C(SUs``(UQNR_DHgdQ%3x(^{)X9}hFyPZnN(cyg^`~`lMHLIG zfSAv}S~D)?P%tWNINj48)YWaPhT^VVqK1W4-lf=#qY=Q=AX`Jk1$@KtKaYn*0dv*F!DYiA$6rMWrY9-zmuOHT|6S;nF zp0wO>6!aCOQ`mg$tR*G(Fd$=tN#(1Jj1E10K9uxS+%wvM4o`1NbGYC#MN4%aQe}Ez zR1oiVk=y_`e4zFfV;JXyRe@*BZZ?C^dk=c3X`p?P-zp$*DL@1b+zM(bi0$gNDIGx^ zR?0yqW>#eg!yJ2xP5>m1l=2sLdY^i)Gq4*o!S9MWNKqCiNk_~0(_{f(AavlGMMW6T z%1=!6rc7II6m{a7c4A4kMK_#4Ft8mnp2D1vk%nWtJQGEy%^3$L{P(9R!xS8fG%CYX z#;0H$@_6Z0$X4OT^XbQ|ckuVC4vwnD8z;A}D!i@bfUFNV_r*O1Mp??U2EvY@ z_o&f`z$1fJyrf~g{rZfcj2<#*xHg1PGlu9X1Vbc_2W--ScKROF$5~tjW1M#FM>8fd zB9Zn1im;4MQ-G(fAx|uB#&T-gO%)Bu!jReRiiwyL^JE`Nu+oKa zq!Js`p!{kDC0};l{AbdsE2{}TMuHOzIXI}u-T}ZEtKNd`ZMAR1{_+({iORX1Q~|IqQ6!$*Z9=0A;INd8h-;P$C} zl~%#zp7fv(%D)t(v_EZ$THfMFq{m`=*Gp|WynJKa*Eq#U+Hrx$y=_>>xknhSk#Q`U zNn#Hq^c3+3KP#p?)i*|Byp`H|)u*0TkQX`HC{M9b+|RkUk9m!H^fgJK^2qYe2YxE; z#ly74@we$w8AGqnz@w<{Rvhq86?QP>aB>f7i)ueU^*IGb<>^xx>LDYLmm!xpr`+3b zKtLY9N^0SxV~>>gt1JqRyc(C;l@l>mNU}-XG18RcOaMO$x)5x_43ku&b&hir^=_3( zqL-NvQj&391+BBpff0Ul#YJnP&wD5l1B&$RFGNdZUE?kXTDZjXak%)?R!0$I;Y+C| zEJ#*9rn}ou3t6TE^4RA+>v|}XB3(yXwHDAad)AH!`MTMp<+0Bvhcv!+#ud2(jMI@Hw?CXQjS2WOzh{$pCR~+Eh=bc$x;LdE4CbNS%dN+d6byCsG_Aa^(txGN3~^G%3gmSa zN$Lraq7pafrC3d@$2AjRU{uP#E?ccFMwv2gjd}0VnEVmPT3;-YjQ;@jsmg%?9GW?M zfhsNrPg6=qDk-Q5Jvvl}oSMz64KQ2}sHH?>O$vD1#Y&shfNMxtLIq`Gk@D25g&3qD zx5`d&PR1yDtplKgJ*oRn0}60OE5$u{#(D}#Y9IqFKPs3-kEKPlvRI0oR4S`OqtUeyb2N`R+lntczrY?VoQS%A5=BE{4NOl{Lb4wW@;n}jfkto^tYOM*YKdbzNp7_gHfuMO!TQ>MI)ZoA{s$l z40WkhK<|@EM&Y;WMI=tWdM#q=M<(lM#(!Gb`9gI_6h~&VNA16HUdW!Lu0@_I-n;VA}^mrLwIv&Lhf=J)Z7Xy_&PhY~h zYyH!=$mFthwzmoc{_K3&{`F6)K(_u{#@HMCdM#63n7OQDM{5nL2yX zp_ty^&2h#vyVvVjTJEO#+Ze=c-jQ&-(B*Ef-ssfk+up=*TXbVW3JzQaNN!c2Dg~!<}cH|a4m$CP+I<%fyZ&aSH$2jf$Uo~$+#%P*3 zhIit%^p6f$S?;)mpE1unzHXfbI4x{Mb|i%n7kUlBx%_KV&elzaUAsx?p0w5vZ!m^$ zlRTk5m9reS{z4>goK&HuV;54nyN1x)+jITw43qWtt|I0ui;~o<*kUZ6{5@}Do!KEC(zM64=GSsuutz(A^S|1F^IFXKQPA?yLWE|yj#X_dCd|j zM#MG{M;h;sjlZpH@Uf~!+kDPGnXHX0E4xDqwtn_cO0%d+@kPBrW=_BTYR$w+cOcc& z!LkVONX8GPRWl?p26g$5WvbH6HSthRH!`1>wOzZnjgHi-i86_h#yORb+-z1)lw`Qy z8+O{?-Kuxa@Z9~HDO;BQFX>mbx3nzL63>pis%FSs$k`fgl)5v0uP7A%01x-Sy#w@Do_kD0NCT1^`?bs3!xx;}94_;>pW&#Ms>IJ@?~j9*Qp@4^;&{Xu zQ~?6^#{{uIeDxr4UYB?uqVbNk`Yn z2<|JUPQ%)mBf<3sgv*Q?YR26G#W?c~*qI9<$s7u5l3P6~(eB|7YH7$AQCAkla&`l5 zI{VaWoMoxW$6jhA&iuO`J5p}L&~$3skGD#hc|L}aWqJxtxhmlE=|p9D5-!kMkp|tu zp^@1^<0MfOj^i#dQ8>NEiJa|DM+dz|n?r3UgHF%L0TizuWCRW|(ulN}HY3E3kTb_x zu92uYUX?hMF6@j`QXs36c&mXAah#UeI@I9;@MtKicY(zKH<%fPM0YAZ$8exv(n$QM z2P9BFPIl5@6Tcm3Xa~rHuX2dP9w%`UaP;z>nlss(b*wa!o8W4KZgBaM(&y~80uu8EFj+B8m zeCMBPKqYL0z!jXKCIh5$pbX;`S%_xdpLu)Kin(@aIi>&)$fIs~`Kq?~i0VljqkN0S zF#`r{oYTCtE4Xp~?KKun%gzVuL>Wz!_Bs2eqApZyam8AU0thR>sDx^{Y-9?kGbZi1 z0)=7nZUU^vLj}i5MBG&m5hU$nuxd$Xo=)=ieXh#xDF}GT|WN+-K3Dn7;PPT zQ)}HHIv)nYOB2(zJyk|etwH3F*&X?yjyHE5s$#iHBq2hAPZbP^-#5+j)T*LSn4IIa zM3yFT2C4(-`h+`XyM##G?86w`rD{Rv(2tPkl> zE=uo1#axONk2&N4Q6Py9z%YlJT#RLS)-MX&-aIVltfWj_Mk_`OLI~MIM}P> zwIdMCxtBQaQ!p9%7j|kn2bQF$&JHVB$50uxXF1*NPhwG598*$0rMS;ZkyFh1PeEDB zKtpAR4fUm0WB`5Lyi;~a4hX3ND3tFXN<+Uv70Bv7Y5;aD-6&n^`TMl!%AsxDC`kxX z!DQP10CuAipp$S~vJoV2GCQ%u%TGaB^6l)tjX>awt|9m;2v!O>V4f63XnxT(?h3*-(o|!PTa@wLN>oUlsK& zD)C~wk>#>D(N#jkyHvVg0o-XQtcaNC=06Mv4sbAP$ z#4RqJWQ?oj4lu)~KDFjza>{L92Q090YeV%WE0|_R@(x+6MgXOEFw0lRo*DSGE&QRb zN>$5pOb1`^sk+-fs{2o+PG=N-I75YZ3CbE29->{Uedd3 zKT^1RXUtuFDr;Mr3hZj;jF&^7l$Y-0OV6c8BA<|O160nUQOk2qbZGXhpE3&4EsvJl zknGqnIi-*HBX_Mz%&`m)y46HUwCqghwF_~?xUOY&1MbrrKfDJ!dewU_XD=rXeq2@a z8wX_-QMXWHM-l~4ys@XRJU{#fp(yb$UB1-=iJNZkm1?C63t~r8Dfv032;C1S{i;My zC}VduW<_@^+%HyhmAV&A=P@pn6Ksr*$lEt@g-JqLEjCk@(5kd`- z?CL50VvxJeDFR_WQ}n7!LB&{V;C=c9&D#AXQXthxlj&?Z-eWQasr*{Cm_WC4I}c8)>EsYYQ8$ z{i-<>5FD|_DUp_nL%Z(!`ctI9C3`hF6Fta+9-whekOe9T`Dq47BsU9Dt8XBl)L!g- zjChR!-f89b!@Wj9?N3l-9CM0}LdR$WioT@v8y^Hf909quIZnm1;0%P{X*Y%orRBsN7Syd1VOf1xVv_aC3@P8Cr2GoG$=X zwQ}i^1|@P1F-=!~n5Ei7ZygV6YP^B4-6`^-E?ACD&+~k^rpjD=qn!7r1_i+Mq%Y~s zR3e8CU{vFC^r&Xaw;c^m56Eg3VZkFK-iZ80ng@v9o&McBe?Y`*5Gqt*bkV*AOI(06hgUGZ`h9<*D2E zku0&A8Ax5Eaai1uq>xt}FItVGXMB^u?M}lHkII;-!Qaj+NTQ-Es_pB$6eAKiI5gEK zI3ur0a8E4cjtveC1(-0;EPB*PGBFtZXrIg5x=!7yL>m)0!qqK;B&r{7)5xb1t_a5> zqDJR-PAWn?wI%os+MF6h#T7>2jT(#}T9hCO!NEO65yVd_aY?kh01gy&s%;YD!)S}I z8TF?~H;}m%E2=2QatHIOj}{9N#(ioN>{7T!jS(Su{gKR3a;uJx)5*f!$OlIcjkdG(U9cduE|KV*vF)3cm_t zOx0DN%N+7ODsUBfQ^BVrSfFzGCAh^pIN8Aj;2!k8QZnVvN2M`WVlwA}(vxI3kZfmP zlgK|B6D!jLV$>j9UN+TNriG74@%yXU9Ov7mw z<0}R9{{ZV$FC>w~%m{Z*)yrO7%`5$()a~i%TBvGjsj}tV@V@AkORCl{mg|8Mk9_qN zh`OZW?6Cg;QiQEizVRw5J;Z#Be7HI7T~Vgah{xS0*RNK>CFgrc;W6%daa`+5G_keH zukQ%_1##D!#P>5T#o5B`EIaK3zt*_zOUBdONK#MS!ygg-Jx{%M!i(r!X}-s-X;(sf zqHYLuBMd*;9gnSi! z)UI9bUnXJ4{{UlL<=k=E+&YQ=a!V3;#d{R+@krT4Bcaqab-!d_37eh#@yGszYbx(h zw1mIf7nK=Ibvu8(TzW~V-(I|0S&e|?l6c2%eNA_kx->Idpw$q0q;4a!?XLL7G0@f$ zTOy5wjjBNzL4w^u8-F9*R_TD+C^HS4d#_3M*3Ev+m z-M~J^ymwLY1p2kihV9%aI0^mVTng^PQGE<5)aZ_y{{X}{a!jiD+UdJ*_gnp%=T4__ zGU1DsPE&;L7D!uH08zr4(^DBD}0!erCx|=jO#ms#!#= zS8MdGfu!8tzmx$*&ioGfZ<{r_AA_|Ei^Pchv9Iy}0PM8+)r}HoAvNk-pgTTv`>GqQ zCBCC|J=ztB+p3)G&&tGhZ>@U9kMQ>wV&>>_bpW^ygMHY!_vKEKs3OZ4FsABmExl=Ztbc-v0n(MB8Z{pyhtIT*`s+sEBgS-TJ+ zE~OlGQ&ytFg^gFqjr)#;sq8yhmOjGqpErJG13M4gIQOH?c@-KK*sc60sH-x|G)Sma zO2+{DVxicR?lCA%C}lvjyM%~8y3~@ahUodnI6VjO=9U>majwz)TpD}5#l(@206)Zf zQVvv1ZRC?1I8p0PTUL<_j4`)?@Aay3yBQWdN!PbQ_4cdsY?V?YC&~s$&r?A>tfJxI zI8rm*Qbj0)l(;zG&=2CN+SfAquq$CW$A8L~%RW;>j(^&zQ7e&+j!A8#SrJNZ9Dnud z{5z#aOOfVe&l13T^{o!wzcgL-Hhle$2t}X;qobTg305$6i zq+4y0SQzg?v>xKVR;)XrDt0BdzAzOxd@ycyR z2Dr5g6hx7Z_0R0Z&7s-5g1~1dwLm^;Jip?sdksltpUGjhhg{a&XdX@Ffl<&?x+ctw zfDRaR?@}yBJF!k@jq*t8(vmV&mE8T&)3psNi9UpEOhW^sRCybJc0RQJ8cpXUQYeg) zdSks;v}M4I7FkNk$UQ0Nh8qR|rlUq&v&{>D`h$0JjVRk?C41?oT5tOdWDzATgu@Oc#;5`cj@` zI5-sHkb06om0X>o5FvI49Ag+6pmH)gQ}Q#nZ#3A(OD90Tr6@}BD&FZFi2O1Ufz*1` zK>--YN|U*4`*TsElpLNj&0CF$gFudD01>ofkHVvGk-`)6HyNo%%1d%icof&eHykmc zrENmq@d;#!aL11S0F5*#mpot|Dn!8fNX{t(Gs;wq0qaL1Ac0W{Di7W2O(cLJ0Zv6p zBFD*I{{YU9DMD_3Kc!~h*#f#c?>yrJoYaMsBVh1pk^twBF^Y{@Wd=3>018H*;VXrZ z#978M(0^KdX^uhSq*&Er3a5ppDzkn)ewC#;`@{>eIUscEY9g#aIL3O?sySk@x4kjE z!uwl+PoF@Gu!(GttdgP2xasaHAk4$(TovM`3el0C^u~yT!N%`eG~7d69P_~9o1A1f zG~ty5J9OzxbtW)WOh+mzDWlkojIf|s!?%TCM3%4 z>Z}!peJGVx&fU2k#W}VYJC13YVh9R({!}?3r>Po66eNu7R{nJ39>ct6ibeuP3yi2A znW)|ec?6zgD8>qLw4YyJ)`i>})NqV8PI~vMAzC&+Fd=fs*i+(VdzQB)wwcFD8X*sg=ZaZ3vEPY1;N}- z(~+O1DasChZ>XUNMr`w%d*C*ERkfgb5T2#|I{Id-gf4z@k4m!3CJ0_L$*3321Ch-Z z5Z%BbKYItCYE!j_RkBBFKs>Nnhst`?YBw_M93Rqvj^ktlac+asnCK^q=Ew?i2sj|q z%DS-)^9=W0|%VqzR-&=7XKdv=7Fm-WnmE z^#qVklK{izsbztYeOI+-eMfx@7O}G_RqQ&{*4hKz+>So)B#zZCj#b#Ja83ZtdS;iW z3ut`C#^O1xqZ7}@<0A;zO*+wSV_4NdD}YWp;9+j0GSLlWNH{3=cPD%&<{S%92KGh&I_NNrq;~`Mk9Q5n!Rt^+!C`9UNNX|HZ{7_XfiU=OUqzZ62;*(}ZJt$Gg z=ZY>>qB%hr?kZ7(#&9X20`xS{xHSn0=t>!o@+rWhPyswr1dO$Y~!dEWsoB0-k7+?@-~W4Ix*pr%cVVHB!Q;`bt$LU)1 z(03%k-L=lq+N6y++MNY4Bl8N1w5nok_N>vRH>om2M<=y(nr+EcWFLCD&GK#l{o3d> z`)@H;MCv-yMa61(FOK93t#G^n$rjK%rebawgc(fQ1ZWjvuAE+N+dS-`v9I>%Q z!ZtC*Z1{&xk5jZJ@03rQ9;9}xJu_%kGd9h*z^<#_MMft9c_dbW z*D?P9O5*QrI)#?PO+8nQ>hOhzyYcm`CK6p z!U)W2KY90ll*5+gyIa7FM11V)SvuH~Y)KEvyPef;-bo9(JbPdJ`@Z+qy4wo~Z){7t zbjUyL5m6VZl3b>4gjMa5S)XP)aq^mev8gQEte56bN?W^6vMg~ze7@k+)nUKY{JCK;!pPSmP+)UnRI8h&e!m5z&cQO0*GC$ zl4su@HxE#2oOwRfzEEADb)@zbnlup1$l!yHhtn04ac-rQ1PFiG>04H@GDO861~JF0 zfBLH~=m=I>S@}JUXDyC<#QRg=E!+#?+k+ZyQ#eDkHDTMdy(CJxXkxn&q4 zo8|2rr0QFxH?WZR0SC+4qF~>6ahh~!TQx9JymX|#5M%-=5OwQL=rG+VZLWIakSQy< zjz>z-B@ql&Kf-va3~og_G+6Q8g^;tAJS|5s5Ga#&Bkk6$s3+zJ~H1GiH#wi3_2cV}C0^p3$2w=l}#Boh!A~NgJk=PJbMhT~@9h*ARZpdV4 z3lW->CP>}L6ktStwB*~3$FHRh>_ZA4n`->Dz@u&rN@Us%MUvQb=|oTne89eoPaHVU zYDJ5BV4r%KP;Cl$+e$wW2*l$(sf)O_(^5#Rt&Y^O#D4kz0QFS>nJBm`#WprSbkxT# zy?Lm7rVgjLsE*>kwh5OEq0KpQkC@XXM&1J&mN?3eImK-XVAaVVfIX_PQ0Fx}DQ;Vg zQh7@o0y+vOxiCU6LJvv+4aZMfP~7CyIr+)$M>{NvSi-(k(n1_?!-|m(T#s6j0;&0_ zL*fE7E0VGPH1IdLDaff|jx=&}#W3tg!gW5B<}b88MhVHlp;!U5aw(vYpr6j2mFUBP zPMD<|jaFiD_eDgx`GMtXSBwxq`EyAeM{d$M^`zWI1UwaSlThW*upf4wiRFwAl)_p* zzcQXEf(eMy$ccbCri78U=ZcYoNL5ElRbqz>KN@v56airo@;g*b%Y*&em0YhY^9pAn z_Z8x^=18h!G7|jr#Yq%wK5BZV;!kRk(U)ch#T7ASMIi}NH#=k6k~aO>1bnq#LBDF% zk-jaU4fNpvBKgXxQM4s14Xm!zrZ*)>I9f+TF<9JuiQm3y#z7s)42&1$?^R=mcR43M zwO~cJ<>#LChBxEprtk2Kl}S{?9x5>6L5J-~az@qu8e*o`%N$V=#y2F!$6~#zP8~L= z`qTk7D>ia!!l6|8IL$RZMLQJvULU|i~--W)1!17i+8Bod#cADL)MgnimKfyNO3HX z>OM{uqw{b+YFNX{s;A{zb8JRn-DxB_GA2X~n7(Y%KG@}5%}zydk0-4}+x(W4jGfzR zNhB*H9q22-{yIxKczvy=Ke%>64?H@b{RX~=w#-FRUzOLjcn8Pn%4p)#%6B&|yT7;s zb6r>@y{bt1E*xCgxJSD_Fo|A80hEK$Pu>-32zE@dF#xqBEtw-!8xcEtRk>9JPVBtn zHZO!u{>OwG{9{f4)1DwFk@1V^~jj z9nAK&f4YVPvwMB#RsNORMt4?c!)F;>V|i0Xy|nR2q{96Ve_vx(t>ZJ6%I#zGQzEs5 zBEtaM4BT1eVAx(pEU? z)pje($QYPhpKtF`6lXjOK7f{Zu1fiDmZlLS23Gsk;+Fm+xV9@QADneQt6f%?*GHexicU5$aIrc# z2*H+{4%s5!-z_0#3ab4n_($8$D3q>GD8kt)M@6W_$2m>drpm9pfw*m_qlQ9A`?Q+s z5!@qk8_fHyQ7aZ=2*o5j7c8AkKwPMEjP0t9=tYHPX8E{UwuU9zrn2qbCd7_}1JiX* z(a2c0_c~NbSVe-bziu{$sN|E%a1;1ygIu#NH{zs*Tu4-}G$2TryAhqVc|mZ?Riv9@ z{Nrs+X>g3Vf0!D4!D2>~?!e?zSAO;xr=mh-Vh7FXQi0rzH?<^{v=LE*5Xz_VsiKI< z!*--~a@_PZVU+x*D_6^*GuU%Rhz>X=vwXKFf%x{V22$HjdQ=LU@?=@qEJ5fMWQ0O&NH4V;0?o!En_J3Ga99oWE@br zToKZogFIuU1OTA^b#OxExaZ@j?N9)?1qTmJEM0y~;)CX3FduidX${L{@sS_3G$>+K z&Izbd%%G4d>Km4B^{i1XgB^?qYD2T;W5^V^z{4M!lgio%&T~n%5}-X@TNocoQOj~T zqzDE?eW?!hUz)Q{<8mGmSE=MvzG22V6vD>~#sQ|m=5=FQ#gNc}AAhAFMhr7d-z0C9 z8}s^9tB^r&#*;>>2uT%0o5SNHiin&ItaH+&duW)6GtD$E&BTr?HxX^1GkILDNi`7# zx^*=C`GHuB8bII=mzS3YJO@!GLso5{N{k=MVkwP~!__wMUbAZG7|6;eZFjkO$~y;Kal z!vj-G=BDk$W7?|)C#U01E2z>0aAe?Z9qCyEeBE$qQWwvYjfy$?)Y9WPUX==9hDU^q ztZ9t;(ewSx1ZK3cc167HPzTHwq=@27Fvq1(f_HW(t)EK1q=@pz z6`lV8n5!Z2x;r}m0CR)IP`Siy$K9ti?&KgHI?%}O+a&2kWJ{6~IlQrq_4TN(E=+$s zY16eV=^oVC$zNYer!?i5!?Wf+GeTx)c$!HF$KCH!F<-t8PilhR+Cz=qzlNld5(&yX z{qgj{s)8CtDW!(pJn4@YHY;K8DmaO9=Gh=_m|%#(DbJj`)Mc*D*(kq(d4GcVlU;6JGJ%yjIC* zhkVD3p00g(?Os`VtLit>OKl-oqMNs;`&HG4p!Yf{!1aA6UU_`ebuyUQ_9)Kb?~`2p z{{V^OvognP`^~2yXBidcH*GbYpj&%}XvTMZ-G08+&s%tcTiJZJZToxw01wMvt{)1{ zsM9*xwdREOX0vr@S-}d&dO8)XeFPWXd{JVenm8Q?Cv^z__BYgh=yua?(4>qdi zMp6E=INj(yYtzHh*HWKjtvci|Nw|ziqxgsU-CWJ)qWX+W=AD~ckN*H>p%WzDT+GH+ zhm4*$KhC0zTii;;KK3z=z}Kfs47(9MbR#V^3LYmuXJ_u8O3!#D)&VoI8#{k}N3CeY z!YNu7Zk==5tXs(fO}<qI**GFmLn`}=8FX2SfyH_L|q0ODy`Y)?WZc*8V&&t2U{`GTm-@wu`4tU`I0J~O!lH%!MA3Jly6%|1(yxANG{I*u-@TVJf zFqE|ZqgxAz5AQl3YSy1Yw}o13FPWT@eb2RXW(%uuWXTMqpL2TX~$$upha)qD+*znKTjw4SV+-3?KghRZ*5tF+`FQOZ6g>NC=-p*L6|0on5AvsYT0J&dU?k~WTArbHP8ew8|0#&Yn+>ZNkS>(JDfR=!^{ z_vCE;RZ7}xuCAFM?SFc&pd)!CFJ>cj`S`&<%Bne%HS+wzqZ>!J_|w)>Tp1TQ`=X_hpQuV*=m zN-D&R?6ZlQ9H#M;Yj`!9+|I_%&=B%#LcwyKG?a`bmusVOh`sS`q61+ zEclh%hUs1{qs=7d-O^q0k-;4GuSU|X^>`P0TzATXdRK$&`E+J;I~lFa39ybTxG+QI z`Hbkq@s9P9&8|rxcVOO~s`JkxY%&f9QY(@&NP}KN&?*%KpYzRFjin2@`}Xt|LQCMw zxc>mFLDVfIH>q<5_|MEvG2DG>RD`xQ$=JCAgH_509)_B-FhRWM0+J6f7L*>9s%E~; z4mS93+4|I|tl8t`T82x3BV?Q(>sA&(pa6cRs-*5>(FsyBuznQ`0CTujkx!Jj#NmBBy&^`hDjQLVsU*`}EHt1=w@ zYD@+PCwH|+x68`|fI8I1EWUCE1vo-;{HZ}~U;ZAd3Ylv;CHPM>9P0@ zgwQga9h(iLFX;Cj+IXHe0Q4svtoDi(kBX~|aTaZhoWh>P!x zbNuLxt`d!jc{yXi?M+n^ov+aIk=y+GQU%=>7?J5q8hzF2jUqsBNNt$M6)KeA5I`K%B#$)XrBoy-?l8m*fTk(nd1qnAK~4&# zPZWw3_yDLKJq;0^&?ynds4`V>&y15yc(%!ypXMAK^TkN+BLQ~+p!1p{NJH*kqt~@u zM+d1JbB-`atuVw7UP0|ry2548@c=;j9<>oWGM!tftlUE53<`tgUTOw%7$b3-nLOy! zJd6%_80}3VScBAh8nmp0v?64YdK~`%N{l%GCJuZ0RjuG3YO2Ba@1UeGmn0(Or+Tc3 z`_|ZgQZPNL%Q->_?tLmaK_s!{iY^HgkTwp+sLPBmaw=lSB%Ud|cabNhRgfg^Lli8E z?oTdqbKmPtDzB8$6nQ4qmf&35ubjal?bQsmCVP=W{q+|#(Gl#Cma2- zj(Ig>@2)s4pG;I68aG@XJNr^ZAPUQp$C5f4goIZL7?OGBrDbz3nfw4_>rMy{BLlrO zH)H?Oa4i1-dy)lB9)Aj8#z_?D^T-1kug2kfCVgey$@dU2Dy`j=SFtj>z1aJsESDrx=MK{_5WRro|V!Jy_ldx~#R&k3v zrX|LVsVA6#umd=%uo%)s7_Pe6)@Zl-oQ<8!MU?zyJX1D^GgxIjRthHU(&4fB`(xxszn03^^Q9Cp;c8O0k@UKD9E$ z6|+@+0V@l&w*0?#o;b!S$_O7Yry?eIFr-voq|S|v#*tJM;A0dPJPx6{QYm6~p0w?y z%^JCFSAkS+Bo_YwGjIo5(2N2U8t1ji#1XI!oQw}+S~e9CxQA#D?q&N$paOnIizyYNQ+i#Y%E;I|`jv;5Y%Fr%!sA zF7?T%wi0vbDe1-(w-utjfOSyEtA%SOgq$ut2qTYxJ5;*{GHDeyp1Cyt0GN+qS+%H!uOltioU!qh6wtt&W~5eU z1TV{qBe7A6Vz9^+GDaCeEsBT%v;#^zfyFI$Bw#_FD$?!b9;T}R`02$?tGQ18Ju5eI zMzW0j)ZzQIz!{(>NCT5oDmLw%g$+ru#zP?_DPz!6!xZNk%^qIXJkUm4+*7l-n&>nG zoz5y)*ehooQf+Kxi~~X@23w^=xFSL~e8;6QV7Xj#LbDyIj8ls3ITS@}akM`GDF>Q( z1clr8MKw7%^r=-&3Z9isXc2t}V*@?uRDeEVx|-3Q*&Vx5qb70ErpOB@yl19rGN*SO zig+SLB~C!%lte&K4LkP{Bq^|io|Q5wcic@!0Lj|J6)O#=aP3jesZl0XIa=!U)tWWW zi8-K%-5m975IANt?C51_0oQj2u)Nq}Sdd9KCFxvXwgyGxnA>S9yeUQ z)e9vO#fDrrX7t@t%YP=GpJ%rxclD*Efa)PwY}d;pwR!FCpEve{&7YK#dj9}Q>K6WM z_@h(zm+z7C^YpCSrxxGo4BvN*e|XbPbSgWX@%u1ki1+F}4NWvg1dPM?2g_J*9o)0E zz+JgLdf-=450=oN=oEhy36S?H*;}d9qj&q+?c3VDo((u$*vOVHk;s63`thwE32t>| zAecfn(i`}PwRh8AHkD~C(@BWm(UO>|5nKfjHaGwQ8r{eXucJTVtttPaHc720Kd*i}kNd(x!k$@JYiyF-|ad9n2pQJaXQcWe3Ynn66zS zgKMfG4cYyxwz!PS9!XauamNC<+lX#a{K4`^{9eC>Tvd$Rbuz6Wkqeoee5Z_hRhBY{ zmUZR5JqP!zKwFKzYA0IA)NhPZuaVJ{X>Nv9@blGK*E=dXHuOs`%{px(ss{wL{Zo{;%YS@Y# zvZ5c5e68(N^%ZM%+7uAoYd}dAp^Zb5yphOXN|j?^{%obNe-TmGLp9uoYVerP_p0`x zX*eijd@FtZ{{Y>r+Z#D)V7M~*0Q|3(&tY4ZQqKhI8R*N6zuju35?n*5!qM|=ho^EF ze~om|z$HF=FFU^IsBFN{GAqVoVO$&Aw09E|lb+qb-mbS(Eo(9!eZ^s3r`nMsnE5fQ z1D)7B9OLOjh%{3d(^^Rs5k~IM({J$Ab$`+TNg-XxI#!cT zqBRqSZ}9&B8lFMMne;#G_a4NW&G3;aM=iT{Wc#P^0=}NRg;hq@&MW25gO~OT8FO28H6K5DGH z_w5I1uOcTZh~obMHw*stK&n)2&swtR#c(=`s1=t7(yw7L@-y-LRTxrE?Y(Mkr5i6( zBpJaqHxooB`rPTtTH=P#Y(PvQf}i! zprBoqUjPzYr?oT<$Air%eVJD2NJEftG18t%+y;0R5DWtm_kYi7n_(z;plfh&PI;hZ zmj~FHsOijQ?~%1gHZbjj#0?PH)sI!nn2*5 zX!5sUgMn6;KuBW57-O|R3Y-H4R5DSJT< z!h?pVAyhp+Q&9oAw+@vizy=U;nj;Qi5V%9P85FzGI*ut?7VAmCQ@DJhsZ-@Mn8`Nb ziews9llORDm05shZH#Hr#sZLf(NZIUD&dp`Jt={C8Rn+)$}Sg*Xj1rQ&lQxNiezff z{7bf_8?lUTr;@G%gVLG?(Z>~XdJZd5#YdJ{3}%`zfRp@HB9=k@<*1RGKuPIY#v=rB zyyBxWN_S;=p$1Mtz^OlYGN51zu2dH)?QP1$bj?VHWjwE1a0G=I*t(9(Sqi~gljoDx2`EyQ? zY+z4%NWjAacGQd&g6EoDbr}jW$;cG4Gn2INYC=;uUN+KAwCx~N^(xmPfb1+O`DtGg z4h1Y@Yj2EXRAI(8p7gnij^m3+(kKgnl$d8@^8MN)2#Us>e8!La)udEGg+?Fi6 zb{N?1U!@l}=+^Or^Ld;Mf3;D|Cz&bQFjkHh%PRl)@~%1?C*Yz9A@A9}N% zDIpIuF|)UIU*fGzH%qzI^#qQ|9o%#szuvE*G*1NCX)r}OUq0!VmpwE5TWMFWsUyJ5 ztHv?2JXga$9o2Q2Ba+1Yl3{*tmmayVY0x(4F5a}eN6R@JuWBcbS%z2S z-TwfOS2Mda_GoA;8gJW_`>H9*1HRQ9uS`^ysUokG-B<5Wu}K>2KPEqm{hH;R3gsNg zA{mta6qfR0PcaiKO_mU=u>SB#RunC~ETy)sWhKfo%%ur;&nzmeP;ZTiYF32A!JC|q zmaIo?B43>DFGwtk(c1*wwqLvVmY(r$z#liQO%w>E`!(lxy#m+j`k&!Z{nHJ`W{K$qGD}PScuWcpYa`^yo z7P}(&4Nl`y)nj>oV`<$n&Q9VYz$fL&`E&K#Tgxoar-MHHx%i{uh@?wjwkOZg@sYdz z;aRtz7<@Hpi$#^EkP@VU@(h0ouYjS|FP7&nNeAW)SNx@lV{(jJ&iRi&bk>V5j_kPL z&$J@=zoR*qD)D&@w4*2LJ!-%FF0D3Tw-J8*mm#BHk-r>@_~uz|qF*X07_sZ~e>$Kb zl)K3@d3p42n{{g(3|)?h;8FGo`1hr1F*z2~K_oH+DEoOG$UQx)V#DKKhc8w3Z?`e@ z^Al+Q0C$S`lgnstF~e z>Xb&sV&|#&S)i6@;+npW~xFY6KowvIIB`@gv|zm zIM8hz3SyXpp>M*ZM;|i36vdAtXAC;2tWfEeJk6a>R+t(`mjOR;26unAo|vbqm5gz? zcd4TrLjo}!Id&_Us1YHMh>0swNtX+rwIITSj(bxh=yBSdWn@Of0wRp{BAX()0lMa< zSi^kH#YEYNt112}(hV_ABnrf^O!7ZUlx=<9YGc}(7s{7;8?#Mr3moBUXL1xDK~@z+ z$J_#mk-`m~7L~l$LLxXIa8IwjGcO=6{{SkE)pXD(=v6Do$IFVctCO{!s=&ZG-S||o z<$)?NLsiK!+qoo>jDLIURg?tUtM`w3yd~b40;)8w8DlHQdQf6}lc-_ z-dg?M=Co?XNmzBkQ6Ui?DT=v`5S+JTLR(9Mt@nLvpVl?ur$X`DFnMC@j@{^tTL{G5 zy}O3n=5vVvuMzRj#8`BcHVil1P4cMh0qResdDgA*O77Nq0?IEOmQlFyKhJ9MUlLzm z>(af%ugM!rp6S_Z-oa&>`^NC2E~lv8c!}i-(n;odV6i}Ry#5vCx~{dT-K6FxF@-qb zbO*Q7-m|ooeJ!0LoX-6S?b4&vFXk!bPafx!_*bSY*{6VndL1yPqQ?uHSdk{w`F_PY z$NMAwnsvnXnv@X$O6_h4?^&~XDQX}eyD80LCECR)GRgw?Tz&8MYo<6Ty-tX&ZgnjZ z;K%;3IO+F>E0DR9PSdU;5uLGuK?9SM)9|ZJe5$)`8wlY1-qpuUhUJUK;K%RW)q5o! z1t+MQ-TrP~D87DkxBcEKqDWlBA%_Q%{_ob9$8G$Ol+H)){fhOgLJRLN&XOOID@fB< zv75Hy!En1xuuRCmHbqM%lyEtkGqw7Y+dt!26YA|_bH35k@yc~mSyA0da}ZH0D=m6- z@ba-TosG-ANiD5gJ6d8v+{dkQ(&`tQhnFl0;Sb6`hOP^75ZiX5=%1VBtt~zkw6)B# zaNj6n_qTsOYoZY7M>DZn#@blb#N(yl@j+RFBTfSf3AO6OqvR8EZP^1sXTe|owd zIt#heWTm$p{L98OQq_$SO&IxR8NvCRK=OU^aoV|i?LsJ|*#X@gt@3{rZ4FR!8tY*qTkX1F(QPN?JCFO@Yn{|)l2De+ zcE$!3lXl}&uP>cdVls30c&JkOMcR48YIob(x2Hv;9%DOKYp*P%c|wb|Kj1aX3I71J zBLek5e-BayNXPp%>`NY0z0*IDe|E@e9GsC z{h?$}kY+XOy0Re-Cw2?_qw`|DV^i>iak%m^z1V!8#H0AWxU5m(o0~Et19LL&10TY* zwJPzphH$52kV}~4b&cQVM*c3ittkHhcLahZGBC#;m9YG5$5t!{$Z=pzJ}(E$RNvR`OBtDawRg0oy;`spD5L`Enp|c%;>e zac57YYEhIvc`_ky;{KJ|ffTWeh+MLcySlHndBj$+#Gzu_g#9a4E4jpr2y8}ipL)sN zYHJ6lymnUpO9EMN2TWErtEQ>9Hy?4>{GfIp<6F?&M?JEnSXLYZ>OD`rERaGriC=da z$gI@4O@c6p56pU#pwl3+ZZ6!TI?6Qqn+hT!o;)sWIJ zTQIp|ZY1(!9A~~yYLOLTCKv|LoeBPD-m}&-)4_U>EzVRMBQwWNT!^VC=(i#*;-N3u1iM zMHX@EPGlx9JhTV(qB0eU2=b#WqiX*Eo@tgX zG-a;h0FlNTmPqD(k(b$zN<@_{$Cf!m{{Vevx#Xp(C$9Kr$m`JkIBL;V>#rG&&pl({*E~uB_mK3D4nI#If#E80NWY{92hAGbFLd6F-$U zCJ@F%u1@2gm8E#FpWZVK)kl!6j z0;dOW^{M8~yluWummCV#DTHC6px4Usq;d4m=S&{2%Q8eC$+8ssJ{`g6NV~}&-tw7SOvH*7y zcn2P}1ae0teq0}T9#_6AUdAht9`k^BBm50R_;oY)Sv{n4z)X{Xs{CMe%~(hpNj%<& ze>%}s9C@ei`qSYENglM3GKwk-cy|XQr*l_S?gew4{*)rBe2(0DQbME#JqK#iUBv<= z46>7*$_6n?C1qXV4I&}7+=TBPN8|k|@!TmK4Cnb$gkLbD8&cv?K=~5i;1cQ#% zG@KVGImZ;(mR5)?zkAk{u8AOZ-g;u0CP6^JoN>il*stFVDl}GNKsc&{W{y3G1Z=7U z5~DR7xs5P`CZv{4tI5e)j5&~G@rtA<4Fd`Y@7vOsV`n`*b57bek}5d&ta$B0orTIb z1Pr$WJt@1GkUEakyIq_Pf~SrbVYRthsH=_yOvi3I8jLaHJpTYnk)y%DIq#aT!Ig;Z zSL~z^fah`44r;DLpPX_y6(o*O05C^iTB6RUka%huv2j|HuFb_5_Nb(Fje@VtqN+*r zD=TxyKT540*y8z|1wV9A<~FWgS(gk?$|^ZyS%3lXThqNo98zv&kLL_~o`SSvw|IC} z7{+<6(ScAXKn#PQPT!R%^3@IjBiFr50bnvdRq0MpF^podj0(SU4gUZz1RM_ZO1oWH zjxCj3L*HgiU&Pm!k9@L>&xW`I#;>XO$2F|_z0IdOwU`7G{_U_d&i9sd0 z)EQ;vc*RvjNnO?VJCpK*z#f$7;p{uqjLuG1^QR5!GCS1U-2$;m5tTbqNURPz9R77X z@0gXcxV`+ZW`5?gzKI!8f>AMU>0!}*8a~xx!DNv*X zk7}>-1|KoV905~GpfGdOxb>zWO}r;P&03zswP6_n13!6AbLpChF){+D>N?bea*UDk z198)Iov4UKDgSDn_hG938!J`cx7`#~TR1>rO3R!E}H^k~U-? zaOV{ifrfbF+OIM)#mA*lV z?n$^2?nfgyx~-!S9#qzZ})sK=!%1ab>-4K%o5 zM$?2OV0EUF3knWn`G$Qe5TU?S;-806>IX`VnZVB8wA^*DA%Y?aQhQT35OF0+5WIp+ zoa2#5er6<&Dchk==!JI1z%b>%l{^^VcHl~iK&;A6019};GF|Gb@A9U3Bfqs)sFARh z103PLY#yL}4@!xGqhS5gcr_tV?ZKx!Lttab@9j=75&zSXN6EWA4OoN#M-^Xb3Nyt| z2m}M1fnSa;$J9pT`v3(p4FdiK2GO7X=-Us_te+ge7q-qwa56E zPs}YkjzI?kyC_e~^70K;y^P#jx)HmMl~RjwJq#8l)0yOmM%-f<>s<}FM~!d_;B>4T zt9dQ;4=D8O{{YsmmfZs&_N=0Pl{xb+VpqL3s-$%Ethw&Z)0QKO(YexQyHFy1xbNPw zX0o`k8(e)WEApEpA8L44F&=9wdF6HtgXTTzea#}0R|He6kIt>{Q5HpM+AW@`;Mf`~ zKQ@27Mn|@5q`a0yKw<#;)eRLpx4*x7-tn%Dbu3c^Q@}lVUv8PM1HyVW z{2I(MbZqS;kCf-J{{R}9YR-FTePwA6n;OYhLIOx`0Pj_Fw+jj*{oz`f9+gQPFGevG zA;8JaO%4xEDlycP#ZL(eao&?x6iIxu+|rcDz!a;&J@HPGVX)-zv^|7EP$Y_5rC5lK z`_yKsgXR?mrzMaRi~&w7Ls*hcI>Qr};fG4|d+V!<+mbVtu8UICqGd3l%aTXX*ESWP zZOl5>H68RSeSF^rMGpznD%s2e?N4Vi;N!;So!P=#5a^Pt36<}~x!iOzW9n=`oRa8Dy5 zrYAB40*I6&Wb(B3Kg6P^sB{?0P?OS~A1rb+N^nRlahi5i50{!9?gQ8|s4GaSd1?Z* zgJ?gUNEM=79<*J(1qL}(?Z--JQJzLkKae>+X;5NJdetHQkzxdbNySJ<8%KIoU95Pg z1t1I#DJbd}B16=ARMCdrp7e!Af2Bx@Mo+J5a?nUXHZcaIRy_OD5jg$eIUOnIsPw5) zS1R7ZnpI4a;+F&yft*x`6{A*OJ!)klScP1TfFmM~WF#;)?s`;$ zFmbrx8gNA|!{IsA9Wb;a+?-@Uf6i8@drtQT~T6|&1AoERC zK)DB+nJ|MZL(@{=jSC-|RZMhh?gyC#in&GtX`21DRJ!{ib0?tyHELXi;8@a4e z@Q1{mPUQHSSvP#rV0@#X0~O3^TcwpqA0YLvi^t2i#P^SJf@PC~oSY5^TFtZFDk4U3 zsmWv3zM6$kbtBn|_f4RZM8;Lf9nEnqBS)x6@e=7HoDcA>&g$sR2ifEKpYEE)veGpu zE>irD-Defhor;4y8$CWHvx-SR`56_)>d7FT42Ok&N40e3>Ud*$COJgtqxgQc#OgQA zcQBYQ3&m@FENKHz%@N2TSNU9VRHX(M-JSco(4XmY2Z?^*=Bx%*QxD#AO(8{+X-&Au z3EFz`=~HTYXp>Jj+29TJd&99qZ0;^OC-AGDDwS78nmC`!`7%GkvsOh$N0zj*NX4zr zaoVp~G?JapyKvn5RUIB9CB$KeAH`j2+pLPh1;#3&D9JEd=tbuFG7ErtLB>C=Y23-@ z#F5;7^CLJt4O7~X6S#0k`OQZ)?)6pJLLtUL>q)HvT@Sj1&k~pUN40Vqg}v3S#9;jP z%sTf6r%LW`u0$3>DC6Xh;{O0e7~LYqdl6Gv800{ymfh=GHqBzX9nMtRV{jqH@5ZnvnWTg4{Y-7itrHW)1|Q}) z{XMFMyfPF9=Yl&5%!E=5Q%{i_*e9(RquLfqF^tXve2YW>i8_x7$5 z_U<-u42-IN>W2Or(mEl=M&6q+H=80Q5$mRrqlo1IJaz9}J%}-dShC((>+fAgH^cxX zS+UJjWH}K|NZfw^02!-#e5QCFX#oL$^cr>6Y@#s0o@VheS&nKaGFs9r5(paMkzjXBXTCp5nU76f|RcewYGvYVo4)jJq{t=oiM{`g2 zc*oYF)tT-WbVn+kt40AWwV~gPXOCfA^~&7bZZ_mDX+@P5L8RQpEAEw7Vsx&q9YQ#F zNg)cKd+S`yydFr{`+VO~+|y*10KyrL<_Gnp?aWL!&|ODTn)Y=opDc9ss<%-k<(alF zce@XhKPcP&H8f2t&gD~tKc#6A9t?zG$0{kOW@KYWrO73_sr%9V%B|CixMGo$0O5e= zckxxfG1}C*U!A)D0KHfMTs`NM>hbLv&emij>(f5elDaMvN5B5h=Tbf=XNZS}7~IHx z5Ac4q_FUd$kms#@Pw-G~)%@t+$(Bx{BgVx&$JV~tyDb_a>%gy*&La8Q=Hg$zXSi7Y zS6Zj#$WHd)6IM}+?*8>gVP(LVoY##M&M2XU7&^!fX_5l08~AEZEU+jK-KbH3`5&E? zX|zEvFV7gG%qYMp=}4=Ah3QUWVmPHKi&8mR{LIsou>%x<2P{C0KONKT5tzsM@sw103;+)*9|Z zXhp<>1B#UcvV`f1jx}cl15!d<1`WX-Dgrx->=Xcb9+av;8H{~u1=*9&CZ`b<ZLHVTwl}e5a4CAR>?} z4td2%5gUVJBAi!n#C#6)*wxnn9+glY#LT;MQ2g1$RFic2)JwPyPa>p4aB@XXBV_|T z=k%l*CxgW+IRg*clGGC!=d%hXie2qN|w$585W?(ENyR<+LOO#=BN)ayQ<#*&?@@h3)yRGI5H9anrG>X9tbLIi@Q7!B&X0T2~@sRsKJSjVR-Yn}ywtUA!o$w;>RrDIY4c)y ze+>`_-TEFX#EH3ZMk&7_AV+rMoPf4N{rZF}4cVmIu!qkErte@ag+5tA-D;wVH{krK zRznje80`x}fuED7dT~U0X+%H3C8bAs>O9ak{ji(x{o~Wi|P65t8W9`JH@;2rM~s z*VI;GPGf`_h#%cQ-mP6`+Dk1??#AfsxPn5A4;UlZ)+7)Mi;pevRx;mDek1-m6fr&htw9e}@LVdCAM-J|4Cq&E2sj*$2%S-Ro1w`{0DC{J-A*8m+P9 z`H=Pg8cAW4Y}^}XeZ56TEBH;%-A>g}*Ul*_e4?(*@&W;V7v-w?h_{r# zD$-N4B!+3)ONNp!y1yx_n-y0wu`wT7f-7+o5x9K({{XvJ0yC9Xf4SPGPx(r^D9Z+O zleJf+O9X8!JLOH-`Gr`M{UEGiep-rFmMNFZd@tShsg}Wg2ASj7s*Sb%8mx|)!S{sOgV$S{$8;rD^4-NVM7P}ryc03N2I z{Jvf?2Nf}h(CH&*hm-#R*wbuayNBiTHzE0onzIB^7jXFr*^Ng8U%q0`!t|q15XZhp zW&4Xrs9IdX(0%HeiH)|mDORHqh?vHhG~(^CUr z@6hewcCWY99`Y94cyGI2H}M0)x8G!KO2XTF#-}V5nX%h#dii!Od^0)cPRQ{80I*21 z?c6t?l}Bn^u$iGUHe&f({pxL{)QDw`w=9YBm2dA=$km)7Zd>mE0N+*XiY+u#TW27! z<-YTOy;J#(XSLaWe0lbM zUAum7_Exgyw#U`s@)%gnOF0}Um~=m-YFmb9WN63U;;oUqnPXksN8TOkG<~lcl-_q# z&ZFG+@c0^Z{o5aB{11_&(W7)9zKyv*`z?I}%EmU4{`dE*$vzWl{{Y$E9gf(pRvpB- z`^C>+z;>@zSCUAxj91L!Dqd}$ie{5i#MEoM{L0b!k242fl_|2boacqB3RS?xR-1Yc zFRgQ>bIg#{cF$jyl2(uJ?bAr-Z671{uDkT|W>~or(6-xPM z$mX_MAy^p}GD$oiT5M`Je8a6q(U}|(+MTfPUFRD*3YEEh#*$(nKpiT( zs6)Mb&>J6jy(B8c`LFkB$4HrT3(FPer7GAX8K}{uX-f`0D!@VzPw zRg=sEZ$nazyKqK9;M5AgIV->wahRF_yI2M9PgPZZd(>|k-LP~#)SDM8frC*dIH5v$ zX8>dxdu3aJ_)}C84ox+iZzS>1(PZLWS|r-8yo_VDR@eacsoB6@In720BWR^$ktRqY+4?5>H=x z-nogVUBi)CxG|i!%|s?W!~tZFWQS`Sy=NLl2vhuDl~HDm&hy49&v2U5M4@{ma1E?$z$YvWo+Pq`NJ|O!``7$^9Jbe4-rCez@shv*8 zr0M#k7m=2=e5fR1x)_>ib`>8obM>zi(dW80nF>eK(!B#s*W`V+_a7iU{xzedjTQQx ztg|LC>kgHtFtwrN6o}+};;=2e^3lB5j}6GKktAKY-Nh&Tpl0MGhELF>8lr>^aEwCaYZ-?nEg{yNWoM%AZ;G?#$C1Su!#e0 zJGu3z-rgIDeDax2)Zr>h(MJYh2%EExzx{gdRJm59^Oqs}M6N`OwG?f~YN<82w_)c^ zlz+H`sQ0L@Zmwcnt84@KGy2t4zkACDmSQ537Tga2w%X0mXq_3e4TMVIMjS`{Mf?7B zpR4QB+sgKFyQ3iOj(2)iHTR13E0j=(3}j>G_4WSsa`w`&n6&MgPx=1u9Aj3e|h(D{9o`Yz=HjjM<_vVmA$9WG`j#z$`F?KIbIO(4Jip4TzjtlJ{QR`*b-KD3k}oKd*j7DC^r)su)s-$XtPV5$ zD%6v{#)`=h-rir{MKqGKvhX(j-HJcETFwp%uSZ|{G) zwXdXjM*X+Q$%tZbFyn52+OByxL0yh2OyRBc=54dG82rzdKkV0|Xg(ZhqhRW?B#gKn zmb$5QjXu#t4x~=Qj`;QBx+`dHL+d}Enwv2)e3f6lfw?8Dqs`XP< zBesgtDGNT?SGnjv-KT0grLL1{6t>ecIQe9RFYBLb;Pw9i5nE3ZMH8|o-YM9hulqHf zD9YvgNXJu3=U=k2kjptOyNrKYt$E^D=7h+J_W{^{&#igprK>D~p5to|m+t=npS@i1 z*8G@SICJ;6SD{Y}*ynW_yEWbJpu&64oc-E-6BH4_(`U>NZ~N-GM%Av~AgXqgQY4be zvIb&|-;*!BcKaJ6D9YzS9nF-Ily}RsZqMG`Pf22TY=5ovtczPuEu?u)Nzz zl`bM?nRZRMV{hL70D)ArGiU80DB}+y$~PvqF15K*7?uO_TU=x6TLmt2JOn zn|n*O-}pOzbv%d-`+aij&HGG_OTycK5AL_tv@A7=?k|Mw%2oGl57B?w{{RZ(?ib45 zV0=d3F;?!&S+99KKfhtK&HfLi5Q#2QiR|`zU7hsuNpgJ8@1DWEtDm{>L(3$$7IO?C z$_MoS02<{qzZBnT<(}9HP~#|lJq>Mt!dEt>w``wh^4mWz-fiFERG`MWWK)Mq)uO#f z`JA7ZXk248Bik*r`3}FmLPLFP(Y!gY*%-~t(xCwTR1w?jTN<^lhpxrv!55W0V+UdY zTmJy9PBPx+T@N1FD>C_je7|`5eQLCkm|M+?Pm;YN>%jhHlU&7iDMGU8L@|a`wtMC(YQaKLSkLLdXfd2rsRp8T^VNp2pXWXnple_AA;-H!^$RkA?m#6oL_pZxnASK6Mpy#2k zM_9CDX{>}({AfQ%dwz^c>9BZ%#yOvv1k{5ch=8^L> z>k}fZk*WRR;~$MF>{KsfijYfdAyW}^oNn~p>r=|m01AS+2WhJp5*3-GXY*r|u6i1y zhKfHTdHnUjC;-OMO+|^aNMgBE9Pc>lzO_wDG~Z<>i29S)by|tuBu}4jsO!Z&p^7_? zKdJk?)TBqVMav7p70BBjW61LX;~{-3>JJEbpGin8?St%wFcW9jf&P0}%8M&ODUa`Z zS3}|E+cU`{6d>gP0QIZS#^C*=Z6Z|J`WFSY+?H`(Sul8U$2Zi4*vj{F>yxrgu22T_P(vmTOce0E5nJWk`_hc+79;Ypj8j2_E$Rz6OJ>*9IUIC9IUx? z`^wa+N%2LzaT4|HDPy>dHpvJK-6<8cb9Zj5R)kRP0IKU#pr z8_Du?rg<_ln8sCOC;W<-M#O_}Ig=R`PG*r&HfJry-qm>`D!472dh=3C7?3CnxBP2b zX(LDx+oNL=a0N-Qmd0?sssj|ELEJ_=`kzBq8szyPl=+7SvvAy8>|iBSs*IXJA~59A ziK7fMI@JrtiYdIMY%_CL8FUUo?AT(Y;{!RWzH-P$P8YR8<=ZMx2C3s=D0!`Yt01#1 zs)VxgSYw{v^+rRo3?ApLK`Ou65u+GfVDp-v$~OoRxWUP*ea$J4jNCf3Qv=BBkMqqc zS(ez2nT|e(*w&^(z@YPriDoma6$BAkMJ<@0!Z;$P0^nn)rSnj>(A%-rmqDdL1C>LU>;QETP?5E`irxe_sg3U6o z&IS)m@M%D1Q;v&H@)a^i@p5_NG?61bWGif8>Nu>#;qMSg*i)V{RnkE)#&+ZL&06xy zM~Oz>dGAe)VN? z4$E-Ble0d7U)>Q zv9!lleXGrPdelhp5$tQk;?+LKtBZMlQ@DYSoK(+7eP&%#o}G_Sg-marfb`8ls>2=4 zvmWW*w3ErZvlA&K0s7W$*>AHH9Ce~sKhaqijSxyM+(A8MsnmeJ7yPi0!&Z5}x za!*m3w`9@Hc?4MMMND9uvNOd$b+gs9xY?}G5sov*O4x=hat}(aXxpL+qW}uI8EEsK zL9VA4dmjl|`_APX{VF@yiaEe)%(3vTot&mb!8~Ae!TQ%qgs{NxN>7!H_o%ThPnX>u zk*cr&Rj9!&&j8T7Trc;k(!?>9Jk=O;YD7^ot%|D76^`E3af+VZD;{ZfP0vG9utF%* zws1xX#Wv&Q1&7`ps=cIxoN_6XqqF-S^qkd;Ng#slBRgLirfOQUHL!}*jpY87%Uxfj zGQ4PV%f&~hm7ZPF9%~r*ZP8R#iO3}KmsSktFku3tITLe^q0&$KhPc4DP1Qf@5EGv&WLxrX&BocCJOz-0v zrzcPtRK+`*3~qo9eZ4AWRmdRoNE9*UY4NI-Jant&BylGdA{>23YHuu06yOLaj8vCR z2(5v*)X|coE7F)3f)7fbD1cH){3$TCnHd|7eJV)D%ag$rB0IJg~>*>Hh%hucpI8M0+t##rrv$ z3#`ic-6l>ym3R8|j~0ZpMnVz+1NgD)_*a$L$8)J_@RD+YhX8(guT#8fCbWvvX5kpy zis`?+X&sJI8EAxJxY0*}D&zy{*YT>>x_VhV$r!Q;bkTzPo> zYOH49M+MH%1jA`hx;Oo2Z*Hsi~r8f))>sT|}M{O^h=jJ~z*0=2Z^^hwjcGRU}`U`tBQOdTd zhrs04Ia3siFmM%nRg0M}uI~&F9?}nPz*6cud%+r9HyegO8f^kBYBx5kr#xtQarOOc zjnk%$qH!9H-*@JzWw>Rw`kD*}wyBN7{SmxTzgQys@-nkl7>F zt-zrefJjlurA>x$EAS6Whc1kEHRpDg+({2!GoH1WR(T)fY@C1JHF>wZY^Zppwz4tF zl^8$Lf?7un;xvxbLnN8=cWw5p0b?BGPjMddy*TMxo+i_8u3_O9Ol08W5g?cgY0ea(60#H$?Z97FeM zN+U>H$t0dKs{UTjyjSm6OKk4iL?Qv64s+a}TIX${d9EF2W%5Yi_sw=XWG^E}X9)*u za4MqpDQscIZF2-I_N*y-)v-%>teInv8S3Zst&bDf%ck3jna1A7A1eBTUR!mm-#d9Q zl6vp|0CuC$h??T<9%lsngXA?z?PIo^5R4(~f%?{7jS|gtMZ~|pCjvj=`qa9#8iVQ) z!xtaKeF*x{&|MRGxJO9N?Ee6J_-MWpTw5x_nUjt>DIdglds956l6|Olu>0PX&_xr- z6^e!(K3r>BYOpUZwz#y_o2RFJt8@}oPACj0_V09B-0iz0oa zsm5v?qJ8R_RGy=XJiLwvO0{D!jY#LB&<6Ly@+xhFF5ZTjv_{wmiXycIqttpv5rKZS zVRqxCQ(hZAMLhA%DIumuCnMz;#XT91G+~P46(T0p#Wvz0#!v_(a4C{)eorEr+e+eq zg-%KNYd%q?MG6FBN$XPrS3KYfhZ&QKnTHVzR989Y)Wb*D(D%lSK0X%m2PRM)x! zqiy-IQfW?%sy%rRJI8u)Q$>~nuswnq`|=$TrYD| z1Z0mMwO}Y;kT!F_l$km@H-RXNk5hU7KDe=RVJn`C)M4^b?_bOFmju#6`{XkO@jy(F*5#>?V zuCO~XRlwQ~4slvWUhvUhXUT)}Rh3+guG~~eH!maQsMQ%;BauoU5Ql-W*baiDGO6T! z+L2j9ZeN<3fgMj`X*2^&jJVo(J?K}Fh6j2I0yYnr3P_^))Uf#~lsR_+!I+LehMW=A zgAQt4s;bOt64Dm=e}<+}0mNf*lby9xTqJS@2L$w|2Lnq*4FRRumYcn({oHq>?oUpU>0&BDBG3Hf*NPe+i=<*M%g0NHA2;)(OW z_-Z0+OLO!4zH8c}icx|;Rm(VnGQ%!! ziD-8^M~2%(f)OI5jKFUtcAkH`T9HQ>kf8g&`VC#4N#vDK{omzO-YvW@ZuP-Zq@0fy zwjy(ur8%Q`l=+yEhuz!!H5zr1`JqN~h)N=|!cy>oW_FnG>fyY8Na) z4pStdvh2HR(vt3xNH=;@n8gwO*keRQo>z^(-l%m2Vd-olm6j&lzul(Bh(7S${pJ4k zJ(FYkk#6VZs03{i{LI;W;-)Niu#QM?Bn_$PDrn<{SLMkfq1=mx?!)-L^-URFzujR= zlEOos_otONYI{5=ik(@%N{NlY830^M}>S#@VScV z^^F$W%JZ9i!8&gK{@U?z;sm#qtfm-pGn`l2@<9~wx->#Wbs&cR?Ro6d?RZG&kwtqib6*^uKk=v0%vk@pxJ3WnvgYaAJu9%DJ$K>lW|MIy50kx2Wy zYN=5y{{Svm1m>fQ&XCAU6m8s8 z`g|8x*EX7HlQ$B~k*mK0=R12);;dTxxzEZg<>xkkKVu}_NlB5cM7GhDBBYTD zzs*yS<1A{lip8^o#b>F?Czp(c8P61}3KUp@*k}epA0M4Z60UysTBT@b0(V4xsh*U( zKu`x1$v#E-IL%2Mpbww!iVVu{h_;Y^T7WTkI6W%MGRTU!$Q>z>uEJT56>)ZEuVEun z2nU*PlwFQ^#XYd9+gp{OmtUBi)xuhkK!`F)JXK{3U5X#hrZXLdLj1z3;0(C$R+!Bg z)Ro8_(;t4_r-4-)n8EIz$7;>fa#s$J5rl%f#CC?X|;L#!OOf`Mr7cYUsn!DhlVT zU3jNTw8Zns5)WRrUeCt5WUnR7#msiL@s6d`WcDBMF4gi@t#hdxnPExJ_2of4bp313 zTf|dY+&!i1HPL~$l+WF7QC^)4vNGJ#F+Pp)U&U!Zv}A_TZILJd?;Yzp3$@nZj`w~t zHv#?s0DAdPUDn@Gxfjq%P&e?Y=Z{+SZw7eM*}S`XBvlcN6VsaXYG7d)`+{pz>F)_@ zlL(9xk-xY2R=xbQ8<QgjP46fe|S9r?nAW?5B%wuP#}d}56y~yoJdq3DXMdMzFv20KXTnF@2e-Xim&xc2MfPMy;BH)VTXT}(*i>({IStARvP;Cu!ATy} zmZ=`{sF@2{8os{99xoiqI_T5Fluu2;%y+_I!w%XxeKE66qde$oeMW0P!(-@Mp* zRULE3+IC8;f;5aAzD7OA*1kvahs1yFDdvkt5<-OM%n#Ih*U(^c`E#qHqLVwXh`u$; zs@Te}aS|2(0Cl?@de?->s_Ht-o3(PK(bL1m8XK(+n$BB8X7@r&1UpDP{{WoU9o_xK^oHFSrMVd@1~d58 zD}nY{Rsk6n;Dy5W`McKKK2$cv-0n~?ap~-}v|_g^?9Yw?C8v{O!_1HFmppw9O!|q6 z*E>_pZ@+`MZtsKKS3iGyZwtt6qvO{jpRIEVcQkI_YU9~DV!9(tu65MWlJ|V92MA9a zdy3Aw)EZK@e{?$mpYf*Lur89scq6Cy))meCanGD(6R-EHrV&p=8=G%7##q@fiO1HZ zd;21WPJGC{zlyLfbyuB4aUAFG40NiN`~10)x0O-1IPd9QGLD*xTW+TJ%ENT_Wr?ITo(s6=7g*0rRC_b7yofa8v}l;_M;6^!;55x1QR zeCxGw*b39J)9+`y-Es0lM&q}+^!#f6m<^5CYooCCRr}el=F?WtWe*TR9IiPH(*wAy z`MFW78j>n$I&wr@1s+-t-H+)^GL=`7?ZQVN2Y<_oqj9T!goI3-1GJCpUTJ^gp_YPj zCbxb_{!RE-BxpK@p4mr3(B9#0VoUfOOA=*J`U>Q=ZxY+ZZzwZ)c>K+I<>!m;ZKEr0 zc7JpZhwEGw)}?cN#z~y=E4q$bWp;B<5v8Jam%b#BUa(x0bi$x)g>PSK!Z%YDc5{{u z_$^|wJw>b9In4A5x4uF!~XVZ!q)BM0!Q-qH(%n#QnQ{x2u6r(kBrvcszrR6 z>N{?%C80%sI#{Mr3$uR106pfTInwAW4-fs@~(F&9fzmVxf`1|vUuSf zzLfS~iCOo6`C;V#Vlylh^hUEE+{3f8bNbcGZB!4txgWol$ahRgS zgCp*Odgim9#eI>AqDRZNRCF2sw6U1{*&~fMsNjEEg<2S+NTeS>T>8_dGes}iRY387Bg{9ZJ{c zX!rSGwMH_j^ zBzx7XLMyY@6^%@BlH_xq20yK2 zU9RVL5$y-56#1-)DMYa;^BPZ`{{V-zHRF{6q3zdgIpd5Jid4x1qSNAbjxtPTBUj}6 zdsOoxn-EJPqXkd7`QocXtIY($H4g6Gl}mprxYI@%=7f2f`F0W7s6vuyQ${4(RP^=R z?^NTVl-7qyrRrb2nXU@$^dER1di2i>_`$T>^tPD~mmue#m3I19jBSm#+*>I?=aL6f zK3cmq_mviA1sR40I+6Yr=hvX6?y*VgeK7tuO-Q6i3V`4q{{ZhFrF0gTnq~c{YiRtt zg8u;P@wCWCT>f?QE{Ux}Bxc@L5z25e{Lj|A81+E_j^5T;Bo2Cmjfd%8Rcs!*8lIVZ zaV5T>tXRwkBooHpX7sL-FNi}xI-Dgjcb~``FpX?5%y@yOXK9M}IxOKq!$_$c6^sh0)mDq89@wMRZ1KXQHb#T67 zlm4&$p560a)23+Fw$`BnA}AOb?!LcT@>^EDlGY=oOXTIZ@xjNT71~*9cZmK)#^+Pl z(M@FBiJ9G6`4P9-nf_Jd6tTdmH<&mExw{G7Z<*#@?d$DbDqIMZ@xiVcuXs&;lwG#6 zg^PzhPXzX+T$YTO)13abnlJZ;BZc>`7EVL_Y?;E(59UQALF!A4K7^r@7sc1^V@$rsMb7Y07(`cfsJE4}_wdI8>| zYl#iP4Cjt8-RnjP@^^ALqH_uIl@(qxyS_!~Pm&KY0w259pO8Zt4$^3gE0HP6o|K^^ zHSZLow<_DlFe+F|uwsU#X!a1X46F4ysKZ8?A9U4TLgYnhmumz(hN_KiwU-|->T$uV zdzd$wCn|aX7(wU0QnLs{FkX9oYT%iW5Ohg{n_*bDoUVY9?PTOFna2 zMLo-Z2^o#HZUZB|Kjty+lZB_e!UZF60G6m051rk*aZM{CqwupmCV7#>N^%Y}NA`Wo&SqwBpOC$Q>0LV8 z#}i>x59VrZfE)u?7`u|%FyORupg&dn#~A0^+Ll{wuD)9V?OQGs4n8*!OHg{xfs^2o6oqn{68P~YQA35U~2cK$eX(u^uohgb^ zxXB)LMlq)59RWD~d8ceHaC_8|^(BQr0eTz->S;%E2p8qfe+r2Fqndas!*cQsFrJwl zQcM;8(G=JKGV|;yfG*(doYUCJ=6&Cn)Keu4aBzN=ZQRlXQbrlF+`zj^l_{HIx$@L=p7k^+R7eja-kc-(vClne6-pK#fE1%5=CmRk zQF8pKsN;x&WXKA716G0sTy@>oj+DiSjOXr-l<)4DwPK|1s~-0TLcNDQY6*AnLg5?J zv8%pM1;2)nu6pn~RIf7Wl;OcRW0Q(V~n{$`Yq)^`^#~a_55GYUOc7s|?v8euHW2 zO7ai7KJ`8v5KeR2q62B)jOLZVg_W3wJZhQ>PYis`#QeU3k@nziQ~1-8 zXsZol_i}Nbpm(OMU^#Gj^ruLm;5Xw>X4raUW33U3xDnth=QtndicgrHIU<5f{xuwF zwNGL@`qS5{5Z6$sT0`=Vb5&4hl^6$}YHu+4jTEd3w@>y>D*%IMTz@JO8chGyycuu^ z=ZbPWXC9Rp8%G?0OhQZZ#eOvzA6FQ(UqxWMSApqCEHTPCQN=L`P}{OGOBP=}Mk?dD zpur>?_Hk(=PCLwj3Uwqt`WrA{PhI@54-nw%VCwPvKpbVPRngVv^v zKyEXW-jiwFkZMer@t(CnIaPr<=A}#)=aEcR#&h0<8%I4VTuSC1zyrYG)VavoIHa3j)29p6uIL$wy3f(GFRspGl+oeCt&q_hGw$&J^QA%)oR7w{H zh=A=%12W^FpoiQ^Ja(y(Nyu(E=7~nb`y&Bpz3HpZ%zM<~KpdVa3@3L7Dtc3ht)S?W zkWXrm?IQ+=#xb6h>-W`F{veU2+UX*QTzyqx}w!=olG_8q>Xxwn7xAh5HJu+TM1rA6VKbLyN zvy4c}7}@p5nEH?keh<;frn<+|W-Gw3T5P`CR_8)z7+ z5%aG}6cWleM87%yl_c!O)D!aL;Cj`jOJ@nXV1@)Ns(Ls6%UA4-k+#WB-&0F{ zrN~LSGi?K~s~R*>%@%X!W23cHTDcl?7a*2tVN%!!xb65&pc{)t$5OfyF6j($Md2Y2580D7tne5ZSRtH5nc8+V82o~v91!&^Md{6nwzYe}X_ zWf06i-K?Eb)&kMCPac&hY9~Q!E}o(=jth~~(yl{%*4m6RjHf@PbGDZ1n>g~>dK1NM z+1r`jo!_6-{{Z!=Y-NA4YqC61#q1nyAHXc^s)bMs_bdg-*)zIh>8Ezr#aDRb*>; zK1o~0c2@R*oXW`>fcru9C;i^F`Wa@Zwg+D9DN-HvwG%I1x^T;Z>&n}^({oTO!xigOZQWmkNpn@?`_;vXa5>$BK;uD_~I_%;eb6&J>QgsiPjf>L}QZs}IJX8QL;xl<^@^&w5afpc@#Bp53V%pzKd-jATAT zaB0DF!x}BzXc|$#r>kcmbfws`4WLpY82+1DbC0za2482tnOX zm}%IL3>RtqDk4fTL(NR+3FPxk3dMUPXeX?0A+Zn_7v;Q7WYO>poGHprtW40vB;ztRmi1$d3`aOQTJ8Bf)!4kDZhK1 z;8Gzf4h2Ax?_=mH;Q2=sSvyN&na1o?c-W+>?)Iq^e(77KXVh2f0R&?o!ds7OK<9SR z&MHX|u>lXERh(gncup>s$I&J-NeR|B8B zQU(s(kCvEFv#{+`8cYRZ2T`2WgxFLA-mC0x6R@dUcF;%O6>2v?OPqY7t8L>sJC@=u|s=Fhiovrek%0i9qC`FAJ^%T^@IAA_e zP?ApE&>4a9`U)dap^~_DVn;`(MupRp_i5=OEPpp_Qb0fp#W_^>fJjDEi8&prBcD5L zW9wF=d<6?t?d{@@Mv^`rPF(ub&Ue^p4=S6smExMaVv)9u)Y*~NOz-(>+-kmBp7n}j zmHL&&5r>w)GWDq%V*D`0BV}Dfe5@+Kw`q2&uG%C?Mc2q+2SZjqQrQO!S`Tj=k^KJv z!Crf=c$(JO$!83qC6DDlH_95WoLhPuQHyTK$??aC8YqROkIyOjN$vjt0=Ug7K@h%Hz`xUS6-F{s2_rKn+R*njC*!nCgvOTKk zh~ImY7(KgIDqjM{032s;`&HnYzr_7fp(T`I00b_1KkU~WJYV7|)ox@a6g-HEkU{?d zYrS>DDxXuPHEexVHN-8nvxQMte%oy86l)^00h}N9Yvh|B6KeBHRjyp)u3NYJHJLuM ztIc^L30y?1Hm>I7M?C)kz`Ila&h9Bxx%Lm8X6?95hxA&b=gA$yqDi?ES`fMSe~tRj$3nI|9PP#bvCUo8CIpX}Gn zx_`u-UfKS`a;8R;?!Wgds?z=h zHyExbO!3Zv2=cWnpDfJk5bZmOZkw_E>!z~Sw9BbJ%^PiF(f|Z~i8fHI`&X3Y?b(KnLYpG(?OqUyD9D&rf z+P{}OLku!^tgAGV);}gSV1w?KtHGsbSsjim9#f((v1$)4=Wu5u=ILIO@Q+DL-x)^C z3qxWzyKVVH{{RQ#Ys?*z*-ORpx%pI&@UN`?0{B_%beT1q_^~bH1_i&45WFAE*A8Kd zbgBC2c-j6wR4}q@ccMOwwu$A!s2hLu8qtQ{FyBAjsA6Qt$@gkDmR#&S1+SZ@CeOwu zAB$I_Y! z-gCuNm4bT`F%G+5nrw@miU&$tc1-MVyeh#trPf_0gAgfcNG1~syA`#Odeql4+L~H%z27D zKiSuI^UHLug{4S$%KT(}*sfw_Hz-`DFg{(r^$LH?Tw+rcW*Oloz{7J4| zOv#^^{O8biuJ>9+i%GbUoZ$^}KM&M-61Be{KIc7n^fl;HdsuK*)Zsj9rTvok?9-;- zFcPl6C}*L0=U zETl7h*&RC(Ulr@tu;~6Ix>jabZQo>nFF!E*r}61twid6nPq;}Qh2g8K{XbEPKeRGK zARDlG`d8atAJ(iNO}8l7+KRdV0PEN1BI=XHG;=2QF%E*hnfOuS(RKcfsN^hpKDqW$ z^{y<-4(-eBoE^Gt6s|KCW*F2e|j=LUA0J#LJdw;c1&8RiZzh!1SSM?Q~+LPG@X&j>a{{VKTwOH=uX_0V^-_%mD zL2F}7+$@dd!Z1hOHEnHLC^q#wx%H*CwvIUb*uG&OuUePRj^O1tf4XUVKXe)?tWl^1 z+pTFv>l+|O+!w7Q#?F|=+|`R1VnlehV-=q%o&Dl6cKKe0KRr;`M&tt!Mbh z;%$^B=fn3malv>4xsBVXLC#M=eY0O7>RvH7Xm4ec5R-u?U-O##EVC(5jpkHWL!RweeOB<@}E$j$xUYhz1UgN(#N4^H6v z*S`qzqfSd~Sc*G{0FDsvx2u2kt7_6oZROuD$rBE}^Yo{@F)S|SHtnj=+)F$}UOE*{ zGM{}tm{iG{MOf9hxVBRw3y(Rb9S%A#TngqdbxUbOTO(x$$_GvbP#0Qpo_M#Gc)1Qf zRpYkm%ZgDew6c7kH}`97J|C%^rO=i~jbhsuUcU8*bADl9S$fs!?;~IJYrWKN&rUs! zbGH{l?TMWiryZ-Z5bk8X(pmKqn;H{_+E*XKYXb6lw+Ebm7bdPU0=e0=pZs>J8(Gzn zq(dxjKZI_<`c~0OI}vthX;#cGcFpo+ai4nVCrLcjMU_y0v)!q-F&lBuI|nDyn)bHR zN-i!5Qy9P>?A30KO1CggE2=_rSNLceOWzeq30yWR{gOi(IoxEC$R|C%m8Av7UQkuT z$G7iy&+!VI6>>d0Opd^8k=dmOg&%Vsxvf-;qe&(_z?}VPvRJSZ{!c3aZ1p773yoSN zcY+V^bDouy2lh*=JUe{2LizF@+=LBU)>?(M5bT4JPSQ_ob>g_ky|Rj9_E6DinET)DQ*ifeTn?X6)gF7&z&04|On>NAhkvVFo%S)0E@RY#)hjM(_DCj- z9!KF>^WNM?B3!xohe7DQ$KzC?bz?glvTK*7+}Me-fME;vUjG1%akE^>xS-|PstdUt z+`ru?rB_fCgl56O`_|x4sy$;CHJM#rBxV zR4QWyn0-I3bTcx9LO0sLU?*c!TZMT>@rCTvii+01DwN&GIOjg}*l=c8B>6z^=}93M zt($ZC%?GJMLXLSkkzPIA_|cl1D}9 zT4@OR5k}3e_iG`pA96@}DmzvG0JTdKE$q<|v*q9tcKror(McT@y{t+5!Sa*FDQ%L< zBJtism2bVf`cllu5pJM7<2gp%#a5D4c8=+vcpt<5)k=Des~NZ2TsG>{!f!QmbFcc`EA^LQO-{;w=^LS670z+do@>*)+r?_z_)*! zwMz>RETp?wHz4{`UvR(;xegVJP?gGYv07*Hq##D5H&5?=G}z&tQ|4j3^&jI`Bv^Lk zo1a>yZEm4;m_GE!&W-%V4g``$ilK4S)};}~B@W}Ds6+^x(jY+OM)JOP z{^{oxHqa4s%Z*d*TS}*Vbo{GECtauj+#9d8GB31ULzomO`>cbY{{Z#W@LQ;KDZxt3 z!5YQ}y}qk^1YvQIqXQ@PHF^n+(kGYzZg-K_HI3)RljM;uI}X&?UBVr_Z|60fAZZr* znsa@s33ppKJ9?hNwbpp9N7>|K=XLh16uFrcDCdlk>S%)a0yBtNjtY9z@*;WBvoggS zZBdihnn_5({M9;kmK+aDadjnUeS)kNKz05!d8BTHl zs=5`KL7C)Y>b&DQ?zIa`HPZP7HX!I4t+NRwX`#ybXCBAj=~X3~MVriDmA>sui(uOk z)>w|%V+f>ud93zh6#i?dW{_a1`{TSR$Z*=X>`6~6<&jHIo#E_BofAdfF6xeC8-uj=WHPm z-QQ@W$KSz^3qxRH`18;Bj+rO`~TbauLB z!>qRvUfdZ8%d?;3$4b|WUuae{V!lfclxO&>&DG|U&5;fWGTiAe*0cE|TC*dnmZqVC>IvH7uI9$D&a*CZl8&1^e_ zxmh#Zbob2?1ckO1BbEMDs~)2>+iX|lde;`$c9)oFKflwDrDrM@9Ff~yNx#b|a52jMuqdx4#Kl=&?1c}O}Jqs$7^s&KJ~FID#2YO%6nHg1eW@pqR9~~ zBq+w5G+O6frDov{iQm zx66aKu6-%;HdqC2PC8S3qDktzhB)jgxY$v4B4BVC4_{h_KRb3Cra7x5Y)>smLBaZZ z(k@C8KJlR|iaLs;pPP_7Q*kS}+Bl~oWG;I5sRU&oh9FclToFwbmP3<+(29QW3uNTf zgd*~@=r?6 z7r9c6ffOqIy#VNaX&N;Lo&oLsY7EIB+Mt3DKT4WRY#0YLn=W!INY0+XR1v!jdE8|7 zsiTv4`IO`y^sRQULbqX7$V~1W)mM%- zkU1I0E1Gf8Ug-~*5UfnObIBv1seHakV4YOeD*wsBu$oW83KRS$g zq9Uuw9CK4D{Fr7r6&jBuG?~HxNzZInvS}eDZ3^%s?cdV}ntX|t&sC+4K;tX-TcM|@ z#~H|@dlXetV?2ZG1t;-khZQ>%;IDd*kaFCEnl70aBT}%VcisG|EvY1Xl;i8gN}#i4 zhSl#&Bw!Ai9+WvC_ln9k{e9^lU}3m&!>vm0LW8#hx6+_+7X`9O=mjSoZcx;W4bQaX z<3EK+IZP4PoYUi1K-lNl)GS*pznwUV5P5hwetwiG*^%4Qr3zSY-R(?`0mwX&O-jtG zkoinx10W8y6GJ3f*~;gf^{WpNQdl=9r=X^gKp8xN%|2}cL6~ z+*1myD0Y)hh!*62HDJQBEEpQa(XkNqtG$(u%q3n|c5%0tF74aY+H&A<32q($~esffM%NG<8-AQghLU^kSt==Tc`N$ugQI;{d5IWQ{ zt03Quik8kwmHE#{vGHt}jcx$s^&D5EY1dI*z_SCBUMZt2SD-={4e$On>sD6g-pwOZ z)6%Ik&8Y)@R4!XTg#>fcH4J#bC%0OdF>(h%SGmI|h(hFU7&R(B7?aYOB83^x0 zIOjP7^5(h?GU9ZFTmrb`k=%8yk$n@!=6{rqhZQ%AGji17Y;XKPkq@>&>PMi?e=Pq1 zI^CLmL11ICmjiJfbH;cAx02yT!3!z$t*C(V)uh2S5QE(cO!HkIQ`8pYa;Yl$Ip-Ct zajsuL!CYrPg#Q34?GoPI31ER#_5+OlD#*09k#fihH8Oe`$)01Vc%M~)8_S8M3IHmg zmdWq=R`!Q~CatBV#l$ZIF>jT|4gtX9->r2M+uM{?F%EeD0QJ>L94a0$v{rVJoS$Qt zyz=5=syXdd0nZECtlX*Hyi`k!98%>okra%~LCyfFqXmidsF5&6?m??XS~G#tlXnP4 z;jZM_Jmv_x`G6hv_o<|l#D zo|(pKJUR@Z+(kY;*yp7_QXRog*YApypy7u~i9p}!Q>OJNH4AZ}GyDWn#5ZSeYF*sq zj+ET<@{9_G#Vv^(yluh7JRSc4Fl^$NYJ9n*#=(_Z#$y~o#zjvG@tHWL$G9(wvgsM$KJW5c%+c31_W&)wDq}!_in0jgVwVIo=i&`p(@=ASJq*ZQAfW|WN1k) zVQjAT{c2q|Z2thcU*Y+yI_Bl2O^BNcjC`V}@Ys0Y5B{?}p4HO!)TqUp*YKGXWA85& zm2KunBe~%^8t(3`E!xz~$%4Fb>TAy>l0!F;@3C{q{**~*I~sRw1eQN&iA(I;^%<<~ z7Br6Ku7(Ial6tSWsO@zq;CXEj?^pi-BCWxuG>|;+Ccrv-iqTuBM(0O1u+MD&0A)`x zf7E_O*u?9EJ3fPpFiPkp=?} zcsZ?zUE+&spg-sDRys7UxIxJNUbU-kj}YA>bLmGZ3M~~@Yl){b`J2>yq&KZxXhTQ~ z$&g1Q-1=2>7ujTgCO!UP+(*B?ShIl*`bZ9BAHsSHm#{%H!-~__V1blKpX)&F-|JlEub3weSbzmuj)m%6yOujb>H^_^hPiJw8tA^? zkhjb$pt!epm8M==U;hAAV#9Blwmzb!M z%1HiX$0O3DigP5YAqUeUm769-tKUB1*s^ES(wyl!EJj7x+o+OL5NRJcXzY(R}83xkzT)m@5P#M9(~ zyJ#Mjq*qcceT?g!_Ey^?PoH;MVi$N;LZSV0PnQ!&AXhSRP&`uGKay3jVA~%vTP^r)QSsy)F~nG-6+|a$bfGn=J|lB)j=eBP)cJ9Q5?m{ z&f`@i`idjT3O0__7(I__XfDamtxB;Sp__qI9quN`cDYYXQ;IW?NvT(26aCXl@nCRs z-mc}vf|99%DXiO&?ylaxhIiI>+*)Dr^vjXwN)N~DxP^5 z2AD^2)4eaq``3L70ODBM=QgSKFUx||k34?I&F8wbByayH@5G{G+7uI4!$VwNd> zZKsN0a~Z(r6p6UDNTtd$cOh`Yp{Oz#VxHJ#F}G@r1P9u#5;K7g4t`z*NT3sgQW2Nr zaY~>D!8}#7L|7z7xj|KyLfo*$SX`d<3#Q|+@tT-0BO}biFM5%3+&5ZP0eI(%n}9Ko z#-+51jBZ4Bp&*J-na4aDbeneoMrpf_0)tT!n?zZ_+Vu5*EClPCYm@v`!SW3C`qrGL zWUQxmsHR8rWcpM7aynBPOYp6NdeesELXEh{JXD+VoK!(PwAiC2rBx~b$0nQYLzptAounvoZFkh;jpG29*@C${LPhYzi15-ANe= zgNzeQ+`>Yc;-y8w`Hn?CVF)&mGr-LwdJdE}H|ztNIt&xij$jxL%o1~&aV2_xdYG`u zBknvP=A;DYJprWM$FUoEnZm6sVC)^K0p3P)kqQtjQe2J23gGIFCPs++a$QX(18G^vbZH6jhm&)%pX zgMq=P0Ty=cZcf#vyBP+-^6jA_ZK}cYX_Kp~1jky=KtZ$16(n)xJm0*3yH6{Tv~~2T z7(9DgvxzEKC16)-h2o_|Y<=IDRb+F9FY{3gG;Nbt7>ti^H7N|CU3=7o#?OP!>X;yY zqopR1NUjjGFU^IiikOCTQJwOy?$?#46l|!Is{a5LWK@V*q?y=l`=5HO+1-IT-?(wb zBw1!ALHBFIej$8Iw(#V}&eP|-&dr{f``PRz8+v&GN@7+O9k9sy;69CC`Yjy!+?N4x4^b-|v65T;;Hl zV=D>_EqxXT0Ft{sY&IQ7Q75`tB_d3hPn+fY)lw9aQY9<2uiel0YDfcy+{yF(+O=;k zXE8te#r_{^_M)w#JsW6PhA$~vZGhx_wNg0AY~9Mwj+?)RrZY}mV~cOT@9xq{BZA&S z2bnQ$H-8N%y+n~*qFddwsKPE+9=WEZQMx<1*vHf6sHc^f#IpYY`yz&PXH-MStxZU_ zh7hP#`Hu1TX|Y4Jl@hUx{m|X2MTTT8)9-Zkq0lq{29sw=Bo zKGaXnnGuQ35qC=$U-p0d8lDSTF7xD%-VegLB~1&d>iQSND+pnYFIN)~8*uGjt!b&I zr2@}t$m!IK?jpWUTLwvfb-`ZSe~P+K3;4G8LcTG&7l|9W;<#$zSJ^5vvGlw|#u`=r z9>3nLHAiT`lwr#LwS(ckde2<5H;{Gvr*|CJLI&mD=L8Rw3i6zN<7FbJDz6js>s8v` zS&zb`32@Hbb5xeI7Ya2+_Z7!h~5J|o%c}DN~HEhXq_K0@{+b{5sU-qiKizZPLNeh)f z#r#`ohG$gRKMI!G6)WXU#VxRt&GOFEvbCp9!N_smC()+Ww22pBcW=5I`^#T7m}j%T zk{QMwKJxzncD~V?2^kxA%g5an^Iwj12{heJ?xJ0>IQ&2FrmtrKQ%*zcvK(5svu7pd zKF^)Euc4_CnsnVG0HgSSyHst%%BshuEUi4vI$)=j6pku_`k;>raPpk1`*cw3yJ)xWTIT5WI>&I5n!0sa!JD z5-C%b6)2u`WW^8JNIh!uhw{nJThgH;Dp~m*sdv0?hvnx2t;wc^r@|l%$IEUQb^1}6 z0mGgFs~FGBcr_VO4=i(^(yyN7DAI?Nlh9P~O43F)^0d`AV1$WUB7S0d6xE0kz54r526NboYdH~|ap_9t zmLDvpIQISQ);mI|Mn3a;)X~f40voSytpu|~RP<5Sloz~1Lv6q%wzhj#j7Y(K4NxR&QYxM&XO+GB#>?C{mq__FFI(eB`wJZXZYfzI3>)yez~wOD*JEK*z< z9KQXBk1u!2f&A;X58O#`+B249b_cilpkNhheNb)s{Sg2O1aUV+{BYRCeo+;_O8qxEy8+^_R#pROom%{i2M0c zyUFWaFNXCSts3$aP1ee;3~rrNiq*OByb`0w0X}RW_txL{YnYcx)HK-M=5&yler5Jv z+iTtSk*OU@TAyfmSH};iPj71`BrcyksmI;^_q}>_@HdXxE8( ze)$EtUqIjN*VR&MgI2eVAdnc!?#iBj-LC@^g>ZTq&K72Vsd(D7rph0@-!Wmzs@J1w zg55ObwFl+{jW2B0DtjS&`M^v{ovt$hYehunh5KXHGwzhpW&w4L*)}Qe5(C- zR%8zzq!VM1@b&)yfYzPF<{134x&HuqlZY24pUR6NYmUG1K(Hbe`@}cr+N^52jFz_K z^xlUDzUA*;Jq^vp{;)TVq_-@7ZM%N$IIT8!31zCWVQ-0q-JO2RVwCPfEc8M(=8*1%kY|~t}<~)Ir zKJV7PSop2+Ye<+jnl1!;hne!W4%GXcgUQW#N5xNycYY+e{?3I`J1D*Pd5lN!`&Z7g zguQHCWr82_EA29zpV=>IJ;cAdKJxYaL2)GWxR=ju8YC<%}jD=0LdZIa~0z}LTIU8xvtZ}BrInUnPLW!IUazottr@-%wu^sFETT7qxIcVJ-?bZ$^sO}Ez=cv+lb_3=u`Bm zRb%p61D(&@*3g}qE-Z;G#NWJQgBpx&^rpnXt7AKd1O3`nh=w7*)q(#2pwxEk?x4x? z9pA&+s-U9_mr}!YC_^6PpS{neR=BY8V+{WQeE$HRYgX9Y#Ki9HkjL7gxsu}MH4-R} zM)c^_lDSc*+~*;*l6D|`r2Ayn>`5h*sFMt!9DKEYD1=I>o!<9ZDs?EBzKfLG^=kcr?xv>;h4Pz&l6kuQ+l1cpiYVfzp z2}dq{s@h5R&BRHA{m?N>0~OuooDtjUSw>w3WHqJKY#1-^3CQP+eQ9Ba8^<$4{<1T* zl#YkmwTP1KGaXLeDUdab7nL)lU4zT!U?|C$@M)v2~BNY^KZ<Cj-gXC}t>9)rCJ+>6OcB_6)why)w+!y{zFhkn&jM(a88s<1gA%8b#-Ryc$ zw-kO8ckNrDc?@`d)mqx>TljZKJgDROe;S2keET&tH~PCB7Xk>&<@qFX?rErqfDGK_VlhvQ)tbvc+^yJH<|%C?c3{72WFAmZ_U`# zp}G>xyRxdie!ibd0|^Ph!36a0=}2}%En$?GVsLtaR)aZ1=eJIVs4R|TF{tEH6=x%N z7^s|)oU|e&1tumfk6yo(M~9PU(alab`Kp7R#~G`!BbLH|IsB-Cx)D($-!9f1FR!gE zHlk@a72q6nt!V9|R^I2YTDYVrX&%x)8UjSF9zOKxqX@XqN~$C* z6e{!3Q?OlZPUMS#K0~sHva$*t!J_{ zOPG!{cFq9&deV7t^N>SS~J?YJPvG@|u07bGaf9tpxMjy5 zjXw>wRWLE@=|BY-Z{TCSZym#wX5?Z*@<(q7?$++Cd%aL>tv)@7F)lpD9uUj&V}txrlp}00-qHocExR0RV2t2b!G3i}MmeJx8Tg z5$tW`oxKme4i{pJxXx6J^r71ljCLJ8Ds6-gPDg5t+aVbp4_aw#F^c4Tq~Lqf2+Ffa z2_&Arl>Y!ME)j~76cGL0-R%K9%k-_n1BZNJ?dI_ z3s_Bra>H+NkLySWJt@SJ*zHV+#+%k0kPkUIIr^G(;Kion3}@zGc8^Mf%8dNZ#A2S# zJfQi=Cz`Ku3rh~j@;mX?wB=(z|JTEw-d9lF7#^hdt2%nBHphIL!#b4nCek*s>q!`q z0DakSOxNPFs<%Gd>h0`$BqdaJt!R)kdshQva_k24%J;6zO_)0EcH*nr>7gH0luJe& z41=0jqdUHCYRP2>2sot#hRCW?MlLOAhWQ{63F5MKeJotZx;~(DTkD;hm~{PV!PP+^ zb)m&GN`22DxwZ;CmdUPUg}1s99;|EJWVE%p$aDs{?MK4a&3Ly8+jjP;+eklPR5r)igw+*^fS4k*+o z5Wrh@74Ui(>}PS5WZYxoaVN8Ai_8Jm=8o zv8vYIB-AV>j?(=be3{1?PCE1atJIc6d^4ZDRd1~AX7c>?40^8}Dq|kR^Bm-Q%eV^M zdXN7AU33uY)`lbzzFBxUJq=M^9>U;!%e9xG9Dn-jH~taH?QTWPQ{@2}9=-XeW=mH# zF7Jx~LE&pMYu`U`=(T$GF&tx#wa&0W*&KUQljw-IL1lDog+GlRSlPF|M5~E}$5hA`IG7B#7^xSj+&+|xyr`)c0A!5NpL0aJ5Awhpo25twNHo;RKD6e{e6KW{ zv6_!4_ie)+g(-iO4A2z0Ij4C*5C`W{(jAAQw-o#Vg>Ig-9IgQEN=8UiP8*KaBihQ{ zeosn&OnOoT+m-E4Q@Jn)HEzWHp~d!qJ!yG8Mkr9&=eJ5z`qZOI4hX}6)YFi8hn_J@ z4(_I$`N#{}vU-`T^c8@{De<8r<-h`%0RVBq4nfxw>|uGSqQ*9H8fRa7V2@i#8RwBc&0lx#z7; zQFFUI(vt>5hKz>AIA@kq)}FutxxYFW9SOjt7WM?JH92fI6y{N!(7^7>(}EB-`qlIo zD2O+lj@0!mK?G7LDsZEY^)l^VdK%|!7Q|?WZdhRZ(#F3xHDD&?$*5B*dQuxiiVHd8 zj8w>+svb>76t-|^kMCpnsvEFJu{a@4F`AGze(2(>`D=s8sYdl$BFc&$6Xx`(V^xi~ zJt`&3o#&vZpeorFGKPYZ)OPG2m#sQ4nO7&~r^Zo<9WhRUBU8O=G?`17+pr9clT7i0 z70@J^{{ZElcpXST&ZV)5*pDsAnpC`5lYU;y6@=V_ktdviTF0Eyg zQJUc8SJTqw(DynQ zjjLMPhlxIZi=XzY)`J>6j7x2G+mL^yE~HvGgh29tD$Ucp=%jHN`Insf*3*l73Nk%1 z2Pte&g(6PmfALl18pLwPd$kVr-N+T`GwO0KlKYp+eS>M}GhSZHB$qyEIX!CJZ=i?- z5IX#^>~h^lTJ5wL-L&yzJAB)^w?IF{*CZ1&Cf+eyh|Ul;epNL|12pw%}AZ~J~M;q>G@SyB8_`*I?+t7-!pZ^ zWh&cwhIs~L&mdIu$d@unZb^)e=b;^bT87Fv%-&KC7a1+ypEC<`mYY--=#j!1FyE>5 zr|R-t+`zW?N-zU$^~vl-T{=`yvP(GFyZ2!Jm19tfDONcF>Fa^%M=1Fa+gM;SG$iHyD(p653xMdm z0jM;~3#YwniNL}BRi&!j6m$`|0CgSdKEVJ6_CqhTdxA|12{%eR8m*tnx_7#&Y>cH)7 zCyV&D1a6Nm3hQu>Syhx$B0yxRK>K$vMY=%C&7G`$MD284>}> z^{7NenkLAES9ayy@m{Gg`We?m$@ly?0ig>*zH58+y5t zGqp~~_5Ss8;$mcPJ~f&%)BWYE`i;!`g~W2P9#{ks>S~>;Kb_<%(^sfguPmvrL#A)qJmTHa8<@vY^QWf8w-*{DbEC$jm=67eC7w->| zNmA+jHC&yM;!CB1IHBNibhl%;-V;d3Tn)MEPGE{)(LWfSp1RU zzZ!TMz+Q7t*jV$(sa0^Ji~;LPGXkE+8SH6Sa`TQVQUelm(xe;?D^$Q>2XPj!v3 z-Eq>8Zzmm%CN|^)Szq2V3v4V{=g?6E?kOt`RNMi_NnYNba#D2mXL z&KE3dIHXd%9%>1t!+9j&nnZSLX;~B{M5AI- zBnJo!RYx5AQ_%6V?^6u88&66|q{jpfK5o@u7}p=AQp1+Yuggs30#4bQCr4dLI>Sim63qyLzoScVz97e$81ze#z@s^+j3Y*!2Id{UK_7Y)wX~= zeqWN9(Sx}6t11JG5zRomSsRLgDg<>Km*(42?2(m9w$-2`uTPh6-lu`JSjo*`0IK^i zje+k~%5B;oky0b=k1jR}fkx(Cr>`|@;R44feqI#Sb|sr}2Csw>t{bIOnl}U-@M>6H zScC~wZWT8V#W3#sx#4I~M?A3i+gD9C?1dd&j4v2`O1JRVpF9!Ao4!#GWq!r0;f;G-)O8EHhH_*xJ3GEx zB$oan)v@DEdj9}fzxzzr8_DAz{8e)n_f4>kzq}&8mji_MYnh|j!%&LVl~F~^BaOKG z+5RfC6iXD_KyN9=YVE8_(6Te_-Q9YMf@rO5VMqfRRQ~`Mf0?V&hw`1!eGJmm30R}? z?@I3^6Q`7l@^?SP7NVZqd7#AX7=H(@+FvemJmw$#RXBV`jmE{MkgM!1%%3;oRSdar zCAr7mG=29w&cLIsP#%0xeW8X~Tka=2gI1A-pzK(9e93&MTer-nm=+61ShN1=tN6A7 zBn(5Jz4fSP5eatVb~(*gG8L>m+-_ep_?xvgBMQu2i+tSsQxRAx@|Kn#GtN5~Xz!ZJ zGmMF03k6AGTG{gPe{{VWmY_H>m8d(&D`?Zvlm`X;g)AFXfA%;Ya`u_k6f9N%vi{>5fXw7mi zMpXUd^8G5Dk(NhO+pR@r(q{}fAH!M`+*>SWAU=M-EllZ0m}uDWH;C@E-A+46ilh!g z@^<{y^%F}g2uV9~17&OC+r*Ck6iaimSo-7p)$AS)@tZ|rmim>!XSM)*{R-CxF9e^y zi-fd3f|;$YqVuLZ6aN5auQ>5n#Em;ivv@4zOPSy0*`2^Isl|C`iGCw$8iUDcW?e0l z{hz$u>&~rR86iY{{VKq9@Fgdl`uG8=U*kk5rR#v@`R$-#Jc5`!_TJNyo$dnI{oEd z`)kdqm#?yI8Ql9G25&I#bzpz*s^UH%X~shA4)oG3~E2+wCJw*f(n;(%gKgygK z0IRm8ZaCiKi3E;ntg(+U9;3ZjL;N_3q zPkON%24CGa&?>a;xOr$WDmYb;D1McsA3$idT2};algm1E>E0UXkPx{QW)a zCK;IAI~Vy66%`*ro1+0oJv!BS8)_4r3TN9Of*wA1^c4-%peQTRs;NXxSkknWh}n*U zu8Gdp-kVBSH*b3%o3s-5ny zdhGW0_*7NePhNehor=#c>vt{dnwqq+{yu0C^r5&aH)J~pb?)f-v%f)++t!*8? zmhCcS@7gtsdv`*G{&2)` z^0!LQnnb(4k=Yt2Prd&2Y)Yo$Z!v#*3w0yzuio2Ox3+~OCLg|j@BaX0MyQ*Wu3<$0 zDcvi4%zp0QYNu%wS1RczAv*s6y;>T2O)DzRmD=6vT|&wmJA)`~kvI2x=AGTmDfK+Z zP_ehO){4U4ynnhsg_r%Rz5SS%QN5+d41Qi{)}J@4GX+V$=x6k)-eq`Wk1FndS1R5A z0KHzFIkc=O?s;E`^eOB=b8IuSZd{-H>1$u%{{W02(yrS})ZE7T+Zwkj+lTm9qg~ng zdN;|3oUr@f!~X!qSA}@nO4OmaTZp6b?jifK4hSBfEqZj)sUAs{y0P|lmiE^cao$G1 zbC7!O-TYM_pE045EyGX{`*js7k5oX+MkpBSRCby@!Qv%1FGIHL(pL)xg8o;T@D*Y>o@mGkDTe?Rn zjILCX{7aAgb!$In*>vD+YdWQ+{DQ^__sbtpIw{@%0HIb~x3*A1u?%_N-`k8I{=Ioj zI^~>ez7ypSRrM9kYo0Hdag=E(m58tubioaJP6LI8%w^(Zzs`|9@kZ#X7q_UcSH<2en(3sA%qB)SGG~wn@PS@- z#yFt!#A^8J-}^OvmRpn3q?F#~60_LEYl$zf9`0E&58Xlhn{P_9IFQ0(PmmG!>KlpC z<4{m8-a-B^rBXKc+K5=Ke-_&JoibvJx?CVyeCK|~$@Z z?dw_aBHBXnk=tqyZ}zIP$>%n9>3wPwl@ z7Skk|^**(oZ~z!h+o*~6e(;vc{I%Bwpq#oAw9cwV8*x8&n9a+GqH%P2{dey0ya=yh3{{VSG;;Rdrl8EyR zx7|PcEep(+ku{v@X>RgJ*E0z z7<~0R+cm;Ae(ZgJ{ZuqKBD@jDBIj#1eSe0mkP(3&>Q{kLtI2K5e5?NedaeXpr1K#> z#&(csS{gzoH1-cJ^oOrenvLvbShh^KmOlRgcnavPEs-RZqa>5h{{X1gWcGPdUGfKG zS59M+jgE2%#F4p_o*SB$C|IUqj0n}UR^ft4Vq5|M`EYvB%`s51pOkg>tCaO3C3lip z7<{~Oik;j^DxmBA+J;#twnEVS^&yJ`Ue z^FMnQNc)HQYB}`Kq>jQ1aFHQI-f^5%cb;^1o=NzOj@YCSqw?ju`y6sr%rxA=aP zUs>LyS-bgyw+*|m`&G=}y{W2$GXRV7pZ1!lt&xU5C4O_(wdI~QzKRJ( zH>qvkN`h_M+DNjop6l20u9#Zp5^SjPf{G+u2B_miw-^n*yBYuvt|wk!*ZlESl4v%% zPIqj^KiQ?WffIHMnKz(#+^T@UgSC0Cj>1tihy#u1I32}iK`p$IM;bW7jt5$|Z7r>o z&QA(kdD=2_S*WGav8PE3+(lVS+K5-nP{3Z;0C_8@B#8eLZQDXwh5) zGPV;O1I9?Kr#|M581Mw%MEEM*J!;MxG6Hj+x$W*N8p*>TSq8_Cou{f|x2>m&S28&B z5DnNJe=2Pl(-s7WahS352Tw}345ihFmzVYTs+Lz4?;uqe2ftdoB7KVDNaOkQ$tU

{{W+gF%0{9dx~DBaea$23A~ed$K}S+>(8ZSiNd6D6bBvg&U;m) zxFjDimUVBFcWSLI(4JqJ4p+N+{VL-jSfMnxQe)@)nFM-{^--b+^m`_&|{+RUi&#$UEaLG`U89WF$pb2%kiD>D`4(aVF$LH_GbWx>k9DC%7dy zF3y!=Ij#-Fkz9btgE<{dE<&zp#?i)~yWn*pze>&2%RFOZbJy0b!R0F%S0H1jr8-9& ze{`QY9MXz+Cf@PO#~j5Oyi6n-<&*USq?*=Zq?ISU!*M? zT^-RVBR-8vYQv^L*7rJRnLK|wu;6E${{Z!=EpKE(WBca zagKdzlslR!Hb^5%eHVqU!dz= zcNLw`fJ@YlN@t<^)%#?bB>PM$<|;7U4SBeXB5Olvxg*rHsNlGjrG*_C4#He;<-IG_ zJStIIYgy(BulJGqW9wcyqiU+iP@G`%k6QN+1=`u_(Mt?+Bit@Bu6BnW-lSK9T9vM> zQrA;`1dvRNZiJ{fJ2=_@0M@SB+g2e3yu|PS0Arp%3e2(5}`F@`wc8iAvg9FzAytvJ0}Bg|-3 zcg}EqYETtN^{Cng{{Wt~q#tq_Nf!7rE1Y{l*^O}&720w;~v@)S1 zJPcx*>e49k`}C;-jrd@8(Xm637{C=Gat88{aCrCitn(vtxo|VZS@IK>$;YKb875MC z?HC#8Dd;=gSlyUrRomK~wV6t(;LVH{+hze;Kpa#sWj6AP_^NWv!voPM=epc{`h zJjlQ63E_P`svniqNrExcBa>EL;vrSY^7uXIX#Py&1ooiZC{SDl9;TY4FeLN3p`gFI zN0#6>3MsLmhw0DblS=!zOmya^Kmu-lI|^}?h$^>oft+fyU2Qa{3*=7Y!>$8TDB8;(x^epJ&6l?*x>&9E9ka7p=b)83k>06Wf2 zK1EPHhd-4uGQ?x1D@aA$ak!GH+5q4Rs_x5hkc2pOCvokMO0g_{XBjvilsl4BE1YqW z*i}kN=pw756NVZ7wB5V2p4Dj(JLH|%qCvHZJdaAJ9YGY>Ng9O-kWX4-4TJ;VwOQm0 zvFp;KokjzWzSSFOE3Js+a)g2jsN;CqbA!i1dsEg!w}IEzhEN9nIjc^@6@v}Lw{Fx6 zfr6;Jy$`KBD5vh{6xjeE6&p@?tx{%?k|1E@;ej7tT0EdLxDtKpS0+aQf=xBc5=X5Z zz*Y?^F5L0g6!02Pm~aPrcuZxw`p|I`-*MG?PL~w`%+?MXMwB3V1cx=xt;>x?yWl zEBWn|l=+2o7Pl;>2NR&S*5+TnxHY(Sm|=@8&3Vk4oMYvU zcYmJr({yIq2_rO>Mvfdt1}R+c6U4G-Xg1d1}H5fuR(4^P%%vdSKNgVUa z>aOIBV-*`f1D&F*K!YoR^HlR(u2x?*Ov62@B~@8=Nz`<%hTCdJH}gw%5=d2m=7}ba zBO4rEwWW)gnUs9pD~h+aHj@32lg3ERdgC)6-I0-8X04`qHy>#n_2<%}>vnoLZM7ey z>W^zEMn5mDbb5q~J-J|aX1G0}(fPI@0Ou?IBZ zl3?~CuUqUn&6W@TB7C9Sh7_?>ratzfY3o4ZR6ISLEE)@Q;n`- z?k$Do#7;uD2iCeswR|Y^#zOb5RUiq1oMNsW%nJ5BYU4IU(bC&$P{`TnD@sd{E_oDn zG|&g84JceT59wJ-I+ERx@P15m#VTZ;oKw8D923^2Sc37K)s7C}hny(-&^Py~w&NHa z3TmS zo(?&r3P(dvAfDYQ4sAskUzz##sXDM>kSU6!5j2X>-_pTHQPQ&hB*!7} z%&;c~^Pl&B&sykon{{_m8;Z*Kg%t0g%3*N45tHlMy0EQt8{t#uJ{8iVk*)msTjnP( z=nu7R+NzlZt;Q=l^7=HoYiP$R{i^6_p4p@s-aC8O)4}_^$GaG4CDQ$_U5WQaK^m>P zmvQ$!Kdn-Z;%I|R0pquN=$CEAp7I3QAsHF|FRf__+{=-zj(+=5d%In-H|~n#9*5Sl z(#@b$2zO_%wOEEJ8bcZlgQ*>={7~Qr2N|tn+_z&PA#`V%esSCi(T&75NcASQ{HKcG#C~Ism;1F) zLU$aR36C!^SjDnXWf|j-YIuvwm(AJ#0DRWaw%r;zJ!+-G~VAB8MhS}b81vHt)9+rh6xg7(A1*0CgO%M8BG{j>Pf zjBZ7`9E`d|_As;;r#L?$_O5Eo+ARJ`V*vB(^{%7DTG-Tsi)hSIzi#!#T3aez7Xxay z^Q-0T4R$>S2Z?PZlyI>QeXEfZJE!dlH51S<7xG*`#2_BxeK<~e#r;{1ooRCFrXz{JRm}!*z`u%F7*vMQR-?|<9pQTF@&*roX{-kzp;}ktc zmW6BWR}RrzjHkVFt1JbBmpGBR-AG4TH zHtd7ZhxMzF>4`qeoq>Z6Pk+L*Je}-koDl3dQNRbicD@vg&9N;r@}HpfsgC9+5q$$i zDny(reqyWu<%gNhDqj#ay4)CHlRq~H)|p~0W{g75iK85kZ(5fpb6DyI(HV?~@AdpD zji%+k`$Uoui;yEH1Ja?NP>|d*Krw^1pCc$i`@FcS7Nz_BMPkB5ls%71$Vg!de9ztn zIp^lZTbd>?iEaXrojr{~Vd-~IzOZjq7^2nU$+NYKy zgd^r7pT@GMkW2(+iUt1nT2t7LV)VDodtzOFQ2hs{D+s{j5=yU+@Ez6c5n8pV#dmAWJHyIcl*Ymf=Hc;1uE42_WuBLam9Fl&Sfo+mY%^#=b)>IoRHuXYZ2C=+0P_yG|1GJ;~);ys{%O&o*1azif~|3xFATSha#;ZQlK{!#|4{n4Cbw( zso}>pv)B{RW*cz8%}B^X?dwi-JcZy@a36ZB8cl%Z0YT3sRaDA16*{;dbW#LnWo7%d zoE$(@h?2zhrSbv!$5Gm+LRCl{R6}y(X}}acb`sQjp;Av=Qg3%2;*=6WEy1WrWcid; zbJ`($4-7VvSYc&>F$BhtV{{Rn4pw9C!3&0h2 zMJ{~F4;5c(1DxblxY+>aXZyVcH6J*@+SM{D%Gd{*R)foB6+Y+=w?D%pRD&#hwCTE- zpD@NY(*sVAwMJ5%NNOwVVfSq!S}==;#e6aGM^o_u@hj=~lDu4RM@`#aGw6RqUu;kN z$rf}ZvT^>;-xrm8UTTI0HMqYo+l9lY66IJ*KYXB~X&6DWLAjf$993Cl`#q_(e*wMIzzk!5p9VYTv?CY(s9|NO&a}`My)_RuMNLJvM#9dY`RV zj7V9;oG0+Je|D^Su@f2+H*>~*^-UGjhRPQ=PA&HZ54YuU_fOWjElyQ94{!EkaWIOl`ySr%AdJz(=~ljlEsp4FWv+b$uF>fy{W z6SrsGE$>sFwOYl%q(LMZvZ zZoh>^d*)lZLOyNT#U*r7U52YlGJyj6VxBDC)tM#X`uwJd40|^(JAPlrmA=?+5=kQ5 z=r-@_%#Hk2gOiah>OdN1RROoMw${)0YQTxCn23V;Z~p*&Q6$T4B9AMB@{?05ou>=D zjw$jo;JHZ>C?eY-CB1pBpTqtwywcRdet2XY=c=B}D~oHB1YTpIVfTOCrpW}1%P#Mb z_WuBD*0}0WZ{00Er`SIad|PhUHumv1mo?8HGhsJ3`(BmweXC4Y%#nKfecJrO@OOzW zblpHpFCyMetc~+!d;b8ytMq@udeyGAq{VrrNFN6*oh}xim0Nm9-Bw!vY2%b-w8F>EndAlBNgu(Wf+w!eIuJSPl{`#qY&n9uVidBj@ z%MjaIrsf>6D$XQE`@fAfM$BXH8lByk{QamA5WAA9`VBr(84t~cJkYIzx#pc3F73vi z&ZK|^K5YwX=z2`iot>$GzA)YC6(0(5xv4>93^AG|xiW&>YoP-Hw^T91x#9FpBC>8(qGWu-$VU%f*R-zMYIi-YCh`qQD8Y*{qdx@pLVBup9i z@}{}_#}K$25IZ+Y(ZAG^IMz76{%e(vIp>w~`Hb`P^UX_bkqg|@8lm&erLtvLsXmpY z^X-X39xIuLO&eIWg(S~W>FHJt?VK`shlf0W^{K%PXlt=RJkECtl-y?r?|SCB(JH%n ziulbXy~LBA4(0c)`Ff6TpzU*Ag4_#0%pJW3aJ5p-Rhc75Pv02~dyiVg)-GADViCo@ z5Z^JaZ7Sbkn6uk9s3(3gq?^cp!nS=|_{{R>FY4OB}r)S;oSjgHe zitg3|$iRem94#fBK_lMnwZFYpCXdKpI!52O?hgL|H6%CQPQf7nNluujvCu^A8Zkk< z)d%zE-??_W{o1`{GDyP*twDDphuWk60J5okp$Y0_YT|U#j`=z1{{RB7nXaDeOz}Of z%fz6`@{Q~Avh+VsYWhQ8(p9+)D_jPZ3$`b z9;FS`A7|PFZDG>0^|>wJWk@;RyRtoKybjt*-`lHhF^2>AtDQ@vxs4^8j_Xcv)Tb|a z*3%UmY>wOI{{TP3Q}~Q8*)NZftx2?|I zx!OHepCI|!%=p5_+DlZ`VUzA{&U$Sv(W@%JrQNY~AwqnMkGoqst+lQ8l63OqN?AYj zEY~$QmnvPNMD1$`8)HQKt&i_lWjL{@*z2@+dEKp}KQsd;Kf*uVs$MC!v$&7Rl^b~b z+gGmN=T>x^aV5(!T(&ve>F-*4w!>iU_vAvVpYSHFl;svU!RXJMuJlBW(n!NZ(H;8- z@mJ6v556NsYo~pN?5^ne0Jl}IGSuT1wRwRt7~ z0Eu>>bF**1<6e<#WER!Q+CmNAH_P(>0KHC*1`&E2LMY}Zgj&Kbrkwdme&?xb^1l^$ zs#7pa9mSvJ-TW#3)pWif*Wz@ZB{+mO)d}-4uMWJ`+1@~YUB18kReN|GDud=Sl=>LA zD(>0N*uk4MrH2SCJWCuw|;L=F2B8 zspWTOsU<9|h{FtiQ%Om62rh&X%QJmzGB3{hG~&^d$H~th`VM>4uuNryC~~iyk3uNq zCNUc%tDaK<8-}e*6nP^iB?{g1!9QBDX=MX~jQfh5fLHiw=^OcMRQX{3qLf(LwuN~W z8AOhAv*jcjf)a(^ez@p8y{c%V3h1x$DCYydD&Vz(YmM8sdU|GpUd1AZ&IkCPoR8~Q z-Zq5@C+9zvPYg*LKF7oK-?yi(1vchbqbV3YdU4MbjeVOlBc4})qmKPQtv1#Rr`)mQ zp1Y3~WndQ#=4TikJ${uqa5jk}DADwyO%rnLcIH@82pmS^*P{xuH1{jzoIWbCnch&c zV;zrrw{JS_k|km!4d41y^B3%yjP`~$WQgZ?YRB@D5b;fo=lE8;2DN5ywmg1G#?pOx ztV`bO8p7qhID357DzLYa}jq$fJYrSnJ{Q8FifU{*^J+>^@DOF6RFCr~5QAM-Be~*+AO+cP{Twy5IQqZ(Z9ho!JC@@AHw_zO^cdZzM%= zn%hS0(iEU>Uxt|ma2<0dGc+O)BT#fkh|sOjaU1-eJE)T zE3vh2aSKfxQodP!>GrPX*ugYP!}o-L7dYKsV{a2YL?4uf>0Ks~s80rl#ePZ?pk`e_v|Hvl7718>T71%PEOpg55j(zV**)8dRQc-n)7q zZ*N+vbvhL&_BjieNEs!JY$Wry`PAm?&QF!jPpGT%*tw2G#~lwnee0i&)_YlkN5nDvL(ts4Znz%eoT*R?}1*hF)tH+uA~VFFYMZ&DSL&qgjg zdwkuhjLc+`Ez#umJ;fJ-NJ^t}oO4hlpJ-n$L5zBJtr|0);~bWo<~a$&QRfJ}vlrf% zfLe)Tw<8b_z1QnbSi*?n&gC^OF2JQ>(SpU6MfumQHR4{Oww3vgX=E}VGs{0R`gf>G zOFVvA7~Y@o5I^3bT$Zjf-rvnh51YC7eb?*%0M@1$?ouNVP^*%}_p93i6_*%2_R`9N zWsmH{gU&(jDw1gDIltX25bRL)+uEohZ#{DPKj)g-olsnq5ubBeZlq7=Lb;6w)9cTA zXXJ4YjvwTC2Cdp5bVRtP-I{L7QgYibJ|yB%}9VVL$W-->tC zxE#BN^T(P<+y4NMQn{OHR8Y#_#r#WJ*G4FJd5ej0)9YOPo8u;I{KlzS6ZVR~YI}JA z%Q};T>Ibbw_URfng@+mWM{+&tITBX|m%n4*6+x0!bdmo6c2oPNw~Q0qnr-tMHkZ@G zCe+PW<~THDG9lMS2^o`=xZRpPo12IZxU z*HOK?ljdOW_C1ALMw-qKC31y0Z>>Juyl*2y-dv8=d8LwE5^__gx2dl_ap-LxQI<1D z4ZLt%sg6L|$m5>b_O80aU%%3)j^f$I(TwAvKZS9ZB)TLGhYEQ0tyGy=j?saRSE$W- z*os3;_HPe(?@%owUCbR_@LBqRdkXZMZyQ-g(dl4~@h2d1GwEM1#U0eP%wWhoS68CH z_HEQ{b{%(&D>CvoSCv-_8(1Q)&!*+nQtlK;QPyT3y9@kdx#P8LTX<6H`qO>Hom!H=)zeQEZgS-iG5e&gxsP^End=0%BPEA2W}*mpdrQ6Ev(-&0o37!v8ysg(ql z#wy87tr_z3&o5TcMpI|;8j2V|JD;5JDL9T^hn}@-aSU+F!t;u&1UCWO%)yM0UiGA= zFn&b`J!%yaB&0a`Dw07N5tz!U zc8(1ga+{6+1I}v=mZE z#^OS%GF7`&3Q9J`t2b%KXf72=7sS7~^skQd@R&noeU3K+m;H zxJUyI0H*Q5>x#ItUgRJRr<`{lv^pe!Za5U-8yCqPYBf2Kp&LLPdT~~y%|6JGi3^VG*{DU z9$iqF*Ga`FJLwmLrk4{MpWGNesKN!;(11ITaguj6q(5v7uV} z3>qRBbMp2S%qTmX*YKqTyOwN#2LKE~^S(+~%c%KtPGqvQxz6Fx9%+n$mj|UHt2CQP z=z4loj;tLNjvI`QaDDx#(GAy^GBTD zy924}D%HiDGZPuW2aYO@rmDLXNWD7K7g3B&&nupl_%<_BHoqJF?3jifa{7qM~Lc18RBdtd

HQ)rO7BEjui9nQ>LErPORLjn%TCJ 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

onJQK?d^r;4N8M@Rqx&?@C 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 >fN8wuB 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ɬmLhdY2jg-yJ$B=9@^DMrTuqwD!qL?PI2 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�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 >i_ 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�!BC6p@!X#{dYzncrB;;{X4TZ7yO(|`e!RLxm z21+9f^Njr}3?12TlvBen<=dr2mLz&pp1~48xMFknXxRMoL&yRy1q%CD1Z19Q_d`;6 zfde?}Ri)1FrAYFg2T&>&T%7LWwTMKL9!4LUbg{YPwIU6SaZehKC7Q@_kE6jpoQriuwF% z#eibJ+2n9@&#h_dFv^mHFWgq9wWicd#rZb>01ZrcHjP8(kBYhk_L4)WFZ!f%Huv0r zPvNc?NR=fb8UFx__A7l5IEoe1n#?w|g~zEBoddKJjEy7}c(w>9Ep zX#3Yb{{V+EaCEtEsl)ikNAj-@>`9LQ0PlNOAz^2;QiX(@h#=H-&*slJ5y(N#&fqB-2H`P8oF5fNUmghY;dkr%HtUOwLjS6nbi|^@BId{wC0Xz z(n%k3FWoiK>2?!MezzgPg)xNsf3;Xnas$(}mX<3R;gPo$9A~vddvGnBDLBvff7++{ zkAT?v)-I;2EPv?lvP1pu)t1IGSKQ9=2Z$|fEsQ7`+~=Q4@cmE4cee9Mb0ORP)MntC z(eVzi3?<{5QWu|_Z{5Xs*0-)afszBCo2gyZ>R_<^+KbrsI4_7=-1?M|t-@mKIY905 z0D9y7-qpxyvb~+mcUHgagD(yITWe=gu!?(uHP&P;-RnNy(Vp|mAwtI8dIhhjqU{uq zGQBO&QM(Xc*xTI3cFS{MD@~Bgd~tLy)tR&D2fo94TcK z33z?Bg^~VQkMQ$>Ug@N0_SV+kP>*;{ryTQ9j;OhHCk;v5*wbw7vX2q_y@#cD7J*2? z``^P{&7Pi~RC7Z69OJhY&_kPuQIAh7eUoK zn%IrNMId3SBy^(8S@T4QPtVr07C7elW*N`)st^Gp`ghGClCQr4KIp}&+ z%DYqsJT*qd<#zU`83^MUsF_jNlpUmEr6id$rl^lx;~%YAg^M!o6;1Rm#h6$EPkON! z54n$OtGN*E6*6JQNyaK_OF{Ay?+G3N=B0?2;Pk4+Nl-;hp|BKGTirE-&_W!)_f%6i zsBe^UQxmjc_Ulj>NpF<&s5QAioOlPJtH~H$xUA&)3g?xpXv981II4!=Sc*gDa(Jm7 zz-}raf!i44)}<@hQkgB>j!lDa7~fEc+i%{$HDH!T-Hp^Me3@>Pinyo*Q7<{gLm(~l z1Jb5tKX_Dl801tmX?vo+)Rxn`H0Bz{HlIm z@u6;{Oi^eJr0Q@shG|sqa4^Fi9koiTVakITtw7iL;b$s#uc%m-mJjRM$$rA)| zlqYU~-mbSwm11n7e4D<1{>HfbYs+}u6ejlWTeWwZOosX~D{bTOu4%>G(jM`)7AeN; zV{b~L*-g>o>+MrCB_d-Z?f(E~nI)?tV765EtYmBL5pFw`U7HrQ!=kF6ytT(mF^VLF zoG$L&TAlW|;~PWehxfmRq0wbSQ?-Xs*ouDWr_ZWK5^g_y*B5E4Mngtbo%;U(z-tdu z)uo8F!oJjRmtkH3{`P;pS<|BBE>u@PDmJy^pA z6N2$4@eksz-p9dDY^w#jx00VUZT`)4F?eEV8_zM}SCO~w?XNyqsB;|(l&of0YZ{K5 zaU2Cfg5!h!#^2(u;=@$8^50|fxoWO7>p85_<{0@-cJ29_{hAJi9lSql$uIYh*176d zi+<@&G9LHL9QmI<@%&v^Ki#ZlkfhG74ij@f`TfH_< zHc2-LKJxYZw0)9!^ef&)9k4gI4(ke?xT^YxiFE5tIEeC5$IM4R_s_jj)U{8y#?VQ` zS>3bUd*-+uQSRiKZ8Y@Vw{QEk(@#j8^R4`+2d`>(nzXGn$jCqCmVdckb^Volb#o#} za;J9A{{Tw%d)+c*oFwOTpLu=1y^76)Ns=kuWnU?dHe$UzHYb&6d2^=Z^*rj!MYvM1 zvXx9!dWI*>hflZJ;HzziO9j?_rboo9SIRg%Q(d0XtHwjFWan z)1;zh>AD;i6J`VQzbF0g>0Y0vLL`M*Q+$fuf4y9G#<+ky2jyeW@U|;z-tuiWMJq2+ zit{RNb<#}Q)UNK*SB>~a?e}q99E~*BTjX8gcmaR-s@$IGuhr&rh5M(z?X{3(EV6kc zZa(3tjD6#;+6W|F+lT@_pDlIzTy~~NB)1+|Pm#{=nEwD3aF&*$`IaXpA^ceX01EAN zTSKQr_VboxI4U~r{{U*UpJQ4#Jugp?3!&v)?(*9{SMeJ3aXgbmvP6Xl;kos%9q`50 zoF{nNHg{j*{{U*elSqndn_yzV9dh04%fv$3v(uu^qeU{!Y!m~vc<23};;jScNZvr< zzw{c-w~RtkF}uticJ!?TmRA{ter|_9EqPOt<~q|Pf!$YZ(e0D^e|niJ1eb8+H}`*p z)QXbhGJM2!sxn38w)8Bm+nzt*Rg|8(3`UPJGq3Q~KooA9ze<0c(YmZ(al3zZpqeJ~ zv61(`RjPE}#!gxlT4YyYaJ+j~9psV9H>AZ;I@Rg!;>dUR&2v*Ik)Li?HPKJ8&n?je zuN$xd^S6#V)+Cb{o5U z^8D-H{gztDn%)bBfo9yVZ7-c35AooReMSv!NVrcX51E_qe|D=ngt{TgEpGEofdi6I;f^`4i)|KH)Pj=6M1SM?e_HyxPg!m> zt73N@$QXC(D`>}4MY^ ztDFt1xAm+Q(IL3H^J0zGbY*Og%)J_f&KSk=pGZmLOE^P$;0*r&bmKKXlj6+>RFFa+ zWP_r&`RQLY-HW7mH!jjR>VLga*hzg08SUR{pOo+GM!{q2xGyxRBzKNj+oAbeG{$Wn zS28mp&3wH2_NN(0fx{lWR;;?!$B>INea?BIFjg(R&K*d#? z=C2&H@wLsk%u_QW{{RWDg#1e|$qKd$KYE+Hig!n4sCZ6Qm3*1iv-ws;z8tj2`&!RwA0lSXd(?xBEXcRXf<0-Oo6c;*RC5*RNf)!DxhujGGyL?%MQ24U0sv z$r#`KEw-`7g>5M=yOjR`vrQ+|XCdX3lczNsMrGZU9Da4!p9-U(GfmaLUUvRRA$)m-Fw$V9gC5YGEFvHQX|-lj5l8Orj{t?qKw6j-*j}T z33n=RO>QNs%yzfS?zH)>LgQ%roxN(E>=93?&&oCoD&)OG3e4m&#|_PD2pU35j1K

N=uA1h2{* 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�*(xZILBQ}X=S{{RZk7rCYROVXl% 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%0A{beVWLFa^A5E1 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�qEu*f*+o-3S}R*lJyDGGwvBmJS+*Ec&C zoMDd7PR56x)t}1UhQ@Q!scLg_S|>=iqApW`{75>J@f;g#+ zj3pCSPQJE|UC>Ulk=S$mtLE?8Tf&-pn|~TYgU>7EN<#CJ-zX$sOjQx1!-Jq%o2sBaz&W#<-&y3mkEvbYADK zYw4ozsyqoUjDyLLZ}QZTxX1Tal2o>0?78`dap-BV+`YV>U-3Wr`Kh-eJ>{byr+@do z4O&eJb}8A(9o%Z8DVOTwk^a!Huznlq)7oiKtA}Wx4f&7eYvju$Eq4MH+?m5*eBXet zwtgPWbp0kcX6YP31E2MP`}+NBi!p+6O`Bn&j+c6-B9TZ>TxS)#5L2~4&!=k6Lnv&j z`H{Kj{6%kC`Do#0`^(b2S-mWdn8V&4@ib564nX}YMmVLnRQd2uTq+TTuJSVJ8U`5I(xFe3(UnAmwmYY-Ln^F_Rrv<3+{miA ze*Nn?S4G@5;-v(f793Rz zYln1L&T-Q(!Tf6Y4Yz6LzYL5S_s}GUL%nx53szBab{maf;qGM0lT%4a6)O z;CYxQcwTnnr#0p_mqmj{$>qnMJ^q#JUOb+A$euJ@9&?^LSCB@EHn>vmqaM}h&|dC` zn^)trI#Du4P%|##c=kQ1*6lGj4RE=U&PTAU+hw$5P*(+yD#PVdTI(}h5)ztem_nl?w&BO;T$5~Z(VMXo zY@S#u&(rBQ5g6thj(p5#zd!8PQDm>3r|t^Eab@qZrxQY1yuRIj zwRJYQLnc+1`POt2#~h^jc~(67=C)u3oDiQd=ntiE);4r|RcYiA#<&VPR&BPlHK)1gegMBk*5S5@aU-Z5hEJ|*?n@|{H28=+ z*Bxu%e*-&P>d{AqE;89ZwfByONzyG)9odXA=RYwS>sh$8dl*-EmW(HIkF8A&Ege8jEOlY&lV60nb`+K))*vDm-s1o-t2Wa&p3=2$sWg=k8FC zhg4C@(}Zuo<~;SOgjpfltqmeUFFsJI(PaC~HsYd1ReYbqrY-Uq$K9;?H4cZD{6N~) zk06uFWaB^MUmxm`#P^TqeCIuXt$lss(k6;zL<54g@^6Tl7ISQo?38ue^JRbDs)Thp zs(Bo%+uE$5_WYu*#Vp9lwmtE;_q$Xp0d1v~Sx4Th(lR>igMt3dZs{D;T@Dw;vP3Ly zo@-^9WEjK!!WzC`RkDiU!L#H;{{XXaE9u`FTgvuM+xHA}_4cosUrt!>=fKF_!+P$n z`UxIpDK3VMmftamJpTZ-{3}j2FEnO&*AkBYf}*!OA_a$<=l%kfF|#J$O3Q_!MccFGZhl`{xe!EXrp*?GyvyNnyp&X_+FR`tQXf7mAEDxDKD$1k{cPv^#9CtVg zh=}W595X6O@>h}+YyQ9=?gP%Kd ze9QN6JJ*E8J8Tg%e5+o~@UGyUOh=!US8&_+zx`E|)~8Mt*`If=*NIv`yHR;~Wq#E{ z##R}tx^=Qx_F})O#Fk|vcU=j=l%p1n%Lr!IUf~A6Y0+(>$SG}6Ss=_ zTIHfTjFBR?@4x=a*VSGqnJw&ITZ5gsWf=be$7|)8Y~DMGu8XeuPDuU{UZxd$r;}aT zf<%%j#&;+8t6J9IEUH%|kL6hLO3Jz0z5TmZo}W9inFropIj){v4tw1eVUXd$UAqbA z=}QEo&DgDw{rgpj;F3^w{DAUkhQ=tBqKsud_@^z4gDkn)$ro|=jcdg7#X2K4^>4fM ztb0|=UP)e!wz^A5)s+T5NV;yU-MLELnzr!Ui5^GDW!km0XD9m`!#d0?{`!M zcCBtjAC%{wMPpJb#l>iCLaQtcV;?>~^H!ChjV4{if_nNlrBKuE#J{@<$?yHz=5^HebHR#i%$oMA;r7Q|&Be5Seg2%kgzBHtv@7yb{Gm;2TA6p9WC ze7sl6e+nHXx>r(H506^Xe?wWatfMD&O{Cu?$iytc^ zQ54IW4hZd1d7V?Sp%r!xI@HnmYDddN8Jv%qJ}^kJ+FU&6YV12t`&i@u03NS|CZ87t zn0@Yc{o4EU;{+aMy~J4BkN*Gy`?c^|#~haoQzz#BD$%V@c@$@{Guo046K-97Yv#>% z3uyIQh^>Fs#NWmI_Se(1+cYZ8yx@+X-LIMaLlccm{Pv zcKqtpE;vFPj+I@bVE$Sz?)$33OTHFRHWAUiE3D>;VHQAk$Uv#>SQs|M+e?2Rt!G06 zTt<=3bNoQog1x=FwZ7k-zwz39#l@B(w^(8ku2`O?v|^Sb1Q`s=RF`ogIQ~$ze&5K6 z#sCMut#ejP(&*HI8C_$O`1*gdTh>;ppX?gPl$DFkG45sl?P|b4UGMWU{{Z8^?$;F6 z&~qC$7O0Xo<{Q89+TXBGvrD~HS1dfS99WBXdgtZEc3OHw$|T>FTFQDvosP=HOC}rc z{{Vaan(D2?6+}b#dz$4eWDKN9@($naS7WEeyeX96uWILZDmLh9K%P`Zhe1}MjUsL1 zjMZoqtGc&J05Cz%zGE{Jf~>1tl_z#lt);||enSka{{Rhrx!?)5_<0Jpcb~id)qGQ- z4cBPSy%}rmKLaAcrNtMe6rQJk7h|<(%YbR14ZFLJ)h_*kiKxuRRb2M2h%>Q`0Y^Or zLm@mK%~I~b#yF&9+%s1R0wBw5+ny*n+v+Mw4#2yr0>BOhPuVM>JYP3o;rVG58Z~Zu zR57zh&faQZ%;bmrtxck1Barc9TsEHgz!=Sbczi%t{{V!B;Kp#w$1A(#+&_xHM7&ua znPlyPLXL~WSLc7km}j@w;2s5lBAsDzDAWQnrRTowpX)-`?uf z`1VOZkrQWib4ys1z0&^Z=3;h++w$hOts`O(7OXpaHb+&D?tR+dj@7NBJDaUxQL7m< zU(7M8?;DkScC8&XC7S5@JvgkpSk=izlXuO^wQbr#Bogn5$gUcbu+Fw0IuIH({o{2wNP|S$OJ3sU)+KGW=n6Bae&171@oGW~<{qEJdWD(+Rt%cptS0zdIB9SQB+B$!D*H5P0H1o5{xM%+W*=vS#E)3{x;eti;M&kbf z%9T)+`8!ky>Rf;}`qZ%bksrI270!woIgkLwcWtic;WT9Uk{Na=L!H_C!?z#dTtvX4 zZYSlhLilKh`*Iu2+Z1QzttBmVIkCnKoRY@&S5O*m(1x(h2 zh*S{S?^V@)U+-0yJpiZ?c0VmjOQ49~&Da31lm7r{H`}L0XkZeVA96^)eliz14e#7n z)ss8M3a`x7@^{CUki`Pba~a;;4vv`r0NG7w$gaKHADZ4Lym@sgqD0;0bz}a`a_KTW zNZ8tQk9Ds^@wL6c)D_(XY}<}O`A%B6CbfT=isSri)uk4rspF-}H_h@KZbmFP$mgvH zWOQ*mbGziK@ejI@zCLQ4sobkD;GFUOYgmcMyBEn5MCuL)CYl^=ZJ7giUi7abvmqbu z)K2>e&rbDL2pVuqk}sN0*7Wr?bvCf zb^icqs~X)6yCB=kR=g#kxK)X_ZvOzsYYK$8JKW#0fQAV_)xs+S&+&iD{)+MXP zN`k-eD(b8t5e?)0Pk-rLGn3dJ!{CKu%Am$5kxD0@yK1jhtGiLLv{g%^Y>>B~gpYEJ zpYIca`I=n%7+9x=mDh6Dao`m5JV|CAHkUF05q@v0eE_aK;xWd%2i&fs;rX~v71>P- z{_LJfY-8#Ct2WM@KgN&Hy)erSvPUubK>2rbQ~7v{8LM`Q8L)+<fwL@F}Ex%qmiRz(Vol?;j{`)nChfr!Dtt;Z$Y_zr#_O)-?fY zB_DWYNR_rPnNm8lar`tL!M?QM>;9`BcA~*yRfK0IzHIpUJb&fhe)R8f`6$0Bb2FUGa6e4DA-Ma)W16*OsyX}1N-vjj$G9q%b<2FT{{SsFgdJP>Y8FSzfWL)p=@x5qbqt68 zS+-bLMK#P^UWSyAq)>Tmoxh5_=TL$uq;nrTtJ?2YH;AeJ8uM$5B$1Bc^4D}D%33%d zE#!&JW9MF!?XK}IkKbk>ODqW=K1S&bK%N~q~nx3R1lOh{G$2Ue{u3ie5FMW^uA zJg|^*I#ta*MYYs#9|w0@6R~nfxLe)F9AY4!N}PzMMclj}TIXzT42rqu-nKr_QNHdJ zcC8|Fm>S-h6qfB8FG}U~tNAo5lsn32w(YyCy^yr4oOP}bUAMv)+N|HhN=vBXzRByc zYS8MI%Q1d2(SB<3{{RqfkVyXkDj)9G3#E9D`$?Kem~KY?^L(rR>ek)%r47stHhR>z zb4WztFIQ@@X6uUc?-5?5y}L^>!hPEBwHacSfzA|Hn%&u4>wYb;(;yj!HxA?b%e&_M zg%CA8pWwcM4V}8`3Y-4b^CRu~v0qOMRW|qo=B_)!I$Tw`KkT(S zk-p^fBF}^_T@Xjsy}rXvit5~D6@v=!j||(%3kR5d!=-&8p{hrxsQa`~6s2RIyzqsj zfbAV?kh$=crLOXc@}Iq$_2h67npUnqTE7#gmuR0bqIP7(*z$=q3wvq2{{Z3@BS!=Q z0BxnKrt(aOY>R{5skW8ozDe9ahy9v}%EhK*K`O^H7`XSSrHw8_WA9e%I!v3$DmK-- zT_h;mx1~gt*hKUBG&DC$BBGbBjvXDEETwGEZeo>Grt0kNbp7_K{aUkeE}J~h`#49q zF>KeJ>hKul1qR)T2+&O zucj;H&yD^o)(3{Kt{_#-*!weQpOR0Pzk2$|#`+|WY|C5qn+my@t-~3U?=CZ2N^xHnNU5~#`Nc-jfHRuD z@spo=i^)}G9qH&eM5C}DpKmo>TT3ey1LXIu1&FJ%o@rFFE);dCZo?8gV6F3Zp<-n@ zW7echV+=W~s*2H!4wXFPi3D2-WaKqlRKk%?MP16oW43APIrgDS<)W%8l14I51Fvde3?B!8YDUO#PZ_9Wa?Wwa-YIg8B4$u< zTeUH=LsdRDMv#Nbt6BURZU=eB7r5lNZ%R_a3WS)wHwQCm`p$Z|(c z)m;KF?+N)&=xUYv67}~?!30YmmKSMShFfUTHD@{Yt#=C|{VP4rSe6_wr&`)P-)J4~ zViFiKs`RR|2apGD0Iem3;~rsil5>{+SgHJpo!Q1P-789e5tPnqcw7&WzZ$6|7auId zecI|Gw{>8%4r;8-@E@FTcontuGic{#wvg;}TpslZwufnv6J&?xD_tav6aew(e@|-9 zl>)m1!nfV43mGay6qpaW$I_sgB{PFB&lu_L_|@rR^I<+u@S3e9wd%)&=-#~Iq>e(n zDJ{P{eX1Eu2?NJ6Wn0u$;|TJO!g!|`7Ff2(-*=|!=z|9qbJ0Ag7it}!cjf*ctz8M{ zu=_bHD*U8{NL{>VXhK z{{Uy0WVb6_EJ52pyZH&hBxeSw-$N7v;NIE=%-YfEsEk*Z;(@k%x7q!`cH=jxvN181d`6Z z2OsS#SJ{35@N9Z&2+;!n01-I*&0LqlF9BU733GP|jGvWV*KP>*>zew{MbethRU=%2 zHvTJC_Od>I8;e^bpVM?1khIbtz1eyy{{Zn-p(dXi@&-O?^cZa=VpPYqR8>oxSl^sw zSEX8ybH{a#9klrHc*g3W_MTjSH)`xBi6e_7?W_WXk_|NxuXyF=Um*)e+OkHgE=oi< zlG|JTn(Y!8-!Z4k$}1v00U~CZ*X7+rV`3Rr!U-DP=W+5Dre0giF4)nwF!ipE*feRd z4k`<{jKB~!n!ZnTqgTR~Y=sWpm;2xQH??)~qOsfDQ6w7~R94-ch=_@w z=G|R!S_(|(V72on{opwDJXY|73Uk_|)LJV=BrnYT))BZnGFVcT*2YdH+2w{eQVuGd zZfB8#ecGc1toN5*ZNb|YWfj+2z>u6OW{5kJ6E+)doR!62hYRyC$gKk#M3^6TvZk3M zI~e00l~H;VZAactEG@;vZGw8&nCiOR*V3|w{n-_}uHK}Pc~G2(8%=ROQ8AFcsOQwE zA}Bnyjf&G$$+U>iN|HVX4{D2Q`JW)gXC`Z6vKhR?=Oz_@ill{PW0(82YD8?~Jt>gJ z8^0o>&{5?RZZpL-V^vdu!KW77FgsG)?!hg^SnNp}WSx4G_}M-J0qv1lhYS z+OcA{HxhZ$ecFu_Og_13=MfFY zFi*?=dspUf#=nR+n*P20oeYJnVnmZ-K6ktIC+qU@?OuuTTjInTqf9irnM_JbWF3K< zrc=H+J&1fe4A#>~@*LXZ z7(GLKdsf($(ns>!a2+e3xAWI!rOWw&8$aF6Z9#E~1Z(TJj@7Bl%8su{o5@AEm;G-| zqos9Lw~l5b?;7MS*&0tQFd&XcbMIPqm*Ul*F&79p$5ZsFZpSo{*xI^s$M3geQ`$Pk zKII#Cb*w?CLKrM)TX)T$YIoY_^8kedFM7&LLo}>>)%!qr8p0MDrkjCrDQRYnzybI3 z<^npN*sqY)+B^cMK9%|l@wY|0)O;}drMB@UsN2un!Sy4(eth0dg;tS?c-!Y4ay_f) za_ZdF?9ZOYLenVB6uP0p1Jw7X$qTCmA3Bl8xT$t0m`H4iJ08^KwuNlnvUf+*)PMD> zxaTTq@-%w3$g>zY+H37E2U{)viw(}~mjff~?Oz~hvB5p+CEA$|K{56}UuyfO!gjV% z=~l8^MjD!OEJ*$@)(KDk96QZ_@?69mz2?nl4W>r=(<-U~khiKckQsuN%FHtu*=3{7SFsZ72Ir8_N%i>QG{}IJ?kRvNCo5Mjyb2x5fs_7 zHz*?~9+c^35zIj8>FHG?o&3U^e(zk=H*rfL-k)EtDgOX;BFJv8jB%`+OSa%PuTztc z)2&(a8K%Ph)82@Sx(Ptrx2UMzK;?Fg%6j6i>tPcgE!q6CcPZ)q9@QjLsB966tq#bE z-N9~@^$Mp8$?9n?QFH1t>_;N=#~+Pxnw;a!OK?73`1P*3X;v(}oT;up=>)ePf8A5f zI$H`wQ3F8h=AGi3G}{WqS3dPCvVr@d@`|Qq4=7%^>st`d|IpGIax;KewK(oml6W-~ zDjBeNs|*NG2TJ@eZ4bZZTNadze3fNEX8FGA)_f;v$753&N+AcIYNu-lDlH>?#4bo$ zyAuL7VyQyqjsW0QsGaficBnc!D-*%%yR)hy&CL<-kS_zahHUS>n0Py~}Rzj2!l^BwaK|%|W>K z{{R~3i*`6i`Dnv2NtHbF+uD&9FDS&n>pgo4vQ%7yE1U!zk9y8nFHivLzhx`3*X+oQ^#T@fbvV{B#*ntZ>@PuZZ0JeoTzVZpIY`X zQTI{7T-ft-#y4a9^Hwba8Jb_bojL4&m6dHP$GK4M0s5ax(zl1~_YA?ZkMm&k&-*pe zYaFcEw`7cnxA~2nocdLZSGbTF9|d#Nbze+Yd?=Gj7%vgzHhP@am8nS7#f*W|+OlHQ z)v$}r)Pz?#HsKh#&r-O+{&l|2BUD&9+xdZ6_Ip55@%+7i#ymQ0 ze(EggQ#7-@vnG7Aw0{;9*LiItM%;`?Ty?xFZz@k8%Oid4S5XY5zTwzjvYXH$BHe?C z(qx@7OYaZZXSHj_%_9#iZ6l$qs74!~y5HxT*lR6^Xnmk__p6DUMQUC1c9cdRy!HOH zMy}0>v5x1pQP(@g6hDu6y#v=JcA2J3k8*I@P#O^@v7z?O$-{lW(z( zLOPHBwR|_>`7LbqyLs1k_aI<;e}#Ru;ZwU#01Pg`e>%^Y^>EMKI!rKMkYyT=EmAc( z`?VQIWFU6wQOFp^2c;J}bu<~2l`;L=V8|yQcB$K81`A^~Vkc#cXT2mgi9tB^#Y_O( zmgS8`69eTHKE;b^A9{cl2w6U5sTrkwe|D;um7J6tw^g|nnN^1hy=yz94*gCK#X5Sy zXw%AY8}(}W6JC-SF5hBtystI&w}{!Kw~-n0i=VvJ@@I+CGjiTZ!QamA=AGGvP0mhI zo?Ac6qj%ozQAYk*Qk;LaR{sEW-+L-C&{PmFm`MApjw@C7{Hy1UOHDR+hDIvQAIdAx!p7&Dh|s4T zj{wB$#EXn|{AtnJh~W^0FZ@IOnnh5Xo@T~>y;p47ZWtARFXj4IRjlP!@KZ${F7$HF?XnE#~=nHYHg?!*j`5*U^01fcm6NR zx+o^%GjH;S`Ht%5p+sp{3!mZpwa{8y&*nLQ^?j-&qkT$>b~Y^ptLDAQ4HoZ_f4lx# zwC#|UCPz5k#%nyPNeocUiBs=lwc%x*H-n9p%O}{_v!yUoc=WD1vea>BK@1*4DL*k^mv8rLRtchF(eD2M_NyW} zE@y?`q@Di&`qitY+irkIaL0~w?_ABBK^m5@s~`>3cdt_TbpzUJv6xWJxmi~q-YmRV znA=4xaP5Qm%iiLrEYc6(WCA=WMg9q3->_zY4QB7LF#Ijmo$y1 zMW4O=RWLh#Y9DjH5+0zb+to*EauMh8QAGGWQ7&&N!wLmvT~0{w- zOa>nO*R02J!iHa(yuadva5kFgLC)Sb=j9##?P({cx<1F}{{V>o(dYRQf2>dMe-nGx zKV{}@3RACA-@{va&C?xH;auTE{{Rm^Emadl;}HrJp2sZCJH@u}M`0w+H@d3<{5-eu zeJkY)wgTyvHrzk-C9kZ!S#Krfl)h>C0Bo}T>iJJmjScg`0Om8cy?h?AJUmat7LW@_ z)*v#4vTIEIvIGToKQ&1rmMBU&&U&EjR_!g+j+kG%1$AzWVbD^~4ZvoTF#*DVcCFjp zM%$s2`027o6l}1N$~{F#a1|Od7b?D#lx&S1u56Hz7|dX@j=O(~w5`qDPGnQL4@5h% zD>}++wLr(MY1+vkW9R1vv2T>PvuY(+l^xe>ZsxUOd3@~cQx+?ovzZLLNoFyw+TFFX zAz6tjD|5AL2D%RY&D&OvIdKB*X6;>Wo(LvJ>fNh|w8s3WQU3sr*L9^s8H~)*ZFT## z$v9aK#?7<0+Qz~2fAKZl*t;VxD~hqWTZK1C^KJQm+OEq?d_=6vxYrEeZ3J&5o@4EA zmo;)ok~A0`)<8*iB#FV@T9O@sU5-U@jP{>|FukndJi>Rr{{Wk}8+O;$@uPV|J%77j zCVVAn{{XdFE(h*T8Z2-@@A>?-^{8Eif4Xa~jJ?)+xP6N9FjU*Obt*%ZQq8q#vNNv) zQZo@405Q#N$>wg9MxU3j-Khs$r9uNn*&`;V0axyv4@#a=Ac*m^Y3==KLhl*ICHzr=*T?i zTWLStHJs&KD=J|6`&IjL@(qp{dVBlQPeM!Nxj01mKfV3xuq}5mbsKWr(-er2Vqu-t zX3(Na(R{-P8TYIzT-eczDYhh5ZQu9JYeSWlTe?+yXGlXo-q~7qR~DrC#B=Fft!M^| zz{k6waY0LZB00sN_P{@Oe0n}e$`qy(SouTRuyt68*lH9 z=IvaQMvSwkOl|KLK)Z(O`$yr~c{IoxPx)#CFVNSe>Jbs4-qeyWg>ct{POsV8b6Az z5gD5YZWo~4RVe$$RgvXaCGM=A5;$23PaJi@&uboGv)X)we`4 zGnQ=h{{X&f?X*za+$+cTTC)+C%;kUDty_5f)kjs@SMp!>s~Wc(Xw~yheqpz3XKiSf zo%WKYf{Mh7C1Sg`Zg1i>(^wa1wg%ouR{OQdCu18HwEI;dW)HE?YTdH)Vz^bC<{#dy zc%l%xyuT|i@YdWYM5LkXUVUe&wKjD+bTG#%vy9=sR{OQuT9PhN+-K7rtB2D(&pXIH zU+&j&ViGa1zT!J~u1cGVpHr#c&mLFh+fn96RnN;!w~yuaHK80TBih{!MU5NK%#t0h zC6Sqc{Hy5?gE9|0elU6G{i^xaP^4^+t$i2pfXXf*W%)U}M9 zCI=No_k~)yJWQk)s>Md!j!3T81JHvip$>4=#{pZOl<>h%1B#8~^FqJf+eaYM7@-#= zaZC_Elp$H}53}B-fTCumWR`kUH0>_@RcT1W#||?dad#uPl`s(nD?+_iOi`)vMg2 zvE)=M$k9i8$XsfYU8NXN`uhotQ6a# z#!m8oin_~1Wrq;8g?3gCy}YP~+ViSv9Ol)cghuYiy;}^SSLNcV zTdIfIlgC=O8S=L+B=iC};R>5T+@I}NZSdh{m&Gx{PRn7F{{RDAW1sH&*AC3cJ&kuC z4qX2LZby{fjCXDS0CuF>hs1r?X)I>hVlCzo{8Z`WSeGAo8mp!l($Xgf<;70eW1YWt zy*R}6qBOW~yHS#xlo5io#RqT8{4|4djqTQsQSy=!pyQ@$vq_V)8%0F!%*sc~)JUp_ zK9s|hM+A}DsmO;a?fO;BlGPYi+w*m)NN{8VDGZ!8)vuO5JEW6atQ-*zSnfM|^ZhI8 zvI#?;qpf_O@$M$_qL~83$lICQ<;rv)UTBKEj(YOY{PgjQy3QtkP@X@$HrJlqNp&n{ zAaDjnw(%Hu#Ah$TK*1>~X`8&FH zu0F^SE?M@VuC5Y=cEE9;{C2$g&r?Lrd~6sUg+ml+Gj4XNq738Y8*xTgDk(vV}RW%fUADOX5pAsHF1NIX-`z z86N)CFlN*~BlHr*Rdm~R&I+RE@~9+?l^@;hQdzQ_B$YZEcIg^CFzH<}lRZ>4WnFgs z)m$?q#SKcVO6St6hcY(hrEhq4cNIfpo*Ixdub8Cg6()GbD!GnG20^WrhZG}ZoQ^50 z_r7JT7R;pc_o+b}-J6QeaS=u`cWqwyubVzSTuY{CO>mAw%t~%m=$l(P$EdHSH>%1q zyDR1ok7i?|&kS+2*BRdeugniXcXk|Rv7Bt|5>ChEo#)vmzJDd~tJHR?@r>@=n{!Uo zgfVI}$YAp1oRWXo%YSx~6DDvuRj;apO(Vmq?8?s$@&f$3yBf0p0O!od% zsupG}tT^w|luQ)vQ!uT(YR1K(iV~F8AfnLs;=zs=&=| z;j(|=Rk>)8qN*?O_5T2Rv8gK)4##6_YLTc4aNX;EFEycH7YqIG?$#EcB8a&eHPG08 z{@gg+o~qTwCRNz`Xjnwb-!K&B44aWuF8Y~bP6~0lk%&`{i~iMNaQ22=v9bHVHEZ}` zeCZW%fZ^M_i7d(jGDGlm3FsE zsBw&uLRx#Bm4vgC~IthhA; z4&;&kO4QZEMR4k?wHM{DKiA7c2zdVhi}pf-yUP-ao>%(|jb- zPOqvyt#+A3`H|25f zNZAYIjhzRK2YH98?h{P;HvHRZD zCz2wan zs-dt)LrLWj*<(`}$Z?(lsTq04QBowzDFFqU2i~W~rH9VAt3k@CCq)Z^dr8ZO} zsR@a9b)b{b9tA(h!7AhBBk4k?lfsXdsWRf&iRUIVbC1fU+*ELB${7CfdUU9Z0^YQ* zVw?$5GbamGrNR&gBviXuPDkNUu*(ws991V{D~(Z+xs42}xyM6HT!kn{2c%(9ol~Tgmx|4Z)^}!UCz&zG`yAy(ZvdF{cOC zgshD^6^v@9Ju0gtN0%KdLSc=Y2T#=1WKc;m9jtm%W7vSH3c;5mn9*Qk9epX_G>xzv z9<^XAs3#pMqHS{*?CP8i$8|;wY%&VMF`jc>5JGC^RFM}OJO2QC{hFsLnD{*6w!}VL zGCAC|+yMwiOt)$yQsClYLXY#KF77i@MHCWl3F%iPiDeBOyOTdISG7R}r`dQ%$gM<~ zj@nvAuGVJ~50?$|4b@n~bV5TWGwWSqTBsZG^ZNRVgY57ScaNEBkep6QE#OOmXE5jd z^sNJ9YR;&`a*nlOL~={EMGSw3cUnHo@RH}JcC8~JK+3(-ZKNaY$+yY-yQ#3-Kggq) z+t=kas=&EURlP#>sw$TYH;_4ZT$ew0KAyt2rz1C^JP}81Jhx4t5BITD)WhY-vmlWh zvks!Q;M4A|WyFK$`==i@citZOWhL~{!8~$EvV8lLe5#eKBKKz%d_-x-R(QUb;j68C zQEPh$i07BX9johKSolxjZk=yq9J0jEa;w9i;tlF6)I2-z%ELjm6W9!H>bo|QN8|ce zqS$HPQjM`;N6NKIJ&%^g=6u>jBc?RDf=RFNnMaZ#H@ z-TSfgQ;Y@e4tD0lo&`;B0gPeC%sY3klsIWpt~PXK71y=8OBa^O{xw`%Mh8l2kus5# zvN&}haa{$ju?YoV_-iq=STo_a?Pul*<+AxUs~O@h|BxI{5>n1hxeBrQTdcte`JwBgJ(h0 ziX3#gnli4u!)@0X{OgIol}2}c<*u(*ERy0jEL){;`jxEk6Eu}66%Tow?aYc@NohjkT}F%0$m8V5>ZiE*e~PLSPoUvV%VXD6SzAU!vhN)H)rE7b=}VgZE-g~WIrK5 zr#J)V{QA}Mv#J;hn;(4m%i?B{pxQCIx>$Bdv288)T&oZcKI)O{UljaJ_}6`ZaVDQ( zKbLDB-ge~3oS)x4T<#Y&#yI(@e8R6xy(p&PBgWj#dQ>d;b9S>CxLm9%CIlf4fQcc%m%GGQayZRMY0r?qq}a zGLq^QNc<`6h^~%5b{DlaXt$yR^PSm0)}E0cH_QQXjx$jJlJ|hNQIme{zwjDFR*V#v z?mx<>{pxZ@1)EcvHeEEF0 z7)rB+G<|nNrD&kbLBfpT?ks&%4hpz~}z@ zt8Zzu_mVc}e!tS9RGDY}=-`dN?9ybtiEY9@{zCbk*mF;U0c{g*8{GW9+iGtr7Pb(o z5hw7Pm6QOIPs=KDi~ZwL(D@2wUKm6P_02LxnpO&gDFZ)Rys#!gD%(#=bg_Xkf&qsk zulv;FD{OO0jme|5iDMg%W&SU%EKz)pk}yNx)YLFrHL_s2SKZ&{ryrbi#%p?WeNR5E z3l6sOgQI0z7qKJ;pjBa72Vy~uaKL! zzn9VXjOX*~UZz)9R*yd$4rO!Y_7H|K$?_FFy=p6_5J0|1&RAzTtFl?chLOH?Vow|j z&4)87R2UfGH}tQ6mqW)#Md1rqzrS063~s$h>&1P!po=!q?F3Qbqd~aiA2;zI#Mj0? z479qBP>yJy8yIc`aC6qa)$sUXV;Pw@90ljU;aoVqWOdQd=+fy#NQyBS{CTP2Wr2g^ zD$UB(6d2qcc8{f6`y#Wff?hGxx7NI>kx1)`*5;IcQ_a0PEji+g%~`?2gTVgy^fg>; zie3lG)$S4l>FGL+Z9waBd=W5#iKbfs}dOp ztbFF1wFd2@pK4@L%fE31nj@8zw;v@_zu5?ncvZw~N#d=<6lI4r#ARjYuUdNGy5wHZm(_q}Ubw z)4{L99Fu3>TcD_4EIN-$wGJQVBhsKm^Hl6OH7&W=2YRWO4#m4y-bfuqUXSI;BB-d1 ziAdLHdbJ*7+P`{+*2FT{T&o4F`;x5_h8b*DlyYrSzr-st?%^VUm*YOwqE@j>W9RP^ z+eXv0jxtz|G0;~VIFc!rFrcCAE6_Y%aDLHlGbdtt0bC=@4Z7VpA;-6R>4HZL$Ho+^ z2FlfY*T>`zjk`m(7_|Jq-~R&^T!pr&&YIe%oYV@ z`It9P@vR$3_mEWW1-RYTsLJpXkdU#Ga8GlN^>PT~hG7;-2c~@mOK2{34I@DcET9%2 zjy{yO%@};f#Ifs|%D0*c%Vq0b93o`5@kk!$}G?@{&1Rs=FG~@3CV$GXpK@!BnIoritSj4g&kFykw(Lwyb8kBXQhOC9hnjFvxYQ~#f*kKn0KeD?*9N-K3ZE? zBaO5T;6=o0-aLt;j6s89$<@}|%t9%(9am`OQhLL*Qu%kRvMni@_ z!$`!$6!j*UtG93}R8^AQwJ*d%=0;vxqiI`dRqs^>SY|fsSIQI{$26l7P7}lt;s)K$ zep>lA#x~(KCAH4LjgnWX&3$F!NwaG)BbP=j-{OqTl-G(Seb2;xg!6v{y zK~@`Ne?HD?vOZVlQ=j6g#o8U&Pnktr8N)LJ#1MU=)x>GF8Gl;&ms*l*dx;w4d1f}i zuc`G3oivH0W%+sAUny&e_PePaoV)$vJuA|~YI&HQ%9iqrg!5;Q2mbo}YFji%W|rUN z1Fb-c;3@=I(M4adFvlaTsmHB$&$-R9ddN?oJhzw!L*A|`+sxtaIFSA=RU?o0fZP0l z{{RR3H5#;jd+*8wKY#eMSujlAgfd_S`>pq@LKdDe``7E+wNZ{la1{d#4)rSuU6mnS z(z|V}qZ=0XIx9ae6$UZA&r0ZEhir+tvRG~d{hH*o=x*S+Xl{G|0OP+(>f?*a5te*9 z4i4_#m4wqOCY7to)3?d74`I{mTh%8*z=wQ8Gj}!T z)LNGmb|Pr4pg;v*x7zqD-!D)H@YXH5fgag@ZT|qnS}`&NWkt(>BV6*-=#Iv++^l5@ z=*?cA;Hd@Pu91HXe?R-U>0Ui)@_zPjnUC=LS9#$3sQ&=A?PCGin1%h{@NW5XcXkz* zT@7iyPrY=4>83!WWwBSmWf(P?p~z&@qITtR^0jICYNK$gdmfcAbCw6D+IwXRVyeP? zz)3j8SyFZ%RjD*Bw%{<;3Afscoj~nCf01`_OO*aI^3}>V0iiJ8B}@q;aG_ZlFsJW( zRE(q%$I2?zG88Py<3wfotIhr+6?-{1ZCplI-+4kQqE>I0g1*1qt!rdRM(}f={R)#P)3miJjL=4=TpHH0Ymc*} zR|}a4AMWO>z=<(OL*=%1wkpY#`JoeljrXgDW|7uL)vz|lV zMXc*~^MNOoYS+_kR^CP`a$l#*_iK`O>QX!1BG57;6jj_lVO^BnGX&3S;H@SHLk+xY1~cUvvE}6L3-XTj3}@!Z=xTZ8D40Rgxn%S- zrjKa&Ty|c-cH;~;H?@6YuF{}(HS!PYc)u&{h*s5@;JIFkCsiS7b*6rS* z3dEMa@lZPH_X>XD-Nx>%?_UUOXz|>6rShuZ!&*t0PDU*8`SCKc zV0PVKKX|B1_K?WtJZI$}#a~0P^B|DFB#tZRpBoo~Y+E;0`L|bA8c&$>u?L=8jk0-r zNPp6`5DmFc$!e;zw!r78`H#I!urij7nRp+2pf%`AnBwLZ6!RFVY$)W`oGRBpGJLGR zcCpvYd@2vAty^VvBOEgdabD<|ei5@7`JI1CwF!^T3nvVsqqc!0xbnknZ@pHhMMv{v zT#vi{^MAEm(_KowwjM%A6|;h^{58D>GwdcA49rCM#on9n!BqcR{iXi$vN4R1E{n>R;)2&mQhsf<}AAh80%VoQ=Pt1 z#d6DYL?w^z=KxDVw7!h=udzNG#~W#?2;55s&t_j$uZ}Hak*8lXfTwTPzQXuqj5PS6 z+qqB-e|HpN)ueafk56C~iS136Wl%e{6U4z>mg1?TVR^4cCr34h0($kJ^0;2~;t2{s zqbj_0p@eye_w8IWaZFt9`F`z5wHR!uB@BluyG3IYKr$g_2c`#BI>{lHz;~jko3gCgUADSLg<_9G_%jzj;T?U!Ok{ z99Z~<^5W(9?<=tv{`sqdXFYw7IJulp10(+NxmDx%Yvvys$AA5x&_oB9y!^l1$ID+% zVa=;LH!Q8U{hIl+#ZoPW{IO2k&UWtWy1Veo$CWEwGi9q@(=^@p0(*(+M@zRXyTn#H!QU*F2FZGFTe3r3lhlVgI7(i!HD0Ce-$|b zG_BY7ipV!F{)1XjGp7*z$Nj3zw})s5$7vl~_^U=ZgpPJ@!u{b~lZ)&-d&RR1lLkgO zTGzF^Xh^k!JpTZ-Sb}C|SWxU=ySwg8<6C-HlR;8V`aWd)~xh`cCqyRYpc`L$iRW~3gvYBBLpGG zP2Vkbb`Ha@Ij%;m!ZA8qS6&0v){k;z{{RhVK*;1{gIBjCNUA$lZJH!g3?qH*_lHXQ z8{qxZHPC|?cVI?;x<0k@`xa=kv#ool!Q-32>TuEHKD$q+{qt8zUP$Ppx%Gw6#sE9G ztkx~i){VkQp-J?t`4yakK2j^O=z1}^U3tz&-Kv`zA3wrsW*L3LoX6$dX<11X)JMk^ zTljhDPZ=lXqdSxX#wx5PG1!I8L}v1WmHW+BpJR>}0CuY3m0P7t63|Atk~mvFg1!#; z^C3Ftn2vnVF_GDaZ|h%qT(d_DN~i9M_=n@Ax{X5A50V|MPxnc4x9@%xwKryCU*SGQ z@iDfuwcjk5d=7nU#U{8*wj~eC{2`apy_d!?q!0-uMUj7neSf=NFpK2LA=n1~TiE+o zwMBcUi&Nqq40+nEgslRI2g)+Nb5x`Zm@US73STxbpCS3{Qez_f%+lQ;WceAk{{Z#s zOOXsM`@g^c0FKl~Uo43vT;rgo%W%@gBt>%FLH_MTuh5cvSA=boEtdZP$A8(aEvI(I zMc*&|^H~~vhszmH&#A3domx)6DE|P*YdV{i65K6xHst)fw*4zfnWb%`gg?dFvMu9s zOgP-9^sTt^A}CJPTvsgJkk@G%+HqK+ZG+|Yu7gj8Nsi)nDEqaEX}Pf$*3S0YjDWOvaC<{TmJyD^ra2WaPidplS^|gvauXe+(*FXpJ$f02X4`d zY`G*4%Dp%v*orAETaPSNR+LCsVUJ3&%H*-AnlRDfX_Q2W+cJ6zWV?!t^rxY3Ebjgq zXjPFiwHMT$q$?JAUzZf%2>CP3Ar1}*;*=0R_i9|EtwzTh{_`Khiuotw(p+9??FibR zI+k`gQGzk`$*-;4g^9gLuaf>bPiiA*9sXAv2<*O}n}6su;~jJ}uC9;H?-#u7aL5mw zNB%kVuRn@ipS>yN zET1mkk5NV*Hewqi9Vw51<99jbeX2+#7~Vk!l`^3n2dtZr79Vz}j&_PbLS(n{s=FL{ zWN^l{qqmKu-zf_0Ir`R(GVT$}42|~=f7+?7;%He)$<~^&+{E~BtyaWA73P1KeciwP zYRagZxuI$0MH4;O&hod)zSU~nfZ{K@&Hn(7)D}_496-*%&+hbN$-cw(_mieVlJqZuQAl zWg}t~oz!j{3v{mEO;t!lWB7jca$0zjYlSYqO73mUA~t3_2$`^I(v&wgp&d`Y?c?&SBLrq7Ca=Vd_DJu+ z$0O3HNOrCV-mb=vUONgSWI^XQ6&?bvP<5gq$L}g28I&p>l=%k|K!E(q{52j7NtSGi zSkcplY^bD{=3n=!7Uf5AB4gz~(a5A5nL!`$Duyxh?I&eRFPRhJI#!dlz2P#lsFlNd z*Ui5j^*Jo`f3w2ac^H`ne)31i&*NW8`EFBkuNCs&?FDfG&>Y68Jc-1NI4HRo$@I-l zmC-WT{Jp(k(Fx`|6MujwXM;RA*@GiWY`W1o7@e84L3f&(fy_ zA)9}i@sCCRDuNd;Zyb%r@T>==Jn`W0ix zBTF=E_fQ`IvmQ&sp>{WmtC0^X$P!>suDFd7F%$ynQN)#~GB{?%02d zwC$J6AprZI#ay%8B?fO;1cz)()vKde);P+j9RC0+`&pq?w5QYI+g zv2QG^p~l+j_f0m(#>{>C<#g6q*)qdx*HaDRyzLZi^RMu?_iHJ;jJWDJ87uzM{pwQV z%tTIe%}*3@KbVf8`d48(vdG&<;auGCN|J94oz*u;w)+u6#&_~@g|3aF@?zRL8s=>$ zXs(dB$lYCq)2EUEUbN{;Q8S(L{HvV(^={SBLcooHVz2@7p9{@s+7Bsn<{2nV8o8+7 z!V|Yz!_+~Ea;=~1T58xvm;2R=c3i3c@1-l;5#-(=CGG(BCh(-U$z=>|oNNob_^WCnsj;!CX)rGc zRQ~{Y8sR6lc%NbEUY9&E$UMjU>(a62v_?P(`Rk$F#wHG#eRl$EM%=&Mu8P;rc-6;# z)sqFHKv@UOYo^m;ZMZ)zR2G9}n>$33P1AL*!Brz&qoD0ru)^+vm}3>G8!;qS)Rv|d z70mfr8bX_X^;RB8e0|-t_Iymo`?Xc&CzjfCP}y<1B$d@bG1ffstmDkvhgzC@l|&nQ zRS!Lwe(deX@l=&z@c|pMo@#j5M!7v}Ddi^s9!)q%=$ks`r<7VFPwgxfo*r0MzLFTe z;(qOO5Wd+qk&M@0V0^gAUi7V~-o~2{vUARBI{JSiB02+C#TSYgf!(Jhz<*GOpDvv{%?#oG=9_MmE>YUlHsieZ&q2O7gLh>U()?z2oy! z;*Ef{_<;@Ck1W>Flz*XMeep9s)AxDpv~r-2t5)ZR zZjAbT2`9?n4C1_ORIaRj#vaFI8ezPq;0l$B$Bm<}=}e1bFV9kBBW)e)&AzugqwtKD zKb$xvw|@;vgXBATKgyWwb_M8Gq*cm^Fjq99wHiVsK4T<@I9joc42~&cAe^tt)g&si za^HW_tukyw3hz=thHSM5&oLsU~FDzb_RmNN{jYP-8W2HE^51@!HRf0y2Aa zsSusq9m0mniYx~}+ap}(=J~1zSI!UJq`{5yyb6%3mEW8X;iT?bMPRJOmP59tR`UM< z+NgH`cQ+XIr>AMH3XTzQf|nL@QwSjXR~ z2`Dj*tY`=kcy4_tzJ4CJ z&*@dw@*7|*MNJzyi)sEYv^2(|A+-TX4U%fPg99~u+*|(us@^#J)SHpASEUQgn02(WRkn_`0>G#<{7YKHW+@oXkA`BudYddq%HDD@TXL$1 z@zDC!Aq(uwKK}qpbiz!>WRXN*CjS8MQ{xb$5aW~E(zQ%$v~4?mD><#EQJCBKs^qRs zh{owZdAqOh)p+4(raOjRs%A+LD{lMW-Jup{Y{~b(hPI~ehjOWiFe=064OF68-Z^A= z_(QY}+kWkBBv1*|?ma&o)0tN8R2|r|9?k zoaWvnaOB`P4Bczed^_;={{U8GF~(znILm?aAl=wDGhb2oQ{la>i$@~Ix7Ek-{&m|* z@;rQIXHJ^abI3j!{3g_V{{XjZs6ftBcibqwo7Xk&2@0vLj|-d zpnRP$FewXjfHv1+f$^BUTdOW+WX)o*FhxHgr^gD2+9m5(41*XVpe0A$t?AOxW#flO>^U%0&<}@t^wIGE=s?qeT@!5Hhss80ywX}6O#w%htj^9eSb_QZTn-BMXZ{e)j z?T*EcG{aY9ZI5=U?`EwT;+u;zb3FNM!JBq4{?%|#ECp4M-L8e~qJ^7p-fF_U(#oq% zoB>%jD8#*QXKd%~lgP1!9V^OwMW~yp-67>8YPEZRc_THva+Xg@z-T2h?PbZObZZC@ zM{e9XYzmxPk`>(j+P!51&OULoZE1@&Vv%ER+RT~1c+0Y}lY2YXiGz)xY^(7_BRe8< zQ#^4)37X`9DM#KiGpyl7Co9P3H2bUTD`v!>F&{DctC;Z@jdZ;h)sQ-?zsfRp{q8qc z#(xmLKWT8h-c8JN3uy{I{mbSQ8U5Zl_V=wR#mnI|rAkw0)|#)6G@C1iLw6Ee?aD~Z z0A}=gfw|n&0~3(4b{}-o zPUDL!#M|M(IP*SG-jzG7YX-tgs^LkicJ{I9^R!n^{#x}^EcYWW+vU=!h>HDP-1kgsQ zZH^n9^&d(hw0IcKW_dH$KgCnCsQJeQ>S)+`Ob^}v02&~Y3lIxfyw5TsLHBMCwOon= z9D-Ik57j!-C9^b&d0~yUqaCsYAD#btBJlBtOY=?0@ z*-koDg@{PaEQIV{YeWT|H*PVaatZI6%5@l{4veI%(--Gsr)sF>vyPG{df1K_JB$B6V7VSw++nCgWSrY1K)>*m^26(2-fDk450@j4NiB&qUtyG!;DL!lE zU!`psoK<3OSVwOysFDwxw?4m0+O)CrLd`MxYmL+IKeHF?`!*;%bsPO%yTto?8s#<@!}<-BI(8n0&dbcH}QJ5`w(R^Bqwv%^Sxk`F>8- zES_4&`qWDQ0B9$F&a3JD>X~JQBgFpz!&#@$)+CT1cN^DuOxjhcjZJWvDS4!AjuO|kjq-k=E z%d<8K&1A_t0Ao-<6|;JtTL(QW4u3qbc%$YOWq{UatR@G?@F>npX*;>9<(|X zkjW6``u-JE%e$SRk9yWVK_poFMq7Fu4@y7|PVW5Galz|T955<4V?=ce6S87FgH8yp z21yjwU_7-T2{GHHB4xjMC)}!pUnm^*u`IC>58qsJYXQ-Sjg#faTG`g-irQ2XeB1h0 zI?{Zee7W_|ejRT<-oM)GCLdgCLfy;zY1aw`VF#Xa%ogBVYt&!VC6V9 zWkyry>sJvnP~Zh3u3IybKf7751%4Z`tw;z(FVG4|B=jBtgt$)iLit`;N@JW=-0zb; zstbkN9E*&OD{B(nk>P$M+RgTM2k&q@R|H^aq+@W|jez65dS{4j(m5U90z(RdH9XXF(k7^C}B|M#(qIP#iaJO05)D@HSPp$soxc{{SkQHI6u% zNO&vXJ-(H)({q;Q#>;7-0H|4`Jo=BuwCsyY>m%U{a4RCxCU}FO4yT-&(6*M`LoR=E z@t!@v??RFerM5`YMt9|j+r@6G`D+^?<2X3?tc!T!y-4JYk)E0V02=8u*&RMcO!h4aTJr1h`swgdGa(h zEMXS%JB~vfk6PD`NrN|>`ScA{P%ExuJPvAj*xW?DgLge~ShAv8%*yWKK4bT!x}>w zn7-xz06#4tXr(77YX1NZYNYEk0~{-{UYWCU0!CyXFVeJ(dLDe)4!aD$V1Kjp*yR5J zvyV^qtL5!coJ~B>fx8&n)Q@`lisE@z6BLAxf8wv2JYQ`zdgq-Q{_6)H?e4Ej2yo&x z)a0OR>aAX4%_^lkH2DC^r89`qs5kqlgA$oE+CZR*fQbk9i}Q;%52Sa4VtHY|L!3 zyp@Az<=mBiH~Rb6Lu{vENe&c!>ho$dPE)IdVZub}!D~|ocHlW*PLUWMR`OGLhg^LFR`KN{dl6qQ-|PfvR6{4aW9)vbd60IJ?P ze{?lwr^<9tcX}UpXi{&}AQ;BbD@e&Ntzu|5!s||mD&?{BHEQKmHn7`UMd*7F*bJr_ z1S9dOAZB9056e(0E;s)GcAp4^2FB}HiY@gtQ*@Zf+lr7Wb-?LVQPqwr!mCHS2j!~d zV<%I!xcj1l(zyzwG{__dB6{wn&&|gbUeSUkW_3J@;QVT`uAc4uEC)5*2f-PxBgOJM z+lZ$dlLCoN*mgb<@jL+P4J3`Y?>rjiuAzoh1PloNZ}=5-{x4DeuQL3~T2}lkkt?|2 zn{us9JDhTlymR`rEiOdAb3Njr<1NqOUs&p6%(UAo{E7>0Uzw}r&liHX zzEoRQ+>(FYuU`W6vE*VY>TFk|E8 z>}$Oov0CbAq>U_yP<-B>-Kp()nWI0(*&p2%l#;Mz5}Zimb_GjrQaMWm+n;~p`cg{3 z&Ym<#(b(|#7ARUYR_*fEa(WuA%eIB$i*$>( zKP_xpM6M74Sa9vR+wcDXp;q>nAd7Xg^5duXjdM+0yEAkl3U?ix^d0L?6u81l2gr@{ zW3DSM-Ylz`&eK~q*9PHICHsk7H6hTWwzD?PiC}M)YoxMPa>Kne2W?=^OI z6M1E0+kspY&~Z9wTWC@~?O0N*H$7C5(GoqwetD@-tg5+8RuX2AjgMORZ0r4_6Q{^S zFC+D@vTYS!083z~uZsR1v~X&1$U3VA{{Vqk*!HaEFkA7iyf4Cfv=gyqw;}afYR9pg zpOvaj#~1>kJJoUj0HIavU%XjJ*LcTzfGZ5=_-RvnF5&sp6qJ(=+_hRAIEcJ+O>Vr@ zhbO4%O?Fb50+h9PE1YO9yke}!8*Wm)`&B?gjzvm{TdCvLsYRnXF2{}hRE!-i;zm4? z@~ZsY`q#kv<9_@n@b2cnK>jJ(3ym5`3HcGTl|MHX`Qdg=zNaF-=XE7YxBkmhFNnsi z>@2F0>B|#+^PE@BUOAFWTj3MG%O_87Q(sBk8Ki~r$Xh6cBXDiZa#;%(z>v( zQ_jR*#|I&Su>!X5Pjgk3+F8~Y-MT#QHEnh~or4=Y`kJ!>sC>vcZvOz|UZf5v*hm`$ zCO+@**1fAT60E;FRcS5Ya!=+oZEMxuQUH<@iYS@*pp>oDMeDdK__FH5<7c+F0pyOC^ry0R7JO-$KhNZ!B(6^4Fbd&|Ib1m_7q~{{VO1 zy(dj*kci{^z3Y;u=8@RgwYFGtN8WC=X+(}+=h_7>?37peeJW>x5ah4R*16|{{Vo~0d1r$5(ofi*~0wP zlPU6Z-lY*R1HD8feY=nFRKg=jhBL8C73QBLq~U<6aD2AhyJ~|uM9wN<0TeY&#>|t) z2ERT0dn~ix&WC30r`~@Xf#~ep>na##ZZXb0SF=OE<`W+4cM@=wwDR7oB+PUqATtyt=cj zPm6XxBDe7W0D8J`viGz+s*K{+P>Z)5e-UrHR~7{Y9Zo?Ts)&vJ&nth(I_>XPaxK@N z^=sC>8h;6zHf>d7Y_A4Sz3$YA2b{yx_`kbQMq`iypDxDTyV9R;8yOtL-#6aJ@U>Ie zg4|3z-LUgo4+ZC!8${=yz5Uf))mAO2-@HwP)|669C}kWaa@3ze!bH)bf_am@-y?<|{fSU&bYhPG{lkjU6PS21BN$dBz1 zj6e6Qth5qbjI#XvR~-3~Na}16n-VooEMSm-hpjTzT*j#D@~tF*XC1|6&Em8ox@K6u zPnXiZfcPin!+0c6UTKrB{0o)EcpCyX<##CSUi0v2BL3P)l1;CMfA|O-)zNP+pExO=cySK)mL_XDH)3W-jwA5ci>Rb40$IzcN>>KcKO?vN+o_TBpYb!cF zSuxfB0NUHyypGUI1Z9+MX6in*?bCkgnZz5;m69ksa==_9na}i zBS;o*TVkYn!C&@j<)Dcp104PDtwSP59I&_y?%&1yBXwONW0h4GFaH3J)_jX%FQ+ML zDOfV>Oje{o?_@t(%}vb`<+=VUwF+g_+&0BQ_p6doD$;)O(7<6=3ys^qinm}eLiv7N z{*}sGKFL#O-sq;fyLhHC;gL&Xxaw|8k<(hnlB&&`?ChZt+bp@=?OaZk1j`2V^5MEy zWo;*#v0}L9(A14M2`l@uRd-gTaz>+-=~a>_z}pe){pz%1+X}mU#eVf;xlSZe5VAb@ z&MU0=Y@%-y+vh77KYRFb-*^5yT#7;*?)##<9|2qK@eR9&WY|gEzuv`Ftn6<`bMC7q z-)OrJ%Di(^u-ch5OG;Mz1R_7WMr!kXvHt+OUC=#Mu|%s9Kf6sE*X09>mppOWfCd{p zRkk$5F)wpf*oZ=^9AmXg_>ch~@YFyuvk<>6LPU@kIOBs*Cry%n6TB1UyiX#bo(X635jXANEnNfmn4NZvW||@v{{Xmv?%Z-%&}2zD zbm`L+sgq2d!jtB1&$st#z>CjRJsCTH?A1ym8jw_MX6Cf5;dvY9`@i}XIF9VOC7Kww z*}D^k`RKQRjHIUwKa2a-Z6)4{7w=Qkms0DqZD8E2OLr|>g7NuoyOy;JIfY01w%zw} zSvICk>`(W&+xKf`NYs(@{o2ld5R33cP@+iL-CH4!=%YpXM^jjq_epZzQ}tf;zh!ST zwpE9aJ$N$I~j+z*^D@mBS`LmxX=HKs3=FptN}$M>tTgLjvi6fYba^XAfJ zK+%iki)dP48-ZWqr`rM|5^ds}AZFoyUA4`n%83#q#{U54<*uK=K6-ev!Qwjt$TGu< z=Ezb$Zfk48EMV6y)H#efRARk({t@-37`vNNdY__pa&EO%90e6tWyruAs7Uk%* zBF5R>FU+(U6sCG5N>&S$Kw_!^jHl0h#I_iIK-gm-MvfT4ir-iZ?oWgmOJdsMy? z#i&tOBY+h}$j1VoZo7iMI8K@ES2nx;?`99JSBK?iLj12!rD~nEC!0dXB9ZYg`p(0( zLxI0*Avo#iDoCP^VuKq<`9pWBrXs2UKPYdT{saB$nM%kbVIYSrj)NO|*0`2!hj-sz zjZmkQ!_8K~{VF7kJd5VDd29XOTIZa3wHGTc+lZLu*`86(@Aj)k-r?k6sJ}PyRcMin zxQnXw#c05#a${Ys>sVBcm``(ZIO3HCKKlOv6>7r<)z4CU)^47QGcab_^}7IVts3$M zYYLkLH!f+b6Wj=!=k6A}yLe(9zG~z&n4cS#A-R7rJ*%zKQRdyB?``?I))Q7*kc}0Z zXor`M8^5JFW7>FsmX$5#L5Cav0EU&|bpEx?C82WoN?ux^VBd1J{3c3k5yXvz1RVbW zz`9mTf{o8BTYeX}Sv9+5`FV9-dViDBihQ@wboWQznhFKekz$h|plY;Z%KW@lT?P{t zoe^EZf(5M!hm;21_0radyA`1Vq>%jmjYdD#=0)P9B?$SdIL>zN`?N(^)&$X*!7RM( zp;R-4A1y=&m$;FYrHgaE*v9IpBuUcvXG(jGS~(g1M6YWK6*eH~E0*v@lo2CH3o$)M z_iM1Yj4QX7UactFAfBf;aze|>{KBy=oGe7+rF3_U*vMMuu2>Mju4QOT;XNdAA6SB|w) zQOgcG3Q9jckhtF2B00yP)bm zTIiB6skjVos&`N!iLuueO=u+@Pbb$9NgF^uRkr$!wlcIB)M)h5Q&YOJxk3epeX(0C#5@ub}RMQmtK-mX|P-*5yXp>c=^( ziMQ70dR~46O86lW+TG22+I6wE*2$o$6%*?s#QM#(HC*~D8{JWfvMOSmV zd0bVQK<4!ucatnSSCV+6PJ7thOnbQbf8aImmobkoajru5P4m&dUzWLX6m-z-!&T*c z$o%H`o8fp(h3q%O%|wnz0~ueG9DY94^KXGBxwiQykje6e`TJMtzm2>R9sE*-AG~Ed zG1MCT+wo?Xt9Vbwa@$@-@;Tods%%G0^1x@Y;=XRZ7Z!caUy6*PdW;OS0DkE;sPVH# zst+q%E`zBXrygr#f84I#37cj&ZX&pOCCqy?=9?!m_dTf#J{Nc0q~E-$9FIy=Du+Blu}$>Q3L4zeRH*o}{Z}{M6#firAhJBQej)qL|El-`)b&cZWeb@aeP)tvc@6*yfrT22L{VJlxVxlI(a6VXJ|4Qg zn{~7~5_j#oy|2UH3GPBiAx|@ZB)9lg#x3Y`R>xDPyF61*@SV=4q8Jx@W0EV}ybJJ( zc_WVU@;Mbq4v&rxeEmJE-25ltD-9@;Ex?jO32bx6YW0|6@*^;m01x4=>Nr;SK2IN= zH>6HGNbudYjj&c+E-{Y6w;{BS)8yDIPhr`}s`ExmWPR%ODADCUc2y-U$Ro>s?p}*k znmw%9tptpH)AJf*0J}-8;~Nr;c16w=X}(XFkVjh8lG-xcqx-&A}4lH+Ns ziwQv7Q-lDm8y(ojD(q2^RK>^5%{Ja9+(8@~xeP#XDCE?o23Uxd46bugDQ_@y$MI9q zN{21?hAJ?wtQ@U5#>F*a^}JgHIu5mHvu#p(Rb-XU+=`H?>S~-cGL(swAlg{qnp6uX z?+?nNt9lKz_`dG;914cIBI9D^tTDScyAL6bvTh^ZDHMWHOi{JRFjy>@=7o^15l9S`V?Lv z8#WDFw~8W#u6R;Dl^yi@ZkrRyA^C^nUKir8iIF2q1+2N)4nKr3{_Qs?rOY)8o}sMx zpH0v$-OFW%dilG?-yE#8>j}iS5IS`Epxx%*_^VUYgp?#bBS(RvE3JUQ9hLk)A-{v>>LpICN}!_&$#n-$#U6D03dUw+l| zZ2tgiy7J_0&IaF@pSy~p>nMdqpv#`E>FU)f^Usx++Ncgd`^5U1^eMQ+^{G;fW1*z$ z9uc+!G4I@Cy$^2E0AzAK2V7QjmtrJSwrKiir{!A8)BKGmALqSOeN#13xY3r3C?G6n z4^7(NHpV4)epD;SvYnrIxdNn(**Bwn-76_BTvYI3WEEPYX%qq7k*ny+3p)Jfz*`zuokx zKF=Owk<{tbuU;zPjEREh@AWLbYNU-Mts2BOWN#l&TC#%bTeub; zh}@IY@veC;rSdrzqq34YOpEh*eUIJws{D5GnD)8a19YjQ5etu%@?W?2s{0`be3c4C zE^Bo)bmCAB1l~b#vST1)sP(5NpCnu4Cp+4-7AJ`T$K3DrtpRLEV&@!IZe&I}nGi-@ z0z09RbI{Vs6~TkaD}qi&Ju20;uxX@l6#{q1U#(~xJgY>^cY61(X;0oSmd1Qa&k~{x zC!whkN&ylKsQJ0AKPgV&PjA+vC{gxRa6+)bNrxH zMadkKMs&*2zGwM}=zS@+*X?I`liD2Q{_qYr1M609nQkJ?W9C}QxwRo@LJVj!%gC;rC6unuGP=BZPsy(m=`-4D*S2un8PeKUPcis#>(n1pn&aBuR7JyX z1Fd?e#Q3bB@t&z~rb_ZJpCOUt03S8ZTY=j>E6g53vNUhX>%*%Wwn7+$g_}95#xpbg+z;WZ?;@Z`;|I+>N40CmnEaJy-Mb7)uQGNz zQn8&Nk|3fXwGZc4k&m1sm~KJ$PhM)wkz2~-zwmw9iqvJ)Qn{kkwo+#2qIUVJ)rqyBE z!kpmJm{A#W4$;pPpu$5o{M)}O0rJ67NYW~j0I){ zS&x)DepHmqCAl8tE>=^}R3Bz(HmbObzpYC0h}Y&HewCkW%Dohh54~u#7RUe7x}ak{ z4NAC;M>O31;srSsm}f!>_nuN zhm!cw)O^Gf&{vh*qsCPO)`~9GSkP_^bI)qLi)dsK5tkz)K9$!8V;RXK%zQ^` z6HK_dxs&&b2p^A3SAp!3H*z@Ieq8mhrhHYW-pgq;P!Z)!2qngFp5FEI(TP#aY`qUv z^sh>cv^X&fsX;`oI_fbl`EiVT4&t?9F_rTf0T0ekP-{8}uAq6^+cv`F4UD`C13(-os@bn(uy9Io%<{*{Sn9n>i$$A7J8!*3yChnT_1 zz^+MIJxgxqV3J1yD103Et!IcAfv0ojpx}DfHEkQ_JT_LkxY{`J8GLR2_wd&RMRrtK zUUHybm%1ob_XI=irM;i5QIW#jLE zQ8EJ^v@qP6Grl2x5}$h=7!PD zYjXyL;zRP0$n9S;c*@j7%<0Q+-Twdquc-g7J68y~M z#3O~Yk*+YeQ85|&kN*Ind)G?7V=3~w^aG`4n|;DN$2)fLHva%xvj|efOMdt73iM~# z;*>iYmXB>{raPVP@_H^p{xx9AQeCoqY-Ay+hchtj!pw zQ0x=#5%^W>C6ZJT$e$~Jd;7JS5ZL8NRy=I~0Bil>Td*NAN4x#n=cuArH*=)35R?(c z!msIF6^*pdjJE3KU;qH1<8Mmqbjg@Tt1AU7UVTOGnndX=)exPnyA`1k4y3W%SG8nA z0}?s;kKX?PX0EEOw;^5B`g2^3Yja2<^1Hg>&)xY&c3u{BI*c%E-p<>B+w%|iO>tsB zk)M`d?yp+tyf-*Y*ipyIK5YL0O36g%qP0Hj@M{S4wS@lw2;lz!d;RL@*oIY*@m!~a zq!Q^!cJit}in=MdAP<>o*`w8q(6T@>3^gNvB4ECwFpW$jwpsYw3o)h?K+gR{B)M|E*-criomOFN>9M_4YVmr%a>)N?b z7|MRgIQf(fwbXflfO)Jx5~E9|mWLToTju`&X05|RCXa*sVFRW6O2>&9*Al3lG+#A$ zK0SG()Fip;G4~Z~&HUJs-GAkiAD8`=rlVt$Lv;t0pAC_)ec}HA#aGQ9GrNrH#5cat z{o(!U`eJZAmqlQ}50}&Bua!Jt5=~XvCEbVHoxEeXuR{T2gA!odOtG0aXD|F!cVTt% zckNNm1!c-#ZY^TpA~3-I^=QRwy5L+n>C}2xqW%pXig-p>W z%kr&Wg&d~Q#w!Yl+7d@a0!0*I$5n5;R;|_1#N9VlNVj>aW8{CeTB0$v6RECt?pib; zN0Lw8KL_Qmg5K9|(69MdF>CjS@iNzAXXQkz$lQBZJyoWIH?($^A?2z0>$21KG-E${ zxQ#v7+_L*uTCg37ERFZEv<{WQRyqxCbk^*w+gF{nXitNQKj1Y5ki=@omZC&ND}l{% zPAbOHJ#)Y~j`Atb&HOum-mkDU@(r@>`@ij1$9@2EE@7CaLa^Ky{{V@vu(ar;7N{HL zTvt{aO(WB#KXlLxv5ljpS1b$dKkDgrqOUzgK%c#QAC|ggbjxDOxrzI0dc`-FE6mVt1JGynFuu6@3=Qh( z%!gtvT4F_uVKSjE;hT5Kx3K>JYNm{D-Ww>wt6P-v)Hge8Nl%+{t1$U7{{R7~H8u3* zTUeKSXFvG$Y}hN4A_BSUs@|2(TL`7hXt>+|0DRV!q~ntr!yx9k<+*WY{i;PHv2&b% z54~>K?-GXt0DiTJWwK@Sq95=Y=(LPQFPA6rcK+>o^SLgW*jdPzJ4=EZyKObF%2gX4 zt6Y7P#>7IE+v&hSb_3V7amj}+mN!?+mu7zQ)wwQ#d^h{GnQtP@%?kXab5>T~H{5y1 ztY4V)W$iSp&AGl@H{P$SJ{AD>n~S&2(02a-_N(O!SY9?!+jV_i@V&EUBRhEMxBInJ z7ru94k?hP$p<1nit&@$ktCe;?dX`4o$`5+<*JHg9WtEFa-z_n+rx^K7N_Ix0Zz?J& z4(vCrM0X_!tlbuok3}MxxMwts?q3^zS|%v5<|{v$+7v>nx4h|`dv zsH9@dsOWmv!5V`_=PzjO>J3vjrGtJGTD- z3f9<2+FBk>ZH^ssfn0a|>gtm(%h5ktV#cc{ogu(q;q|F4)BtHgmcBft&mE0=sYWI? z&{*6??-XZak$~UUv^2QH8=SwHC#_eT%X|=>D(nGJZe_>!X{%UJiJ&cwzh zZ{o#hz_0SYSx>EFQW7NTt;Rq|{!#w`vex~qu{wEVu-nsZbJmZw26`IYwLvb{J->>% zYE!XuM^mRrQY1|LwbfXe6~Rxs)y>(-5;AY=U0s|Z+?C+>t{RaaE8OWKoyvgR3YJU_ zvJNT;U?N2LqjQx&aJ1PMQy z4YgH4s1%s856jY(ONCRna~h6DEUF*xEli_wktAdgc=V}f&OT-T0CuV@Wg81t*fA>7 zbDAKCk|}Ovp;ec!G^abT7v!K7KXrE0`!cyu{p3X;R@=pVbMcH9zmhoE@{b}urTcu<x2>xRE^b(8(b`J=MgFGir3RE-qH{h z_4&5eQeNp5C34JHY#Yl1{sUVv0NYMCE<4r$nNoi_{zF?5eWdw*Q)BzwRui!|{!>d& zjbNX1{ommRx=7iL%H!rw?$eA=TOfSoxwYzMK z7*fA^tDMqp+I^-)`9JTP=^^{VHD8)Pmb~e!8XX;k87$4sT$y$*TBzGD+~@eZROVfz zg4>NucNplltV-U$rFGr~lqR!l1fOxY+z zWpcQxNVt&6836eH7X-*HzN{XsQMx1RXr3?z7T9yl8 zn10prZ^xTOmISz2K6qGz4tqCKkNf7nv_PR7C#8J3@y5_xC`bT}nmGpl0OH<%r>$>? zc9DiA{JI~Uo-SKIw3r#&d}Oag(=isy|L{V-7wRYYuw@9u7u;ZQQvXRkigM_N? zMQ%7a_ODefE_rG69~(63z1IZw9+cSB+K-rgrkVDJwr0+DpO^79Br(k&6P@Vo(Dth! zt#xe%rz4CMrd0$=)wlv%lE5EBv(#;`TNxb zVkqNa7i(=Bo8FsjuQQF`C?CUI&qD)t+7KhoK6718o47==zh1(*n`twZ2k!K(+c@Qh zMIOED8k4XcMwPMIOMeA*#Dc*hJPPIPkCy5pRaE_VS5s<%m`(gO=2T#BTW|6L?fbvO zRi=oc+NT4(NU}7Ex9*ScR1r;y8_aFh&0|y`ZHt||m-wq|z<~b%!clBnE;|6b&hMpR zEL&ZfcP)0G55P|nTD`MkV#Fuc6kf)(_dfZxG8+iI@wDUS{Hni}_zt})Yb>2I+t1{H z6~EpU8phE|sr(IH^w%^`U2H@*mRxhvq?9ONF}j*O!6xSZ8d*r(qe(q~@GCM?KDZgka=NWJBWA9hf$W;}Pe9K=fe$b?y0{S5yTI$+J z(Dx79{{UvEVrp%v`F;=C&3z*|?nSY9}pj`gs@5>B(S@K1cp8>s_37%M=XEH!=IBxup6HB0a@M(A)~LCNeGuI|uPr zazxR#58m~w%L6kknD(sY0+CUdF_m-v(5|DwNQtXkC*ES?pYHtM)6%)dgUePe_g1#N z5eZ#(IZWKEj0|r3-|p1I;x(hW_m+bplFBz76n)?KYV3fA{qKL8spt`^=}``h2H&k) zC6Z=l8?jwT_8?Y~RfAKZMaVL7<^0P{Z=IO!q$)_=oYBzHY&up_yHlX2MdqYgkDN7D z+Clla6>7%nIHn3gCwJZc^=VCNPg@@2;J98rFi#@ju&#zf{nJ_66io$!4cJx{a#c8H zTJ<5=rMZ)G(zzgXu6kew<&;-U?YQqB!(83U?*c|_=7%ESj#A^xD#ZM*wUKh`_glSm zQ^%dn)K@uh3zhkPVNzP`BtS7j!)_}(Q!zy{Hg^iqGKkdVecI>l6{Rf4wHLPK#ER9G zCQ{uuS9Na?l{cv4{hHu*vcvN)3;bWjUWMVve9IONYN<$uY()~VT=G3@7gPB|BDHOo zYj2b<%UrgxDQ=ZRgLgdZShk$V-#$tCxUUoOSuxCqZsQ|CHTwbBh zclPi8^=8sKRFU;}!1$FkcwRr45x3_4`1{rFH*5x1A9}pQ;eMF9M~1D{@>)UWANEUs zcDu{#wc(e&ZK75=R^>^Rx}K|9%ueiQimP?0519{Ir3J$>ZzCaSY?~XAw%o4om1}y* zf@gQlT;85V)SQkhvbVHERb%qCR7sY@q5%fu#X)%Kjih3oA!TKgZ|>_h>TTPY)i=;0 z%!ypa&4E7)A-n%|v5z_Z4Pjd;^NL5)-#ISbfx1UA1x-RSXAu z8WTdk8~28xgU@H%^8~ArtYl!+q$DH={%zmGS+*SI>oi!`8P01=1&`%kwV4czyBIIt ztD(+GBc)OT={rvxwKO|`*{bO)?%h`7B18-aO1l}rbf0xW`KqxQ80xh#aOWq1N}@Oa z0P9nd)N4bQztZEJvlXwKJ}rD8(L80Rw0AH(cT4`R;y?AVxBES?d*;5o`y6rn*v({W zT3R^dZm&MR9Z6X3!s4X|bkD{H@ZP`ReL_tmUx>#zf0gidum^5Yy(^`&zmh37x$Dr^ z-=7fv96{q7M}~ODR5*$8%w+!n5U+;(Y4H2R{scsqR8b|klVCAr&-b!;;=X$mhLlgb z%Q4Waw&s)<1TV{0cd|JV8DuENRe`j^8D2v z^m!L|0DbCJl~)UoyF{yiyFOgha+l0IYrL7x7NpyOjBsi=(CyDZEj~bgUzarD6G$P7 zaN$Sr(Yrjq0CuJ*`L^bkLaF<*HvvZ}Q4sAbyl^R@!YecIswu47xdNFRG5KWR4z$u; z2$Qj5Bm2Cfb?2InNS7gq=qf9DJfKv3;PXNda^MaWPHcgp)0UsJF`-NBTv27mGuP5>k@=5 zyOa7F8mc=VHjpY?sJtibuJ7BNP*9mqM2UwZtak{0{fA9}9& zD*WSi+KuB~$ID;1IjKQpK`C_F3v{OEAH%w;Nk8wrusZauOGutp2uEML{`G6hOqyGi znY^5t2JO|C=gzW-Q~p{vZnf&xUJunL^4G~PznqjkJ*(I}Kk#v8gimyVW+Z&PFvon? zUK)g^d3cOU`cOK6^m&&klS)(`;gd6xzw2KiRKFj?x=6 zK0@uqXuGcLMmVanf<`f#>x~G+@GD{^J!B+TD&SN1v!6^=eSs6?6tV8x`_5}<#N%zR zh_a-{6m_MP5USXyx~>|RbCufN1znYbFHyM+`0r4*7-X+XCObZGDO84x@rt5(5E*hY z+N-of=4^GVFvbGzVb5x0?BU8k-KP|9Pg6Qo+B1%8D(8AG{N(ypqbU2a)hSiT8+%h~ z!hMR6$Ydb6`?V>M9tz@>6^GuZpw89BN{E=`S7%h{KJ{Ek!C*U6;Z28W>sHhxiMQ_J zsy^vXM6oIZu~!}GSvFu}Ij0EIK4P!TYQifQ4E=>%A`%FJU{j_#)S}(c7ha1}M7-sG zYPO8~Spml1yHNQ`flaOXP*dih#t6U|HDCvk)U`0jo&H7#}*ItXA#T<2>FSrq}= zodr}foRm|I)aA;J#;2HEgy|OK${q!2Tf(~)R8=^_?o}Nd?^cDd5rMh4sp(do*y34^ z-BrsD^>tP_gKiw2^-W~i_|sZKc>WVsoKQI3nvuv9stjVU23OjP)6`cnEa7mg*00*! zG)auNCnJiKM-nSfM{JE5}A!y|4I^OX(ikFO>(% zed~yL)?Mn$!*{G|)V_#xsPe15#@i%vF)Pbf#lD?&G)kzO-3Q)plv3!LZ`Govv9KK%=4^j^Z+gc=TPLxeBZ?3n^s3^x&lG$_vC<-v3xD1?2ata2EqLdR zJ}O4CNem6V{{Rl(x^wqiHQ-u@iEppuaUuB+@ouP;`xhEM@!WWm;?33kt!r%m0JwaD z>T|gI75?sP#cs7dUgqJ9l6`)j)mHXstr(EsIc)O1D<&J$AyS9$4)p0R=Upmf`n~Jg z+A{&VQO_stqqM0Fl;3KMvtc9TdV~J}*R8m%;*#t4k{!LrYM@EPamY?O?v|GZCKZN3&BcxIY$R1mIdi`oxWPqGU&*4hJbV+9; zOJ@_4fc-Q5YWl)UD9=9CQVawnL68XR=~}{Es!NZU3Qcr1ggcS65G3lm0*_i`k<8A? z2Lsprnw0Nzzp{135h*UQ$0yI%@ThI0sxTRCZ6Z5|JPtQ{)%3I$(EjZ1Svvm!jVv=f zg(E%NXbr_}No4JA!46oQR}|`8=!`oV%NS%65*9w01N5smG1>V^0%vTE+pTQcX?Y6( z1Ibg!&&{7vTG8n6$C<+C4f57%aYZPY(^2jH>suEJkOhi0~~d$vX({&-9e^A70;IIgIw>r0<>9-7UYhAzgm#& zZWq6$X^0>r$y2;~`_y9HB9vr&tJB!ijFNhhB+7Bd(XmI#MmCC~B9u+A46Zu*4{GeEH6wzo zbtp$3(C_?eI5pMyR{B&T7L$$KLmVpWBc5CF6!@OP%J1#c{J6nPf4$nesiU5y zJEQ1(8BX!#o}&lpT5t&*<~4pBlB6n!tQ>@wm|-M^32hR0^DE{G7$S$(_y1}NcpTlTb#=&E z^9|sI@>W(wQJuV!YFOiq8IV(uNB;mU@})XvpaAW2_n*Bhvf@~Q-6JVFXVd9cZTFW! z8OnNAYx&6&d3n#>^~GygGb4gj5NSD@#O`#1md8O_(~}uh&fs`8Lcps>(;m3(QnE6! zZPkBhZQTr+yv9{ODXbf%FigQ;Ju5<4OJp|$R%D@=?#~qDv>BZs*|>7ps`k6Qsaj0F zc^<;2W@!F+#%NdA2`7WqeQOs7av5E)>4m^6)EbUK^B_@$QBGowFwR>ar4l;{ys$oA z^=b(X79#!}H_g_hUC|1u5|(m0Vy!foi1C7bYU3nchZn5N2$_Grdw-2&JdngU4Cnoy zdcUczBqlW9o=Nnqsg)Jbjv0E;t+9lLNw>@L`u%FTF6tqhpzHqt)~mBF6dZNw{>?)e z$Ip&wMGKVw)VGz}gzr+UY>K|MQpt>whjEI$Llc4gHTZ2dZi7%2h2Tz9VXmzwCg1Z)w5f*hZaXFOJ|q;JYPgA)!1y=6@C+OOJ9XE^|4 zl7hA^q?oqIxY#(Xq?r#>qqK0)`A{bybL~>wnH7T{-In8?Gm6TwyJ-OPNfMtyfya8( ziWy|N2KGNaBj``~dv>ll*bR$mr;M~a3EJO({{XLDBof47GROa5|7P$A_y{{XdIlI1jsJ%bVk(TtDCdsehTBb8%_66YoT>ZC-8b~ZO2pGwz` z)%@0-8~_J@=UGXbBwYR4#;MNl{hFMGrf=VTh$@?0M-V7aC+;5gEwqcZ5>nFkayUPQ zVQ09_3kYTNnr9%5!)N!a>koy?HMP8Us>Sj*_3nQ4e1mfY{$TqnluoKe@Pg)j z>m1UCXI$gC^`cvyxG#+QH}1uO)oFmXd8rN*an#ch9F@uWYZ=7#?jC00|b-*1m4><-01k*~iFRs{2w>Fs`o?$Dxcf13yj2=Bb)BeX+&&w*y(I z@=Z2VqI0)5utucbr~FO-q}@>I8`-ubJNO=#0>wQ}gZ1|y2?llQ&Tk~$+o*{tHW-p7L7 zI{oU?PbPUA363`7wP3+)9(9>YfS)ex^Yd1|oZ@oFcE^v8cC6UVD>!X!;7e5=NRJAM z{3?U{wXE6Qg>A~8E_Z$3_G=~q<}-iKRs5>#WFQfb-AeqQ_z&KxV@%k$vyCF(&}aOb z(1fx}=AdWCUwX=gfZUy8i%np^irr-X;ikRO zT(rnzDixQC=X^w1LQ4JG-CvoD2FBXT*AN{%yV8msneg9_A&}}90z#*A6M^V@SD7t@ zW)lTT+Rw1_lZLga=Uk$u- zJj}nnLRXJn-`%gIuHly1T0(at{K^-oubF&jH`yg?L`*d2a+m)Ad;8Vs;MI>a5Shfo zHO|Ztw+&XU-ZDJvpW^vc`n6Wf(F4YI{uL}6xMx-J%WeU`*{?+5Q7l`eQrohrBR@Cg zT6WP&fU_0ae((3Hpz|`#Z^8TA{o2%xRjszo{C_w5)Rx72#mgB;o6256{{Y8paEQSI zAH06{@4D5UVHLb_oP53NG`}|Q_iL(vDncZa=5_gNny%xCzmSoskL6?hU;S#aZnGrl(Q}_uRIOE{ zl^^b(;;xd{%8j=F02b=uspMKZI|%o;n~$10>#ZJ1Bl7mI%Urdpm5X_9pDlITUeA$t z9-RLGcCePlv5C>!I7JbI^HXAqR@`M>j46B$-X5nJKnchLAtt@8c#-Bcsa z{n)KZoG9z^)dW@xx+>kB5n{aA7*SFq<(R!wkb*%Ss%Y6HE5D^w3y)&bNxD7CxTdyP z^Y>~7%HlE5)ACtY_*H0|u}efJKsK!`Z6h}|8Y5>v-K&cpAJ7`8nKz-qd_h=~O_7^! zSx$FX=J$wgp3d>%ZWuZFy{q(l;t$!5mvEOE*i#=Zesg$>DXd&EVp2jGf7$*VR!?&& z6hL&hU>D7OzomT9@dn;s?HO3`pTbo1uc#TAS&<8T_^+M3d2aFDI^2EX%CBawtR}4B z#G}h$8AK4Ax2sjxj#UCcHz?|Rny#@hasq7+{3}{k;ziGw%XH?wPF-$!_PHzuDG@}O zL;dQII+*;X21Wk&_kY@Isku$cr2hamJwLlzD-?fnCg!Znk57f;moK|v=V|X-ipES9 z`2%*W)$<5grQ>PB*0ReXK2m|TdR7%4rqO|A6(ZTPv|w1wqi|F$>E5YD7n0+g&}QD~~mf z(kq5&k7$mYO@iTNPat4@;##_BNfIiv*C(ROe=N+5;3n$sq6~1M71e8oYQtKcKAZ?e zX)4<%-jnW%p<)Iy-%8d9vF_t{_jguK!ir=}`#iYU=Kl44HSn$EcoEcWTKQ+~8_vMH zTpIeT;ZOp`G#@t4{hE~*@12-esqOAKQPY}*@r~U!)Y87-0xwE{?jb~Vt1Mc+y z0Cv8A@uaNUl!jrjH{JgLcDgX@-aM+z^Y9&mVe+ferA)&aX#Qp*t1YX`Gfx|pQZbIz zU?au~ug!)W*K`@nHKArH6_Ge9SFY;SihEm-u%q)HK3>(2aLEcQIourJtvkyxmE?e< z?)I*ZV1j2s=FEYlh%5V3AhuRe91*Ksw&gC0|bQQ-}uqpYSEu?aJ!#{gx4gD*tv>XKAwD-kx zmWS=Of@r^YyR~oWums30_p8sUjiBz1uF3{M@s zF^(}yxN<7unXT-|BPAPf?Mo!PxjaTwPe`s-)~CsC}D=sv}yO(_MWzv-=q$Q=jX#e0+`?w(p4qh{t|vpA+S*ol+o{{VWdu3w2mK3j08<$)P@ z1CjmT?^cFnI(4}Lkp>ZaR-7gX#^ui+rDs5e14fG29cuc_1io7Qul?GVR8eVswT(+J z4f559nPVs-Y$}h+t311KtUr1DKi#Mzo<)7EzjyC{c9JqTtqyJhbXQOAwP@Rvl5gGa zinA?#cFFsdq`O%MmfuR`kyOo_Ic)9OjES6lyT974I~S4}o5>w|{{VKfH2A(&cZ_eY zk4RNwM}6Ga79pU#PVUjAFt5#xwXdg%*_oL9m4_6s<*mDNE1=TZP#8%2wdYB7kx*wr z2HBY5@wTiaDVHLsjfy{ZD#SS)vvsMFXjX-swkxji42>4Q0?383cKp46-oKiRKR zJ06sFAdy>W$7)67WKzE*D5&$eW2R|M3}dMSXz5XTTg5!10kwI@-lh_dYv|w%02LP)701^HgnJ3Vw zv^=n5<%Giz{RXZ=rCa6u)lD8_Aw|QmKkzJ7-zUqFr9;Z~TEeU7hs=#cc|Kn`{#E|~ z$G)|CGvx+mJ!={XTm~ZywSGKJaD_hSdd6y9Ox~u|fFT51{$;MN)aPlD^T$fSjuv8q zAC(CCoBi6=gYS&>PL<0qh(~W>0?GTy7^;S?_-A(c6@T5^SQZioK)pA8@As>uvQ<@S zQ|8-T6;Y%W&1ho}7+F_l+LT2Jjl93%s5eP4{ofznse_nCz`WNjm`lj0rM_-4xBmbh zuG8W9iXCFtdgY9R4cC_Yzd>AlvX(q9?cezAc3uE-`pvXZ^S#2m4$&40T8ll+DDHjh zYOJ=ZAE*@*Zpi)>O0{gLw(+7i=)l@48C0XHFWs+3l0BHc3e1j31a+$HHa{OQH8O9E zf&4V~c?#~&-K| z@5=m?$MY4D8}8L2(CD9NIbW4493PN zXjoxi4&F^PrV$)}A`kg!NygvDG_GYWkIcCleBw~<2)zFQyxr=&0SIDv1EpTShB&3j z`^+ihI|3MN9<^#CG)uh~{pw6mL*h-_R$rDC zA2C|Ak~A$Jkej}4RjQ;jn~7u!-!vn3-{n^=t}^0JyPx7}#-rB6UsGZ@WR_f&+C3{` z(F|K!ZUG6Z^lJP7mo-jJkh~!pnqvdL2GlfEGe>JnQPZbiT;!b|; z9;TP>HMcMY`qjNY+wB^ay`l`cYNZ}gum)?Y@TI!Ttt{-nI{d>mtR0x!J<1qGy{g1F zHx)tmw0l;y_pZ#LaIe{{S!Uu%dbu2AqzYK(K3^&da%0yPGwJBw#*KT=#|~WVcvT?qh9kI)(ec zcAQp$5<9DpEk@enby=Qc{_S;FO%jZgTuuA#EK#_naE_X@ht{IqnH#XLAhev{c$OP& z*@>hP0KdWuSE+b{^KGn$A1DRC@0#Vl4`}bH_^<8rjqV@J0Y?XK^2J0=dC#--J7}yl zyL(W0Kr(;brMi+Sn*`%+S^;6(8xGaW>Tj^0EAF=y(JOQ_wx&h>;1g|M;i;@HBX&?e zVfU+=b_$YwIsO;Z;uy+PTfxZLjj0&PI@W50h|0Kku5) zX2U4PD?l$FJ8r6yC=Y|$h#Ev=2I_x`qzLMz2wrhaXB^WZerQ!{vKFDfK_`DhEBfOaR6#=MeU8&%Nc`yQchB4fLZ zbLn5L7y2?zgKFly%U}3yr|P)hXp%eprQ5T1-R)mLiOY5OPqV>sAG^y?{NGEM_ikpx zFKyMKZ#qerKOy_I@7^x>8FZHtwYeL3gSCATid{fg%l7%J$(Hh%GX?(B~ zC~5QN|e@ z;O8BvlemiVByOHr7|lr(YKow9?Nh1;JAmm0Qp5@V{2MoXZ$2pG;%ekLzBuqkJ1{s7v0Bj6PfpAJ^Kpr9x7X z$yYU_O={1cEo|p#zz>7ow=6t4cXg2(mj}PAdRNpsSHak=)eXir9=Q3A?@ILz8^C&I znm9}_>Ds$tfoF|hi6FFsJ~y@aQ>aQ~GREJv`lVHFhCY?yeLB`Xksu52&1k)%+K(*;7PL{5 zYX#w|yurTm_ODizB^9DPIo6wcvpzRhY;vSh5&`F$pXQC5BQ(Ziw5k3Y(~*(wNf&0$ zM@prf5=rY!N!8S=bQK%Q8~~hcrOL{The;?@EV-1d6hO++>VYP(zNr1x#CNuH#dnn?n{d2JgE_ZS%q43Y|Vy-Plx4+n0CU{_R_V zRN_!J{#na*sUKvZI}B~BY|(_^b5*1)jn6x)IFyx%;EFXnfX!V)mgHeYQHOpq8muPq zyDgPkJqU%%u1f{S-K@LozC>s-wx@fjl`?wQD|vF}>=pS(dUIu#g9eiX;MEOJQkfB> zQ^(z^x}DdMJmL3$^cups-*>Ue?ZVb?KtwVs%Pv0m`!&;P+F~R|Nz)sCW%^W_CW)^&Bz(v>?DCb*JW z9po7&_^BdQSyX-HscxfTh{9x=jx(|`7CwGIO3#$u5Hqz1OtZOm-5T`&0BC#HllZ^K z8dj61NcwSGhkT$|&+&cV(zZNt;}!7rsY{jLB%gC{s`byHua5OwsBU#8p56BaJC(n@ zO?Tm`b861|RPU)Z_MvlqaIJR#05kl%oBf~XNe!*JoX-&4qva)PXO!G|X7M)2pD6zT zfm7m%<7E-KjD6ld?RF}MWKni897=qVyaB=vIr`M_G?QW3Ht~;ofs`{UIN9{{sjX}R zuz}<|Q|q)6}EhZ{`tL1}k5gYH5$*l`^h=(C}uX>tTM5s@h(x}TiTA1QbzuXSv z*17CdV{#dS6pTldjGP|q4Q)$cwxK4r`<|HVQdx_8l|u;Lr_^^IwWMO2Ni#RfoxZg) z(^hmsiIW>VHxXfT9K?w|LF{Vy%(!513CF$#Yg$@C>~l!!lslf^bGM7+cy%yRZ4sIEs@ z%R_j?OJug(f>=WyHu0Xl#dNSm2~|zITygDGEp*cpWjV)EYp06Mih&*p9<|3(rnWbV zD~m-)mB9Iw)X|oVF_0dgg-*-0lyqhNDtmHeM~waM#Me8Pr8t!!iI}q%&8NLA7Uj9*eAQw(WKw+N@(=cU zRK8-z(XtPE%i2B5vN5jVj@7qHyN^;$QUnqiK`MPZgZ z@IAU#(M-;3u~rzD3Wq9vspRZ(%g#78C?|g4xl-KIi45Lq4tIZ?)!S1RP@5m>;pm-7 z_4cY|+s#pO#N(%>Y3&kj`8>SxKIu1!^ul;Paxe68FMn~wEXI32RXKYJrRtE6;e%u_Zo^NP}(yByP|iV13DW=8pr>ZKyQG8i@qHuU!Pt!bw*EBw2eyH`H95=32O zTpv-%AMIClHgd`xi@IK^bp`Bk79tgYm@Z9y4WvrsBS=Jw!zb~tnk{aUNdb;M@qiBR z;y;CZFNJle=d@%a5=F)V>s|EHJREd;9s~PEqH6lBtO8H7{f0Mr20rQUlH7v z4YpCRa&iwC2l?03{{SDaKHsiKc++`L3YeNQcyJpakIx3aVcgQru}(6sk13Vpn)*Q)?^u{&zVFh!BjFU6?<=}6!bUo6;O^~TK_hw7 zGTg_2!|(gonTeCS;gq;pUgD(pG|O7|R5D8y*Y zaz#C4lL}aI??iJx-MzhPSwx8+&PP3}qiYowa{9A*ah4eK3E+Q?aOfvVI^l<3dg?V2 z%Wy-S`Gq(?y*oNut!bDTd&wom-B$o((bT}Pq?0#dYVHg{Es6@VQ zE+CKvBZ5IcrxZn#8=wExn%5pep*TO4T4K$GUe#U|_23SbWjC^dde`C99g;`iPnP0{ z)d$XVnw9~%$@Hqq8do95HDU)T#x~bPB(5j$j*POi1KO;_K~@h{_c4!}U`VAgm;wu%CFWo_}AGnZ-8D>qa zr;7I98HZh@F%8JT^!itc-j>TL2NkqCvz~G*q@HXkZ`3c$O$4Hb82hx?oW_f>aZ1vd z&&t9CP#*x`f=k5@A>0dZ& zZxMI93}YGj6!rEWjdtMUc5v5y48)iOWRDC#l}m1syi0N%{G1GoepOo1%|rdE&nNgl zxmICUH$P@_S|uC6{t=IQ^ct~*8G8uPM<7C_`5=rM*MensR4Nl-!6LEC8<{r-As49h ztq6)4)(o5h_v-aK+nvW8n%s&Q zl*W%9PhxuQu1T$RG?vA`~t8d6*=X)!)z7Yn%@mMKR6 z0GB4Vtf!LUpUjhL$I`f_mvZ9KvL}rhBa3l%Z{n?3+(|JAo3{0=h=`sQk}kfYwqc*k zkQF0%?d@3e6qc4GSmH7K=O#bWlG)>qLFNo(_4?D}iUBl|07sks@47MmHBv?MBWRdq z`(xUoeTs@TlVnpn+LO5Ben}%9!oH69Pj-<_EE_Q7gP+5ZUoH!lvt>scyI}g)(*FPo zT)`^D?^yb*QNu9hg6e`f4cy6%{t;EzioLtE_A0D|Ff_XOQG=`=XSOYDDWN zmbhi7JG!WKs_2`#)bYOzlJ%^vB#EPa(JvfTo#)Hgz3Qs(azd}mO6?(F6m+U`21v|P z2&V+o2x0Pl>Ua*y8l_*Au-sGTDk!gZ&i3qy#})IJj}c5)1ReMvack(Qgt0`@FU%Vi z^T&+fw^<}<_p33^%xE6)~A>??idZ{e?+e0x0inuX2OiW1rxJhchN;Jpi1(YJA{E2PiV zecJGE9LF3=Rro`n)A(z<1vcH8!HJ3GfuWJrBqcI9$0PBlFnA*oz@RF(My5fqNF6?6 zDbFk_`$61T@%67pJL+*F^_xSyOS9%ZfBjU&aSW0$`^CA>Z%kErZT5ev%o3BkHK`#l zB0Q)Ho~$Zlkj*_V>fS)jE<+;ca{RwFYTL#e{UH3=Uai*^gKIUQnY_62hy3wf4Ya6N zZZ?5gPS(^7i*F@k*%pt{3f!Q(?@gczX%nA0+B8k z(z}vafWzjmJn%%RKAxzJoG4oE0g)NjF5PP56=T3Nq{Ip@DQLtka2-rpppL&53Zrqq3E@`Q}ZE5~&P>mTGKf_OH z0*nJs;$+4)B#FOyf;QHEz0I2@?W%L1!nC1|N9uD~dZGhqBDX_Y!k&eukBNRLEOFfl zOZ?KYU>E(Kro75IRwYQo^405q5nIi@k~u&dc>{0V+g?8%y3ad13?g)Dh_rK6LflFn z9!AN=KPvgx$B=!tV;EM674o0(AA0&Q+e*SCtXUs420i{&-Ti1CGUCho)g(9k2l!k2)wO0yuK71J z2J8G)M5D$QG4pQakG*I><>oL*8a0d$pVxI~%v_Or1ZI)Vxn^JQRp`v6_VudJpC&Yl zIF85uFS}d7f~mQ7x67L5n^zP`t)`YPW8uf}z43Yq(e7XKA-Lx_+hBR&kbDDZQw&7((l&gHd-c$a~ zY+Izt#HZb^Hxi=XG1f%rpyTh;<7WuYesA}yE)D7zExoIA%2OCFaBG&Uxucpoe}~0J ztMjjxT=D+^0r#)BGzW8K6leHH@~?+{6DBo?N^^%F#b0meo?6aD9qw@I~KPuF&K#f-$swmFDJ?pObIw5-vD7&~^(xSFPn8J#CqZa@-N?AP5;p<8W zu5vcV&A0fdZdG>u<*5}moStd|jl1NhYZY?RvZ5~UmYcZl#_lR7%WZQ&J6TJ7)ucDD zlukFt(C1GvV}=~p=TC_lA=W2_M&src=jQzD^jpU2WU-VD+^_Pl&hHu98Fg}4D3G1b zSN{M({{VKgnoe4oO&PJv<;2o5;fL`50C|43;9feGDZ^dP3W5Isj}u<@$e(06J-%xB z{{Z3u6ES#O3OjA|uDl~$$CZfG^4l-oIfh5_l{rtPT-bGqSGcwN> zQIFsB{{Vqi2%E`wjcW8ain#$jD<->yBxylvuwN|Da*h80eOF;@H?C8K70YSke9I(5 z?*9Nf>TTe1M2ddxan+EV&X&&d-Wd`<<8S-syIU)XRB*euas_budPZ(?>62Z(ge5=; z@`bJml#Z&#CPW3e4g4pyY3?FHgOxwSRAPbCo#%0P9ns7tD3xH$CUdbPKklknK)+p`~`|{54p# zl5j`LE7Oxb7Bgv$Skz-AW}dRP&zU~$KsSSyH9UdH#=?xfT9X@@42!|36qCz;4Lb}* zds2_OB|8<_gnu$|Pd_qlKQT1}BPwQ{8aNp%n%LNjQQswzi2d65SK|XczN%!NA`uiI zKf|AT`=;;18`o$;dMAA9F&nIo3A$BM|Tu=%8A7xJ&3{B-4S1cf)b z>x%jgL2)uXF&~wCH}O}4_}9#i=*EnrAAfJ~*G3W=o-I~+z>~{j9CE+i=}1A58*lk) zh_UlPUbxx~PO4#y0-rJe06DJOYjZAx)JG&r^9+^$0D)GtF``6WlYZ})n$Lv!Tr#Qt z_V2w{Bc1M(_luA2)8uUm1*>E%H+|T^+gi4=yovjO2jFfcG0A+QZxIvuA0sf97-K` zY#jdpwf^;UR*FNZ#u~aycnh#?i+;T^*=K0qBiFu zy3qKi#Kzt`cP1`=>eqWW>_jc3eK(neB!uD#NA>R`w_Fv-MzwFdGBs954+fMH0JDxF8$YjCt{_52n>|wj- zSNV32;j7lknMOEHD>VT?(6s*mSD)^Ry>7_LOsltV-KsG#4%-{|b)yOcv>&_u+Qv&z zaA??qLmYXB=W5^6*`rY}+-WPE(}7LFNB%oo&`#xkWUe}i3i?>=EMS`AWs-OKKf7IR zs=`@Ve6`AHLQg5C#&-ShMXsvBWkKgR-t?{+$rS@}6J&V)F7;yCA_rQej7uv8KT5q5 zVU>39d)F&>G=4<#+#!o%jJNRDPvEr)sl_(TqBvq3*R^v3Bp)Z=s5Y$IS^r@d-s$ravAw_TqwHG0lxF%Ua+thl#s*hbVHed^`An9uIc7PFGRf@Z3+ z#TiJ3#y|QEEH1uUvE)>7v{G$W`CoV5?OFm5HpUrMYnh0a#X~QW2G&0}&HdWHZ*2{s zbDWm>szB(mh)*Z@cK-ksOKw=Y#v=KvIn21TM%GEUDuw(jR@N*d9`#1j8Dh#0m7S|j zB$PU*O5~i!1az8cWmPhKwb)x1;4|H+Uxej#%7LJ*@gcAYxt{; z8zoj!ahmMB0B489cCp(0%7>?@@4N7*H^cl#-j+rF$ryFP0*QA?A}dv!c4KQ8b;dJ{7#og&iwZxWz^*E>(8squq%zN6Stb`F>hr zh7u{E>>UY}fJ2XzijGMGFUV;g6#$aodY>NEkLDTMOU!;{O`j%fF6e{q2h&>PRn)=0+f`;40e53K|IOnjr`$X?*j}cAdxBEa;PjqKJkIc!4FCypn zp#0wd08?3!TcZXpxjVjEot_D9UMSB_{mnghdCLl~$a(pz->0N(c$Fon)WDC0>Fd_3 zNC91rIH@EunF|oZKX-LR?J`IVfn7H9?eA3EWHHc9=jJ%cP`n)W{{UvLt+dmq^4|n} z!D*sAMVRrp^rf_ubbF8A2WkHR;;55d3xL=xjijw6e*Xa9t(yyXmAGG!R5tM|03~c6 z_Nx83k9Q8oZ}6{A_!Vb-_ew{WMUSEI^O zS`_C-?O5)SH<|tV)Gn)Rj%{WnVH4rAI&BtYvfOmIvhfrnavFlmUBI zOCeO)I?&ijYFC{R%7a(rV>xp%#{n0t}y(Yolw$ zj4~G8SWpK<$MT*Uz3Dw-=hAjaSS;)K}En zJPW7k@!KwT{{W3u6|SSiJv205Jq=Tol?R`@PI(HkC#7ayPY@eWeAT;=gi)6+bB60# zlD5{|MsZgdXQ-+fO|8DNEQ8EGXSFvXM^(--LZNrS6nR)VA1fNnaYcxT$SwReIwGO@ zM_Pt4&g!yV)pCoR&^Zj+SR8RtDlj8GDri}Va_5fKWF{BbRYpSCY)5L0bfpc!EzLSS z5C%F^a6lNP5M+p>zi!nQ(pg%Se8O_$ihkG5!QPxiY1=y=mFni*qYcTdhzMQEOZ~nA*y&%!%zUO{tI|(P_YolZY|0=kwk0rGoP1}>Fr)ut9%d0 zTUeE3QOdfGpXb)T);8!qV0V5MU+jsJ6kwX;o?RY?qle9EL#g@iseBdJ^yk|Hq|l!H zf<3n4xZD2#hdS+na~usiFQ7kry5he|n?<%|Ab`zSm%bf}V!m8zj6dKt$t(ft)8Z-p zqw^i@F0GTuo(D{H`F8V1*k_S&qiDxQuhF0QKy7DWWElJb`Ky-HeiGQ~B#DqGl5zqr z-j&Nd6FodX5ihoWe|gOln|V>Pzuv1$Fmb$e74`k^!Cf+U-#ly&M+5I?`@r`90Cu^% z{{Vuf9Ilu1ZTYbMzZ&6|23wxIGpa3E`Iy}%HZOmAYDuzO#&=@9?Y<9P%e;AKU>`Qo z-1^i}{2A3(Y@twwP`tJ)o>)o$04dQ7&WCfxzSLqNv(lJJ*ue>Z;^w_ZUxYe|cVsLb zdw;V;KMJ*&$|@%(*QeuC^-1aWC21lHC2;S+^+v07#KhM|$+heiL|| z*{6m*`!UY(kELl_{42h@Zze_EEB^ooOl|%uKCdpq{?eiR$Br3MTPoYdL+2m|2j*(} z0X`00MyYQ)DlzG^n&?yDMAAgD##SBuOMJwCwN>>xorV3eL3KV@hUzXYa9z)F{>^E$ zw{lysNPblBUsc%r7Pd>5m&)3qLj0re;=0`{;U1e5yF?>l>K~pzyIaFAnaNX#sI8BQ z29>K#7-WsP?4q}{zXa;{DZV%e2e0?B{cG)y_*d46AdFiKBW^+I{_S=)UJTRi zdw+CdyD4ST>Uni|nRGrE)4mjHm#ni#8NpogHj4C3BjEIn2H7^2Z=1} z7Ccp4pe#oKS3;zbf}4AjmFxi9S<^mScTrZ3_~Xv()=aV~UMoZs)MJ@kZ)W87t4IqE zmxUFWC)>M!N{MeWgl^hatyq_ShN{Z3Hpb-DSCgDpb6lOc2a#38@{#60AXbry4K`@a zJF2TUAXPS-D#VJb_K!E@-O`9dJ7ABMYNK$o6b+H(zFMI?p%@534r@W7m(1s&sr;e4 zkO`xenpxO-K=LA;_^mjgfJf6O9cqgO<&<=*ic{nWIj0B&OVLP?AkWGwiMUm5!|EXpsM9FsSuHe$~#jWZ5#?6 zl&QyhgcXc!tK`t9G)hn0+w#+05Xb57QKFCd4N19)*he45PR92g8?2jEPH0I=f-#X& zM*&0ov5H%JNedG%O!4nUMX56_Y2n$!FCcZT$09V__p?>4cET8eRwG8(%+(G=!F!^n zQF*2hH{~0+^rtkWDw!6gOs>WYP(DT|kfZJIR$_Hek;d>l)G8IusbwNnwE1I{xgiUz8e!WLTeh`?QHs z@x@OlqE)_yB>`kRk$z!XIz^OkH=T03k%tRe_FL}n1O#MO-leERp+*Fsc!Ed#29qBv zxgU&tM{A;4{_g;&_1j+%d_wVy>URvDXYWICgZFEv_@U#bds&P?%y%5^IAqVDZ+iL4 zIfcPDG7OVhRhFiz8i@)t_d|Kh=XX5S=ZP9cZ0%wF+NqR@ywBqOX^n71zb`eEuX9q# zm^&5=xkufs+o|>`0A&a|lNhFOOFr9P!Ij=zYuXk@2zjR}Ow)fgVIaBZc&-=BO0(q#FrvuG&T>6{>H`;)h{y;J_g0>;2VITHKZi=i%KM!WNVgK~ zW*hU)KN{AEiB96XGr>L0XIsL*JNaf=BLso{^VohhziVnFX#D8RMnnwCdZv4E=~?qw z)|554`+F!|a=AnwDMdUVtz4eoRB`1DspH#qNG+s=rC7HECr@hM)9fXR58idhdcswE z9kGpwbo(o0MRW7W2hImf_r+-u97rBt-Nr}*p67r)`KvaT1sD^8akP6@sj(75qaW(d zbLeY^ZJIdhbNGCDJ2!mYJ!?+R$qe3R-MQ=Q#cA5w#~)vq_RVZZXk^2C5?i;;oYdEkPRA0imT=h1#nwh_35+fIKhu6Javqe}w zKnFa7{KZ~dS!P|*fPs1A`Bbr@Gi=6o@=t2!mgAE5N^Gqu+^h0|(whyqC?o>`Ygj_^ zXJ-I$k6JvWjRGE|^r1(nMHo{;>f>IH)AFhnb(84D(GS z6Q`km zAT~Bj*S2cYL?t;a5tE*J)l0N4>*X%&@K2>&WXxq93NuF+nUFZFtCa)yv5e=x^{q>X z^4*7UD-rt$$r(GVx{jwEYIa3;m_k(*2@crewRGF5H0!jM6M)|{jn$q1Y?f{M@8{;_VJ@fUie_L!Kw&2J=oq5%#X_W|;E!eaQ zM@qRPBPz6f4`1=9p^iA?8~$8V**-$O0q5Si7Ut0v0S(F9>*#7i0RG>DQXLl^u>w`Y{_Z*|>K-v0UTMOMr`jJJzl2o88tjKt1aue4y_6@$FM%BDC?O z+^IZs*NS9U7)4_aKtJTvvj`U7a6V&a3J0mCnWP~=T*yDY(EWWV*oP}0|JJyeRypfa zLfeK^VAXiY&%Gk=M!-3*!{V%uyOX(j%Vh20g*6wW6ZdHox$8~mJoKxIyCymlLy-9# zgI1YN{oQEOuP3k$-JdXZG2&OTaXDdo8&aZ4`b+#=+A^{Sgz z5@!?QwN?f~cpt5Jb>W%h#CRc(IrOh>*CLwbK5v(9P6c><-_Lr%1`$p&J!@)fL!PtL zsdBiGMyCaPb~Na%rEW9*v7uOl@d#J7|IX^Gn4OM zHtWY$7o^->EjN&+x;AL=XS{{R}xcLt=^a!6(?j&XzZuKd1w z*yF_PbI^kkZzV`PWcK5|XhkIM1aZbT{{S6PhT>wu0OdaYS@WF+@Z9GgTJ4tSA~X_2 zX_h5Voq5M<)Cmh>LFB#+xy(?=+wPlGXcL0?HuWZ*PNZhk_)R^wXCGyTs z2e-Jbi4CkQ(V@e)bKm~}tyn&6!Q$DsBPv{Vsb1DoE4;(a#x`@-yy}lzGNN?$sBM#E zP4~ZwwRFoR^IheWe4Tl$OE~685EFpB)~rmaB2Et1Jb(J>!YI}#-A^}hBxP!{%2zDF zoKvECBUTLCkdRG30#DwlBipf}YfvPSe$_G(fx_bkzJvHtE!0S5 z=?chW2*=8pHa%l;T=5%3Y%n6jY%N>t%p*IWHid2k9+kwHTn7Iu2so{OJ){JSPM1~)f@+w^84fm-n*jzbJxwf3a zqj3`&O4iUXrHO6j1Yx+(_o`7Jn#^%)jTh;f7-1hxg>a2iIAH4{{Z3) zNgT3CDcnCUylt<2xKEQKy?AfL6=XuYcNRb7(lVRS`P9Xk2?vgOsiK4k!{o-x(wUNE zcw`vQdYPj~iD8Mb-Hi=1hH<$RX(7qH`A74w75JNNAK4A`Pq|BNBcpTaUf(Q5VPGF6 z_{aXuUq5_Ews@^fF*XbGbLsx=cHpGk&J0sY9!CYDr0p3y6YpdDtNq&BduYKy1Zv;J z2==UN1Y!d>-XAaj0A*bYO%jwy_>!{VI4C=c_H##?l}2tZqC!}(XRISzU^Vz31d$-L$iVNR_66k7`AtO z%4?2Bu{0ZcVHD>TqhR~nV}BiHMyv=Za;B{-JSx6gDr_VD?A8-(=%=~%AHwwV^!Q;9 zmS6n^tJS0hX4&^w`_<(i44&dxB6d!2Gq$~Ha+3LN^9t53O&-$Nu2o}=goc|Fq+w~Z zv5yM<1wv+RyK}`$iYt`64DP_LK2uWtt7;g}@c#f6Q-t!P8*1iv76*{DL*f$^2kzFM zRK(d-;-iSNj1}Q((-+{aRWe6H&9`##yVj`cA*8n`&9{o5b4e!E`D(T6vRk&_nUs9H zsnlaf#eWr`k}XbENjP)C^Z{|S{{Xv3ozr|kR@f9tfbTj?_ezoA}mawA4 zISJCUgYI+H+?Q1IRyk!WR394+P--4^D!%P za^$l0Znf)RA4AB*o>j6&jEPt8{n6M8b-WCx3-Y({@!Qg;idgPQcaMR-OgAOJ2ZP?RNMa5Sc_4P0Fap2w?f(F3sG~`8j-a+xyVUm3i02Q#1a$|$ z`&5h2>J|5Seo~#Q^HrGLot0nY{_p<)Wmx`g!;u(#7N@kxjH+{=yYkYIIUR8_$N^^B z7qwkflL%j&S2=BSA&+4MWBc9fcHTyhXa_6kYnrDwP*ykLxyrJ?O4rkT*DD@b>z%Z_ zS!KX%FY$k~T^*E=z{NqvI#-=J7i%4jj`&BKry2Qce$HG-WIWe5Xwgc7No4C=`f`D| zbxquV_3N5)9A2jVyn9)gx6Rg|oo2pd4#8G4k+=PtkwO;SIBHl`P-7dI)(@D{3!&9` z4Y903gAcsz!C&tG04n?E!=(QJWk9Rb95f8DRr4;Q#Pd4DfIrG9jH*4`^EW_`{`mRDfD zi@Kq`PI`}19u~EGV(8_TpikgILN^jh|-f}$nZH$~pOTgRx3-!a?U z`@irS>cYE7^Q$j(@uc}*XyvI;+zA(V3Ey=ju+F#Y5tnN9Cy&ak6B;`1%)5T|dNn4| z#bQM`lLhw=UrM{>?qq+uR&0no%vCjkwzuV0CedvkkMWiBZ4a z6_=)4pCT=-fPVF9G;XR@8}59y$x%Cw2lubVl5+K3eQ-nci?F8@BKb za8@EI>~&VRlMx(Fm}B>k_iD@&thr*PaB)d(0C=!IX8v^I_$mn6MRLn?M23*A!>@yAnj;kW?!DYvydT?PJk?^?fVwn)F955bg{NHR#K8(a=@pF#iB4rbZWZc%>>_;~PTMYz${;<23Kkp$d@O zd(nWQmAMrD9e>)W*ClOSAk30y752^6;~VX4abFsIXtpw6Lh+nqEXBG10D#oJjB8(%`Or9z_j&pE zb6zRq=(jsc4(~JXxAAda>uu$`O1pO}H_iV50k0DA%t)7P>UeGnx6AUaZ-QR_r-Hf|)`^Btb z<|fIPa*DnZTZUN4z(0Hc0IgY6Q6ba*Q$$Q)`J?--TKZgOZPHvf%06wintnnFqo|_xytYui0kyZZnZrj6X9a&E`l|!kW)uODi z2vN5w6|<(CGRAl#xA507rGm_&Exo>4>+NA=aDGxquP(dPs_Hi!v@tK z-tSRbDu|WGC+^k2geWJ0Tv8mjD$i`MAU|*~>t3nw$(lV`Hva&sf0X|Kz17~9gCNmL{ZQ`nvV059=U08cCTYM~%@D`U&~$fa^sl|?M?v6VK{QBFOoqCp>+ zLCY`8NgL$1%Z$=O4oPZwAUOnNQ@8S($Z``J%KfY4&yDMEcjdafA1XphH$vx)!~LrI zxtYW+uC?;l#*2L0qCxUM&i?>69XhoREi)>wL*lO#LXtr#ZZUimEd2zjpSK50PPsBV+np!!>RF->5wu>EUefI@}cjFu*5qJ+qbJ` zpoBR2!k#~e)~1F=d!;0Dzc2f%T?EH*>cEyV{LI}d>@ON7=l=Ko^HuzmX_=el$4ZhV zMtzd^piH$m+{@%`4NW{M9jp!c-5LM|x_(J;QG$Rx$qoeO7+yC5R?Vgi?#; z?fc*FR=uGIc61A@W?Y`^lZ38l<9%Ev=yj8}hL^{XN~ubF`PR;RYby|6>b?0e8AFr#zw z{*}o0G<%S@?$@5x*mw;W`(6u~CfOnpuxD#At|{4_cpYo4_=4GQHS(#Rl(n1FswKH8i1P3ZbhCe-UwH5wTLide?jK`YB=Y z6`aa&3D{5jCy)GkywwH7+{^pFYV?nX#&NFN#DjX|IsX83RLV9tqoY3Uv)(M!xz2mh zbFjtF1XR#&TPRTS2d z@^0m7(NA)^midK9@$K7&-Aw4m(wyHn%_sZ@nM4G!mtg5r2(Wl>mZLG_<`k;IM%-_x za<+tzl6}Y!bQSW4?HLz~6l9aV{xRgcYiV2%kgzj*cS{{R83`DbKxXX9@)>E~5p3j_1=8|hWc zw6Z38Zm)J1x4d}uBdKMjGq}$sYM3o4W$o6cAUk149jUAG1A(|FKU&r=Q!YWPCze@1 zy;k87#@Ii8p%VS0l^l2f0D7LW7u_O_pYKwY*eweS1GA`el~(H2s|qw5n0?*VMWoyS zQMdm9imUeVy28F`=i0E8d5F2M8a=x2UV^q$A1i^l<8eRTtay;fp!$99_p4Ge(yKz* z-^U-rT+-AF@lFc}f%#A8UACU8A`Tk3n>$uXVh+4+{{Vq4b&ENLSpdjAE0(7(KsqQ1 zm6IoHEp>6>t@!KrYn0MF%Z6wBp?~q(>C=2_q;l2CC#cahBn}vLrm`WNGdpY}ZYe~B zF88I4H+;pj{nJ^_K+_XxK+6*D2mb&;uBX8~YjKmzY}o73yH_W_%ZREgeeasPKLftq zUf1PT%%dag??fbRLN4dqIzTq|il4)dD&%a)tVi9bbf*T%6K+5oR;;vPUu=hN>gbG* zVjB>ugp()knvK<)w;r_VTt;~LmY9T~Qhx8HS~Y@w1c@1m+uprH!f5c@GP``nyuD<@ zENFI`^nDS_TVR^%ptT&1_8YMeL-N#D6SSi{aaa*do4Gr&M7PPiDlnqE2rbDmQ_ss; zvrf(Oe+?wJF%YC0tn&kaIG}IHY{O)DUIk>xOC8aT-nD+}MF1%{th9A3L+~g_)(ok2 za;X~*^&E1>uo+m7m$vR}p44VoCu|+nkuCd`ZGoApIjmYn>)pCW*lNqVyP1cU$BM_6 z^5LNXFC+M?Ij&@R0B$it9X1k3JoY)_qGeLd8APH!XpWq3SE_o5^P?8M9c`lz3<872IH?%TNU;J@ ziREeRj7PN~MRky&*rSSDXBch6tvDg)G}Mf!=B_9#Sk6~HF;&@^5Jg5_%H>@k$6~18rN6 z4b!z|laG)tD%>p1(wrnYB6K_W`?#kT>^oE`CzrwG)WoUws^~);A7~jIRAtv7ZKZH9 z2kA^3LBOo;G?wBJ*$fX_lVMb?Z?*ow;11;?ZU4$ANFJcKnv2f znRYhrl;Gi%XRTxG5vRA8Lz_(=)DyV|N4+1|kW7yZiWE1cbR`acl!~Yh=b{u9{p4E2 z%ejRQhwWiTOoAGrmqxaURRm+pt^N7-sN_43&CM@jij8UCbDUig&pD1Tg@3zK4K4tD z)`$~~9y*HJQr|K$s1aGiDfx3!>Bq5t+Fi`cdkbj(Q5u9JZa;>YnpLl!$`B^*`1z}B zENK#`90~}*Tnq|`VdDA+wPh93tn)y`6`ES=xB7?oxD_kXaguI`!qGo#9@|Wwx)@AB%i%Yl>5h%P?P1b%~vLb zGzVl$w0=}X!wf|QzG9=jS2B4$sm4V?+?C%0X8myu#ymNEJsm7BQ6xhLsOS0I$#lkZh# zl1qGKZc|T`ZdL~~NZW@>rdtQ*KT5N5lE?wKI3||cPgtP+>C3lMM=2b_BP58TF_Tf- znH`uoz^NgJWTR(lwZU!%FYQ@Zc-SGagzT4 zceO>lsxm34WiJ`>`l#tqlIp;*;-gVqncFFo)Yd$uLmh(v)yY|gNUZEIO~hvvQIMMq zD&Vy=pS|fy*aHTn@`5ts=AvUrjaBoKI#tM21sLs7D<9&i)w9o~RUwj~U~!BN)p`+@ zP~#N9W5SiGqLFtJS2(3oLaidpTamY8RkIKQPI^^!f0qqbnH%nd#bjv$x&T{0!%_xU z9VrxTU8b3ly@xan%vgh`09DI;Oh$fORb*F0;MLe80Q30OK*>9@GDz-szj0jjGlkAmZrYaWEuaF;$*L@l6gT@-&ik9EsbVH+ zCi(g=-JubdSG3mKkJrJMo>>jjY6$_7lj!pkP-k z^KBKm1+$>@lcDO>OT=+bnmd3t@6R=&im|01i2VN7f8;-R1jo!sreKWC^Dy1TR*Kqe zGZWY4{{U%zl|Hbx)9aTe*KkOkm+tLagZI|)q-igbKZ&up{VTclN3@!;HKm`}zEm5T z`jc9az@A&E{6=d%9z<92&hUB)vXI=|Iu`*IeLbl`ITufI_m^=TK*GDRjMd9~XDaV2 z?ca>&idfOe@?qiJV}JFl##lUp80JW@57wnU&d5XEEZJKNAo4#Xbb8!?#``92Gx^hP zE!ulder0a{)wicWCO>4#<*%!xzkQ4j?yWa{O1@0`BwZE(@VACBq15k{{UL9 zt(+F+T0`^W99D&;qoDy#JL9!-%2zt00vjuMqdAaezm-k`MMwhj+$b^6hjNxZJ#)~94JU>^RRYY8)CyNqa^@=$!M)}oEoTx{=BpFCq{7zdA9 zeYX(gr#bwoSzAzJ5e821RQ9F?Tm{B9_p34~RPz-4!?ht<9x)?fRFB6$;X?8hVq?r@ z3IdFRYSe0{uW_`Bdv3;aRQZKji}C7eTezE1BVeh72W|~4(J~H3?&6^iE*o(KZ9kn@ zo60eO=Kzl0wM{>S$;EDGqRTPMIZ(eSAN^{UJ;(xm?d0?5J!&|kksIabH6yabImjcu zRBzD4&yw83^0WRmM&V^+xbs@%iAj!0Ju$^)$kN9dDf3|Bwx=tSQ4!^Ya%5os6&=JZ z7=_$C?A78#f=%-mgwsq*A$1dV5t# zV`pH4C4ukOw}kwRWX$`B%b%Bnj8-6m>M5IX+z(JW#c#^YaCTs!DnY7DWP(EHzsp+E zs&dpZUftbyCsl4isHKKC*)*Sh2H(B?D)|yU#_MCi&hK+j-9m}`#y>c&mm|-eC36Q+ zv3+J2vzO*YL$J48n)#ydOS;o_^|5p0%WlJYUzlgDeL?0=Z7azJN)u({{VZfci{0-jo|h^cQwI5`|ESp{1+TI)==aXBn-E%E7esR5FmxV zMISKtuORS*S903Mj!p-EUu;*Y+nEsnQ&&}c$Bd0TWnmxB)K%0~X)sU9DutwNChshq z4!f%02&}43(tDnjDj^rjPYGyQu(?j>(vgbX{_hyu_i7|eH(kP|w3a>JbLA9X%+N%S zFXc(Xir3O5A87%H1J~+FXAmwN-|L>SQeP3<@o1h@&d9D?C5E zW~$1_kG!6~m0-%jSIQjHY)#wPWYKg8h>%?#F|cEiO?ccg>`aIKJ?TRL#c{&-G~mP) z0OEpViJ+2B<6@4KUZcISe!kTh*$kPL`u6mx?-^%|#hd~8RYi_F92M(%viWG3X!~@m z>18XFD~$E4*9gke7W?G&>-yD3P4J&Q@@iC-%-yb1SXD%1$aY82e>#UAVqlW^J^IwE zZWTwGbB@&#NN`pr^2z02xaO@gci8{exSTFX+emO^;9yfXmd||pbg5(egK@9L+CKjP zlH`$+s=yrLrG%+oMOTQqcF5waGh`oXQId%(mLt*CPS&d-_O|0xkwZRLq3>3G1~czN zmC8!!vNGraH1z-sgTmASLbk$krka@tV)mhIWVbW5QWD-l7{ihIiuvnagxX3&I0L>bz&vL*HJ>agI2aOo{Xdm^ z(n~8@Ge!!`d3~J+1%i)j#?t~DaS0mIqyughU7xeDBH8A zzr9Z#yn%PXcdK+Fq#?vCr!G){YtT|m=UWzSAZg-_(Y881K^zi254CNByaaQA4tT7n zM0WP&v&hF4bR42ePS*6PVPkIENSyxY zq_fEzrJDnTkEL?XIsv+|7*%&J7&UZ|O0vQnf-%%q6^hDsM?QD${{VZDTF@#fSe*Rl zrEt`Wy~^e<+p{q$3Bawpcw&k+Blz2#)>XXHL%CKh?tepCcCyIG%ENrW+&m2Xn$A!! zo1uCpLO^0cW~&V4en~h2sgWhjVMy|49d;eq`W`A37jw1BPIgB7RAZ`rKD6MAS4P0y z<*$~0Wck7VRqekFb?fOQjweKvIorEG@Em@1;kIC`aYPP$pfif~ABC;E)`rN=| z@|SKq(&jOoPnf5J=PDcTAG~V9L3APKpL%ubBhF;T82#$79nup3Zr>@YQqba&LK1wy zg|OrAX1qJ%D?(Y_)6aeTeaHU*s=dl6!QN!~pN-YyUNrKP&W04u{s}&VwRT|TB{Xni zHatmTc=uby_nVb1_kS9&w(!R54a4p#o0t9rQGg_WBtIX+_*Amm?tSvE{PH=@+V_qX zxa&fbznB43TGY0UZJ4xEAK!fVC-}XW(x9{ZJVA*&Tn)a}d1JPgLT&~^^zY4aFf^^@ z0xj;DBmV$GtBZLovM)TgmdmdybIs|QkWISW@Klgqe-$~Wc4Ki>M&NK+c0{{UTC z(^e~);dd2&Mk0C-cS zb(VaAPBIZG!)zqgO+WyQx!ORdgB)xE9nDm(ok(?lk5kNna--#6iVzv35{wPFAMXnB z1Q7xkZg%|N@FlN(__G??$L4+EpPSmgdh#AcX$Q)q6`GOFTXOZ|J4gGY_s2^4zv5uJ zb&e|}*!#bF{Qm$CwS5h1YST;};Xl=`)&Br#Tkltnc>Fh*XG8KZ`@V}_mI7;>^D1^c zM%5*TEFN7>cXkWu^r*$ev$vT2k3;F+r@tY9m03hwZK&-c$~$A`A9p`?y+evd)Djd$ z>>K|8L926HsAZNToPT%tt0!~(r#bZtS}^&5Y%EuAK|568ZQGamR$Kv+CBrFl+kf33 z-mSZ3l(0^nI(^#boRxDlfJM4T`D<$4A#?Id42r|(YG_N|J7{cmGe}hYrm7Y@uzFG! z`T1Hf81Y?}I^nj1!i7fYKL3&Me4p1v@I zTX>4@8PS;w?ngcMdVMSOC&eoN0NFB2w3bo8ug||7i4LW5@<)bO8 zbFe61zTYnD@h^y0?wm-C=AV^+`t|KLCFO;D-}R!rgW@X$jpdY<+1EY4-L9-OS25+) z*zjWn@!ha3y%X;P{VLO3IXe^;S|MAjmogk|UY&?qRZ^SwpSxXfe9}0FtTMLOE5<8Y z-Gn=F_m-&GwCumV?z=~&SXcqvjJVp}YgqGjDH?Yy<->#bzGLZ21F{@1Dn4(TtH5M2 z82)m5H8B3QmGSbm zDkw<8P0O06X6#iIeA}x2%tw;nO68GdX(KAiQ|@m0tLWc_3ac+Gh9l)Wzwz4n=rU{w zYv2A9sw|N-o1MO84e3T3<2S?nN70PCWFIfxr4mWFowXmHOE)`IQlTL8Ub>QJtUfo& zkbj1nfQ1JevrP>nH}K(VP=$Nql!8cbO`kCpRUMUfV~TKj3hqC4pa)>~tkUM(#$tp6 zk6MkDu)x!>U*`9ueZ+fJ#TQSMp)m^q^E!cF9{gFK67HL84f{f`-mkA_gqT>G`0wK@ zBsb#Bh8s4qKBVsXXmKW@_fG|ebxFwCx8|=1_>wMXlwC%H_g^Sc{9C)%xlF!M5{~W7 zc*l@DBXr^2Oaw=c5&oUk3J;Kz+ zDKkK`mgU(?k^b*$-4dj`PCn<}{{VWi;*ad`D@cBI?Ndc8+m$0+r>$oBNPb607Gzar zJGPGXW-a1XkbIxRS-NW@yGI-R>+@o_AR&}vw@tOrCW(QfEhLduf!kZwXk|r>$IV#w zo@fn?yG3bf856Qf+q3s83X(Ra`<=FwrW1lUS50AZ@|?QzD+1K9P>A0(br#z~060B< zTJz`4aW~lMtz{EW@=^skgYH5+%gY2}2-;CU^N;otlx zcWRz(Oe!yQ_;1EAyteKG;S-X(f30|%hmt7*;Yu*Z>i0c)Ls~t(ynbHnuI6n1wc&RW zO&sPS_dR|80J~nL2kvs7Eof>I$mbt7mce$NwKcY43dC-2T6MZc&^%HvI3IeTj1dZs z>s?p-B-pyg2qZtp$I#OlIslpHcR8t2IMy}aAS3?(W~hltq7rUxtMZNC#MMznOLJ1* zDP6gb%o}%Z-BL3nZIkZ%R1o>lKnZ3C?|igE(lku-4Zie@%P^L9S7rHs+O4=@^9YGo zyH7DL zJd^WRB=;&2IvXh^iShS`@Yi3ZhDigk%D3@XCl@lDHrnfSuQ6E%`C8(T;B;~3WZHx7 z)x}2H$fsLIvG6&~NFU2B#z(DjHdIKYjWC4rSHJsJzu>rCHMnji`hd3z7(Qzheq^69`c!^qI%1X8kyVQEP>q4MEiP6usKhv9N#~6G-!(oq!w|x&1y7lG zQ;cjm&L7Z=Le1~1ss37US|us zPa}hbZ_L-Cc=@1$?8gf47X*~R`-;Ebt_5LMi_DDRj_20B+HLZlJmaZe26*LQIS2Hn zg^>nV<{tGj$F@wT-T-Amn!fJT=*Hd17bmW2)3CY`TqCjvAH(?y(h;@6LWNmCs+QyT zLP<9TeC|{HRXiUiJcix5w|}!)$~Q#WmhDlHF<+I#bgS!aB!4vD-u@b|1hJ&ds^2gb zpo|qf*?#{3@YYUTqA%OCZ*Fn_0HIZg?xb|z0&XF;)ks|oOy#!A{{W9xj-L`nn?rC1 z70AHafPU>?JBNSvYj)7B!!FU&rE_t}RK*U{^S4E=rqKPyf4Z3IT#_%5okpK;6lxcz z_iJ|5HnRT!5-nxf2bmG$8zEZNwJ4(r#{U4i7O|Cu72Mdh2(lmH%}VeFZ|>%+t1@hi zF74HA)twKuVB_x<%4ZoRBgh{v-@I$kejGH9;%hkLKRcFRYyp-H^#ZtOQt)x|d)Hy` z=j|!4LFBgHd2hRc-{ztbMwGWc_OfT1)eCSc2T5Xf^36X^1uW5&m+yyRLf? zS`95Bby*u5YN^5w4r*(t%V4^eLtAX;W3P?zJ zjp0qFp{P_0<$s2(m3CY&MW_-s`G>6}gpngV`FZ{t`6u>_5FZXsWsT=>FbW-lGRK1c zqucw~udS6tw(NjyHS$O869moS>x&rnquer#o`2P_b_9QPj+Dr#erR4m9lWTQI}gfR z{hFucvMTQx3H<9q?eROUk>03IN8K!cim*-0(lFkIS9i<@%zwzQZl0*|s!3kOwwL#3 z=K4_>A~M6N>6(t>1&zXk^5Z$|Xo@C^KQ2Cr(|2X6A+hmBV*UAie+zA`1d$m>lsB5J z6vT`tUcKoebcSHD50@V`09qwvZ!MQ?ZCWeG7$^P%S*be8zIjc#`D*$FVf)A1pU$$I zDhSw$RgCQ)b*n}!tbtz`>}v|%9F;2n0C%|m0NJZX!dWf`E{B(~w&j0_e|c+`Mn_9& zBa$=oHFOq46S4WtU|Prf#UuS+{{RzPrR0o>A{_Sr0Cu=0{op#CHfB}Yzb$o^(cu7b z^EGlhMkEO+O^^N7{*~E>a0WQ8c^W{Jz_E?_Ixul@67KK*lg18kK-P~_Z)k`$H}F}-nDdZoV5M*+U>YRo#5Gzc1pF+p`8 zxkVB%k+btwRIuDTv4wtS`Btpm$_o|G%xix|me$5IadyD$`@QO5u4vKCf5I!P#(}0j z`+X}WeK!8pn8_l#{sm zK%D!Q<&9zMT7)JKk^WlhFJ@bKBwgR`*OP0P3aHtBE2b#TE1X}5F8t`sVYe$c>0J-Q z9}SC*P446e%2nigp4I0DSuZsNjf-HoTKfM0!WvKZW}h5w7!Mx=`kHjwlhkteVssHi zZR7HY`9P}79Y#fHyM68}D(TcmvNrjvMsk#-&UmVC%H@wromsbSZi1;yxEWJf+uk;U z=pk=W)~hOIzHXHvjBek~dQ+F~oSczamaasqayAZ>*x^$!AYdM9+!3n`)X~Hk;PXx* zW4=^Dv~;M6J8*hc#*FOa_-el11zJRMra~YrbK0Zwh5=qGe>6vc{i*p~g};Q+3zZhi zp+bzw(xD_i)g3)5d0!(6Dzk&Q1J@J`I&MsJL1P;z1LdXYg!IKCDUh6wluZnJ%8nQx zyH+x)GObj^8*{gzsbb&#|+8cE;^fckT49XAPrxqe?Yf!y9l#K2&8H2O_Kz zftZ&0Yc^RxQmgn#(&H6nLaEvOCV&?Uyl0}*-0fncrA>{y zR0=|h#GLf1riC4f5+FtA?^RU7=X&+6CjHpynx`ayHbT>Vk!2=~`qfzpjN`Rkd@SJTGc-U`9Rwt|H{3#g zRS40eK$joI_p3<7Cy*V_&YeYJjIn6P3e}sHm5mm~)(PgJBZ`?7fWYbg)mB)-zTWFr zoTSbB#o|AjlvT^-7Reep8Yzx{in*T`UQZU8cM;5%`#$IQc&^1RAi82g?b-hT0k1pp z)}tM@gG~eAhF`}$t4e1^ALBkW)V%l9C3!$XTju$8;Qs)2vt)rws+029q4={=(DlzM zSR&bW4#wH?fFgLf1-m$eYKaa>k`p?p-CQK??8#jmED(| zoYyZS#uE+)%0TKXX4B4PV<6|!xT;L)QBfZqqZ!rnmG`YHbUt|}s&yXJ>v-hCk~r;J zilzSmb{CIY!c#Sh)P@Un4Ta#Ewf1yYeEshJ;++g_3k>nvu3M;ZT>bCqT&`{GZy1$e zw3J8tqvfSp@`}b4k0ZTWL}h=Q<&PAS#5l(}?Of{Pj7Tk$ErHHE)QqgIcXOVHys}>sx$)y`ul9KNY$-t`f zWr`ZM=J_&@kXDbB8bGoF4JX2AINfa6aypNN$F`GhO1@5N zw1PDGMO0*C?8;K2D}0;*RGAyfZHGDNdsV4$jH-DbO0Oi0(+hCBLF8h)BD6BGOJLfi zxN6L~0a*D&oOP`-4&cv|&J9(bHCHT1ML(~#TxDWqa)Pq4MQ()P{VFLISmbDfWmmuW z)vd8BZ|Dcf+l}d0-V7COG)n;i2oFLC9pTekI z?TT;%ebLjkIQ&K|%Pb)qZO_g#)3s*2#kg*x)~^)(`H*k{$^QU=)^yG!XL0f#xjge- zDO~gFN3l}%XLIMwzF3G32YSW2Tif6~tYB9|ZePm#Gq;%IsXTs_QYH|GL{FEwHPb>m z-0<t2NlFUnke-u2w&bbQlR zb}n0x@sKz){{S&aG29QIrhTd*c@%OiPBD?zndda`0#Ixn zsa8oP+aBB~@9T=P5;fbiKQR6;N{x*-E3-5a06AmV-nyL)6#oDhPH|k@q>+v8cW&wJ zT?T|zCRNTEdsB?jqdMY+Sy4V={?%2IG#OlSD%->a%6nA{tR&wrbNlFMI0`U9?^{XOha)jb*^%=6-<3E-&O;yJ9co2Y zMcU(s=M@gdL*{P4Jt-|k5kiRblb>3Q0IS<0y+)HNM$GGt{ku{^p_9zVEy0K4l5m>`6>zZtrAB(pHXgy&X2g9aaqd5v19x_s@s0^avqEM)M5lE zQTg<$iXt*U|Im^)^49?7p3*X={NpDS&Ik-T4z)WJBW~P^{AN$yKKhX&90haN9V$cx zh-K({)KMwicJQc* zwk2iqSnhYC7I{#ru33AnOZFon4DxMN{OdYqoW09pDdKIA5%RY=<2CAj z253`IPcQF%!au#1^sg^)j8)`Zp%}px0Vpoh*Db_7k)yu{m( z1M_>8rL-q|;dnhgsrsy#xOK+vc>e%qsUqB~?>{K@tyB*_a=I(rOM4#upK$(l<9;uV z;(}M0yOV$)9Fy*A-SYw79gC|E{R+I-#?ruumg|5I`P*GoAH12vURobB2xhjw#@)!> zNbJ>eSGaimh{4!Dik|z$f3;h&;6&2D z$-Q>A>dCPx_H438$^Q5G=Cy=T6$y5XV~=j#t-7Q(DS7hSq<>|Jf&~i;BGII>A;-(e9Vxb#H&Hj3(d{|fz<&)v95OpB!M;T8>sr=ZW9DV6eht19?McvLmQB2s=ZQ1hFi*MyFL+%wYi?D=+SAGXdg84?mTdLKy zDx)Lsim7$5#LV4TR&$JrzK6_z6%{Y+o;KXV6T9X6x$mF$Yv+4N74oNrTKXsAGD8pm zJ0p|#J)3oS1fFU~9&v_0EmH@s zJ?flsNfgFH`6uRQtDk%Yf0>WW4SLBgho0Icft}+)_X_h@l3S4=c+k41-ag;n6&nt37p!1=$u{>@W_+r=KzySG-7I;>}5 zDT?K(3o}T&m#rka^Tzbxj`h`B&2QzbdkB`f%UC78l{|^|BCqi_-fN?TM5(pDVx8-X zq>*URv`K{GbvqaC5zc=@PyIfX_9E~nt6|d>UvGE;q)jhsIBXxnoUd}4Mn8zAPp~q7t56Q={QUTc zuO6;TleB~M`F$(z-FhP?pCb-=74R>_+h>zml6a*r3?zbwrcdz-B92CUm9ih&y++;)p#CcJFCRr0+26?=$^Gy4YqJmWo=s!G4q}z!ei2U| z#+@8(C(ED4t$yVdOw0SuR|EUi1S{rBxqp>AFRglTIV5N#tfgRc^AEj_)pb&0t+}v^ z{8dSnyuTe|wy^_VnSm*ovjjYz2J=AqpwRsR5I_^U=TBD7eeU7=TPSA{&*4&NvD zYRLKH`MZDYv^GmeLt;FXjGkC^A9}Q*{qvG|WA}gAtV?~V60khh#js@z=y6$8Ot>8! zahR2S_T2dVD&?e$Cg>$UI{n}GYc|IOZS?*s=yc{uCEc(t!PmWT)QgF1>vTqr*4N0~ z8~eMy^>q+jJSbdkVUL!$cp?S-$6c(akD#vGO^Kc%=SHizSDR6H6pot75u#Us{NMTw zYMCTf3g0p){A)K(iKEMO2eoR1+HQ#tCE;0!`9{=1>5ff& z_+R&jXJ1P9--Kaa^VUWje|zPsqi$oShUd}JTQp71cGQVD&eFLCr;~EvNZH#|&I4qM z^eyimq*cc-Q2CFgEKJN;{px9Lqw7(rB#%)|%Uc%LQOKn357L^-2-td6fH~yxQSbY^ ze(0&^Gn{*fqy@<6DY7r_*|$_t??dzb(^AZLukM#{6;^i~4405>ZQR$$-x;F&Mc`7I zfA9YQvMcL}cBD)sTvy3I85b8RCA_TLK_Bd|`&Bk~BB#Q9{RtbvexG%#!2Trcu)QGU zqh)daHSUUy8Ce5l{{VWtOULod?9C1zV;$SRUzWRYo1Qi%Cy}Cl`D9Ur9S2NMBEn>U zf99&DcajDuN)A8ZRQQQ?B~M@b=DiE6oUyUc!EoEuZOW*peWFO&nlrV(_FBkTOfh*; z?#XQDu&sCj1ImBCzoko!$||dk*mL(!AK_XSzG=8sBMQQq_IqQpQZh$+ka@8(y8i(B z>Khy)YC-#%a}fLg0DZkHdeMTTMQ!`Cd)5p>7M%h&-uv8FM-sG*0&$AxoRFmCUWL#@ z^NqjWu8&QQ+XClfZ5{srya6Y=2a<>7BkunI57xP=lM|@1xsFSa zfRLuUYe?0bE4bI1#pXK(hn>Ip^?DASa^(@D$gW91)lHo)oQHEp#wh^1Yn2_gr-BH)xr-D>gD{w#i8rR+=X5TO8KX-EcwQkNg zmNtZe_qTlA7NfR*F~|w>kGn#-ies}YyYE#)b}zJFMe}Ze^EWcD{05|X6rx01Yl^KL zG5HF`xu&eBTRS&3TS%@$RTV-i?b^%yRjv{!nI&~CpSxJ_%o`{B-`=f=6ut`Nvi;iS zWEwhjxt-h}k$>^luDUo3=(3^x=Irxaln^W~o3}5`y1NZMiEOvt>>G;bsSAO(X3P*D zzqj+QzR+S3D9+>eg>rW2BX2kE*Jq|QR|O6|SbWvF;QM^*kqn)rjQiIe89STHeCE1;1w7yI zk=i@icV}%8>}f_ipLgixzQq~onz+D@gRk_e)+~n38200jnQB>9IL6=a*P{iZ zJ#`mrj0_*|ACy#TQw*SSQTan}`&8|sA-1K-jUbGGc6$nps$m#(;;bgZxIx8MBVogC zD^7a?1l_Zj+G;Zx3{G>3i3yN#+N_xrNL2KwrVNd|wg45cnf^GNm(fCbi~iTw+O@;(V_AEr=KlbUon{_T;{>ly?zdgl z=ZfriDxNFTd~}OpaPhd@?7P5U?w?BX_DRB%8<>Ilz1F?DO8ORYsr7QOf+=t3j4Pp+`>t0PlYdRJUEX8=s%D+0+g@@Wv9WFMh{vE%|p*Ek#{QBJ8KhKN=kssTV8a;0KNIHYMYHkoo$roE4H_-=0fVx1Z|ttx)SlDeVS@J~L`A%!lN3jiqZpCHmRkG2ll^?}d zqgD#d{7Y36<``-a$x&sOb3baV!(sUiNCOn-icqSHhUI8li3u5H{{VqgNfB^*(grAf zsB;l)?V{kB7$XdR=vw(7_KlioygfYDTYl7jOtDBP`%OE%t=Ey%0zv-5S9J9~g5R#%U=^{Rx*Wp|sF?ez7jrdNtkpzdM) z?zG2|hRDKv=jN|%9we8%LN=YnljTm8G!9(?5r-8DHd|&k{{UKKffuUnpX5n_O@BaX1uCBrfkbLR# z?WiF)8FY5}8}9p5u?Y6Ek+jG6f7-07Y$(1`#ga5~Z67j8_eFHpv8p%O_I$r8?yUO= z+2f7M;f-lWAriDR9mu~nf7-4}^6H5?1V(@a`^>ew7UD#Ocsp}h5OWscyDM6DzrB5( z7=P$B=S)^Q%Lvj*yvW<+j=D(P%5cs8&-=B?K)EZhY+C5__)JUYI}!cb=W<2ABV%j8 zHb?h=h}D0!ADMB0f{!{$8=e=vOt40NVk@24v{8;h^D_^XzlOUX0!cLbpx_yH)h~-a9zM znzFh`8Jf~bia7GJTmoTIc3Qw?Dk?Thf-M zz|2*))5Nnoe5Y%zHb37SCVsT|Vs|8;m6p0L1b0s;nK%5!aas+2%NdF>^s3hoNx@DE z)l^6GfswZDsC=Q#WLZo3ih##)TFjSNy9~*@3iJw2urxvh|yMpWgfDkJ7xl$3ngFPP+x9$M*}%kUI+ZTbN+6vs-u* z2%sv1?OIb^NOLoF`=x$2D_4-~mx4BHbmw<=u9sK1WAc{5isUr=FYO&bM%@c=wX%)M zgF8=$-W9i+=k1pV%*ST?we*yKyND|Am4)Gb8XY@LSd}o|wYwl8c<)`Qxq}oF;*hSUiBNsz>FNJqzcQmfT38;$eCn6 zH=(9CUA?M4di~K+h6LiRI~FxmvlN&3XexHEby`(yaL0pD7x|a46mw`z>_+XldSav6 z8>z)S=NZS!YPj8u^a7-5jwmyqN}U6BJt_#JFO&xvsmw$!389R%x!Q5YDWGI@=Bp`m zeX4f~x~sVxZ(5#GQ1u~4CY}gjcJ&nuX}6!fN{;K6jB!rI6D~kgih3T$gHSIeO+Ra) z$u%roq>eu73VVc50q7~K&nBB3WUgQCtv@2rhbqB9=9%QMZ#Y!Ni1}KG-B~bAOF^+& zV3YWU-PLPrZTeD3;!V51hpkA5B|+d+#2DO|&PU!_kTT4ET4;&0x2UEhDjPBUwO(YF zl3?5)mlWvbZO!Hir5gV8k-Dt5e((2aQ8X-<%JK7Jq4U8b95U5MNfYL%7AI!P(&ZJ6 zMx3AaaZ;?nr_IG=uvJDId0J5K^PE$+a7KiV3CO6~i>CvnPt)X;kQ*2k%a=Evy1|Gq<@%XV~Qe5Wm2vQYHrV;by#L$f!n=E zAX19W$TXrj6+$a#jEb2Ua)eOOx)N8VDn@u_?N!P?L`W_7wg(jTKp5wdPapZoc#5hGOITgp(I;|??F^# zbFeD+rEs~F?#a$LsF>#`_(fikc6-)mDaiGq0%B*5c%tx3 zdSp{wS;i^g1yF$Cie-V$a%u3lQ;(XNmOQswauXWzD1?c6mO;oEsSz@u{nJd3B!YX@ zpqoH6r@2a8u_ONgRx)|bIBjR${#KvEe4Q!itGneND5-)Ikw6FefH?W9HKd!)cn9C? zYiDQ5%vPzaLL_M$^P`0DA z=48Uwt&|>H7Dn73^sFte0}_9Vv@9-NI-Zo4#=OquKN#B0ab+$#=ZME=Ej-!ShLP>+<=auv|%URggIMV`eDD1#{IJL(Q4+5G-*?ul zT1hN%5IGfc300qY9RC1%sxHMxm#FJ#3~0f|+WF(-E$r5|@W*CBS8tt{<#2mr+P%+Q z*CDsIEdj>Ra@FxSignwqV_SQRiM-BwFWdv5!nJQsSNKl64L0R=bC%E|6`#y0Ap6Vf z^{oQ&#`$$VXKW5CgfNJ%w<%`aH-Gi3QW+ZKhzCCPq@tPbLPtq#v7)Z`1mp5GBr>vX z-^-r75j!YFlY)*9ma}+^zFxq5P|;)5K2i3bB2I zHGpm8h}*|-4#`Q$2L(@R>hz05vpWyXoPzG%1#ncFj^}J5YTGpb0A~zbjhyUL*Xvy+ zoIBzBQy#rgaz$jo*0$(C84_{zt?L-XYlFaHkz8|`ye!KL0Fq!x;{zD&T81(lB4Yxp zM+E3Mjz{vX3wuA~X)@=gc&=H>#_Bc@t3K3WgH{ACtMeT0=zGwykPL_K)tIfML9u~2 z=xZ6u`x>btHBh4u%_h;q<7pLSDIY5kGfW5_$p`NHcczMP9|#3`9Mpm(`I!y~_328n z?b}WOD!DvVkl6*a!dOJ)9FvS5Ivi6G@LZ5rxy@PQXsFy5IXx<(K2o$(G>Mm7e@caj zZ=E^CUJDxFCV8j|1yUGbRHi{i&+bnD0GWqDP{ht-1n2RqMOoRIPad?Az5rHS;;DgF zEFIoxqA(SXTZ)(Wai|VAW~)gWET6mJ`qH_an2*RfCj+fhmu~JqO1S(Y#zqBEGNYXG zia5!ug}Rx^*rh3V0I1<=C1MJ*a4J9~MKOQ1P)i4zGUR|gD|o#T&QO4+MPDy>anzrBr8YMK zyXRj@)*lgs%&UnQyOY9?mY|;63wY90Qpfz8e6qsI7Im$vCqj zMOhACJk$p{+W!D3UZ2IqUbsMCCz0*g)es0_g~=x#*sUWUbo1&m?}z-$eM6{dh&a!^ zdR@5;tmU^T@9ADccXjqjl*7Fg^>0J%UV-7c66zpCzq|wH-Gg29YA#lM);5DrnCwz` z;g`v~j7tIIBd^w_5C%pFIotUPYI$uTE`tN5S>DSQSCi{i8Cc@bt7gtiMv^co{70>C zK;B{qZjUR})?)85>JhXIv8=qaC>Y~+ zHMOJp5wU2#>w0v}N?i+5I$+BrYsfo5!KyO4mt`WZuo15199C%st$lsmjeKmnJYAXY;1vV`ax`WQJz|$B;XU1b9c- zn-(kq$74wllgldSAXFNS%NtFgb>e`H&K<&-h;=w#IjYdc_OO*hzn*hfriIazgOmDI z51j*#x=G{MdRDMnks$M)Nqnpfo~N}!tFtl5Ai^HL)D;8gUZdC2p(fqiZQ{1Z?5AnZ zZhLb|#Kj-~(UvIj^8>%urRDkQ?NGxBjy<{H(Gd#cesSwxh|TKHym7H=Ga5&R&f;kZ zEDC+$>)cZSA+p?5ip`Ucm1;;NfXJbMImfL{7$h8@!l8Vr`F|RoAcQVWRGFtcCV;Z; z$@zcu8n|L(5LD+Ts)7+)y-OPzBLo7KP@c9XPUcR#YE}k>4aLX#HQ>6{ia~MqaUofc zB#(dbuc0sPWR@}%(kXq8c>Z*e zT}3s+Mi1{-u@!L)a+4dUzH6orQ=V(6ycrILHW%nJ%|0x(88Q*F-U$7+}{51zGeVG~3csL9(?eCxw^ zsAIwt-i(JVQ1UTTFpk8s#?2lLd1sAcEpEymmFZrf#e{h#yz9l*jBI3>aUfE|Jw9LI zts!ff)Y$o2?VM^40pS_CwK_aaDT$u}Df)@U*iwP_ciUCfUvz|b{#B&*JjoWsWykK< z_hP)$;tid;Swr@S#IGOCy<6u&+*hLmi*pcfn!M}Au(UP~2h8$t`L3!d^Q#<{U5}k5 zXSltPjQL7-r!`K_S*5u9GkoP(<(HtQ2#j})5>J(KPWqD7qPBL9*}T9yw@UUQriT&I zGDK6#jO=9lr25nCfsi^$^XH{viIMIVnYO2`TC!zJrwKN9{J@`2N{L6^5xmkfghjx3 zKH&cKPXkZ1JfC^F-~H+q)EK{X!_Fh0{>H3DmA4T}yInsT#UaN*@Vl`H4r^xHdDv}} z3O@I}RJFIakp$3gZT|p!b!^9P6|7!lWXZb~j?Z$Ag5FFv!nwly-|tn+a?!r`j>lsXnN(CDm=I8lWO=3f-PhPdi>ECD1%2;~; z01b7vld1)bu7BFDDw~@`)QV;DK|zeuizI3L-duWr=v4tNG#LZu`@)r9YYcqHy-tRx z`aj`hkv*gnN1rncKOFO4M=@x^Fm6b%ntl>o#7uUjG9b$z?;No|@GiCVo654Hk}4&+ z>|ymnXN>1*sTNqk+E3l8(gl2O{u*H$f{c8$;ZWJTZe2!ZeC_Q~9qT6H^3yWQ5oq`; zN+w?~FZZawFiT?8GO>S`<)wE#gZx!mDHc<>Eh%HmH_cjf6k}q2qZvD@3D+ruQbdyZ zd$aR3K)`~{jl!{n%6>Vf&F3AR^IuQ=O=;F0sNP$jm=@^5 zzHXUzv3Sno{8efB9FtlFv=dOoU-muYa1Y+g-rY3wOzO z8LwGB=bV>gLfx50*61qbyKj?xL*~Xa?NxA$HUY`!H9RV9(|il&@AUo}tCM3!1ZbBM zZBU=Z>r%j*-|pmp4OjD(Epn(#pWUqscZp*8m5_D$svBi!UbRVAbf0u~ttgsF2u2Ke z`Ku<{X|^bo?iI0VD2!t}*#7``_-l$+HbnYyWR-(N(W;Hizk8*1w)whXZ4-2CH)gr} zNpt(8=MBzltAN~FIy^1858kd?w8m=b=u>QxaW|)>ZRyc4xy(E#eE$FyW@)jav6;u2 zj*I@)YyG==uGszm0N_>2Gzn^MqbzFJ`=zSvGi0%le5+W2rimh4XL0$ym8}~GA1B@a z0BW&n#lh%a(q2g~1W|p-e)sz|_m{)}0NrUY$1|vHi(dz6@szud%T&Q&tgrHe{{RB_ zuef{>H=Cx!WIJ$!{pG2nJx}@wWD28O61wyyVjeusT8tx21K!DL6*mQ{Qm&>ht9J+a_5EI zzl(LRzjbDBu#mOzXT^^>yhh_^M99b8*x%m%>Gr2?q*vJU>j+*Exbm%DIq@FZV}CZ< zR#?K}*ZsQn_*sNXLw)Ym=!S{VDIzZPYf-ZCa0FKqj6{1Cn4(A@AdA`+^+FU#`Q zoM{{~108aflFjD@R^xZfwbUwkl1I7my0|Ko+0*G#X5g7yEI#dac8_rK`D&RR&;H9? zPL|g3eC*qQ+W!D{yX_({&LmDpTJr0JRnDr>mL}TV)}iu3U>&XRS&_>S!BzX;daOuL zpbosR_iK^L=8X}{42VpL_gAfZ-@>_Ft|6Kx!Uo#^0PTOhULofvkg>`4de^jkE0C@7 z54sQCsi!~Q8)5z<>L6X6i5LcuNeGk8!>{Y zcxs(hquG}EXiJo73{3fheMUUB;Bilr`~LvMDzmXf-|JRUF5LIX6sqkSoEl;uPBTn? z2fal0CS`ZX4Eg!7UnYEEx3-E2WOZd#Zr#Z{O?_SFD?(I?`BUQ!z*mymW#tC-+`p)$ zcF~nZ?w>YWN|F*kgdL-A`#;{V4)~3-BxvV9=~Dv1KZkDYZm(#JD04UWYsLJ2$5157 zs~48|AK%?wcvSh1Cb{F0@A7eSysb@aw#l_ov+94|s2N#K*5?&+(%uwdI7f9c9zgZ6ggA-)BW1&^#1_f+q7}=$^QVMS1}syM2I%p z>NMc7M8Y@zF15=&hIIB;)PkHBT!Cw9A-@HdOP}hBhA$44W=SiL9`$5e;4~z zrELn^Mninte~PFXo^;;dHs8{(!#QX{f5N%m_Z&AittNMHKZSqs+S#<2nNI%zy4c%X z`rJOxlZN}h@EX>$M9OEP{{VOU)r|fU;CGhgS$4?XfAlKo^vKwhjRqNOledU(Rxh2E z)amabQ7GZPYtEgG4wn-oq5BH3QJx-Zly8XsU*YRkV#AHj!~tBB5+aTg;}QI(y3Yn9 zT59k+ef{Gf?^X%Ke8JzXbUqTh7TVM@%yx~#->=Kl`_+@o+`F7*xsC3BI9XS^Y8y|F3;rFpDwduj=dUmoPB!Hm(<*A$vitXNzvhb}#6F15_ zEjJs8s-zR1f`{0Fl(s45RD7USDH(jjo}#UdAr~kC^rw^_UQgbpMisXq`^!nY=Gu78 za?V2K)C#wkj>f)l_~R7+0N653Y>O)fpO?^m<^C#?DW7ilPmuh)*Ck2nE8M$o8Y_fCH-+o| z?Qg)UQ_Mx$-*s!8gK<08_nSxF{wnA+lxBzbhiNUw>gJy?8{r*(C(rL>_O4pO-LCYs`JEUpm$02OtX zfFklYD*U^vnpa57)GJHRyBlb{;H-Xc=T9I=?^IV47{e}pTIH0PrG~2P z`Nu}C-@pixYcR(wd$}L@^L6|y&%D`Dvfp;S7vbmHerOHUm3pOfy1!!$oA9U1He9e>o^>-zy>qUTe95>yfFi}~5 zy-*~EKlf@t@rK;SmBz?}20KB(YGLy@Ud=)&;{)$g!b=w6R3WoDSK3#lMvLZU$lAPA z(*vG4W~d?(M8qp`Nv#U#M{q;NQGF}q584=94-Ykzh2dFu>{Q0dBpY$O_Fwj^>*={b zn|@JWA%4+G zjq2BPJXydecJE*JYP^5C{ov^J?xuMo;0$Ctu9Wev>=&v3Dg<8cPM?}x5` z;U$LET*nOOYx<9+ags*a-`Co`3*nRz{{U{oaVK2u{{UroHEReL2-%-(TOHPs;eP1h zsC|mtPagCjF``C#EhDOK-Yd2!_37+NrI86%=~ek<+$qZ;W@3BOUPUBgj#8GIjyWsy zRY^Wgqd2SJ?@qWiLh@LliM;-l;*BX6ZIsTexCa%=YTA3X##9ZU{KNagxosQ9(Aw*% zr(Q^^lQzV!qI8WPPrKc9Cf6)B{MEHLt<7xW&ot9CNYHS&%{G4wIG1c~v@?GddbGN7 z+XAS+g=Dg#I1=z%itUO_ZfxMjkM?CTI+t$PTBC8JOZI;_CffCe(~(B~n~!cOmp1-v zB}(IM9EMJ3&Qn1o5|KagbfwemBNql~SLbh)S*y`CjTPjRd}Aeh)(kovh*2eMe8ICx zSgLIGe+t_rzKr7x8Z^*<>2Ys&RofYWED>e4z` zT&5-QbGY@dK=^r}JH_W*#yKFP{HKpf;;mqPLgZTQIA-Mk0Cv8C@P3rqZJS10f2SQW zT4CeOGdi!8T@(OJN9d-Tmo zIr+C!M1Z09u6Ug>MO@_oMM1j0deV$00`{lkH6d}*mf2UG=JHabbDF^R;+9D?*$G&ljbVO$~&=l<>ky3$%8wS;? zM01STRGgl);0Zr36*8*lC$%9NB#}zyqQXEVQ`v!h)lwPqN8MULuOG_QFJNmz+HGID zDZ9ghSD>o#GNupbRuHPF2BITno(}|bRbJecC3(dwOXLritw-jR8&4qCjyhaC%ZRJ9 z4ti3n3;;(;r@d2mnfGd^p0WJO+m@h4u#z?`r@c3NqL8ESRTYt2?u<1!GyI&>lhA1w zV_cjMy;4WGoI7BDcB(-ti3xri_-a&aw>_zJFR3c|gtDjIrPut|0WtKdQYcgNiqi~3;8bo{HYnyO%Xk#8rB!%j$4``2w$ZmIpr=da;~{ZG zcP>w%&xMhjYPQ;coY^tAZ(b_^Rf&NN{OJ#{G;ZpKn=ez z%}s=C9+c$8%dLugHj|!$su=exd0aQWUXvOAwGQ<`$MDe*XszTOymeY+aQxYCmu*h6 z$lH`JHCW|G9QUL+p<4m)qpd`6L0XS_UsEaBZ2#0F29)gXnBw?fe7NHYsu>Klc7|vJj)ecgzHr7&D9lo^1Rgf`W5BF(- zlm-Cxp%O)P1B~^j1}GAQz<=*l=)I2wb*PX89MrLW@_SH?AXzbzIPFjr+SvnwlQ`xi2cBm)VxWM_F`?TN&IUOik3ffqWrF?PHsF!7I8hotaF&qV| ztU=@Wg;RIf7|WsqpPQP^azf&)7j_4X)d>r3=kC@rW^-gjNxvQO#aQzn8E&-#zSZ@o zAv?x;dR0MOYes3n#1021wQ1YNTWLHsW!s@*8Bbd2Vut~7)Ks)o31Vz*+$!LVkN_MC zu8Z7t6>&E8UF5RGx^+GMhpSu45!&b>3FKVX?tAKX=zr|BR7B?!~?&(n3GWbg?9_2iJDcQm> zU%a%jx0YLQriR|1D8*8gOyJ1yL|oM=o=-1g^fh`!CLk2^S(2l_d?>8cjcKzk?j%@C zkGw08Nl?r4{{Rhix`Zwem3}eOxP~QV<*PZBEzJqr%zrI<(`^`qJmHqI5hk=-Fj4wYHeJ~w>DB+$h)}dUm5&R(Nf;&rx{i~2Oz7Bb9(YFrP${2;IQzuv6tY!u$Sr^fAV=R#Eu3bCq-J4G(pIN9=# z_NrK~1I9{mQAU7(e~DY~RuN}XFP1D8IL6=onypQ57T+s>$bR)wW^)>=uF$n=V;qrh z&)uO3BL`idNYnJoiR5$%3}lVx?;X5;web$EePw&B%{`P`5>3A-=ns1LuZ%j8lG4{t z^8xBe$3NZN59eP$LvJJs-d5P~cYk{#x+q1Sz71HOF*I|c1={_?R;9ZC0Hv}*zabef z?^N8%BZZ?Lbl<_B)~!Y*j%K)=V6f;9O6azyp%YX{$f+0c7UrgbV`&cK<)?gl)E4oy zpavr!d-CR{ThLhHep1+8D+$3Jl+n}MplA>~pkQh4oBL}c?eN}1z16(notZjWvUYQcdFk;gVY2YR*;0f9|ef^FJADpK25 z3Nk8^X0Ri{NpO4m(h$htby|@!>>Y+N!2bXmdBEkWfuvO@A&5ApgMb^Tr<52fgXKMG zyGo95M_@m#0dAuX6nwl2fGbQe-8)pIGa=jBqF>$ZM&QtABr#)*W+9a+*U;5jm$P&o zD$9Q9@}qWoRe6bU2S)E&!E-wkCt|Q=jYyPd(xTt;f;ipK^{2>%mm6|BQf+ODF@ib# zDs7>Y+@#^zm(Lh0oO4J@%@Xbzr$|?CT=Pwc?F2d6pP;7{g2Nst#9eTslT;p2I_-&g zUNc%V5g*7-?lLh{nf^_TfddZJy(EzmMg_vUl?uZd`LWGFsIf6@=QVCb36|P@t2mh) zjE|Q*5nH<)vqF^fg9yGt4|=UO)hdn4A8NGhh)CPX>s3+5F_F`dPg-#iR%mdTLCNpw zSrW#vs^De4f30oHC|KDTVzV8?GOz~+j8?bhk&c+bi|@2sA=t`wn-o%tTvtt~57 zkADndIrOf&D$Mfnw9}`d?Ca*p>Q%O-Xxlj67DMui=dJIAmhrgG$rN+!YhKDUjt!`H zA75J6%^y1B(A!i{&Od_`)bjF-8v?6EAyCO8)9uzaDyVX+%{bh&T?)Qe%f{;KbSTh7 z8B}dQopFLTk@)H>vC3k7&T9O_r52h;9E?3J9iiAxVn2vUj%M~;2JY%m+Q)z^UZDc!t zgnpv2wHJv-(0cmTxM$ntm(6pU+)7uL#}slCV;*TYk1Y-{-!(;|GJqpEBZE~fUo$i( zI8ODU8YWx}t`7#fDLW%JjOUdgW>PSqa%!uja_uLce=53GHd2zVT<1Cdl~>DXS7IpJ z>Fq?hdJZT5(s7qz3)`^jarLQVC_@}zty4wJwPjxl4l|1UIvby$qUllPZzu5YRpVnL zecmc?cP3Jp18pRAK9r-mFeZ480-?=1J_1Jk;)R?b*@{rCpL^!b5eAD*G)fCfLL&7o zz^f4`Io;S*KOspk`Wm?kVkwXSD_t`dUP)fM<8#Pt`Ds? z6CMPz0vK>BRU@9vxor}HB#{FEJvvv9c+N>~E#_gubBqp8J;i$4yokffeTB#KuP^a@ zSC&?@TnL2wKI(&my!X#QJxzAu>T6_`R<^I9^=I^gXA8=)0hCQFog zANL1mY<#5u06K4xvepQN$C)Yl*}88%_{qk7J6EAD#~f0*U^B_KHEp}k2l~~xPm#Pk zd7vC@Kg55XP+8jONel=hjE?7(9+;~Zu*$H0@8?$g3Tm`eVWGbn~&tK}) z07g;suWG_lT&9WGxLB{vCOADSqR<&8)h*WO?TnB(u3l&rRV5_le=OHmq$Do(^Az)N zKq=}!8p-TwM|16849Wh2v4is9Vz-oo#d5wC+a{i^8R172)omDD9GdfLtFzyxv?htR zoFBVZAupUCyIK2*+PKatYk5c|PkLpV3OH<3Y8!X8KpkX#tH4@t!Y~24)jfeb3%!+Ub3P0Yd0(Fr>F5%X^`^IxiHM_?P;YazwuIP}WF^aQTjLC+uQx>q;|z{u>rdS z{`sxx`J6Q_IVJ`?L^=K?KQ(ZEH4}el$dbpk&q5opuRswZFO{B8rFs7VjpCNyO=$(s zA9n|gEp<`c=Bu(kXt+?Xwp8+%9Otfnm1QjAG5+EH^*Bi#)U77{=($m!N=sz~0~y%0 z>%VtX&V7cdfgLT`GC!40A%$iNMnP_$?$X>_becbuuTk2iMxDS#0l_2c1tj~D*|{9C z+RVOZIsGcrO6?#Kjmp0>8iEPqHjNe(IOFE@q6oNUEzNUD*toM!-bRT?KPcU~m;I{W zhT&!dXWeSYh{X`{mOaSdFZ;EpY-39`MQyHnRuzYB4Xr9Gmt+zyBTDIENcRz)quRNh z69~nwzDFN(p4HL`3|Ml%ChlvM#JICb50*A3$mjUKyIb~Csy~&vn>B=DljORLZc~mA zTA56~dSm2e?Oc@+tXb1r;#mx8-k&XN6?pi#JHPtX^!Ri|P@}bI zqO5zkZ-o(V`8JXA(S`YcyG&^vcVq6;0o*=b)iQy#x|a)`zF7Ocs=6-TKJ_sN%DcK# z^W~l6rA^0T&7e@H_;F8z{b@#DmZC`zjnVKazqyF;erBQ^z?I8KF_r`FnyDc2)8rYc zkNUrpnvcmK3~;qR^@y6XJQw0%cC;!+a@&4`*1lbo2w21pM(X;n;v%q#;0wK^1#!~8 zQhRd`6Lm(Zgqg_Xt~FtJLrhzE{_S~pjmP>ll8CdB-=%uH$i(@7`0w!7oqRwoEw7cg zWP3UW>L9a8)Kj0+g6>t*%x`p>;Cuq)rDnnvB;5Jsh4KuF5i3on$U~w5?!6(c`U(y z+TBq7(?d-V%e7bJ3f&EBX}(-jfhWw(@{PakRS_XxtMa$^t5OuqY^plfGnL{@S+fWL zxGT#3mAzp+tURY*m3nD{{RX(Y-Lwt%cqVnvmr&pn)2Tp+viVzI&Gn|#@yGY zOkZqnIob03zLmiE-gvx)WILFvF5i0T!%6d=J!PTum79pwi<6Ply;$9d%d}o*-pkgb zoj``_NJXpx9k4ZYey48RReDRCSUfeI@@FZ`c}&)@UqqT zipuVHZRt@sl;m`lZ*3{%Jg07~D|Rym0a4PhEzB+f{_ZPo)uA#3!);pQs)~CZE}UXk z^4UKB0L@*#j>{7j$;bYKT#cNjd>KIc8LD~{hCx_qa%Dj#*eN6Xu_O-4ODjXKIqA$^CT=we6*3|vnzD3 zSu@v20&P#N1@`eLN=Fh8lys&dI`IDhcCs@e!89?-DxTE8IQe$cFxi0J>Zfi}*%-?! zY&%!WUl%QejA3aEUYl`-+v`>DSXEcMsq+G&%Ef>2>hVt=SSI5m{I0A@pZBZU2kx#< zA3xpO{5zJsbK*R#@yUiRh0S51^GgbDuhiW zkK`^`w>ZNk3Q8#evp>swK}1aBkeQTK&n>N7%nSro+H zV(rCjTjAkHKkya*02<4)iYIV>_T~AP{i@W7p=M=4hEMNSJkRWs%{7P+2|H`BvJn!H ze-1x7Mq78D5#}_qZGFY|vDV?Ts&RyvzbsXW%) zlXPgFV+Q{KX={JNfnwKf<+nRaI}!X&K8M`eWGdD%Hd_iR%lwCr`{u0KpoY#k$IXFIyol0zX1yvBNcGe1M20-E+nN~j z!K4Wo`GrP={pz{M808r|faa;9HwSOssgSHL;CoX87KxTM;)pTqHB};Q>MA8xW3_2Q z$+OGb_o}%&Mi}#04Iy0`GSRWG0QlCi4Gfu?b}JSt+q)|r+gH-P@wb*NPIJ<{6XQL# z&Bur4RR|GTOSw2@+vvT?=~~78lRCQ}oE|o}S&=UxQ@AhP_x|v&CQF$fKbb&o%q!MB zQ*iF)MeIuK+rrnE%K}79(tN7TUd;!mDdSZ5v?W<*3+7#AhrK||$+hC()DF^bKQ`~; zsQ@m(^lH{OxsrWJLSjZ~4)Ab)8ql{R$vNS-e-%+NMh@ll`_(^~xQKasw>LhOGI!7k zt%8J%hT*qXghoG`%x$|Vf-6AlH{D&kcGbjKB$3pe%eQvg}2K}R}oso~bT|KV&wkha-TIV#&NaK_-I0m}7qs#5; zeJhG=ArnqHJhf;7^r|FpMs2?>K)z+Xj6uUj@d|NNe%W`Q$5?Pa7q{FO`kjS>5de7oYhiX&c-;8fuEfwSsXKe7peQr{`F=TR5(AyR{Xgl zl%(G?=kUk)(>MJ1kq^|@w2vjCFtNy{HwQV$#X}^(kf3GybH!OEMSmz@?y7GASxA|8 z1^yvb7iV%>b~IKul~UbXX&=Q>G*C87L3St0{@45pp;;LH-0;43(Z)`7~dA}_zKo`ks{g4 zJeD#tmi{2vKknwZVTo~W=i5&wr&5ycezaUm4Z|#ueCg|0(^`41v&6gFzHazG@t#Sv z@u2vYXySW+mN^@C`G;W5{6@Z-()GO>@;&iL7eB%nZv0lgoGvaiK1UaXofm17tZrje zkZr{>^JFpY^{t(@mp1-wljJR8-UBHrd0}12oH`uz(Z?7q)K@!ru}K?o^BUH?^K+D} zN$wM1Lf<%~(WGhGC#iftUHWKATYDpZOI^z;!6E+uS&#g7 zyl@os7?$=p#re-Aa!>wi7>GM6nMI-`q zL)4`!8om?L#6V3Va<%NXkCe#bxeYSN!iXbWH{PzkGl;ri*F_a$8jk3&#E?frT>an% zP^Pt=wuWaptO=S)Tb0{aQCuNRM?oIrRauqQRYgfR%sm#RhBX<_%hIx1NVx1*NXTK8 z`4+9G?$acEw5b`|#Pn*GGv!2}^G*v=TVyN%8--VqHvk7wR+xfUWmIX3^jy-DAZY=1 ztM#T5s!I=-G~Mi6mK5CXWBgq{T2M5Kvlt>$-+GfLDqHS~a-kmBrC8n6h3Xor4H`ue z2UT_}_h};;k(hkTQw1gR^z@Hnw%#gbE0H!-W-8fVmYmGWy!Wdi4%N?Ua0(9AsR*%< zpgh#YcKhO!%S0y>{mq|h%$7txQHqz0jCZBR7!%%=P#$^;wW#1Q??%Do8kq+mdenK} z_qm`IL6$veTa}?6LNN={oTDK{Ds3Zq9cT&=@t!JM7$P0Pm~be354lbV8w8V@=eCz%t@lMbHRSWt6s}rI$6aT3Wo#bRdPzdFIbKb0 z*7C~}Z;zJGHPOK&l7MC7KYET~N+#?Vd*b`GGdN@)FDK>|l@P;xg8);KNjv?~NJf%4 zWWiomqTHjcKpm819<+*s`17{3Ah<4H%i4OM;;T_eyLtQ7Lje_&8$~fwaoDw-kttml zq&ou<^3{Jcl{CON3?IC;7;V2OrxNT=Wd!{H04`}%1wY=Z$O+(zOp+N#HBpGt>`vi4 zy{bO-Frif9h~&(9Md?y2mPS9tOp%3DfLHznP@SWd;*e!Zngaa1_omnl!hp;N`!x~B zAR2khYwb;6o02KW2qXunJW_zWanRG1l%p1?jzIRRItfbbMPM@3N#owd$=g?=>A3W! zvVvBKuBIwRT0%y7BAm;#ZB+S9T*GIc)ZZ;wV13#Pl&n)#UEd(!QRQu5xvRoF?FcbU z2tspQQy;L`ad6bJ+g0@fiaml_NY8Q>Y2= zL1S=uWpBGv>^p;x!j%`)Vu=`mgy~lp65WVrP4RL%)g+0)!*#7CV~>Mfmkat@##(%1e-3~1y#azu9DSp7%nnRWLdxw zmj@=dqUE-$WQr28tP&d%h?t+HX)F1Gfaz5PEYcht;;h1jOJn$IiisFZed<$^IUg-b z5zce^(l|I#Q|}Pe$|(UmnEbe>geEoZidGMi^KfcKQWHID+V@Lp$g>1WW7X>KE?fp^9G#XCvhuD3MAp9Vv)&$9hLRZ0;y>(2*mUC(BfCB!Hj_{{UK< z@~XuA%0)xv+xbiUM0TrurNJ0i$qEd&Dn)sYr7((8vHaU>({7z)$~pVB=2w7E$QYN-?S&^4^ zFu*CEl46P7$PH2Nm=G0FV564diCZ3^bEv9TmRrKKJKZ z!W_p&77fVrUlD4DU)N;4xs~K7K2-ao2lS{Qht1u$jMgezTwLWL1tdmNU4J_1ZQu~H zmd^Zs7212$Y=n*&!*9nh{{ZaNs&cYSSFatbh0~K~!x0|}c|Tgz8{L%)aqV2P znW~9$HH@5sb51cxq_FQ*BVKR`2pX<#0oD=eoYpbA8>U2C%Tc?br!eyQA297rF{@w< zjkP(9Y{2R(NJ~Df{~ag$nWb^m5@tv9Fxcx6$Glr zLd(-1ty)xe2Oo`Bm0VzAwWn(tHbAc1I#pLYdewlXS7AI1)DkvO1sJIpF+i@+IOH6G zQJkw~$I5$El8z2K;+nzs?ZBk0(UDw;+vWoRRZ_Df@5jsUR;6HADHtEts>$XFRYA@> zcCLzOmlBk?X&A81KPt`vZGqa@3{UG?Qplv^7?*WsD?#RB;dgD$Gsvx-jAs%%govHF z+Ir_5ezlwiZ#F$qjI=V zP<`s5AxNbhWMj8V*4*C-$sz^{0c61)>l%1i+nCw5D;(r@9+i1kBJ9xc4_c#k3c8>< zQTf*Kj;2#xOv|pKG0K|Gl0YUlR7IhR@#V_|~Z?js$JI_sumF&2jUNNX9!?R35sV72|Yz4~8%2mccD$!@3=X z)wpj%^se3oL4r>Gz1O9AZ-!jjYHwuCx+g-!d-ktYwp54!tDkDspEWmW5|cTbbeu+e zdsNXw5*CsoN14;wrygibW0BYWnh6aUSpNE+O(;u3W4Qg^R?z~G-41(KZ=^#LTar)C zI^+4*ArozgoxAI%(hlg%xGB4e69u`WA=s*fWYi0TF3Z(6pUP7*1GZcc*;>S21L__i9N#QJA_=jN6GF=~0OVNW%(O=rPvolGEoUf1Pt$^l{6! zf4WycPMnJAV~3pYz&)#-*JXuOqmi&pT9KT#IM_=!G5mt8$aXL8eq4RwRTFtE7oq5X z`qc2=TkUhX$5V>c%IL}{m7)ibaNWJCjB7Qlg&c#E-<~SW*q7!(jlY#pVy=I9O3Tn5 z^qAs*|I>j3L=+x<>dwNvo>*{^iL9sbkDV%#%gdnRG=}^M5H;jNBfkDcT!o9N-nc%#l~{n>^r=F);aiHta(WY)WI{Vt*!RWr zIjB6M6mF|RG@W)gL0wTsYvCx&?YzjmA+Htj8C1G5&G)i#k578`dG`b5r)u$k7o>|R zE^@tU;=7p7%;9CTjin6a`lqETNrX1?4n0SxsUkmWQjXg|84i7F84yV7h<@)G9@VT} zj#)HGDBP>DHxMv?#=Q5&YjnD7kx7p;7*I|I550HM+)oj3qbj_9HO2VGDeqUz97dxU z?hR`~cA3voS|2@H+WB_N9N+7K$-&6ttU-jE=S{~s6tgGUrt%`j(bFHrO<5R%@^KpX z2a}rhZsn>x{#I*5BDKu-Ny*@R-9h!ONTg{kyMM|>H*r~)AquLHC(Nn9txE=tROP;4c@>>v@UR6zLQX!St^%=d^2YZaJvpo@ zu(gq|45AsDS%Ja(rnVt4vWcN3w{%*iYG9Hj5*^OJm*HA)0)TlcFnVLPV*HAQjeByf zZb}cGKJIH#EszF^5eBW z)*vp#%;Ya|+cfk>X&MyyRYwMemLy*-!A+e_WyzsP=n?nHyKZ*&{>)a7Sm?B4=EpQe20V<6f`^5(kr z3?*=W?-j*(K4e|CvEYI@BmI$G%z(u%)UP^HJ?c9kQdNT5n7JCKt6o9$(+VrUcuVo_Y$A6l}&xYJ)jE^r@8R01A5u zayv)<=&oPHZzDoq8QLqQ%9dQ8mbq^c%l?YT{sT*#&QDt(F8GDo*HI{QwTVAQthrbP zRXyut#IR=Yd5xX5ffQ^p6pOV#gzm1cZ*=35B#5eze(60cgYlzFC4{K9{&N-Mcim72 zHRuy3n4UoX3grA>X$-nHz^@#`YXWNY`qLd{Rd}t{*6_ z$7lDC@Yam`97v^cDtlHNLM|in5sD~moP4BzyI%U4=WNZZXuim#7x@>AHC(cTCCQh| zEZNOLVQwX~V&~^PW73@*AfGN_l=S}qWL6D~y*!0x%uBp4%a7r$bYxY;qh>2Lr1RZY zG37u9$fLH})suDLj^c2v{{SxU?zZ1r$)JwroGvf`7(%;vtMUAkY<2$tcNI+BPc%X! z7}~!!>e06;uu2=}`=+>O?-z3IoS~)-G)z~ubk-hz_EO$tP3!zMM%>27VHbYb9Xe{*NDnOl|Lj{`D*2niOaG3?%bNnjHHqf4$So)ndw?k!*CbPQ;hy?g40__KO>*dacuj^B4m`9u zT6k5Af&4WSp@mg}-BMulgNn&(BdNF4n4>IQ(*fU%{n1jy`%!cGR5Kl$anR7v*&{q@ z)9%v|6y?2Y18z~g#yhiC3aOKWw`ieg!YGm`UNiFj+Kz8Ic^`I#civPUl-Y}HVrw#F zc|VTfd35=SIExJW|~JnYoFpDGVZUe{CzA>VI*@V_|$Rz+W9&B$fsf#1)HU7 z1BP!>t1Iq8epLSTdGC*6W{Y-Ipy>Yq-LFKGe7tSiKlCc&d}(VP#)~XX`==c5{vHR+ zKj2lZDSO8)T@mu+@<}9%FBp&SS$LfbPJY^H#)nM^SchCzR{nSwXNOTb5dpnqv zF6A43@1=8GaWt7%pw6M2(vpYn8W*qa)+3X$VA@A@^lhwL^<8=TBy! zN(^hiXCrlMTTCuCi?5e$WyYZG5w62p5XZTrQNi8wS2W?=cSh_NHzof7cAHRt6IPL( zRla`p7b$Kf12IL`pjKJLauKy$ZqNJGgQhq;8v1HN^RD+|5BvoFmG-B@`K3!(?Z;2O zUlM8Y6}wsSkc=zsKZf~hSlxzpfyn68QHkG$TIzb8#$H1uLdttD%Tvn78_Mxf4>0oQ zn%|-5MQA=YBX1Z}Q!1*R!m5`F8AD}SoQ%h5tfdB2N!&LcO1$_ezoeJd2u9vGszz`U~%-P z{{AJ~A3@tasS7?!U?^Vxl`LjbiXZ)1@7&S>E#nUyoN?JZZ8fu{l=7M|HtgsrkOhg! z*s8wY#ML#dMmdXm^;#|?SI&w_0}c=H{{ZndZYGtph54GQ2vkQLY4^DynzZd!TXh@N zesAKen<&(XlIRB~p<3y5=+-z`2g9p=mCf%8!+20}Tbg7q{{Veg6q;qiCtGB$7&MHp zzx}H2bl8&s5%;Ul?d@icM9Sov?_ztC5F>)T^IlzaX(OVyXk!6WwP*)oQ_O7EJ(+ii zNW+|ST2V&Qo#0@9dbunKlCgG8>c541U&A<*T*WhcWBuy!IS-f9=C5h^X?u&}h;-rn+%rVG5RjQeDV;dut?NJk# z8T+kHJITQ0Qtb%5{rZ?j+L@`MDRCZi$gi1xG|S}K$07w_?X)-dYw8I$7)r>UtL6`k zX){& zcd~q{Tlj0pe17w6A7t9&`={k*{{VE?UKip#s@t9`6ipSu8}|Y!VnSKGq4WDv`LWKW z`3~KFURI+PT}|laXyFkn@mqRKu*6H; zE_U{=X5CRv{{Z0r>wgt)+S^SlY=oVkdoBDv)yq-b5!mUsBJG&(#y;(Jma1Yvr+|M- z-~4*J8%CAO6m5dIDyCc`?wuX71t_x&ky_BmgdZ$nR}^eIea&j8>`|V%0~Eqo{FvZWmf1F`jz5QQ_iDO{M5H%L?~cc#0hyVYg4 z+}pnGO(#K3UQ=>64gKo6e+h4LxIRRimzpCj=4bd?g#jHy)26_D=jEpXYp~FPSJi&? zLAh1FUzV7~vCTK;Df0c*sdUSm(3wj}S$^$&HhT+i@AkU;*S!lrM!&0cWpmD-{Su1TKUFXfpc(K zl;_{IeFLmT8`=EsS3fpCy4B(GCA@c1DNIZM0L53SgLaOmk6&Vxaz-TB7k&jl$r4Pj z6KzntSwDuE2u0mAoFCGa&y_cw8OZ+t*{frkoLZ40@7hzgd8t-#14gHwF;Esg4;gMx zrs`uvtoa;)+O5TPIssi_hDC5owipiea?UGuL5{9DrcVPyhw}W?ljU#kElCVfE+dbE zp0$*x8(A6qruDAKEjL9kPnYKY8k*fR!xC9~dM#xl1_4=H&Hftb?V>TppzSq{Q_4y{jsL26nn4?3*RFoP4WYb+gGM zs7~L?xXm`!Smcs+Iodym_-n1SF6BZT*96K>-Z!FEKYNxHJ0|5*^F~&of;iSyE!Q1t z>66MBUzk@Z4^q0vBA=6n71DTSFm)?(?XiQ8pZm4XGj4k6d>zKM5&r;L^M>2~-V zloqGm8f3<68)DsYPn97Uwld|3?8O3>RLq}toEvcYMKN47 zc*otTBMyTNTXS;_p^5<+^s2xzw;y(_^4aGV5k=ayVi(LCH-8mo6(yOE%TELb^{5Jv zxF?F`E-Kp&MQ<@icCIVIem1mG=;BEON)k}S52Jk5^fJZ^BOWndI(%$5OQ*=zUSl}< zWQi1v#CHOB{{XY;_p0EzS(R6z`M2W`ZKNVEmKjMS{{V@vF@+sLK))d9E7bgNb8qGg z3usG3g!12cPw>~7O4wYvAPzHL{Uz?)@uvOZV2BUjIa~&$X(RJwF`-j{DnBj=B-mL) zcl9mlQ!qO>DsD0K9<^NP&gFYQJz;TjK5fJBt;;n+{5Sv)lvaE}NVibYtyOa1=4zn)zNX8w0^H*!|t|?~mHL-=l zH$1=j{HkF6WG`?Sor-o*ggA1}+!H!t^U7|Bt& zj@V<(kEt|8QsFcnNuIc$L0J!mG#uG=4ZAm4DiTH# z{K@yT_iH{F$yN!w3^vuMqjilVf179C{{VWq>Qq5^npTArE;!v<_O{W?R5@l}_G>2I zDI}Go&+v-55}&&fV0za)(Fav)m?LPDEUDeAb4&tl$U2TiV8M-oIUjI;_zyL|W}aEv zt%BWa&zuRl(ppN&<^l76dbcdWjqrxCEs>SCFY$G*h5}57nEh!<*5l|AU$Vs@`#`ud5y>L*QxwB^5)c|NmrfW zhTgx8d4W|UaQU%bmGIXOtRuT%#q*AT;6E>|R3YyhQ(B*9+r+PKvh`|Ic4Nx?rkMbL zv7yE(?J7r~?^k3GUOOQXWINk$T7`OTt7#@r$@1=~{J9<`k-k#3XwniBK3jQUab8E` z?MhhUcq0sUgZ}^luUBadahGNLqP!!=mvRW^k|*j2Jbl&w0A{kCMHt;3`F#mgnn?ME z;cdpFJkRp|pzdwGH&k}^-(}xCKgai~8T_TXZQm#j#(##d8?sRlau&Q7GxXX}v=WgD zUEOK&B+xmIL-Pg(y1ggjPmA>8Vvayj&o3ggxc5(+!DD5!K36u#QciS_w6A6I#@gWTZv4A~2Wsr6 zWRlq?bIXm@=6a3Mg`aobuW_F!moA5O;KWPaWioOh=O6kFdqu=5A|-mTuMGHIa@RVf zz$)Pr``>#%DEVvNrbbmNeqmcu*v+MV4pFU$ZJ4cnGTBkVlwy(?TdaczjkT`=WtBZhq|`M|0)3$`-7^vSEauEjAeZve{};Dl#lai{G^*nN}GbR7Hw> zpky9uIX8FjRVippMjQuVc&KG@<>e>@lae=65J;ruYZ-1+L>b-w@u@a!Wyg9k8lC6z zsW%?6&`gK|$XSQ?Y5xE+@(;~YE_#kCUn?heXcsk#@hcp&bv0o=UQc?DVMOVi^rVO| z<+-NXu`GBv>&T{U8To!;PdNi8r2}9au~QP=hJeSCF^Y0zj2@H>w0TjAauOq5!if-t zBxDoGrf(yc=|lE3(Utj+%|uNiAja=%kd56&X`(mANU1qy>55WC2uM+hDkLFCP1~wQ zjaXnFl?Ha6D2ZAQ^LB39)r)%BWx>sC$RmnBGO#3Yc~zv?;!u&m$~P4T{{ZeDDINUT zerj))yRtc~+9{RXN*jjYQ`hDBo|>r6-7$~vRID&Ry^5WKVN`89$68{9+{{0Rttyso zds0FI6$Y^QO*EEQ+*P)%T8criF%?GL zca6Em+O`V$UoXp4$SsE5!itbKK*d!A?fu_MTy5n(_xn_N0VrnYE7qk}UF6j$ywv$+ z>z*;`?^B`Lc{Fl@XqlTGYB={kGTmv7*Pf!4Hz*+V6l^sV_9rF!9vAqkFylWbYK%E? zgVAXffFvB%#^jQ#e7tc|s|HVcs7j}PwGn1fmFZ8EaYdNeIVcvSDJI+wf}peE$*G$= z*n^DJ%%`~t$xdicGxKl-0Ap(!VLY7nryWSJp1e^X3++xo2~{;5kL8oMns(^Qh`Wk_ zq*DWIaNVg)e{|Di;B>_i5|*GujKPmetf$L7)rJLAu4=IbaNS3xQFPg3c;MrTR4OD^ z?N!T?0O$=hNn?*nT%pK|n?X72nr7XnDmv2xU;$4}*~3zaks|!2oDe8Jw2DB+dsKnk z9RC11pc(+m=B9xGR>w+?J-~eb0CZH5vMKpT%SB0Cu3@bK036f8;EsCJS=)Be(v*e+ zC!wt%in}8rfncqHO(C#-spS}TsK7bNKZR%oUD6=+%?%)6zz!+T>Dr)mF}GeT1j>ZU znB5ZR<*MwMC4Yp~xt&pVuOL=rvH>OlAXA>!3lK=3H{R(`J2`Bz=BL~b&(fiM20f}` zx)8|KL2gECLKIl@wC6RRnLMXMQx7#x)y^|RML_6nV_anLYeiS?k-@4ql7kLdX0@UL z*m@dqS1X%KgmJrk%f(w9a(SeT<07A(paJt$a)rl&SP&PAh1Y6sHDwMPC9zFaY;9w> zQ%jU_i9`~{rHC;q2i>Q6V{>gkcAstl-I`O9u*V3tHhR*yaG{|%=b!#2pSAaYvrUY7 zauCCcR?_6T5XR<4F12jBuQGM0fFLmo#_Ab9>5;x_k;RTP{Jf8rvaY6$1_fy^?-7^M zvTh?olPBG(WtbCO?A~$r{$6W`yPc$RbIo^tN1CqZjlQ+PT(--ZGC1AEb5z(-Is4dB zKv=iTKk?ec-5fYhxvi_T`Su3DYUbu9HYk2}TIF(=G1CM}9K`HnA9|#+y(ue+7aP9q zRDwr!V=u}-hNByNswuEhvo`Nzk5G?e^sf!^mxXp2E}&muz5GVKN;!;ghCHuIzZi>C zvX&_#^;O;f0HIXoPU6WXiZ*}J32zd29g?fBIw^hD}q%RCEnBLlHFWCKy! z&30xc)tt!x05T8nFS)KZ`e_mO%-=BibLhU6+Gtv;q)@{c!X6WM4Ua=q;L{XmspwjK z_Ym3dl1dsj(m6p^>uVo;u6@Q?PZ z&BR40p1lToC7cknt0B*r4qT7o$3dFx>=Cya0K!T4z3a@aZ|)rIuuaeRer}cNI#twh zz_yc}^A5S`UKK;qQab1{2tq#St!SJ`o3`L}tSDYd090H^dVPKCcG^c+*Ui9j#d9}f zdls$OBzqBZPdwD4_aU*=)R7#ian_=dQYioj=X%O2<+3P|QC>z>1y$ViAA&+{AGG@s;YE7HIW7jnU zq_a)BJY_3*8IaC`IgE}nSEXgKcMMbw#N>S|N#l7w`Nlb{`4v`OrH^GXtJ3Y<79qDC{c4os&0II$9Vx;l45G>kg$O$j41w3!){NGXti_4P9V;gFbEUHS8`Uiv14n zDrs;@{{A~xvDmPdF|)Y&jd)UQcq8*0bC1I{>fRli>ibR*%677JVd+&Cx}P_Vr)ga5 zp))2>wgL62qEZgs*~L~|nAP*YpwFolWmu$&z+@lNw2V>97Fb!8HpR{ha(h>Crht}e z{4j6xn&X69P;VH`b+$l70+u-#;89`qFH0GILEsO@vlO2(yARY=#wy{Y$sUzK*eLl< z38|*_CCM4H5Kh+_#bsPzHpXs8YSo!=?90}&=4FuYkaJW|F$xuphSbSF-lNQx9Q?V> zN9Jt-2q&C8tQQO{{j-%!p1ieE2-f6IIJDC0M^nqRZjrNhnDu#@J2JCgFqhN9` zLVWcFhR>~W+N?37mY432UbWJeV2#HI6~^DkJnqp`-6ag(GWpHDcDlBF`*`VN!OFK~xI< z^_E^E9Xp!Ql4%wLwQ=i{*0qh!SuTWX%^KoP0sU*1@mYp+@}rQZ5Vs#n>QW%k1!7A# z_qx|5;u}CL+?E2c$W<7fzbRu@CLxn&QvKJh1$@}d&M}_f-Kn67 z!uf#hskgc~vcxbX0b`Ga1CjmO-O;Y4v%8NR$Gh<#O2TI{NRFR)55lB|>S*MQ+{QBJ z!qOdQvu%IwY#E6Tna+(G?`0;=q3BSy!idQ_6K z5_{JRO6Sp2)gox5UF=WYrBb=wwxEfL8CqYN3XkET#JKh>f?c--r2ZY>#ZiY~R3}=O z8)9PMpJk^d+-#M8c*Bkddb4fwZds1nqZj~YKf6{H3hid%vuz9xIUs%7<+aw$y8t<^ zxZ@dKYnIm(!33Sv>f+3&vGZ2D#P2J%Ym(h6IUw}^0LN>s@eUqh>Iemmaw|4v+mDkU zFTGnhrtDc?kR+MGZ0Fvx{8o}&*d&p-MN~Nr)c36rRn)T&xm>@9;+jixus$*TUB>Ud ziqfAqv^ge^n{IBmT(pumoxiwTesz-@$!~n{j*|SqV}bbBN2#r?wcPNkj3zg2{!3Uf zvlKHnPI_0-(%A9pM$Er$J4WOph7a4`ri;pxq?jSP8lxqp!$}Lrl~26ND2~o4XJ?RY zTA4=0+UG@Y9`qy<5jwG}R!+*^S}x`O^<~+t%Pz={3p1Zcw} zjmq8YP6moa`@42lEJ9@g0`Cj*?yW%3k{CA8w`p49sH|!3n$~kQ%&Q%@HPpa-r;Zsu z`S1S##a9=n{{W%fFO|Dz-rZe1w{E*;wN-wfHFEU?Zmd7)CR}b->s=kb<88YiB3CzQ zGtRO6xGZ+boBOr)rJSei!#{O?^$%m)!TcnWIE^YXCg}cJgUtC|ReoBKotu2RIZmtG zdMfNCs#GWC2b!-8L5}S7#a%}mlwzf=N{H^gc%cSKm4`}=)rlO_U`ETY-RVVyg@CM* zFf{kKM=iUBsZa>|ugbLcAr-OrO=Ksj;-3(r-De@mNU_QORq|EQcfNR?vZ&vUeRuHz z+w4*(8=bR54lycbZe5Eaf@xUgLI0l@+OJgpqCA+;T@4sBAp>E>;;%c5(}Qdeo7$;wE^< z%4+qi`EZ!RZ7=KIg!B<)Z1Xlk!zbqJ#cHXS%1};OYo4*QZIT7v z^4;1bo>N5s0CNreJAc`&-8FoK+mADjtz7-Qtr-hH{0kp?x)_fti}z_V(Y*t)E4P~4 zvQl=ey=ykYSP(LrxF&zS%U2^Q9b|BqK$8-qwK6n9>kcxhRqQS|BE>0f%~s%5j!Xu} z)}$l3t7=ji;%<$*<*%t7lPcgToWb1i*w@RWwr6U_Uv^#1^7 z_;&vQz-k8BTeXQ*vDn(iQI)l4z<5kiz8Qhhnnct<0xOWK!&4KD5Ip9MVS5_Xo}X)eKB*WlL?Fby!zm-!E#c zS1vL>?M{r~F<-k%P!nW2gW}kvoQn9z;b!xd`Y zIIZxgOL4e*(smjy+sGx6#KRb^2p7wgzsr`ai&7+aSNSq{KJ|OanPUcb!1VS10D)IL zpS)Uuu?ndn$@!YLql#9{G5-J$KQ(jk28b+?e8Bv*u@iwVesAvWu5`hqYc0W-jB{Id z^Gc|N58eCKhhrd$aUM3g?_CrEIOIsAPrl!JvzkH7taW-!j8HMj_O9yF%$v&$*g;$! zpb=#k?{SLmEDs_!8@B!L_G{0YCM?~B#^W0O>eh&2A0fG{i#11;lWn|&HI!E?I%sZv ze+na7sT?q-v*3g#pJ-p~%e+z`M=V)>VP3U3^*uUdA3oJ|9DUkwZNRf|PAS3GNW-gb z_olDP<%cz-b}dJg5w?y+D@mQF?tw~<+nYZ%HB>U-@M;t09qw1bV8t60@^QB&l|f&W zbf^@ACP&OGLW}HGk%m6)e6{hUM0D8^#pBkf*=Si9fwuvKk zb=)}gBkIGa`&FMNhc$TFA0^2u7Lpa^_^&DP?63Ae-7n4m0HD{QTY2$s-kw{p<6e2= za}?H6nE3g*+uYXJStQRR5%8WQ?581@aV&FH))`YE9FElCZoA2l?ae}u95NeIAjhxck#S5cC1(l*uQ_Lw+?^6C;s@r<;_o^FdjuMdq?w*?z(kF~XyR^6Se{8h7Q_K9X~ zkN105JmQJD-Dz<j+JB0>D?lPoFfQajHF@>4Hm9Mj zYaZrjZ@RyFv?D4*EPV%B&qsz`ss`4p>jI+uzxUO0$qi^gkjrtL9lJk;tG@VqaWs1E zyN$}|cIA5W#d-a*Nf!O;cGqj*23PSNx;M;N^10i>@_+OimTgOO?)y#V(lY!w8;wII zPbcouTQrheMn}!R?@~-z1{;MH=)+^uTNNbZ_i_E&gXWG(B=aQ0H}KSFXeFAIor_OF zmjnThw8+%#UzdYS4)6De`?RZ-Y_IU*rXJ}pLBZ9Z47^kT1!l*}4M^X1pg+Mx-G@l9 zH>!ZYEqv$koeSw*d&*M#3l(p)ieQ|95nz5f8%*S+i3__v#PF<`Q?{LTLA*U#&770is~ zHXM+n(SO>nM-9w))jlDFsxmaBzyAOf-RgX@NU1^)2= z0A{(uR^YT!rxm$x_H>FU;$JCowN-jla|_xRZRC8)Y)CgxLF$;zq?%}yiT$!#rImdO9k^L9%EpCwOyPMBw=ID zR=oMX#)+FT0}m&kYPTDv{j9$&R z&hdZCnKsb=TAq8J zm0ryeV$+w7bP32_wI=CSMs-zWVObHO+_4AwYUQ}NY5vb|{;&Jql)ax&iqzDG<~evz z^|<+|(7%-1gOycmF>h}Z7a9t zTIsB!ZKaQ1)yE~E8X=n5$IG1m0O&QQtcQt>WiIDtSI*V%Q?l(|er?|5J>+3JV<_Y_4VWUtAtx~x99#Y_1^p}w~zi3J9}vccDkR&qABz> zhsJ%~YjR|?%W=ocRnr?-{{R&_1wn2W2FjoBed=rFLoeO_8uZ|MFxYCBjy931Ct%2d zTB9Td+T5CI4i`U-Qd*WNJ9uhnGGR_B+Zpjnpp&!Gn?ku3;J+?1Y9wbRDtwzx zayp8b0)sAPVuU$woc+=MH8RA9VQtNy;jHEcNr7+qW-9q~Hwhl^-l)w}Czj@bj6-k? zZdF-!vNuClyqLa0AN$o-DH-<0{Qm&8K*Gqyq~&{8J5dxVvswpa&zJW_S`!Qdx99$K zoeo-GEPS~6nzbz<-!cbXs($Tr&4gLGVgT4@=Rd>!+UjE)m^t}?>0I#s^5B8G5xONG+FU4%&OMBLcJJCA$dnDgpBDC$)Na!#I*nUO7x4 z?B!hl00SO4_hDXIGV$*{cUP@^GqiWqRTuBKzwrG#^{rvh+Yj*{Vc13z)eOIdLc%qZ zb5*#C3wVrsnKAPA;;YGlfWtM_eKb9qeqs&Ca=&tjox+mG!2er;^5>mPZj2ewSAyrX?+i_L{ll!Jz?W&9iVfJ|P!n^O0Tw` z3$nRh;j7xU8Kag3VsfMowc%bYkR-n^&Ff!Cwm&O^e`xJ~5MMdfZc5=5Pz}WO&p;Rd z0A~Ig`aw%K%CBD|{3^I}t4P~=kc z9ED~3%TmUt8<+0V$NkrN88e#=V8d{Rb+VNTz%JCBKid~Tmt)F zr)q`OOn?renY#zq6tS~sem2sa!YqWJEt`soyzRVlwL308Q__GOE?ToDE;(^UIhikiI0^30CZG`1A|D2z~%c>`ksF}xT6v#B}d)Kr+*G{ zwv*;g*~KnSM;ug16o!Qxety(QRE^lhFb8IAx5_$ExH99gsj*!yOM@8*8?6KqG2Wwz zj_iLAYM2a-wAvjqH5mlC+fkMB`tzEZfFCRJDdg-bRB$Q9qR2>g>+-EiipPL>S|o2V zmx^GIcgj0cdVsP65W<>>j26oLt@>1I3cD*dcGPmrLzWbUa-8#~(gk5O%nK^?t&7J} z%s|^*%*DLc#b()1dX7Z^g>G`x{{WU2aCr;Tp^Gio_-W`BT!$PQ&QnG6A>*7epa&;= ze5$nJ8D<#hDqk&_{Np=nQ#GcF%HdJJ+M!q!z#lTwHN4E*vMNPcJiW|#T5%3QvoheB z4(zwfS5XbkDmbLmxG2|ikl+iF}OKneMptcRg- zf`m$N8wT9fK(5Zcu~wvF?7uE?Qr~gK4c@MskIS~CBy3VDw4e`{_-Kilh7W3@7KGrO zo@w#?=Qzbc0>1{F0YR1KrqLc4MmX(N9f5nhkpRWLMNBXTM->XG#(Pnbf$Kx}h}>38 zFx%FhADCH^QH*h#LoNqnBP9!QwDc7?v&(0-#6Xc z_h^C$q9Q!7RT?6H=^Rk2>gHM9!4ux7!g`2hmHHk!f- z^*5$-GR3ek4~^8ZM$;}Efm;`ris;1rtz7C$P|-=)WRb{7C*{Ld?XQ~v#xecs z%qf~tCwZ8hm##51VNf^S{PF2EMzYycWB&8*X4R&IiAz-W9DkuBO;Z zoV6}~Tici#LkgDt$MJ5!-TiA+PP>PtCX1jYcW0GPtDmiwnQ+Gq~)#H%RV8*`sp@+~2wxsh%XPi%K8f5N?sL%C>|?4##c z{!yLQMt*4V>0HzvSdU_oM{3)$ zI~hXt#c)a7?~2gq(Kab%JbF?-K+J=u<5l4@9)9jS8j*f&r2bT+p>YE47$TgZrhu6_ z&Id{zSzK|q(xKjW7426T4#cFk2Rm^}M)A1tMLAS3D}sFuL-V?YBd7AK6SaI-SvQ_g=Zde(g8$tyf7ouiS` zw6+ye7!rMZ53OX}N@8$A?G4;@t9uzsv0VQ2e53{)dsI(u#E!sqskSZz_}hx9a$0Y_ z&>V_MobqK`qTG58;;6E^5Eu+~&w91@TMXD9{8?+*Yu)%qL+cjT#UpUfi&*V(u?1_t3D}jw^odQ1LS% zDmoMCSTfn--*j!u5%TuH^sUl4=dplUt{*G^0P3ni7`u#vBL4v6wYM#*!G*W^9lHJ% zl_k0*!BtW-*EO_GDvk1$B$1NkVU*!9$zIjpcz)(6BsR+~azh5&f%G-!i#(A^&fhW5 z0QRnfNtbQ#B!yBl?TX%-?s&M^T^{EZ)wE;FV0VF@7mg{>&phynyt16*1YrI(LJOd# zI9veaaqU~Af{I6ewO3mnOjU`j-KDrsIPusT?qgUZUIzme=hkpb=7$IUS?AWf$o^|k z;B$(X@fQ|Vm(7g-0JEBe0kBFr&sx6G6;KdQ?&QhwmP=?W1#$d1KO~j5E5a91ir;0#``ljI(|f$xQQkjS_M1U0vA% z)s?ww;byyF<(Y89rhO|*gtoC2!^vd>ZcaLS)=Qb93MuMR4v-A#<7x4c7y3z z@yIrD(fU=GkPPOuj^b+C2=K!+yIJ-P-9>p%jjs)q;S_(Z&ItCeQy~nDx!4xG&&DvU z*15NBqBbpq+@7C}ZOd~RqsC;nXWha>!I+DW`DZ^=W~`cyF}%(BSDmgqeXN?Up3 zkr))%bIpDlTJF08i80RC@RwP$4JX!Mk`hSI8 zw~po+Ov=Naih6tgG`Wbet}bGcmPTAQNUJL}k+?vgC-L_yRH2ADCPDJC>sq$<{!wN_ zkb71Uk}4XO;*s8H+h)K;Xl_(O$6bs^LF|yr1E@mP;6fyF1tn@Hv z%pN9%<(@z|JGR#lioR;Z-zz8gtI#}5>~6$}2E=ZCNv}Sb!!^iP{x8y+X9Y#6av4@Z zlo`WTCb77{!{tXk4Qk}Y=0zH)!K}?^nEnPN`L5@`bJ-a`JBP{3f3Yy}~$V!{Z^o?&{}m`V8uAwwPI@;ZMx8 zu$a|WW*GUq)>Wej;f*ezY6JMG?ORV1ZN!cDYo4Pk?3?!&w$sL{7cBi2wCtjhtz$-q z0YCBT=B<$LP>IJ{>~y(j@-ZrGR6A8`&zsaDjZ0-BMclaCT@9!vK`wWw^{iBv%Nyi5 z-PimpLc)ATNQi}gnfuj*hfVZm+D#;qF)88xNnxAVdVus!nI+Sg$lJ%n{;fa+OmT?xq1l;$ibRAvI{Oa z-HNXhEKw@-sbhECG51YoKWHlXhD2h1TC%InD=B_{Abc~>-|OOU&oNJ$?q z+P`k!Dy+O#V`nT^?wXaGbOU$Fe}f z7#o#EQ`M4NolathD!m8$wO3EMF>GBy$!uWm{v%$`HTFE&M^j~Hl3mcoH$Pu$xRSFc z&OTK8-`*9Q3w@t26YyJ)dbb1&=w4YlViGm1^a*ibt6L04K||W~N0%)s8_5ER1lUcQvtLJSfb`!nfW30D8Im zHF+awr~TV2f52P)s@a+a{oIfpp?+%42@OEswN#dEolo9s-?W7h0=d8#6~P*xaN*kDGM~+$4)C3o{eVPOKPg$6BiyU92O` zSu5OjqULi(efs7ys&=Rq@_)rMmOEdPes5a(-sOR}eD)Rccf~i^bR%KJfRfA5f3sB^ zbuyndkDlUKWk}_O?%S3B0D)Hv;}Iy0@>X1Z)vrK}BSc|teqG<)t}n$F@!IL_aXa8B zErzbVGgq=adZ*2Lj`qDW%(&n3{{XvHZ4pF|L0=jNq}(;MA*70pv~qv1Cowu%59CEpQUpnKJT z6iArjv8|ZPjh}UD!?KcwEa!L3E18oNc6xj*D&l3@wX+{AxUO{_qm5rb?AJl2<}Jm# zed^7ja-B7<8I;POD%W*qKbr`a6O#4FSx5GWgme6e)zsMA$7rmvbUyXRAxm>&G4pO6 z>qrI!IO$nXl!*Z!Fm7vVHU=E0-2S!4C8@l36v)t@_D|lgR`_Jn{kk`I*roaZ0Cv1~ z;hb{Ab9+~J&}*>AU!AJ3E`u_|LXtaQ5h`zb-1f0?bq{+*CF)J6Xo~=N~bt z+157Q>s{(+qYW8Y#se~r6jC7A1xWF!49ifWuv~T9TSV5{YDpM#@~{2$)czYRdekw@ z%A^7F8dg?cyV`=GYiJnV$f~jf9Dr@gn!ACuMryPCqyyTR(9bX^3;zIo*Udi}49#p( zACq$(@BBk&_}9`sGbN<4g$g$gf4f=D*%;5^K244?S)?PLa%;!@ zb^*2k{JXiz{{XZ7+V&;55`O4>thuis_<*+%Y4bY;eVqRQ-&I&&jPY?2k>OK}DzNpc zl0h8L8JRxs-9D7XnUu%7l3R~#)zLHDL?MuEDPE=3`A#^uaq-)MaJU<`{{TAGmJcyN zR^1}CQi^qq{KqZ)RjGuQ)+ufGBd^{3D5)VwT|yBIGHfHK-m6y9nM+{oh<^|Fs=NVK zFFn^XxA6MZvqqC5%gQ$Iy0w=z*{>;XF)GSce~5Ig8z-HiDunIsDwU{n^Ps^>)V5g` zK^y$Lo91eF_eiK|Su@1|T>Qhg`>C+RP^NgMX}EN1?2E*UEjrdo{hLO*}-(s=Ht1 zu6nj27dq`And8{+(Z1=fzQ$QttaJU!;;hP`{{W#^XO~4I*Qc#{bxonOH|^d4 zxlfrzUV*&Q)q$r-zv^ZDE2_4D;bdRBwS<{zU6F-$Rv50I!ExhShYGyD-fNxO%rZOm zuFt`i@g}Pa?cg4Jaapr!Z&U59B!Q({fOE$`@G5NQb2_z0rA{W(;|MmYjw)$J*Jm}~ z7w(>#*vVn@{VGZK81c57B85%VhCzcK?rQ2kvT01BTc`Up#h>NF3Q_l)cip8c8*&$G z3W*7hPc}i3_i8wiLl!6Q)1fkSAH!9nR#~$rS|;OhN2zsD_+q~;eEac?J85@OqJk7I z;@^1}`@nkF&@Cq1ZTq$J&&E;yg%c8f`l|)*tGT)LtBdGkUt{6zcXAU9ZbJKt`R7oE z+RIRL82#aG&&OK&7g}j#OS83iDJSOi{{Z%D!LP1ujE^@Gk;2!dO!8|OMj`e zYyG9FkXI9^Xp%`Ymu=O~=V*?hp%TcEGRjqU{{S6Ku}QahYNzLZ;3yeU z*0t@=l^TipT8AwNaA!%UTz=?A{N#Mqy{Dfs)+QMnyVoZL#6%XxHvQ3Cx_rB%XD9vx zSX7y5UEJ=Vc((Zo!v6qzv~8rhSx_kb(^om9Tq%$x$MJWr^3{Bh#Ehw~3C_bz(M|2N zq1#&`B{(OXipBZ7rN{8q-#oBQygz#7xU5cNU%U5BYyRmYF7V%zRt$3}Q=h$E z7lhH}*6qq*1aRE8K40Sd)hKjUr`;Mu#@2};J90Nw^liU4O3u=4;W}JL`0%+u-8FN_ zl%1oR?uWvAP_=|;%N3E^r)qdRfD2K$3cFdcRb7DC(fp>ghcL^&VrR-D?$vgnTG0N>6~yWH6gLcH@C_6mZXG~7-RQpH34>Q+$p#l{{Yx(jzH!R6X*W(?v}5e z{yZ>U0hr}JV7r(7@AALhuc68q#_icrUpstrn&Esr&uzJ*GNF;U+5((l=a%H>k4maa z(z%W!Sf8A}GFXkrn#be|y9@j#ywwqJHxjPZ~a(D1dE;*1mZncANCa)Rrb|H@vAl}IZgz^2-TcNmUzAlFM^IZWy;J4? z0D)DuA}|2xde=KvVouD}wUovDKY!&~*S2eaEw%!O{hzvPEGsIf-DRx-8ziYBZBo6f z4b0TL7NwHnEuLC@%iH_a)LJxa4pBZ@z=BjVnHT-m{{Vp2?T~wfB~EsBtf$OeV%gQ{ z$uu_1-`?8Qza7?aKfPEMlS>?1PTiH!+w5r3x{BkGdluqW*rc}tuSTV#+<)Ld?A17k zL9vcU@YSRaenwn{`?bp`y}|$%Mt1X03);KihA%Ssh9``GtlWdw<@B#SNtMYzFbneT zuJhrm?eRUhi9nD#;hDNA;kf?s2Na-bPvbu3ix?6_+r6o7aLlqV-8D6wYxYIT^{THE zBQviHUW&QwQctNAi?pv4@Kw)Et4$ytP}373xS-UKh6b3bOJGtUApGAoJr$YvEjbe< zpvHHNlmSq@m`)e(Rk;Y=&&^cdYO<=WBsl0r8DpN+@sI60m^4^s0#7&2`3!u7MqRF4 ze+ccL@vpQ|K#czY4lCpD+GM!!yUA`hxtb6H+^XL(^cCyPCeIFd``>!3+qwu` zNVpE$YdibH=2kRfZtcu2tc<0F_E8@ z>vF?l%FS@UkNN%@$c53jWBcEC`?aHH+x}c|8nJ4|e2nN@4tIQ}CH*UI)d2w&_W~=O zMR9MjwyE95-{IX|Hk%r>eMoWt0FPHKU4iU$b}##ZZJoc?wJidr#sd7U81vKGC+3 z&6*s2D!C+#{n9GL0hSogL5i&*36ov6vOPqCLL^mV!!1IQE)}VJ5W^XwHI6@-PTFP0 z=NID%qql)lKbk|^{{UvMi@a$xSDKNIShnnMz5G@6XN@E-?n{uhg``>z@4DAuvzdF;FMu&0RxPj8R)|;PG zajw2r9k~AX+K)a|>g&0xcy5L_?W*2uGld*xw1O%I&9sq7%(1rC?_Gz4uD;8u+q$;W zWlVP6h84hDh1%ObR;&7KlO^158DLQ7KknB>IWL4&p?Yl}qt{H6K!q1*#(&3!q1$pm?)F@*guQl|PrFfs0)cDzt@UG%G{7)=o@7o^S zHtZ{L&-+Hczpyc>1Mb(v{{RoJ(%Z(CaL6|K&yKryHGP+2=yT7_T@*}ab@t?-!Q@q> zR`UL3{{VKW+DN7m^K(+Y(k{gxcvkT_=7{bGmK1&7l~^8|PbalSbomIK>0*B+)mZb>XvAN#uyBi`?Q>|v6S_8Bl8(PPL&)C%KM7#qsayr zGB(#08bh^rXLdh2Co-0T$U=ZYZPhGI<~9MUZ7D3-;I&H!-8lQlr9ir9SaeWIC(DW( z&0*#CsTniW{M8UiK3(53)xq0w@{1rla^rAHczo?x`ckxen1)}Ks6YlgVu!h$WKFTb z;;T4p{{XbLBcro!?MSMfeJUJ_<|0M|A%#6LoWDvosAcAu_-<%!=468?c8ZIJH0YG8 zt74=L&O+jd$59RW6_nF*%*^AhOXZmdJW>T2%2CVE(hO>=H)>J}wpi4`T10c))My)p zb^EmWOBlsS%dI(Bj*Gc{sb)qgnnlWmJr=2G$$=Zj%kz5GIY${hW~`F^4Kigcm=y&a z{Olsf@m34t&Hn&v`?bF~V2q5sFWszfEVFLt!m(zMf+B2!PTrLOEw_I`S_CX(FU@#| zkNzMhg_d~${mePZ2c`yke@f0zQ=K$IP|x3?H?QfgQw! zkjRm%6v6)hSVwKAqkVYAdq;%7XwL!olK5C#U9=OF-WEaCeUE>_vtH@#*5UkBCCxZH zA4yC%vntduO68gv2H)#YS>FAsG~F5yYo%-@8(;ng0L* zrB)2z?5#=w2j?FtsgoR0U1J1pU*Vudxbf7~$g#L6oKg{iwupwrVRjBF2-(RT8kLs= z=}!t8I+BJ6*?`(`tJ0$#$sH<4fm4z`?KB{cLQPi0glxyzNgXKUhGH>J zA=E|2;sB^NVfhs}I~zEp&Orl=(rR>khk)SmN-==VNI6!`DyraeSPFqeUY|-pK^%0bOqpY~zEeyL zbMl(goZO#s435*>q)VA$IXhNYC_6*4!m}(n~&X=Zk4BU#5V5Li*q3? z7aw+_3sM|xK_e@EHJ>6oWFNayyJzI@Ob38E5lW*1x(}2nQB(Lcz0vQmYJ=$6Bdw%vYWXsrsA)&1z9H7e~k4saGWlZW^m7C;ebN zcdJN_$Ag~r5{WKE5lW@}vNKYmW9IEsc_?y6Q9ws1h~*ekPtA(VyOYdhTGF{_ z{?5c6Ynh%@41z7e!)Bsjw==aCHuf^^J$hG}$_$OUeroS^Dc(6R#6x3SmBnTxkj23yZCDt@eOlW&+zR04X1h2d zRbM7Cxogj~Yq4v4<;C-6y++9hJGX8B0A$jWkeaeHWUz^MFbqAb$o?V+hfJO*k(NmY z-}~ymgG*#1%u~6$*MNLYo@iinz;Xu}{u-%CiiEE;eo1)GQJ+!QZVcO_+aXgP-Juyi zUY~_>?SRXZxd7uG{a&7=Y>2FX*?{hIWkeQ!3U z$b6;R%-ni6UDcg?6JA_=pDB;!sV7MHoPuf}Bg~a&mQ8{@pZ>ijwI%L(PmNOMD^`wQ zl_SG$UK@{E^NW3PV`PaK#3cL0M<0!P$BAZ}QAwlNJfBwd>BV^kou;0el$NZ1RQreS z@m`HIta6ppMBSi*zm4u>SynrQN*a(OnA5fB{!$!7lm zYtxGF;+|h5J1*Aa0e^%2n)C4%x$NN=x_Ta!s$9!_vCgu_|Nk6uFp=k%LAP4 zKQGd_9X1D@1hO{8AA9Ltj+EBON<}6&dRLVw@1f`;r9dP*2>fUY4499dwG2c?OlaR) zaaRW`+Os+nRxB8{jnDI+Zk4zb+&Bi1n!SC5 zuj4{#vK&3(OR!Q3;EI5q-FnrXl6~esg+nJFF*{8zrgI>gMobW;&!D6ve-OhF`BJmG zw!zLSxpq=aolQG3G$=f+^0wX=`PFqGhH!a2@m6y2FQBT#q+pz2no%a8oA$^7G6!l*DtyD5Zs2Wwib1wPfzVT?`4j+nH3r6-R8l}hJo}GI+B=xfa<?#zj+j#^#YuSoIj9D&|tTR#_vqMj#gB>zd6; zJmKbNYmSw1k=U1)_;?Hd0M@FzP7Vh(q$3*~#LMabJh?Uqm{n#BlA9{ggO{gImY@B^6{{WX5 zxE6AdJ^Nyz@`bZXh(UhGwREdo!bU~GmR2b*8yk|`~^CxVv&>b^I#aUuJ(cA1wTdjGn~$ znu(iaU>LmpofF!%kEy|07e}`EWzFm>bo`VUImUB}>`p{n4z=UH4b|17TWHjc-0bAz z>t3*;=gjhV{_VN^Yh%NlIbE5hX07Ldt+^|+G{>z9Ho^GJ?dr!QA-@vW91C7q5MKKXIR!hDsPx}J;i09^4|)($6WSW zxpG!Pl&a~Uuo z*x6wRegjgFNdMN$w+*yxI0CNQIW3&^sEZ&ng&v z!o5`2qRRWzfAEg==Kdj`*!BeXKGkGO);y9y88SFb4#OSlgYG32Q?FC+TDqh=WCAbs z58u8;W?Gb&1`tAzTCP)?}TB^KYj$f$uHK7!v%NZg> z{yuj904nEu6*FGbWUu7T+xLCmeqY9{TsN63LOw!zmHz-{vaIBaH{6cGJZ;!|eQRMt zODCHbRUIoQ5avUnjK?@#`6uNiPH|g_ZwzW2^f@(|r}+UHv4VQ$t;Z}cGlzWnc;dNc z%SO}!BjxRGeJVSUre%!3&AaY;)p;(mHpG~a4x*_;ZF4@M6!Kx?Prj}EL(-{x+Kw$; z`v>8%`!<^mv2u1N0QTMJE7sQ-$ra)s3@;vRi-q}v?HKE@dj2);(v<;KI#-=lYJCPC zS4gNM$t({v@WldCP{!CT!K8TITYvEMtfX2+l?1A{YMoe>!1;F6EUH(UjCqO)0~Il` zq;0XM8{r9%^G%Oo7z3q25|&@~smuP>YDYcE{L-w*YL(@~i)oJC>VVaURpHycSG{2z z5+IK}Q!{SI%|0wL{jBW)Lwwl&EcdTHAr?*Fdv|*8JYrd|Tgl)SKZS5;s}zOM{MqMs zb3|ltPgYGex;O+JIjo&l-7W3h$lLfhHL$FbLfgNGwNblMExVql1Msb|^VH+3q4N)k zt>YI4Lniq%-?92vBCLq2X53j$3H}}5{7rOTG~SwnG)lz_4xjAS3@RLNeZRc?R8lYDA2(l5)ON}Il= z8}`=C2*D(`eAL#_<%s?iZPm`hHmMcE8Knj^8BM+a0Q&WQ3zugSKLl`4e-%i)jkHT? z_LRuWvNd?Yh!0E<>3EK_ohO-33iFvIx1^;s$9!L#n}q`875V=CGI0LQ6g z$s2=x%2*rAR*jc|PYbu@?A1%%6yz|hhCh{h(8%6S!P2b9^2Ad+sicLACZ&8p-iMud z-|b^dlgK~3#?=+^#=h+Z*@hL%zgGSo)%Gup*iB<4yX1f~{oYo-Jl2xgZ&}WF?%VTr zs-qUpTth`$SOySEetdk({3>e?#PM56r?f9GmP(zc_;Zeiv@GQ)9G{u^Q|(ptB!lcy zy~6YdXlm%A9Zx<}K198OSZ6S2W2f;|Ip980$_JY3*^V<>I=nMA{Mlf3ws&sN%~+~K zh2J*EuU?w>Pc@e#ndFijCII%W^tg&AR)4woR~3(Mx-h_S4QSgg`8>H7368z9RNO)+ z)@FuA*)ikzeJQca6nZD7EF&c{{VOWs>-C5id!2tK!|^MHnP-`O*C6t6yDzTLMf4OWnHY5I-|O? z$0y3w%4rDPwFGUInl#_JzU_Ty@W;$BAvupAe6{jLjl_slGW^@REqzb$w&iAmJ9CjN zJmYI^$FZ!R#E#4s=g?D5!vSgy>{O`!8iqz-xhLgXPcc{J1LZZ*W_pn)j2Tfwovls- zJ5;Sf8@JtVqNFH7ed ze5>(JHkM+`^DJbk^jvXTQMJq}tq-5A>g z_fnxuE7li^Vi9Sw$gP%NyIoZ3T1SmpJx`dYQj!qdJM^rwvk5`b|-8O)g1{YnQ zbNs6r{7ASXO3VH|{LYX4+UYDoO_8)=RhM?^=b`c>jI0dEtNdTZTK4x%JYH5YiszCU zw-dntZ#8nlx=VlFM2-$Y9jlg!0z?{dzjw=Bc9({OZpDs2;jCnWDkj#SBl)3mfCpOa zEuBM`ZlB$*Hps*d;7=9SX+%vgk^DSuYUQZ93!%|PAv>35L9IAs^KI2vwPnU07A)ND ztvh8`UOrR(>gBbxHH#g&0_X2nqx?I%*{H2 zNf)~Eu@TB%4TOS|99b{PFh5rE1f8bT-UOE!TX)e^> z$L0S3cD+h8^EO8R05aE`c=iCge2^sDB5JBfm09Y1>nK=qV_ZJ(!M$@#k)4X93U~F% zr^XdrBc03`;-u*&KI?yay*RmA=N`8vf+*A#oc#Uv*3g<13lxvFJu5EWL~`+!+UPfX z(K@WZyk}G`PT$O2Q#QuidNmk)S}sXm0qdrwbQj ze$G~zcJ0R<>EWdL7!0!Ys*&5i&B3rFtMG}T*pKsV`D$TIEzsDsmJ$Gd;;!y4z@@HvVeiAG+2Rl8)p;DCle@CNK*1`?cEItGrll)x-FH9nv^=V5j&y zH~UrDK_f;Aj&`+qRlJLWIxRjGNpmRYzJI-2z^m;|_yW0PGs?jF*0r>%m`COR0EW4& zJDN#6Q4+u1u7|?Y$u6;N97hWyg<@-sc%9{J^ZwO!UJbYMwfjBeI~{fopFe6%8c|xG zb!izIY+KLIftq#87Jc8{q_D$j$WVOrl97|2mA{KM-wl!KEs76@=lD$x5)xbZsW!O5 zW$8=DJH4sPV&GI*o)_Gwc4{@+W_Jgu>HIuZi32VPHCSaAa9UMg*(TQ=81lL3#-_&^ zsG?nwv0+3}H^@QVSxF5dXye?Y{ja@WJ$zhjui3s}h%y|Xmw(O2<6lAl0IWItt6x8S zVnHQ~!3*G!NjrCa-oNhryQ@8M7JMI1&`WwVy zWI5k}Gs6D>7x!!D>zMqD`CNajJz08JvxG~O@vE&!79(#kkO1zT3GGc18NAKMuWw4x zw@Y|~3y0;$ddZ3*9HuZ?{{RlP)@8~)JjgNRyB+6idsWp|X^|6buj+q>p*WrvC^;W> zKl=2x3{u@7MA^6g`EOd6alqAzTX-H=2QnUqANSQtSgWe-+_jz_Fq@-Y&Ff9JnqN5X z8>^mC)DluPk|f^1F6STJ`^{R=lPU8P^ZxB+2Hb*V`|8!FZ*m>{q}rvwhPkRzkf2X) z;vAcX%Qwqig_Bya0e(`|$1R(^z}zy+_kX)xC9=w=YxN)a?Q=ge?#`YFgowp>0=t_7 zAb}3-@zS{6H+;?@jORT~b{0`cnSd@;e(iG2YDCeq9PWQ~Mr!chLLVz`+NW&}Tj(oF z+=4M&z%^ow{H1pL*G1uoWsg>gSLar0=cR?27%}3y9}5N=t*mMCVB`J+P?+faXWYIW zL>e`?#u*T0cW&EO%gDL%&*f0)L1NONNXEnnHjlmX)xdzVk~Y_&4UchbRF)uqW&SFS zzHgKr`)dCH)~TwjQf)lbRT)UGq%&+@qMYET9jUt(H_0C@ST3r+bo|vE>{GT(Na zAw$mUU;y>|t^)6= z0L9m*-S1yMd}g+S??h;>epupTCsMd5IO$s`>#3b-XwS{R87M_$PxYzuH`o1^uRgbF z9X$C!5B__ivjlkSf7>*3X+c@y}GQM192%y9hGwUc=P zPw{XnG(=~0JnipM#v>{f{#IJt#j?bR&%e$4%hH-QTWl@&PhHh3${EV9@nVT%Hwf(O zhF|=5Z2*lFbWM^f{Ehlm$k|+CKll}9LK&^2jXq+(-m8k6mB-!V@vdn^Ry5&vjawhX zS8OD7EMMkd_Ny)vFieh{m1|NNLOVo1hO=?^MQa+6&dVX#xn`})BP32XkCINUT-}Ph zy4?ib?7uB_P(Df$n*jdxWwE3sW1@{EjxeX@^jhldZXQc?GOpJj!~N>#BU1Pgw@>{B zx*KL#mwOHSep>U|3GQm7YbVU37^^XFBMdlNhTJsKoDRRmQ#6ShqPNV$<=tGBE;tdN zG``M)y%XWfrIx)M#c*5YS08(J?kj`al?7C?t#{uHTmC8~kSJx1cQ$!np`oU2hur&m z)6N!=NiNVx+;-G^xh}%4Tg4+T0MmC=Zeo{7Ve-A zn!R_qNpK$2@7koEpIXWrnYmnrO7bHccH8+#x07i|sZV&$e zeO5JBQ#H(W5V94B1M+_oxBmbYT4Dr@uHTuf2HHh{`FncTU2d)Reayc&t{KY4au}sH zDf`rnm}PkLh3!`3h4(3{(>YmiK3sOLJC_t!ndFit{ucDFX828*Z{jl?sZ+miMo<3$ zYP?)U9EZ4S_Fsj>J^uifjkK>{;`wV@OO>5?e~9}Y8?Ep}QFfxLsQ&|A~Am>+xb$jxf_uG&?Ex+erzk9-f- z;e%6?Nt#R{+uZZp{i^y$Sho|~I&Iy@HT1X{^HWUx(=ny&>$smaX%qdA z#Flc({!_;~lq>uvJ40978bhtZ2_kQqhc)oGh|AdO(aef-8wURXd*-jLd<(6^d!k!^ z48#Qu{qL=JQaG9GcI>L^rM~T0mCy~@tQh1d=YMLuaWo>^aQouAVqqj%X_w5#dQ<%U z!(bb$8V%yzrfwCx(ka>w4$yw}R8t0yjv3Yx95>6}lTh&;g`8X6!jb;fc?XO>An9Hd zwt00+k#49zjlTBplvl+c5xzO<_u8lSABV`E%2a*wl+TzXO{#$8^nUoy(y*2yG2HqL zqlT+u^;$0M`;qcYQwRNq@1?{;>A(-J~kD$Tt zlj;ciR~)fU{^|8_;Mx#Yl$&SY_8$~93)_w9a*Pr7AH%MGmFh6-wo<_ysKcG7kKxa+ zrG8H6UI)}~VgCS$M!xSH=tP^2^pJi8{{R(pS052PdGO=JmfA(mt0Tvz50Mk+4j+-6 z_2BcI@zS-Yh;n8V;D|rr)VHboF&*NNbKb6HT0P3y0=`1{E%D0R$MMQ_2)@O030RI# z?#rHvpL_2L`l8Z*J$U(rb*Y~VkHF6lRnn@g(W(Og2_JT&GC6E*`DuzvhC@tP%uUGa zRm_h+m$`h9gN_A9h?x3R3{xJMrUne-%T~oWqT-2_wz0=bIXt%lnv7LS4vkSvtct6S zDr8zNCe~Ais6uV&NdYXm^s6!C23-BxaWils-L#SXB9$XhGQV}HjT7a89134Hh^3F>hl;^-xpO&0K z5Xz)3;@A~NcadTOFTGY=4=)7ts?OjX9t}**;%2$ptX;O&a+LsXKQ&pnW^%`OD^!(E zLJ`GfC1z~}shg=~;M^N(rfc9o+G>48^i8^Gc@kNX9yAPG{o}unOn$ZZ-lZDHV!(ID z%U=t8WtJ1ISz8Uq$(wWW@-sK^AADCl-I?|LClBAL9|CGV5!Qao_Q~uXIMG7y+QEMs z#L~4}t4D=HGAu4WbU!*C%%;A(@vn~UJP|d&*(~GKlHqn-z{deW_27<2WAd7xOw#-X z@k>TJw0d~cZeb4yD1kh`;sor#etmyBmrF~uexWH#s?hp#_HX#BW8&Q^KMtXP?JHRK zN|F+CfMd);es7<+J?rbZn|IHgX1_E)X1J|vyj^i-ATr-1efB5a^5yA}6mgH8bvFx=6A25C2j;0)D78DHc(X}dO%Ppv$}*aaz3H|^cphp^HZ z%yGEzDnB_>0CSptIAmeEff!~P7z;#1#8P+s-6&^ZHq)Kaa50S3TX{LBbW~dEIYAG$ zq*5|-){rh2a2Yg+J$lj1t~T|#B7?gfg-UX*^V3vea+K}aakytSboC;_`F!piVx&}N z`G-SIeD33=OA|8?M?qD8cpKDEtfy|;cphIJsT`2w9Vw(HTQpB`NMgjP^7D<|=-PL% zr+wUpA4-f8jB!dVx@16q396?k&F@wmy5ydQvt*J*+)qPSP`HxKI0NP8vfKm7r%K0w zJ5*0L(a&nbQev4_Py+2Ada8mjMNc6N0bjjY?3)W5)vJxGJCfvX`Khx8kYPvCp)G@+ zwPg}n2xIcKI1>~W?>s;Q+O{H?7}b~fx#p=vHsBGH+||YV+>8p7NS5K5x2`w?t!dk` z08f4^CN%BVtw5}EgN0mEj^ceyRGFKMRj4FGCP!M#icgRcR^dRdA2=eMB*NF+)JDi< z#Y(+1KIh%4@q@BA* z%UJr8C~%Q*d)Gykh;0L{V_aLK&dygou~;;Nm7Mgd%P3XtTwjQ-T&qZO7P~nhjLaK( z;<)X0=re5{D>WOM(}B0}{UmSnd3Y<(*QaVWYb*~8p_q}ya9wEKDNQ_2?AiHax zr8_faGlr7RB)VB5`CE5JuS?RA-VrRFE0;D3U(TFlFYwoCrx7KpFmd~RUwhQ&G}X7{>@Xk z5u4ek9oz1D=hN6w<-`uQ^6xLuW0fD*73f7DOv^J#=YXK~YRbHkB)5?n@yGD{Q|;}; zTPmaDXMbOYip)HVbZ`6X({ops+(jLO%_PaOUB31> zYV|!u%+|xn1cd$$fxp_XFxRA=?h-iyp&!70@B9niy6JhIeO7u_iDzvK!7ZDR`+k3M z-!I zH%i^@NuebJK6iS0abCCKyZdP(WwrU{Mfu&A*S2fTmQn$T<7qhQ-n$(l6oy1Z{nTsM zZ{FQr1~I!>_HgH^*|aTfwn@*;+;NKOY;G|crMTdHp!)r5&+U%ccx5%*XB}A z5O(#ZtXKr+fz2?L^E|d6DWQlA6n)WE$S9&FAPx==X^pguNHQpJqvi)Dp?MW>x%rQ; zY9$*OJBmV<$>5HaN=G1-J*sJ$xAEzUqOfd?b>pYwP6B9YV8;flG-2E$3b0TPKp^@a zxvHSPcXTI;BP1d+s~HIp$Q0>HF~{A=#%X2@F_Dj2t1N~s>UNi$;Cpr`dee0}aM;>sbUeN~?p&&TD$)7?i-^A@%EA z)blKUUAs18JcIPEh1}N3G*F3o#(vj3vb7I>mzW(w@Y$@iv8V-bzKk6O5FLzaeQh^%;1ybO+bssUul zBP`W4!r>-x2GD62%;21WdYVysm%!q(#WG92QhT zx|#%pVqvvvWWd_s=Rc(^iowPkAa<=e(3-F*R*TDF!0B8jv0$+*_csUR#dpXzp$azQ zxc>kUxsJ%&$skgC9{g6uc05B;mK4gvhatEfs**~@7tJ{yz0b80BMHeo^XX8S)H<+@ZjC`HIK7y!TM3Gyz_u+?8S}f#ad?5K_@As-2ibXb`Cnq>L!RH@J z=%*u^Z&T;n`L}B9*5k`T!O6)u=~yybl(~_RSFEudp`q(H%T;XRiVJ_*?(MASZl&0Q(7xdFHw(^dX3><)WFsg# z4!~9jfW{09&OTgLwwTO{(K*}`udQM5j>!5q;hV>8DP;NNe0~DHhf$OT$0S$H{{Re^ z%n)2fwKkqndwLJ8eJZV#T!1T%ac8@SOO&L^hxvNd*rHh?+U-@QaAYJeIHy2LAuYx$ z9ag64U6O>@0Q=adL@=IZHAWGggAjU9tX4gT<)wdgvC*>(vUIB{AD%jG zY33@gm{75=Qt^Z`-EX*0oreT}bPw*=lVGA9t&pc~@Ajx)5$DTWil$hkSC9DnQ8mh_ zV~je3#YSXgUBARWYOj3c!d~G<{B-YHC(3hGN6wx#xmop%h7T+`-SctNg5K50#*lfB zBzs$U+CRHp4~=dlTkX*ymoK+H`L0eIWkuf6h3?+XUqugvSo0;hr($?eYRa_n zTu6aGau*=_`ig?qcPyYp$~&L$RoiurGSa?4_oqJkI*6Kwwg zQ}XfH{{XvGEMIE5WBa$;ioBNsETm&_f1CaUzO@%+UqamCNVZ7{8~#+8ux20W3q_>ALAD{cCv7$gwCjHL8 zd;O}~XbsxL$Z+Z2qEFr~CWV|*%%WBpkp1o7-mL^=X`bD>)o+lm%GiE4Rf3@~T=L)D z>a~qc?v0^)9bbZ-VAW$We25?C#eKWs`ONxy$T|V?*TTLNm96emCu$cTK0k->uem%i zZi}ZPqh%Op<)stV!RmA|6;h?f2dz|*5?QxnBCNU~ZMnjVr{%nIGVb{eV=6~=iPW@V z41DdSE)U9ohM<5na+2RK`!x7h&5^fpL?S!rPE&RQcBisRr6c*VNdid;2enBfzWvR> zqHEp=tBv`iZ!Npjk`)Z9e}=0QwpEjLSu6|Up#@0toKK8xk?ozAjz22+%f#?3H|Jw; zZDy)nC)_v;}S2Nx~@vy?| zIIU3|I7LcC z6v4c>{LCpl{c3_pt3Q}msH=9-K^EAf8+iW!d;a>XikDGXo*QMBa+7`4Y^T28TIlX% zfHEW}AP=AA@BB4_CAH!uZLjJ4RdOi|ZWYt_UD~ph7E}?hXZxmS1FL-7zlyb5DcEma zp>fi(QQ<+f9s9mu8@*drcXi+V130L1lH7cV)UcJ&Hsm&aYo@eexue>{HHl&)l?19j zhRP{B7YA!^ACm%0e)vE!wpK?V1 z061#qtJtWcrdL{t(^?5D8mz6jj^(*4G9t)+_wdvuutN3CZr?0VOQ||Cpw8{vaY)h-pq<|}R9usvO0dqm zcv{XZaRU9A{{Xv4T~Qm%`Ljx!U6g_MYBnUXEWaw#=0M32_-~gPrbae=$L_5sl*#jB z3Teu|SKg$xBx5AZvKBqQQC~BBO^fX9FCQ-K{{Z9F^wT`1ChuP{{9W4%sge@@XYr4^ znDzdZRQj1!_)ncDjUI6(enDLKi5?lP+9=x_ROJ5vwf)-aWsOt?BP(2Yi3-O9MhE-m zx~R|IJbK5>`ogTbmy@?}EZcKcp^QMQ4ZiL_O24Yx+pX-5j#!`5Z>3}W(CxaB{IX8m z54v;Hb$gFpjsrp_GnNc?xo$qSBr+ip?^Z+3;C-sR5ty1mpPd_kDs*{nRJ-ln?s{UU zP`RaT98a0LZvGn9fjr59cHM)zv7vQVK4;IG+KO1z1m#N9Nf#4k_B>efzVGo>hyg$_ zn^^wtGCL_-m-Qnle&2`2x9nK>Vb? zcXtiz?WJ4Sof&YSz&zz4{Sx8_>pA-E{tFfE=>_iMM) z$V5%tGS?kNsZnP0nFPTB`B&DjS~&pk>MDYiAToT$rG{iPJaKcgulqZ{opV&!l^Zhi z%!D%Hy$j)sGV2kO^0S?v?2%q|6ic1X&APoC;q=P-takhGR}J`mYa7_>!|r{rX#iUk zecWS;umi^q)@;-^M9F0yf7Re~SMZ22+qHDGdQp*5ZHT>bQAX^;C#6X+QoE1KP!b1E zyIP~6qSJ2qcM5Sx!79!2tyX}sO}O1pMhm-bEliu`(1UWbCf;hqe>ckfQwPnr<@u?Q zK4jWkg~c&aWJXg4@9x)td{J0#t)&t@ouWO7-`FABz2{P559B$&-=CL zM*B03XlXzlceri2`HA(ViWq@*2d6(ZPQSg0N~*85EM8RKG5-K}ZEDrV-H76jRsR4; z1A2YjR=$?oq&Qq{s&GUAa2v1peQCC#p6AI$WmLxM&7t!hG-Y9CQq0WFRv>96Dr7$} zYM~T?HzIQD{qMb3El5@`x1Zu#h=k6D)R-R!?)%oQoQDVH&f3V1;Yx`bE)8nw?hfQZ zw5xQkS)(a$bE4B^l_cDLU;PTZyD5Z{7Insc?Q!o@UM{{V!-9ab0fRxOUdD|Bt$DOlPIQ|?_H?$cr0>G!I{(Js-q?+UA+Y?Dri zC#77NFfX3f-A*T_wkW$u=V@#KO_^0=T+-k%$osV%=w>Qae(h-)n$lznqC$f>rBcC~ zJaDx5lq7>AietXQLU6*OQCzn&lGep=WMF<@m1@j!v}(EOQOD+NV&8U}%<>=ZtvY3{ z!-@Hr8u|C){?*cMEwZX7W#yMYb-wTX3ciDjYd+Rm@L!6SUu(8t(gYDOe1CiWnw7aT zdLIh-s@~epCz>@=v3DO@`TG9=_o3$_XboROYp7aTcJu|8=I{RXcn+;I{k`pm-MhCp z93S^<)x$}}9ws72IJP$;IbU-B0JT%xhT{iv=W)mPsE2yDl-{2%YB-i?pECW;-1FAD z{h@>f@-|4NW!wJ%pw*;lVunXva@qC98iUzV7%J)(bkk9x(wc!(FHXyT2L6}NwSt=j}ymP7MaeYp=7 zcYVgIq1qW5RFCg}7ykfbSWZcr#OPv`j^+E+(CPkO&JOt8uW6dHdh{HD|?c;C#pCtI;mRTz%^1lCdJmGshOh8=AL#7rNtGwl^Ds z@7@0EEn>$R+nnOJ{4;eJzl^`|Fys5xnN*i6KIhQo^K|&bw0*73)t z!qN9ZS6?dG9V@aM9@I7>W@8{`KkU<3?mJiWsE$K_e|$7wg&Dv`L@@;gN}!BuL$_cZ$^(QTSFwEq2425mS6U>*me1S zYTY(vQ)BZ##%&^`Fhrc^JI`O2`?cq2+_Y0|E&Qv}{8x2kBx$6Rc0ak(4gUbySC}+k zympNIjnCb$Ukv@z$*FsmOsMFqA5U7Q(1^(|pO>{*ffZu|ZXdC!K{zCG2YTt1uc45( z!yy$4hWo%8m1BE$8^%%k`);Z`Rhb>vaUXx%(yy0Qe<~)!C_B`gfi$5`!pOkL- zt7gM$+!Wo8K2umtZ>XY~*;unin@2dVmefTeh=AJ7^H(*eq_UOA@Yh3Tf+-ZYcKg-m z$kqn3OEfE$>Gwrl3nYgQy=ej@teby_=BXuBl(H{X70XfT4V7h8iTtp673d!b?Id3k zeW;zjQ4HIU-coV*d)J<#1yZsjZsP^3(*763U&Jx+sA0)DZllph@l~7Q{xp5ZZ7aM; z>-R{ivlz=WFW%yrYO+UUlQVGLDUI@BdV^hYN3RXYPIvnXk|qI3BOa6xKw?Ef8yQDG zDvF|s9Fy|y#YC%?b0^Grslu*Cc~M9RU8i*ki7|`w9j$M?3Kqw}w`S0*Foe-(Ul`%CVNL^9l; z^mmzJ*x2E=HXL^?{55nRzM0QjPnDmX=U^nj+ra1C8l(pK2-&~ZoMZ% z%M!?6ou{rl*RtPMc_YArD4!=WsM?AB&!tnBb3jWH9e!Z7AypfhPC?)bumEVh$2rAE zCbuQ|8J4$fRb(Ro@mEksEQ(ldU%meT0;WmihYQsWNoeEGWIJ#Mc&zG#S901k-)ag@ zHrARjm2x>%tffYhNj_dj@pi4tR977QwJ}APZ6yByXJu+dG4k`}{KBZiY_bN+Z6DrW zytS!pBS{2X_-@sl_A~fR`vA95uHeHT-mSYLAe%CLz}G!#GDj}hnYjM-ZrdjES@{OJ zswZJU>@DIq69!GH%lB)cg5qG<$4`~3o6|PJiZg-yS^L$$0U1^oD5qUrFHF(<3 zAVZbin)YvlthYLx$notFsBHfLcow1`5z~kGkFruw$fPf7tDLf{ds2XWsKjTCed<<~ zF^LB_>s@X)J(PzBNVmUDxUUoO&bHFTLAU;Cdc7-Fy^hk&^4Rk$`K6d?TB-M`m&YOy9t@%L)5WIQr$aaLe|k&oS{&*oGk)PX~( z5XZY7m0-;p#~fsC%Y4+?JhWwyFD*=VSrKqKroHV8is)HL*hKMsyBqHR0C-d|MIwww zxFf4mU}i4K{6u`T@i~ek6sK&T`WO3D`Buh}M`7TdXlWiJwx6BKc=S_Wd)v%49XdOh zpL)6uYx8?fy8AucWRCo>?O&iD4sXt>;Ut)JP8G-dKf_+8Q&Q4!J~N3hnyI78JaKCh zOSOjL82S?c-qo8jzf;0`W0~h01vfQ(eEI;8Zi*I?IHvmi0O0w6VALq=_HQJSWSF^Pe01 zMbi8iqFrjbgo>$bn}E+QdH@0I&2Qe^2;r7{miwwt;67^j=f;}uh2jlK@9*x!`dzsB zd0cECJ_sM4D;l_sl0J(f%2j%)&0Z^W%5MBat^8Wn&Y`N$J++4J8}96lj_faE^L|yK z;!R(`egF>-h7~S#n2{{VF7Ib*rM-ap=I$}}6*pR?ie`z589W8FMK@w3GD)~RQ3R9eP9 zZz(X_{ZI0*7k?OdhgVr+mgZE3PnT$s_DBPN5Ih>+@UDQKE%8R3;oE6|XPlcyj4C={i6ZF+3M_t&%3WRQ1 ze|R#d_-L{}y2S6VX;0A7v`$~hHPUM0xIoN%gs14 zh9|hBD56&V*5SJp!dQi>rbd0A-l>v(tA`n@5c9B%JhYVeKtpUR^k&qvlGJ( zYxDQxtW(^0yHC(G_G2h>Cm%K!q57YezeR3s+SWNY^dMK~f5a_r!&>;70ydZxGX@ms6+xofd!iPA+ayw}Jyn$4s{vuhUCb&A#U0O@3$o z%6EExr{imeb(0b%V`0i5O#F}aZ{n}hg62Wx#y2Rai*HtbGsUg_ZO6$7n}*<9rAq)V z%OG8MwxQL`~npkx}7GRTA8mNW>$Pg)6xi-LiF zhM_DFsO?ip8AJ7^Hr%cSS14GK3Ms<(^`$>6{iXy`82v8z}P4e3t_VGx{ z8I%K>BmV23!kj<`PfB6N2sH78dRU6(w+^&&fQ4|NVw$lC#sH}plgDa|=OdmfKytdq zq?(HvJaL*y8z3r-;+wg<@jwHT1~EWztMgHoVS~*e2O0FB2C5z@e&ZbTLlVOaP@r^E zyOyeH6&ns$+%UbWVxTIVQz4KX@$(w9kZ=!bn`#eD2+%e%dQ`hcH&Ybzj>4o;T=Ckf zB$7E$6p@-R=1<-5MMmFy29;YSkJ7Y(q*c*irIyguy39Av7 z4T9Y&EyOWUIu1SRblS=Y`_w^_nRX}Jf<|jeO0uru_iH{7SNDg2wLC6e0mn4n!5HXY z!YJv1Q^pYh*_<_0QZT>7Ds{q~)L5jfSytQorT+l-YSK7Nj=8Gn56sf^G~|eRnf?)4 zjJ0gWMLS#WoL0;`o7%HsWp9-S%U0w0Ml;fg=qYN8tjw$P^Hu(38O2yeQn&*YI;r5* ztx21+As;bc?$iPd2+|ntSay2zk;)T-HuxuPdKdZTn=XACPIGcZnfv$CL$z9kEehB zwR%LcIcJgnVAxvo?-jrhE`Ncztk&aaS@7!Wa13%M$bMm7)hvwBD}*JN{smt>_zC7) z)f@5rHT0Br;b8=DO=&?kbIwU>aGJ~_L^vI*&F(EFi*$jxuWY^3%=39e=B__d(F(Jw zvk<*1Dn!x}Ph-j*r81-lH*Rm5x|?m0#rw`SR%6-RTV0*$w{P91-d!7eHaOhX%+l&@ zC^OFdZQ>h?caj+9#A-I}`u_m6UzuMVHG8>k3|sjQcV%|A#6N%QpVGeG_=Tv;9lV8q0KVzOU402$v%18S(e9b&fv3~dQHFZTEyJnO&@euLBh2xK#y>izq zrO0x)PT$tG;3*yE>AA=`u5#@fY1%`AgS&cG(5LSiN&BW2rF#*K+XQ0I_ey-MzwK9& z_@Z}~{@TVlJeNVk9<7@6japQNw?G^3f8SN-+TFQpi0`LQHOAEky5_waG1lh=eNFu| zOkw*hZ{`QvysuAxmc4^Z)1w+ zk_(Z=bUI89(@DGJkFU#KUHTnV)`rAViNfy~&*@jzMTxPrimnwSI0p+>Ww#PUhz{+Z zo$HmW9dRwhLW3gmPg-o#ZVQ3){{Skh4)}o$^5&xxNW*M@KRlm7PeG(;MJDX!u~y@C zRp*+`RaDwo68^O;E<%9Z)!N#LtCQi|jBWHZ!Sb%z2TF;WLgSom=}au4%M+Z{lklNN z2PEeQ^s16PY{w&&t4=ql0ALEveu@xsDr`mhnCRtFFa~q_QcM`I3r+~}Kg=vZF zjOK_(Q8)~LIovF#wgILtrs;I%5%j&O>9ftuW}?u!8^P2$g2Ke zxR9f+K7ys0%S(;jKPsgho?M}iO#IbxchJv}E^XNeWH?Vs&zK#>)v}+hYRw|dghP{) z->qi2J9h2bJ^8JnE{1YeA`E0uF~F)U{XxjZSY?nV5b@rlQoB`g#b`@JazaZfW(7#? z+N(+f4VmC~tM0f$6!gVb+IS3br}U(mf@Lz8be-57{Gg7!_B9mBz#XSMbI+wco+#L} zA;R(aRaj4$`@Ziz`_-qZoRhIeSVV*}9mH^d`t^}Lzn3b^xeTYTaaxR#MR3TCpI>UN zH0`)J8NlN`4Qm(5V>p@qTFj?;GN0mO*Yd2JxZ(RroPbaO207{8wUvUYbsUqA{x#DHT<4M~e`l3|xR5IzNcF6VUTEAZz7+AZ{3~p^^W9{OlwZ1Y#dFdh?v1QE zX1b}RxyLe;*5V|NB1u^Llat4-QM!YBG~BFs{Etf5h7;uZgzaB`=Bm1>4UzY|pXG|^ ziah#;Zkq7@ts-{XxF;j{&!u|*0EgZwVDlnkBRLxguN(3m9!810r%rg{yPpGUpKF;d zCdZeIjC!f6JgV?_J^RCu5}+d&b?b6qA-X!z^fN3u^?^0p5xM>^Rk#@lj}+{xfe40&8?DtQP!Ox^AGM%%0)uq zcMJeQLB78JwOi(miEaV!nxZeD090@5j+pkM7X+6hVSe4|sLi)v`sShzOkQfQB#=4u zY5-_iNCx2Gzd@YRi9D#o+otSxsMmJiC=6uh*YT;=BCG3)exM|iGoULT+;%m=Uf8Nn zE!y$soSN@0401=ix`SMe>nQ!v9R_pSg`?08d059T-KWYpq0%){R04CrsgWa;2&CYi z^s&br1j1YKG}G=*q#H`dxUNa+Jt~yU=^~X}11b&cKM40?LiG|I3pPJfjVA-f;{ z(B!-;e=YsIiE$G}<$;28h91QAuCfVtqzNR+N@JsujvfN!+n7(eH_N=RU6fW(AeQRS`ww^1J z`Q8}jvV^}V#{<4abU@&1Tb8{405T=#?)IuOMy(U=IXLE|ZL#oro_cXjy#^~r2z<6Z z2(44GgrInrivG)IaIV1b#w7kN{)Zi_he_cfw#CyJ{_j6g$Ms9+s8x=oXcdaO-9K$SS zl<);|P5Z?wBw4jPkDU+iB2UjXs}1B%rFP?GQnG~G!qI_@{{V8VM+n0>jhrV_SUYtY zExaNT_J;hutD&@#_3hN5K3ji#sH|&1ts6K@k4}}N6!#d)4=op_dg8OGYic;|Pd4Q| zKkq$#4JD&YBT;hLxZt@R%_Y!{Hc2K){%5sGYjJG%hSpXeXkdSL-;ZBU$E{%Q!aJWu z{4%;pGSG3cfIm~seIX9<3X*v>^6$dia&Li77CzlS{e0Kd2*Gjm70Ea=-JreFStHoM z1Ig=BLWS24&{Gs;fofK8d0&>YY}p~{+%Me?Qh;;oP=yC*+fP;?oz#>WY4#)_t~UIm zy;<6dpL;CTO9bIZLsNXkL#f8vCH$kYW+;Rpc}1`YsRICZo@ug&ARfY@ zy$F(BPYUs7o-LB#%{gRlasGc=@%Yvh1~oWUuV3;10GTBJ04wcP&V6gd<&$#0dLs{- zsym!B+@?}SnV6D`AKmw=Q_hVrX_K$;`qtCNE@D!QK9xO8q_bg^xlXpa?m!chorM|#843Rlp1ta1tX1?hAwerE zgU9gI>tZ~!9O$t!ecHyd^VEHzhE}xf5-X`_S>iO+F^^v|Dsfx$^G+0Cu@7 zR81#&R4wEY`H24jD=(#K*(|0#(Y;~EaXe}e9EEH*`?aqOo>Knj0H2r&=XYhB%#M+( zx6illQy~!vh1{&e{3;kFl2~{A$^GH})hUVO+aq%qTF=zDo$rSxgx$uxc|?Fe7O%BD zE`}{87)SiGRTc2RhbM#kMQzINjYjT1^?k?TaOX>gMLaSO_zg;Dsew%$D{R_w{{S^L zSIi-E#YQ6;Z{lH1+*J%?_-ik;cOqSihvnv&sL?l@)oLO#ij^XO-y=U2rOQQ#re_~0 z`A7GvSxJ*`W~j?56+!n_r3|t-PJ*&>_lD6NNy@QYid=btwtTp$Fk)qed8r~(6SnR# zQbhMTZxms4*&~`g;n0uLzBAXYW=n~Su1N3qvtMXq1Me_j zo90^Gd`A^kW^s@@!z#u`+}1v`z2bC$V4U+?t$32Sl?TcEEnN1e=Y5)a6Yk=-qaJA- zQ&v7v@uj`=cfVwqvm&;3Dc$#)p|gp^U%NY52YTJtEuKwD<(^=S8*e>pAUBryLL^5! zn;yQk>C;b?^X0vbI~XEp#mkYr@q_$TVmaf5z$0+=+x+W33ClS{8wF9E_N(@>?-F^3 zDu0!1N|m=Hx0PP&dZruh{VP&vC7yW9ZLv|ie-%-JIBkYwZQCl`5{SN2CIfZvS=4CK z8Jk;<10HIeL+v--vrN7%< z;*KT6VY9m&R{RSrr)D`{{g$#k;;x(9%l;j;(^{jT6Mqgri{+(z6&8(XRkj5C?de-E zK@@GiG51G5TEU8NtPG8_KljaSS!@W~56)|rt3h*Pc)AK?ZHN2SZa5M$?#Fk%P>EI` zrcdFmJjDtL7;fGCRnIRYT4jbIV^a-%8}PlSXu=Lx?|k3GUou522NDssHRisQ_(<~^ zRj~{MA?zYN^C)i z!TYqrRt4QF{HClz@v^qhy-~<81*2?^H&m)x5*ya5ZFhaEPGS|6M-({d4HjNW8)$lF zT2{etyG;X}zeFdS#^9<|8pi?-55k^V-`-|u3#uWl~$ zw$%fdZ{j!=&uXe)O_-}vGx8M){L#W=i(9b4fom}^v^tAQsnGa`?wWdS9GRl zKQCch7xxoOs7!|jH2cl|-DVG+_oDQ#bn>}L(1M0nKR--=v+q(wfiWzZR2_$Ztwb&6 zjZCsI*gg90q9wXnW0f(4_4&4sWv6hAY|9p?@kJz<-`!i#AIE$`?S~!HcBrJ zDa!)wMPS>aJFq{zKJ7@+YB^HXM2fqy^6X#YHGaZtd#M?a?q&PS{o01!J|0Gk=9BMM zg}t;X9%9;(al36x4qYy8!5~rtjFQ!-3beDh50E=|TF15u#ZTQI-!-)W`#r~+SLVlB z<(e;++Z_d;newX*_^zhd%5B;3LoO?q(yyfqTWEBC_1DDc`x-uW^{z^s#*sGcjFLs> z6SN-Hs{~sP?Ct*UDy$ABOrq?~N@R{5rH=aHZu*fEN#yerAvZjA)%Y6o$kgNWe|P5< zT>k*IyNck;$e+H??(4AdLldmPTo+RLL$`tc^<<9RI@J5GNZf2=jrT6a+gcKB4YZGz zvUE8&>9O&GgPq^R)vLdBcwfC;&{`gZHyF+3k^Dbe+f6oE?D4`_#(zh@D+N zUEQgLf}fX~ad|#gC+SSxjoGQxk7g)!EAzL^wN@t)vl^IYA-R_{$PrxRu5nG5O%p{T zN?BO^wc_6sm0{B-lV(r?#=V*tcT4l}w!CZNly4rFG$SX^8w)DuXgyCfC#8&BPl;rm zrkY8Q-Cz9*yvxSP9F{VSmGcJdj_kkQuS~m=546i|6L~{Ce|d#@$Bm%Qo>|-EO{%Kj zD%V9lk210IqAEt_X@|@S8>wMZi}MZ#1L^Bh$rO=F!|z3&eziTEC{?9@yZzH%m9{wa zAVx?7&%EtkG3mOsETUHnE^-@{s_gMa3vWBqy*?5n_u}T8vct7mbBqjz`h%Vo|wya~!kzrNZ>Nj)uYo2aAqHgBILv*{{Mp%5idsWD! zF+SK6a<{ks%~|lEETgBmt&4LkOsl(eb%+{bY1uru)8$W^tyl?>w@Z_c;ia~cCSM`S z?thyt+P0!Z*gVgfy>VRiAG$76Zpz`=RZ%Or(qNY2RFZxXYlqX(5w@b>7W_?iw)dtv zJgCPX`!#uWSkyE+lvPPKv;FF{q!`<6V#4!E!_HO$wIEnyDzP?7eed>b32k$0vS{BC z`FnCd+Ws2e@Q0c;Xk|wEbNT-Ovt0WFC}i5e*HPf-jvZ11E+1p_yYB6&+_)`Ix%5U) z?5lGc>?BmjByBZALxx7v;$U!qe5+bOZBe-KUDTA1Ry#z`#?rv^O(Y=5sU;ggV@=tS zhV5Gk6`@_lSbf@xUzPW*OBve!f||e{F+x{~&XoReQ3?|BzTccE z{^0fPPpQu|`A>%Rr&+|(gRr(+pO487K@*^e=HyLI3nO39&e8?ddss4?<|{u;Ec84R(W z7N}alim!qTR7-FqxbjvejDHh1@mC+c(5OV|Y++W5YJ9G1q|&_WWRYay8o4`pw&Tl_ zYb|tfNYei44)5<*G^KI4oi(8^xpTWb*H5IGVZj`&avEGWTNpRXhOXw(O|To62-V9s zVMOXJ!ICj3IUmZWj0I)L+PkW>IYa?IZPj%{t16L-=6Z;daNy-f%UYfrQ){Tla+`#S z_dkmbSo2QNo_QbMtv?S2msE}$hT9hIPo+(m=|6b;zeSSf4I(9%=5`C8_!VDi3r089 zO)s4~B!9Z0f0bKkikzRjUWGXx?LCO?{$z4jt|?djT~!T$(euqo=N8(EyLQnhb4R%I z8_3@;-KR+z&fMan-Sd34Jd6-4FD*(Iwx(>)8+YMNBM?{8o?b<4u=!0_AcPzL0E(eW zmlzE`V(kNswc$S*8&BL&0AyhC&gAamN6Jv84=%c-}7$U_iKX^Lg-_d>{2p6_^R&wY_i@>vg`d~ z^kqLOQC@j1q-^RA|x)#bIPcsF%ZpixIZEaLn$*ev+US*)M`MKu_aOxMeXa z%UTgDq-{3c!D}8Oh&;vqGmKTyB#Hu|`mJ-$R}r~rBHFTsW?#BPe+^uP$d$JblkV3( zBW9Uk+{^q~t?My{V8c6qFZdN^r6S;5kIRjLLyZ3bz`kngp@2uWSw}6~{i^1)s7uJu z<9B@4-GehqQHJzim1_owM`vXINkYGS9V?`Z5|wS-{{VWqyLJ*p1NB6!*fVj^Vuy;s_=nO&h1AldvsHC2W8{H1C^5N+|dQ&?E8K^45j*w%`)&$n&P+gRe4 zxA6Y}cASSS2T&?F0|t^k}zW2VxSxx4%I6%l_UMGDlh`JM|vd0 z*wXB&wN{u05j|J6NW)>rUDVV=<+t&7pe{B?P=jyq)p*_dy-nq-CVFC^{{U7ujzuIi zNHAg}y4S_uwDq)8Xi~Jyi5x$^1($ise{<&J+}GLQ4Xyk&@we?5AZrNrM)H*mgr+{} zT%cp<4oz!EbWL54&Q5L}rIY2#@I9)mHv1(k6tRDlZmH#(N4jML2ngv?F7;M*`IJ|- zcyfA?+(u&pKTfq91Oa;U(S7N%G8jOR6;f&9Mv?yZJfY90wIzO`7BOvPbp}t7T9zmw zc|lx-PP@3N1g{?DCn~)uk!+cHe4h0)EorHK#yKKqcWxTAXPfM?f>V2+;a~Br*b!m* zGT3kLR;(z_FuyRxWY&ObMRhSFANS2{Y0$*MnNH^W)y%}L=O7LIT-Qx&$sm31#;|g^ zok$uM(3xjomDbodmk5M>&MTU;e%gpndeV84MbJUPU+f${sieT$5?Vx`T zy>y8*!9gPjcg$;_u$S!tf4yBaQJ*Pxw(YgaBuaPCwIM8lGyG8C|=&Z{LJifcVzLk zerob7RJ_m7@*E?LJF#rqD53LOUzNUHzPqZ@7}pAOo!nM6k~x$>!AcCD_G@xAVt!x_ zJNi^fT>4H@!66E_Q&ywpSz!C$?Nu~}NT&r`D1U{&O0l&glWa-*(%ou#7f?|ZKYmPd zhVql8Ktulks~sxD-fT|EC*P`DnnmPo#Wa*ai6vDV7v`oAH*Q{^-lql%H{))2^jSQ@S%B?c zpYY?xFQsd+d6Ic?NJ2^d)vfSzN@tavQ0AiFW9&~8+9a_^+jfKcSI&1<&ta^@@t?f= zzwzq&CiYLXTjnWuqYcV>it#Oa+(&u2_+j@?@ch;Ebo!s4t-D#5>H>cYpYvR zF;#E9yE(5l_;W4GX{d*HANciq1VFTE7w=b8R)-|jj{^Ad;%Gb>;9XMw;E>LuD9Ilq zJcj{J-pA%z_%B7Zve*6{Ycs*98+}P-G6a4@qNvW^?Vd-qearhz_#apCx5MLMrR?+U z?qj>dlAwsy#?C(W?D1cjUJSdo(fnC!2CjzQ7%miDLczDJfAY{3_O5wpBldm=g(+Y; zpzkEz{{TaWa4c>XJKUc!v-HnO&%c5bFrLtFcz%DE{{UvMtnR)OXy-Gh@NQoQ>5r`GQwcQOY>|JAKVkQK*3ra8yIlH(n9-D#E^SXC z_(`eXSo}iK?(AYS+!=^q2JFWoly=9kB>olZwjU3*e;WK&z3|nu$QI`2d1R9rc;hX+ z;ChYS@$Xz8?E0w}#S2-klpqDI?ThZ;?J1%P0o`#uSiq+#2M(8D|uF zd;A*s%V6-ucb2oBVgV8ZvjFxx{^$MkU#b?i@H;v>?p5dwe2x1+cy~;*@wb7stH*&n ztD_J`2YaUVd>`Q;9(nG1)YMHQ;&SdFt6p4{Plfy~;N4%r-xv>r^vkJ2WUz)9xX8V3J9rCN%}s<9(seu*vCOfAI^%l4zf_18a6x{(N@x z+fTHUv5-WdryirNdVj*b7wvzv3+s%&WxlZ_^CBz!(Rt0jLB=|I){9?xp5A8fhO5o| zr|M3faKZ&WLW;j{<=o}VZDp*8A_)M658V}|Z3CcKd$ny8en};EPGKm#a!+qctux6Q z;10D)eJM7-XKOTQW(B5yE-RG`GBtJGTD-mU;QY54=yJ z*XG}d@4hGeLch7xwAm%Mw2vYQc`=-Y=|sU@^Sv_$@4!NET^ zd2TrdxYb#AKGu%{Q<7ZOZ2b?{yA5^=mJ?e_CXKs_>Ed1EdY_iR9sCdR>&6}jOPw=T z7gE{J1DkImz8Uz7p<2Z);zO-R9xiR0hYmhc=wn(d)e zqdYwOgYg(RduZ!Vy8Tb3+a6MuT>WWEsKE88;G8-Ve(1(3*euI{IW^GFibN`pyDj`Q zo0UNJSES<7^ z!0oE#8a^C#rwfH&lpmI+ff8lhXru`gOmFvr`BtvM8tqq;jMJJWM=87R{Mf5;rt&lQ zd)7$vINjXif%wEnd8A;lTywOalvkQ+TBr7h ziefj29jAYjXU;#D%v!#*@x7LxY2ldQSip5Co|p^mT~kNueCZuu?1SOsaW12&k|X;# zjungyeg6QMk^a}O;a{OK#vmS8HS>4u*`ThG;LBUdvn018&O8l~i3z|$IXM_7HS~k2 zb`6?T&%`*EqN$FnHQwKLgW1;`NIcT~uY$sp#ksOAC{-s3pML>6PXbgNljnC6ryA!^I#V^RFI=d~)i>b)uh zoy?VGWBD;x$i>P%K|a+o?NCiujU4cJ#auxej1l1* zeiah1X4{@BeY>(vK)DQ54rqwt#Aotk+UBOVM=D>Y8>K=QEtff~cK-k=Vox5G9_U>b z;~rnk+}48Re5$oVCU2D1fsh~sx64i@h?D|>MtG|cZFVKP)_Eb$);}#;Ob!P_R+uzs zIxZ8QoodWV0_8^Prd!Gin|^gsGIQoqk$?mtlcU8?@&n)kqbW+nvSI;U@XlZc_o^w%E_>acw^JntWO+kC@OfU z3ajKv&~&JrO?kA?g7k#9jRC_JuQc&`NgQc%{Os*r(P>Jy^T2K^lkq#kZ52vx{{VWS zNKaE2z*mL!B+KjyM_;;Y>#aE@cz=G3fDSX>zBusNiaW(oz}@oK*cu(fOQqYHI}R&s z8;hQ&CN(u33FV10!3GblVYR-+CC1_2x+wQDbjUTGKE#Rm>HOa1n^#k2DN01xWnq9+f29|#H|`G_I~I4wNhyo6#G8F>V0}uvYtbder^1>qgGVTk_kn@ z*&kut*6@!}au}EP)*{z!+w9x(f_ z_iM*BB)Cn`9iby{m+4*DXsa9;ogRlr;kR38$z}w<-P_O0{?P4R<+h;(lZ%)w`Elhu zfVX<`%?b}Fmh-Z#`@U}8!o7n)yNc{3ff(PKyiGLIIxsRlM?`S&+u27aDuADSSD{(m z#<3fT_-us<`ewYxP1E7Gy9|eTi-tb!U5=0~;kqz2xoG4+JNxt*-Rai8TN6b3id7#e z=(;7mb{Ry%Rpp-uj0 z$xR!lUGm_1RMED@`MMq}M=~1Fh2)n!j1O9hSxUpYPDtbAsmyBqTi+E%RbVol3{vI| z2-NNcoX(w{iQ`Vla+5ABm`^$pJcw z(i7CeWoJ@~P!Mz8tB|-@Tbvw@D$0%Tvy7)&uPca3%Y#;lGj_`)d!)}DF;wo_D9FeW=Z?Gzy)?i|B4S6=y->N8 zE&*0R+jtoiUEI!VLXeG=7Z_yq9Z&xNTB}aL<0AkLhO{GvL*twe=~V9uLJYDo<2|WH zTAZ_57?VU5w?_W}FLUT>mO@IAKixe|Un-NM7{|)}bH!4)widC8Vcg&hupIqxKc#oj zS{#!_X(Wvuq8v9+J*%FW?0FT>%tmXXm_jy?2JCgmKb>LuO(RJAGQg4buF6)q$5C9R z46-ysozaHr^s4T6N+ToXPK5h<)!4!_m=okU>HN)S{hSsHD9W+v>T9JOa)zY|RT|{X z&5_g76{F#6N$j;Vd2B$2LODH$wPUiWNf@~<7=xeXT6%oY$7$t7ozeRH)k+S>4Qh5r z)E*tW5RK6hCjP$l(K9JHUNhU$ytCo;@7ioUl5k?e)-{l>uw*LS%HkBh3vg7B+K3^qA zucbzkd7ym9aiId#Pz|-aGGt|{suzhfyCCz5zceh#wIs!7fgCE(f?SUHri95I&OMR~4jxFyoxnXYL{NE(b`QGW%CDe|yZg51$l+J0#d3O;~H1y z(U7F|6~o0I`GIqs=9eff3CQx0D-W1X&(cnB5CYspG zDft_b$8UP>njpOH>0B3sFCiBH0AxZjUFIbICdd`|y=8eeebQPB5sbbEYPKZY8Dt+S z)l~|EdYlS!1;PI5tfL(U<*6q14yZT{QZ!72d3^;oAPXtZO-NWQj1K~zvm0LNX5H9~ zXKfGjHc07J)Hpkk_32Zmn5dwSt!{^{iGOs9xcvV0&FbL<21FU`YoG;}f2jn1V-5hJOay>ycmXR@4 zSx!ohwQ-kYj$4wXqXHl@JNr~q+ZmCqNybJ;;Z`DLiwxr|PCc6ywm zK6UYw5?fuYaH?)s!6&EViszz_&y9`V43YHm@&-Q|>-=vM#jLfsUFiP+IAPD%KK01N zN0iHrdY+|;wS+UInf zjJ!@VO4a#G7?VkSt#oD=NP_(RST6vyuhUj@` zu6>1GSyy`)Nl_mgeQO>mrYW{%`B$&66==cGuD!mh2nS7>Hb^x8+2mb);*VPv=q}GF!@qR36R>@++LWgA@^Ye}!Tb2@Q-=9A zW;(lg}@l8(M*MQ)KQ}p*m@e8Ka=JD5yI3IwK7Qy=ttCI+{BIqga*Y1~dc0Ct?fk}$ zE}x})PmYxYM`U~4es$sz9K_zuR}GFCZdhpkPb??PNgPo|>}Nap%KrefN>$mmme~@H zqpoU&uKlhXpy+AX;-9>D2gG|>rPWsbWHJIUGyEsN6~RRQQC~FfJG!?~UZdmnxrZ!B z2b>?`uPKrusz5kr_3iYpc8;-EJo<}U8xW|9e=$eRyCC;9Jc?(LrIV0OUa&Oz7A70q zw#M6*=XGu)NUY5hVFxU=T&#j zswT~2Zib|Bxc%dkw|DoeW(%8Qi{!HwteBn|O26G^`}Mh}#{$e90_{$wxTK0SN;TUi z*J#yx?c%i{WZtNHr+T3=Ndi5u_p$Q&RM(T;$#)F4QF(UD_rr`D=X}>1M)W+EOlG7@ zau1jHGxGlcvMQB_pZ>HbAKo>r%2q{RFt7VHjEjmlygM6OUq)ft#S{j9f_Aa)kms(*WDftnmel`nj`zNK9!Y4%6iy64$0ff z1CN<%B;C6{w6n?>?E^mbUu1)6-L+~Q8QWr4R+r`r(tuVr*y5O2gR-S6h?!x#6myk( z58kUQDvy?x6)kod(u@u=6Q)x;J z*^A->H`$yh;j8378pjgfN~IZcfAR13YwRs*Ib^aXzBBlVZ*cdhBYqXVeqmd6IdKT& zqDW+YkMb}6%~{umTYE`u+xWr3YP)X`*!zy+zk6?Lis4#Rc(!j0KN{8>s~j?yx_qtT zNEU5UN!OC?(y)X{6eZ(7yI+`p4lAtj94iL3J}{<7`H=qr6>`$TKGu<|WhLQp{{W!Z zvk6)!n)fHu?k-tmS39F~yB&pINn#$Us5YO%lx&tMA_ELK&$+7? zAQtlcxqpIM)`2a_<2%UdRiL#Z+(RQ|$I<@)imY3x@`Bs0(~cUmsI)CeyvRx{gdNqf zVDYV^8-JD8{{TX)Xwu;dz*iaHbqRS2VYD|bwIjGjZCtSg_iI8m1A zTDGPr$Xt~|xh=I;s=`ah@BBaP)aryq`}XPHvXrb; zUnt~?FE0hxX=?g6;YoPpT)8MVfIo$C{8jUjRpFQx+x_q2ub}=H-9zTBw28I;@($kg zbvy9epHg80DaLrJ_$Aq#)NqnjNNm&6KfL?C?K+hYP=Ay+XZQsu5tj26Hj`0GRd$9P zQ)7Nt%NSLonE`N+%kq8YrpPz8U$s^Y46U^7r@X%|2Q@s%8zYWDqhLSx)k>%jNik8K ztHJqb8{=TRe)TS6D-vX?unpS2cle{Yz}E2(_4!E;_XT|tUuyC5dsoi?02HHG?fl6} za5c@2!s=+`0aO=fZ6L*VlX?dKKJ)&NNMypAdWVJVeH$!YSM)ati9HZCU`Mb4!KKWUda)VTuzRKXlh?;JIU$SBA-c@aO*dYRR1xUZ>q! zS{1U1-;9o*-K{9xDQ%}~)?ShxTNupWEnffy&NH^VVJRM@TCn0t-R6H40r2P#%}_2e z&oy-xF(VcoI#!L22!c5SKEqNV**E)5Ob)8}`_$yjjhEp~CR!W4w>D{?y;j_Un5nmR zDdCxa*6_5XG%P#gD*3M*_^aopiG1uQCC&Xw;vVG*^2kzB9 zj#Dsdt*Zhjnf z73~}Z*5_`*iIRGcTDQEQ&s==C`?X(Bxh7KU{{ZT#p|x@yO9>x#cDF(P?JJJOhLH?v z%fnT}GQ5i{5U%~IGrO9n6k~H8%~xZ#iX-xkuHSaEnKNdpjiDSKzolxbNtFP6-|u|2 z%|jHqU{29n)^klHZyWvQZ@uYUwIyV5F)ktsK^X{o#%LiEo-=#Ko zW!toI>qGdkL^26n_2Jg)6ub`2@R$kTO9~P~xWYMIWWZvWWSMTlq z@cMPBQqaP#$HD$83i?cuxM35Yn2)_*I60O(g2BotZ%)7OSJ7JX97zm^dW_&V7_Xo8 zck-lpA_H#j{+`wBV9yG_#Ad+?$2+yh@wZ<}zTqPURImfnp&o{_?ZKKn5%*g>)x~$1 zFPp|YS9P^BZIh$`Vx#>??njevu9%tQe?$s5kW%I&0 z%Er~Dr!+!$3_e_L&1AD#x!iwXzmM4}+d28k!r3)}UKdpBbOC7q#XJx?ozV_#) zC5Vzw;U9XmTXn!?4brpxI#w+=%EvADcUFifh}`Y2%6|#%Q`oLHD}^H^Y8G9x9P~8S z48d4Z2==bM)-J)d$n5wtksG3Y4pXM~wO~1X}NwEWOG^9h^Q8~*De6);JzY2}9 zoSu}cmI_A#lq5EbLIji{b;mW}zZkZ~rn?n#je&$aOK{wMKfPZ1yFf_sUJ>!7O~!*g zx?nmDz@7&0t#m}^sqmkdUMFj4=4haEg(PfYf`@lX^V2hL!pax@qP*h01I2dRQ+(KR zNk8pwZ&mGHWo8~poo-{|CixG4%DoB+d?%4#b5b~)7h>vd-$?VD5LC>j>Q z9IHw4GX3B7t4`W?j#(nzyFKeN*U6U>j)t^hizguAcI{>U^>aD<#GC7L_HeSn_ZfDu zt$jTl+BD;ZMy_Tgk}NxJXqBsW$&8U0@gD4wJWz_Hp&{JW|`4l;UD z0z-3;_G&2sNYrMRHHxt*8&yf`Ou=MqQ)5l-muf@4Ke@uvlO2ZyDgxDYjQ;@3PnMh; z$}Tg~oS|L$IpT;&Xn=yC?c%;K{id!Vx6`Avhd;k<(v8OjJAOz10J5*OGP@r;xyxpFqR8O2Z9rv| zA`h4zyT6I6l6!~RI_o18E)MU#TS$D?W)1SCa;ma&fF zYbIB0oZ_7FDjYI@x@bp6d`7$|{3-|}qv@_}CM@NguW zi=%L`ugrgs?=KbMaqN;-&l_vqz7R(wdd_waC6{S!zdHRt*+0eUN}nmyhFaMA{{YJ+ zQ1-4P#X6tZ?cH;YqPx)|2!U^vV-@q~k2P2F?pPhcJ0JXdl}%%F=(74(sFCxJjkQ(3 zceqwKPn-O$d3-Rb{p6S#`LS0uok4E(Ne!`Qi#vU)u)@TkFIM~C-LE<{(r4j;=KQUXyZ3+KRYoP-gmaZ{^>P_Le;~!NKfK??RN!_%+;?dp zkLBDyytJt7@`(q^%igAhOKhP?+P$hA4>0T)1NeJZ4Vp#-?Cd3DC(J*+{pzRwtgLyd z*y2Bw=hmTgMP=SGQOZmpM6olRebpS%D@YV$?yX9&?hcA@J5^*x*kPCWTC157{n97e zzb`xL><*DW<|?m`yZ!3Ul^e`g3-f<^s+E)#P27ss4fAMcEp$HD_ z&AKWbqYT`7e_r(tyKJ|)R9;UN^H+j=S0{#VLwR3lg}TP48;`Dk^eXyR-&@o5%XGif zjurU%_#pQUUbY($+-%Q<%`)F-E5~Ef{u#wBo}Mk;*x>Q>TK9`}V;gC1=jF;Q!qniBR@r8)-55rw+Qr6$dw6>5vsmL3h zPQ?4&e*QM~^shR-qV(MRoRb$kWYu{jtoj}y`#*Sk$HhJ@)Frx-OM6{1##x?3E4>}u zAYeU5U&6k-{f)15`@a?Vg6`>Tth{gX9YO&7*`#+`L0*)AhE2jvOnIXTbfKD82(=WU+16sJ55X1u>M z^+gk5!hE^wUoC#nh93}J={ioIIQwmt%F5#zG4Z!>Kf+CW#n+3p+dD;baErWrrHESi zFXD%eE@ajGMX3T|iU|C>d3NnWSbhEKI^_QVyUkSW9s^06D zTI@6K`#eX^cONS}+54^en)_e&Xz;XJZ;LfedSLQ1KqHO8`3CpN&#M~gn@dCL^RIUc zQ_{!Z$pWs~2i~Y|^%t>#yPdm!?`oJn$iV}pe98Mjd{Djc_lMrwL{0biU%6ahk)8+3 zoafVuQmM**dxFa6im0Iz$9^h&Ubyj|p*MwmCv>Z79pkz#Ig<^Ind}A+J@_@^z9Z2* z4dHDM`(ftub;5Q4rzMxZQ_v3lR(<|~f8lKm_?G>a3#-N7FA+hYS{?Hnxk!dcAqv=SKs2*JMHt+*=$|xPZ z_^h7`{Cn|#hc!>NYbHHL+`joElK zK@&O72g)QbkMCo69dlkKqgrbI3h@_}7?RHZ!e5z{b~~y!I0x@9rt0#q4S2Tuz?$ub zyQLW6yRtcEm~Tk~b&QWfJNB=uekE$d#hwV#{vf@8w7hmyXB_N>l>OuBk;Z6`G;|`2 zoF(j@v1jOC!M`1!8F*gLP`$vrbi{xh^f=G^T{*`}_Z2JTxg1yH_w4QQI$sL-#@kE1 zyxFAc7+P_yIze(U$x085aq!8PI2mPw;qgLqrUx@OTg~iGi z_g<^|^4Q<=i?WFqm8Af)ZvO2-2~>?`Zd$0^>Vn*`C*`iisq>bxr6gN^Y+xFxcXJ$Q z9Gvd17sMVq)2v~VOS_2RNP;mX!u+mCPxuKvE9H+Ke$yI0jeM3Gb4`6Y%Iu47!H&C$ z{Obo@CuYxUEXk`^)+qZH8=9?@yZ_(s|kK(cwDJ{v7>6g8J4% zTsC&_D@Ggi3aW=S`7ft_)?O{O)M2-p)fUaZLcnjE3%dvA+5so6eIMX2+M~ic{h^Co zm2`{Ld=#ARjHmF(kJBFAMMA7|V>mw-MRPdad1`x)$310q&kW5!oR;B%MUr2b4d2xC z74Y%VZI{6}n$pav``zMPn|{$BWy6_tp-L`F$Aah@E~(8Rz84#6?@N##<^{ySa^2!Et6ZO(UZH)De|l4xS!eo093NK@pMe#!|Y(- z^k9FDPxnUNYtsHA>u_qmGq%#S)4WRY!ZU?ZWFdZE_Ia+#H*!9nwM$LK^gl&@4q5$^ z!8&v@N9E2VP2;khD)+BgRVBc#Yr+Jr*&YXK%`k@K%B4;Z3r$5ke(fkF`W(`R*lDjHnz_OJ#ixNT9I! zM<=~7$G7Arp|LFo0mgBhQ&=6Nj%f206U*&Nx$oblYXX!|)6;`crW@rwsqDin2*qcK zQ!IA!C~s1tN(4z5J8%VN$j;6}4n68&AXva|{cAc`8<>9$OrC{FTysewUvXJ;JdL;c zRPNs?Bb~JiZ(uk701ry2GZ6%YaCoT!Aqn-US|hx3Qe)=-0A_~uxl=bYpatcHHMD(yByNW!vjgTgah`0fEJ54a;XoZxCXwjMezcd5RAem2S?5 zAEjSOU7IC&t18Bx(HPtJspU&9NBgx5a_`3B^3|kJskrf4B314>BFf(==}vas7_h}4 zB%s^HLo>3KPNt`uLTz?5o!=nuPz<5zQk}ta+%-UClkaWmO}zmvO68w+;7cv|%&fZ9>1js=>3f8QGGIG2cfb8=LKA%d-!QVp6 z6=Z0f&Bn^-d_eI1g^P?fGyc_d#W;K)mbtw`G?EraUG%E%7d*E?xsprt3cq!_SJ~bl zxJfj40)jaHE;;XC8A%IST?~AfZPoQRg0&B{=@CUK`O!ceY_ z#bR5jr`-!%iz$5N1Ym+2zI#>$iIE%`lX&&5xdUB)qres=KPj$Q)KNPrzEk0Eh#F)z zI3&{EK|EbNhx#{qq732)3Rrxhcg4;#)oY@Zh@83{_OD}i9MUvXd8@l{=kEUicD%P%-XoFjT!WC9PIouq zUX5{l$W|~nkDGb_0MKjBZ#?#nW^~xE^5l9q_iNI_Jx@Ne>U4e_hSDnmbuTlsV5@dt zrFw>wq!VhIn#tvf8#zv)dIhf*)9+%2I5{#HhBA7et$PlU1Y*kG_9DwX`;-siOn-W` zt$v4A0&4a>TS&Mu18$p3xXJ$U_pbLxk~u8T+IMAt;6}XTMzbI#?1ys^wAY|%azENi z%2iQUjD79imGc;tsr5K{9WI+1F)|<<&&#`SJ8RN3h<4g2lONvvD}&ROglw`Kt~o(Ob&vp7o(@%F=I7yg05G zMDL7??j2)Q8Ap8y5%sX^P|TV+Cr{#N*}%a{5$ZJm|rU zayrzs%Fv~W8G;d%C;Xa{NQg!Qps8crR{&$urVFtYhQX$0jIS#o0meI3V*reET{Y6}5VKisT{#)+~aCkgbc|x=+f%m(6Rp~bFC;=gQ`_o3>G(TnS zT0(jm&toraYZC5KXoLB5$q$kt!)Wh&6Q*d_W3@ovG-by)IIR_|a7v!HI4k~i)6Jg*Qg|hzuC~W4E?r}C{6_ut8-*?iZDm?Nn$GOc~ z^P@*%gYNNE(lQsaO+dsAb~YMZ3wb;o*a$+1<`{p`_o za#J9?^8)$u9KWIKieZ5q*;rQ<8CYQnIrD0 z%VP0WAanAlq*ha~5mlASjk`CBm*n|aa95>dw24x8EGZ!2K1@?(LAWtFBfTV~saFRy z@Vn88?aeYt<0OH&ZQI_gEcxBPHI~f4Ze#KfZfe|byK51^^`{7pv|0$5EE=(O1ttgb z#!qV6m^;Pt3|BpOBiqEx<381*T?uo!;M&ylEz`+zG8FJ}+t7-@mf|^^a}Am8>0MWe ze6e^Xib6Mi_4;%oxrZUtEUSiYYWZw(?#NRUPAMhZd~%hyYCmIX6^0y z5ji-|P%Fyhu-R~PS`yTgizD zj0~rt$G5dri_VTPtMfnIKB_B13ucB>ET1Yi2*+XRT*)848iVdV53hplMD?r{U~-_oO~oQq1R@B5vkr%z4Qde%3$idiOib1P)$ zpzX)CQ-U;R4hD7-fOOlA^{NEr0^9<@K45817ey%v6j4gvTSf|cn$#O)R*Fx!7Z|D$ zh!q*i6)Rc>Sd~COD~_L9%2fXVl+hiR!#lm2$Cq|DMtD;E6?H~7>T${kjeJBf+*~YBG0bYiC#HMX zh)FDV*D=F6EhMeR133I~(!JNmwqi&;keh^GK1U8c$MvrfQstUB8PZnh!=^nAdemBR zM-5%eh}eCBLj-S^6|Wp@=Mj_g;~;lFwTlI)8v%14mNt+-kKgdEYk8N-Xz*}TzMNQ5469M$2|2P zO8Z0M{Eqr;VHW{FTz2VS8R*i@HlY|SBTwSp-oDQ89ID!3TXzL9{6E84%=GX|=c33^ zsn1%5Jd(LTa-f9nlP~iMv|U{8`?Zuk)65Ct%1oE z)oPxHC1ZxRw2l~t9}eAi_o|nd#>Ub_fj@XxZszUkYUFP6$G9h^-PKCcVd4AI7NgsQTcN)U85XTtq+1;Ayd|71n`joAK8qC=tS89g;0Cu^CmMe0F zh6mjrjeGRghnVzbxmZG4cViyl-}((r zwYf(?k|X@t##@THZqUU$0Q;UVo7%F0R*7x`^@;>hBmf0np_oHoZ(`{#CM9!;Ch@uoDXzQBSw@vc{^6X}+ zHojPc%Tu|k&5}C)@c#e{S1gi1bwv40U{>9aoBf)$W->+~1AqR@S&t%2$+&&oecINw z2wNwwrE|_`-kTiP2whbNJ9gK+{3t3WJCE;M<{A6n_sw`TQY>>iu+4j)!yhZ{$u-By zye?PoZK}Uxvj)B6>R2Omj1oTZ=B2_01G%TM7zmA&#}xy_Rl_A@)~Bm&NBr65pf06^ zXntCJv*7I&AIxFM#afP|Z(EA#wRz(eB9FQmzuKk=U6%^9$fG$a-mVcw8?wm@!!Il; z$s;+c(W%_ZdQ!&Q6@tycjYtF_d%cwfakebK$p+#GFG zBc@LkQ8Su$K1@YtxbmOn$IJcJ`D(tXu|25+t7TQa{pxF}VLeg^7B-6 zXha%lODEk5vFrD?`hT@rLRM!5MtrfXw6SW_qB9+j^D*Oh;Z>m6<8q9H+O)OHas8n# z2I$$hEoUH+K2Ny6-mhw$`H|$$ahGA^h)EhAPThj1wU$z1b{_Sho zOeK`Ui-vxEw$~)4nWc`Nz{su(9OwJpE2C6Je=XwOE3eAm-5>1NHX1m#!a*XpZKh{c zoc=t2=rzGoW4XI&11JiER*KCWq%PCFYl#Sv;#gEd zoG`AZ!0cnzVPZDC#~J?sXZ)>l$e2BAr0}Pnb(?5ycJ9bI_6^NTxwRLyT6DDNfDyJ=vt$CNkNuDh-StCV}l|PGsp?mKC0A{^Ge6lvl&3SjkM0oVOw}+Fk z?HjS5_D|M>I*Usm4qcfV<(1py-SYncwOk*M<11l^+iHM!kNzgT4*g_`M*Bb+-OzLu z=DsI{%@fOT+r2*u*AKbmRP21$aIuZhjy7|-YMNXufTN=wo&7~!yNoU45<+fn)g(}) zw(>}RU5qjBUe7~~p&%%XvRkh$^KK@$5^!-R_xn`~bySHEj=wcqMpQp0*4p2Cqn!;$ zQ%2qxRw5B{d+zN|jz)AFw_#i6{{Vp1Xx+B9JO2Q7rHxFpBB#rrnf>cK-Gf$UggCrS z@xI-ae%;Jd2=SFacW?g9SxX8p&lXXCyIR&}P^~B4ANmb)PjRzS0kwzwOXkafN=8C2FSGljdyVx#-=a1zhdTX)A~ZbB*8LtTnjD zZSymZHvRARtD*3WYaXuw*}o2|-}l$v{{Vp3F%+RgH_XdjPlVYc)T3g5iD-;XsVz^t zd@|m4oS^U!bYHr^O4M}nz}ncXzY4}-(qa+}GY!A(3emYSbXx9@z>j8-*?ipeaVZ^uFT-!`cz?# zb{=W!UHn9cs_-otTE=oT2J8J*0f@HB|u_3v&sG)wcRrp7F#T#zj&Em>eU;ytER={*wnEPHFrpx zcG4^hAuJPd{_|6dRvby;5xgPUKi#Fo@k%_cp_-n)Zj21rU{{UrL z8!X&~aE<1kwQ|i?Rv;S9wRPURmw&Zr+lbM#BR22-2Dm3HgL>H5hI0&U+dY5YtFeIb z21VZ?`_+kW6l&YmiBtSF(CLaGVJn@eJAaLG&DoVLPK!+~3Wr0=edTYuzwFm>Z*p4% ze7VDayIfQ=x12VgmHU5%b(ZlN6#y-@ep=&XolTtaOzar_+SNb@`=+q$kVPN8ZY|E( z6N{u z?a@alRO5GHQ+*1IedF&PA_s>`g^TZee8>Ijv-`z;zxowt=ss)dku0BiMQb|mY@d~u zx*&US=u#(*odqx57*R+D8*BEWM=OOvkZBb?#wQ$OifH@GpSxCsK~s3Dzz}lXDcnv% zWG;7q4FPtl;QXyhptNjVY2{n*FYwcg9ocFz9$i|zALAId9v_)5B-lRo-|yr2e;W4G z1zd*WyjSB8g*2&NOLKDzjgkfX+j@rjXZyb}u9|OC8SH*u_~f%*nWE#&Hh$Z z*9wfJWQ-p5-T3BQ>MsP5c_4Cwc6O)mjo-!ZUU#`3HeKBfdo*pzc$4^vCnsXA?laPu zmyCsCMB9plhKW?aBiflE4DQVS! z{t|zRtUP<0fxH@Vkyd5PNF;UMyoL3v5Js=L)qZB;s>J3oh776w+P0FFxr{}$1skzh zxw02Aa7VKMHW7Mlt!SJ=VpH>0Tt+o4cQa+a?OyWKuFtw#rD5*^chW}0S58%;9sccf z8eOx;8u^3f#d9{c*maB@&s}s0Ccy?nzuq+>IvWV&F_+p|11i@~WemP>1^)nb{oebl zoYGz6!ZR~}cm0~`t;~^{pxhuQZ}U>QTHvlgUcT_;NRX|wNh6IHi6Qg0V@iUzxUNcBx(aO;EMEJ zk5(g>D%tERIaytSKPu1+n+e4+T~RqoiwzTM20B}BM*@8$A7}U+Lu02 zC*`k+{{U#WRP%n^HbC)|4!<#Me9gzUYg!)~GOzHTpVzR*Y!xFrf#$OyNaSZ{h&eyc z)|}DKA`d6bLFt|VsgiBqxrA&j)&A{z=a9(m7{*s)W|T9o7>weqAX|H$d2z)?q02hH zIs2ostpr3^*L*wUKR58xnVu8}8**`m>;Cmwg`9vvSlKC(`BKT3W-s??5NRYyA~wQv zim`7Rw#@$ktTjs5EAXtNKc!s?$k~B%saeV(TeqG#&eP5-RyiIwNprh3goYy9O8x5G zwQ_)lRoVX6YRaU2+m{1+&vdVV*#7NwR&Mr-<}MuiS080BnQ$?r!%**Rs zRaS;(#7xsDA2Ji`TWB#DUoSZCSO>etdf zDAeJ$vhpM>@?+)2e0lK~Tn(6AwmbCx@!L%($yoglBEnvL$B{!K#WTC`9k{8db$7`e zR%8ZA5UYIKTZ2<8DqEsn}Ki(rMfD!2XhSxWZM(gy3yK=Mb=?tg}=qOzQU!qs?Xc^}L_ElCyBtGXFi zX#Vf}Rm^W~2{2^gMi=y^$svys$XNPfpAq?%65DC>DMGt`Womqcd?E&sN!{|1)7GI) z)8x(Y@Ef?(ax1aax zqMBDQuR%$2v-BU~2B?~x4|NlUR6BU5wrw|&8^%Mo@dU?e{Gj-YuR$lmLE)E8lBMc0yM11 zRM2l(0yBtZVHAz~wm5H*{f&N0{9N$t8YjccJ!)xo-|CmA_iQ*-*zQm(cK-lA_2t)B zsT1`M2-cjGyZ(kR?4@ZAnc}@yU%H$kTj}iz#s}{l%OWvx>42ZDMWpF|Ced}7ZtP;7 zE7>HGOR_fCjoU4q+!Z}*#5@_|-G9QG)LN#FQc)+%Exg|}GN)V|SJwU^`1@t8cyif4 zvKrFvFPZ-Ucpg0CA14{+v2dR^k@k_LRy7@#jOp~vZ{juSjy-cPr~Uow50;1*?-Jv; z)a|b=_>J)~b)7y>2WSunvX#KOxn%h*kw0QpjR!(t_=hmnAVQr#m78gD!@fOBNB=S%d^9b5EH_7XRLZ{2C6teimb2Mga z+O5ZiJR5D{T^nQ0+H^PuL*JeUu>>3 z(>&t7BlvgrUyOehV7RriSZ%GhG>WOe_h=5)CAbf><{tZN^Q?bO zTiLs!Fgw9)pWY!L6$E3geYf%3#&((yf^Y3-iS7m5X4oP&2ziizOE>V>#G}KSUxGdn zPvTECE$@UPXyyCF`G*mw*PX-Cu&wb}I71Gj9(gTWvGdo&&lpMLtzXEu`61HWq&q(2 z4cwnrC%^l()c8xmcQ)Q1{{V!$S+oMqGPrrZQsX$@7t=N8{u9$1#QrO>f^U-6S%;c| zwr&Th&+2Q~{xkUU)TjI_{UNs5SwkP0j*M6M8NG%oU%T$3^hu|FNF5Bn9qn{|KI2c) zY(?C@SlIbt7?-=A;05~s0O(cN{5tr};ZGBX(L7zEM{adU%tmdB@!WjG6eJDf*!ucZ zKL9^x)bVfFyh-92cWF-=PaH|sQ=DM8pgn(D`jf}M1N;_rw$$|dai-kae(@R=`8O{? zk580T%9e-8=D7SkYWo$s>V8%Hbns1|fP7_l;oE3&rRo7MEgg>M@*TG9&-)Ar^~Mi+ z_dkR;ejWIY@P7Be2{Ce^H2Ukh-=WWBy6 zY0-B&!{Wab{881};GT516DuMspO^iY>~Yq;*F*Rnqo$m7FBRPHo-}uoWNp79u0oza zgROaYjI1>O0EJN4E`=s#l?>in{oJDs%{c0(BbXvWe|lH;8-%;oIpJLW15umDdXVZuz$_e|qgTA02!b z)-=nFI?h`KxSBR48b2(b?uN)2_5OA6d>8B+?KerXS-w{O=IYe7(XaI@xZ<_bq`8s# z%tLc8<@`0YX!5Pit7R0{yvNlZ2h)BR`0?b?WtJJ{vgkMYE>pP#5xXDlcC9ZQd=2ov zqYivGskOb)llWLjf-&-xWCU}c;{O2ltK)4$N|R2!nBBx-Xj=}h2-&yzYJEG!TCasC zhf&d_e>N!r95cq*_3g^lLW{8zz)N~_`5w=s_yfj%8S#yehBb+Ny*lS)k;}KtM?_+9 z10Rr(8^0avvi+j1Y;3gs7Sh523AuSZ&53}>fMH9o%hdF)@4+9m2gBbK_oRz5R<;B;KM4@ zt?$OxHvSjxo0#yd+?}~b z+}}6ie@f`XUhT*+Gndut&VOYy^+&_4E9p?Quf4*Ill|)5+*&Sq+f=OLOLzoOjt6?O zs;E9ug{q2sv+yZ9GFZ+LN&AMR7$bvF2KhFi-AIJ00(;i%3PE_?35pkZBhE)z^>r+DIRON9^%5LCO3l%%MZRt)*z{vjq zd$EIXMk$Vsvvx7IlRjX^e)ChlZJ|qiw4)n?LjWN@ZfOypq++CFxA$z{D$|q8+q$Gk zk`)OWmOpx>946}#+#77HKF#=7!MG)*9#(*PmKYFE%e2jC~ z7^+O8AT1CVEwFZ@?G*%cF)qYb&OK{h3~bIZn&*+rMxdT+LK&o1RO?ztalVH`3&-W{ zJxxg&PrIHgHqsrdjPp~*He?<>=(-#(UXbl8u<=a!$W~!dF5!-IigxndM@o)RLzy|` z)ndjV%s%Z!EzW*n_g15OrP-AfqEO=_EUFI`4b%xFnccKiX(!!+IAKvN&fuwR8gSee z=4H`X+X#AAOu)IywQF2?MEPg$En~_hOP<~9jo0q{yO1;TOTO{`Gpe3Xaw~;VxBS!VT{4pO`nxyZD#V zt4nPxXYBGPGL6{X_m;0%d2qM!8Ar{}N}+#ob2Gl;%2(6)Yt^MYj@LN*i+?g-B?iR@ z3-$J{OITTa{{Y|N0)w~Gy$a~a0=fHx{{TX+6Is0klQ;n2s`|Be(Aegw7GvnJz|#{U zQmOKd-*&x%&tHUjHY$NzW>|j@AH`l9V{*{QzEo_bzGkmd@W_hiP+9I{`P=0g{t?{$ zYg+5LVQN}dJ=VfuJ*-V>jgCG~;I7L|R)@>pcVq8=dc6KQ&9sQpZAepv7{b@1cx|J* zxM&XS5Ken>>0ddC=039rvDvgy-`a>V<>w3eS5s$Y3>Jv%^OWVQ1suT1EQmLbn5|KB zAaM$(5BxRb)r-08Q)Zqfz?rZVcJEfKz>U1+$f~gX(fLQ59{s9yWio9eEO@SIKg&nJ|VP{F7YMr`XajQv9U|S6)hfl))$@ zvkkcRsMXd_x%iq!MP}MZ$~)E^h`XZ7`R<{lOb@ySX`^?Uw>t;DS29N^RD6&d>C&eS z3k}mhP5}4mK#~$-MEm-b=qM62s=vVf>0;j+?Z+SInvxVxzk^Ghoe6iM4X%t&twsh9 z%Gu9qca&E$PThM`vBKbU>s1K^bt|}aB?v#$@u;F^L}4E%`?WU4ELm8eT8u`lGO4hN ze8{Mw#z{Z~uH#V$0nYB7#ZDuUm*xAz@}w}x#1c1brE?x`S7IRwM-lyyvO!SBg21!vN#1YMha?p+H7Q9>%tg=6sejqF7gU^Yf3^tcF#$^JGqB z#~zg&5u*@5Yj3J*1+!(>dTm7Rco zcHoXPR-$vwHdfl?d1pB7S?KYwXtB*`BR10^94%Fl!l=xP&#hf0sf3+~5BjywPfw+0 zPU17>INsfjUzrOq!*WMX)mBJklVEOwyCBReBD|^??HrIZ@1O9jIc?eDkjO!hbFg)- znc;MtFds717dGo88#&15j^?*hm5e7(nB|_(M4v2Jl#WGYF4cpG-aW%OZU{bxx{2gy zMhGHLUf+deNa=9J<^&ZTtEQB$tZ>wYj5Ygw@GY$4a|hgjaHAdTvha4I`c|f?ESXjz zkIld}if!kHRsG-*pWUGY>)#@# zXr@n^Gm+3{yhp+QE0!jL-sFHJf0dl}JaRi%xV{8lYoC<%sXltG2N_wJq(&Pj=8$zY zN@Zx&$j6gcBY&G}p;6Z+sJm`rgzWStg9eBqg(HmfzbALngC6sd(wQ6%WXY2YOSx7? zgLqOo+v`>fQfOI1w0$>zb#gT-ff(Z*>aUW?`?9?C`csx>An#5EM>x5TXT%n8$jLr9 zUYyq}Dn%o0`;W#w>!8#d%`DOU$EFWz=KRgdyYlRvGt#seAKl8f{m9%tf{CD33i%-R zr_AcCA3rJdrrt3~ytElTkEJg{5ms2R%F?kk=;M`@e3REXG}vAlB@oQma=m_)t!Zpw zWdvvD?N=0b;V`bFKmXJ5Z--7&S#2N~j~mJLJv#dT0G`$BNL|?HlU_IQ(&9yr%x;q% zq+|QO{{W49ATF=Pel>{qWY4#Q+Qpb+2>WSdR!3k4aZ#BH5I-7~Smz}1T8ZtC!ZIcNrY0t=3f!<)d`(O7L5%5iiT0^`g*=A3Au7+RwcrlEJ!8thnImPboQvu;R#8_*&gpSA;@C zAtQ72A@k5z**aq5PKlqBj%(tN3Qr6=p6R!sjPF7{Lw`E^M@MyiHYXgUfDnGQ!CFq| zt%A2HtRqA_w^elwzi?laQiN@Vm+sWD5~$d$X9Z)u#IwJVOAMQLD{!@4Fjpk?rHz%2 zeJd+y5Q%XZk+dh>r>QOXhZRaWGWbr_C@bb*)T^MHWspLW7w*%aF@`9)sFMH@j8mFT zt$=u1B1(E5W#c=^Bv+7a+7t@;_VJM2wm|v+0PmXm562d3BqgIg2kT!tHM>c6M2)&O z$of^nIviE>WHLOlKFGf2KZciWyN%4-Fe!}*w~VfP_4OZ0Np0i`V*dB>S41L?X&zPM z@?f{ZKE}r2eN@+vAlQH$eB(9jzYuIuw8bcQ$+=I_JL0@hmGiR$@ACP_VP3rtg&u8X zs7oo^uxEJcYf>*UBZ*Hr9M)yM#4}vU6#oDt{{RWw!TQ$4q%yc&qi9c;AMDk)a}-~- z9%dF}u&+bwSM8DuNjKog>@dW0{{RBpR3VN;-UNG-{lDi{;<(tjM(I$|q#$(Gkt=S9 zU;;O8sbC6`u#9dSs~#yX)e!Ag+~0+1+AG24eW+tRr#~n)Iw0gM*vuiiF}k1jYpGc! z18Dhw+BL~6ms7}!i?`LgtABR7SfeiM_J;WpdM~YWRd*ohElFt0=jTrKv27C~=2iKh zn&;1$3P`QVYTt=Wn0H;yojI;%nX)uhqDVG6Z(n+?EYb+UU%0&o{{RzKVVc?%D>@c0 zOg6JcbLZSTvSWq*RH=z9~Ze_SfFSaeiCHSwlz8pwo(c+9SDUXwH@egzLuZj^w zw^s1T*ogJ7u)Y?o5b21P+q|Xdr#nFY>i+sqSd{l zZrX8NpxDV7oGDL~P^@J*V~lm6g$?|wU8(?LK4Vo(ZJ7F?b8Pr-Fl*#*9Omlq!yu=$nOy4MLDXpF~y94gn*Q(o!izlgg8s~Q5#Sr5uFS3y@q zWln>qy-~LtE+K*k<@1f-cDGgKRXATTr`~O}>|W$hH0qx^_3gT~ql*plrqTy`%a_iP z)na^m{{ZZ@Y{fiIt{-#%0PM7y8Z@H&o=l5ZqJn9DRQXtRYN-OW@%fQ;fAUte;q#(Q zH_Nx>t_quz3)qxgPM0cVP09CIFYx~WwOs|L+2Pq5CPV&}gKQ-EoNVD#5#m+pww<0WMIT>k*O^AEzbQakWlpIuv$iZRG) z0K+^xqEGoxSctdE!2Q*xCj5PWhMg03N^bJ3tlz^^&L-IS zuCJ%vR%bRtVbgSVC`CC<$qq~;bk+%l< zw^d1uS1eWdP2U912)LFFmJu`?Zs^D zSgvChE|btg5X8p!;NK?inYyaWoXK#>ga9VB0E#&c>ZkH zH4ftYnDhStpw^T#vq~-Tg<02 zbQU*7TgqZK{{ZM!jFp(;ZP_0yf0y@bUd`TBTrVTNXKBi+?1%3?Xh9tCO&~lYR~%lp z1-_-CxL!FstFG{b!aYV3{{SvqwQ(6F<^EiC`d3}yyO`HiwvOMHk-!_OmZr46Bkqq4 z?@Kf!ZVW#4YRc=qN%@+&?+wW-TdKD}E233LEg>A&M5*X|Fj^3)efd8s)sHZAHC*Q$ zcBd%L3jY8NUm_`@RRBI|g;bmdrlS=cimM}$9__VPCR-L!Sq^jZ)0tawHA>n>Daq&f zs^T`-*s$h^gomL8Py03Iojf)$FuPX6|O}xcU&AmQfz1qE7SGP!RrNZx4Kf_*o;>eZleN{zkLZXS~ z)jnN#M0YuMGP-y6sVxi}*$>Q5YD<_}*7A3Z<9iZm@j$V#V!e574NgATp-eu1S+4vC<}o?F#|> znd;uZ?N?Njw9HWe8#*8MYl5+}oqk`vpGxel6kAG>NLZKY^8B^IQ{pNoMQW1FiIe`X zpPIJSy#1v1thmsHA2R3oaay*dO9^g-Rw=Q>mt4%lG$qc z&s4RJTd3YMp zKJ8hvw3Z;j&kgEmDAcyX=2iJib=_J^51(zhzE&Uj^0%FgJP^8WR578fZY$}ar<=B}$sP0HS3k|}6dNfH>^5HJsV(eThe+VCJ> zmvH|8(5osodB6d9tt|jcZ{izhV;hy-d+o=~>p~n~zJ1-{r$p1&pS(D$(lOu9A!?R{ zB96^NesykBoy?q8@o4v{EeOCFFwOeG4**|ukffdx_b!lX1(O@}78~$ae z*ssAqdR^#TXS!En?Ny5TP1y+&Yfl+SbDNX(*4OxU;_bp~4DEI4L3-Ogg z=+5sj0eVK?#(lnmz1~8EbH>{6?~3-ZU1?62ONfyjR!{CT{J*Vq)0U{`lFzKcvmssw>0Eh6P`*LKS7E1!($!Uu&fk05ysGb^e2CChaCSvW8#)57 z)VIx1DMKg$jzfIj;;ebg=P<@MVz}(~Hl|9BN;39e?^mXLCTEw$5W#YVt;SfNNA3C7 zl)A9{hP_|mMZ+(MBQAJ}OJRGE!xTi)o7DS#C1+L2@%L(^pb|6pYE>nojn8pRkQ|j> zmFnzzh=oZx4NO#F^7RW&%B~bscDUNvrdr&ITW1)d*cBBTF4-98H7sfJ?vjBGjyXQ{ zH_C49jMR=vDx>AwOgSU{nurq;0lUkQOK!z{G5br#x4L9E62e|cCRpL>p?93V?Y_%j zbFN{H&N2mjHTz4zpV+q&+({%bJc^*F-Urhk?H)7z+S-Hn;$?`vkAmldHCHJ6*qqfS zStVcq0XmwtK#-Y}gkB9ok*lxDbBgvZ?s)E6*kmRk+X2Be?<|e(dGz|!phDY3X~_G= zp)p3ukT-vgD7%UhRwRX)0rNSho>jN>Zk1XQDOG3TyNc09Lncb+`=io_BoQOBjglfl zvt#8y?AGP81-|I3F-oZ~EAsyU7V1t`)Pm>{$s!oWQG0*2 zS_tbisB^R0vtus|xFZVx0CiXRYRfQLar{gCRnJuw$jw+?6fo(tt#z7W%usos#nb!M z%W2G3e>Vz$hvxn&>g>OFxx-{P@Se?FwRRUN(L~a(&mhJ+*8ZI&F1g)>HG>7b^01Z9 z$&PDs3v^AUGls7^TZH#D<#4K`R77O$l;r;a6-gNn5~D5|d(~2|ueAo?y-iAqF^IrY z6(D{!?_URH2{YYE^0*s4v0pvNWmMRUw;$fGYWQC$iQ~9wo0KWDcgy#_^&F>O9v=58 z?%p-j;Ym)>p!PO7^2mRXlQvULL zo1-I-Ft=U5!(33rNmS%NW8v&FjV@+OZc1(o#z$I)S9U8194l_9*`!uo=Vp1uESref zuY$enNjtOYI#{;brDgK-=2Y=XBt!?uD@zcHPu<1$$9~`L)584wWE-(q$(I=FT(^!# z*|_XwYQDZ?W#Il3_gnt}X5CcGj|*=r|uN)=&5iTiqkZp_AoKrlukmNZL@RJHM4jBB>k8{Gd`suhZ_2y^4q&v%@0r zYU9c#Hb~Y;vHt*kwL>BDm*r9v)wmHR2E={| zw1O85e91C>_wD}xBE9i4SylR_cu&D;NZsgI}vYGq$;(!diq7PVmj-NwBUr z2iVxg{yNv?r|lD`Sa>hOItGZ+39t1R`%Tcn!);bkvHo0uVEIb{pGHX-|guvCgmAI zuu+xGbTjnW$wyfpxA31w((E+1)b;f9qWkfO{_lP}*Jt9n?S3S9g2zMfE}H9aYX}o; zj7CW=6`x|9;WPF2uQ~Bnr>MgPj-JSE-^oXI8C7oB!u>1s%iw>)e+~FkLee!u0FzdD zyvDhcnIFzw+jn{Za6PMnqxX-R&U2{YA?+Tm>@(n(!g;qVZB(Dyr;=vDi4MY@`vu9z(nV^D}p+1+Ovr1$daM}?V4UL@GxAoc@)KI>m7e0J0tZ;IO0yg>!6k%|=xF@{)_x7X** zaz-BU`!-KOK}B0+dl&5S;cpM>o(|PKWv^_wf(a%;9D@lOK#K1B{d)fZz-#AgjY`K; z*Ar8fOqP?*Bp|zd(eC+|KTqQMtLm?ZIzmJ6cK*Y|az-Clisg>t+YFPZmVI%+^y|%d zou9y;95uWP4We5^8g3=#Og0Bj3mT}c?$1)4RGgfjQ}lnqzZU)*cuT_ib)0&X5m-SK zaKL=kCjf8=UgN*LasEC1p!_wg!8VcM>(4rO`5dNjsDAgh@6=buz8UyI;(d3^v`JPA zc72Z0e7OGrY!7eNx-Sd-Jd?rto}**p*^y*{_QuQpu0(I+1pfegjl!l(X-c~+E-O9JW_q{9MJSV7W9uxR! z9;t5&J6}dp7|6!&yfgiGR<0|O%c<{Cf~QGE?#@TRo)$O175>|5KGO%&21R(6|*WZpStNo+AaR#5^ z(c!p)Pjje9Idiomjd?zto(A7abYCmwK1(x)*7F*4mdi)-)t?`DpT!#I#4j0Ni)J?o zb$KCz9n4`I?cOuc8tL@kKjDs_s7a`}6HXDM9dsJL(U%Gp%df@(**5!Q>_q3_TbrmSB4;k?fi7)(1tIK<< z$Xa<64e9c#sOf?Ce+p)w;Z0vwg#Q3%qt5Y-@-Rkh?fx7L?f(E~x!X&qq`kGt#Eky{ zb$YJv;;+4Q2>d(n_rp@(PMj7Qz{|O1+l-#ssFm8W*^k6~2&EOPJj>y>h4AM}wijM5 z*$$~{o0%?2!V=%yZVuo4cAw&JANXHDziGTPr$@SPy(%Kdxc>mNh2b{;0Q##t!CnFJ zN5xMRPkNThEf#Mv(Muvala@ez`|>O6+t1lg!gtnRXJ{HIG-i>O|HweydHJbU6V z+26;rct^!{&nAf^iRSD-JY#kR#CXZ$tEYOZbpF&g76%ngziWh*+T9;HS;O{eTu2!T z9lnGgb^i5k_uOC)q1e!Z~Hl_=eoJ|cwADe4``3DJ|}4!7lXbSS>9<-{hIJB zP#{G+){>V(X=U&PC6@8*r*6#@3vl!#+&?Xxnu0>TQ?0klP{hm=(z2Ett zrSTL+1wLgpV9Ku(0K1PBR@{iE~8l6>Ld2P!@#+`;nSd~-vYE}UUCZgTt zqVA*)?%gu9(Jc&!{M(7E3IqJ@#wxPO3X`9g(t$idNXBti<0b^`Thl$iX9kmZZ>(E3v{omd8r8rZLl}cIv0MZ6JP%b>i+TChOu_2k4mHr>=Q2nD| z%X3-DB+<7WDo1B0pP5Z=+(9H+Ta|B^4wTlHdgXrgX8D^)1Gn(g7DrTJGgcQ17ZO~Y z0fH*rcPh?IgRNvl;1WlAwGzCCBcQDlK;m9vj2boTO@quEhBsAcmuJkU8)?z8Dnhmv ziO%9K10u$mJ8ESG3Ml)gvx97JzqlXa{_RL5W49Dj99@kO5`j)A%A*VN)l_Ci0#D+r zFC(hsKP_n}jWNKc2>vRPHwpLt?Pi%90Hb`=;c@-t`D#6@7cq1?{Mh@ePbY?D>sg69 zZTVK2CBru5Jt||U7DI_Kf%As{0D#q5Wx*)N8)>3N0e5}ssVEFs=jN)8g+&6&3G&yI zS@KSIv~AINsosCH?cAGd66WAEjNoF2B4n&tmE%b8r*IwX3`iY`2a0y*ecO-AR9Tij zrxZBcX%|5Xn}O+2jQqqLRSm_PqirpV;<6x_nQ~2E6D}I9FsK90$=55^5mQ9BqooNTl^8t+1M5KQ)8+TKL&^l#>nD0|pt${#EIL0eB*JEw@ zbBetWQV-pt4^o;oEu{-5mVe+ivjc#0kGtNv$W?b>bz0JnR&ApMR*jTwrNTtmVfU)+ za;$-abz0{`fX8?6)}WZnuzkg)2^qw=X3K?Mw9W2!2J2J|h?!NOxZSzHxp7R4+G|)KKJxlMn*OAY!6q`Bl17$2e{&&IFK`i0Alr)^Xe)Q#J4a z801wJ{vrYSYI#9c1+%o)MEC6jl|j4fMM-oLeM*^4o?GzSxXp3esbqbDw;xK`xzx9B zBbOa(mcF=|&zih{y;*Zv8&X|aLi+8EvZF08g6=LL)FcjmP8ct}Qn|i{R6bb*kNpa& zX;+(dBtZCP`D-icbaErd$!y=%^>*D=;Y z0W1kZK&gO+P_ee)OJ{f8p>5>c0v*_^V!`B4d(_T0W|a3SKAi>f5{w=v2a>&i3i)5+ zzrpw=XYme@f(5l1k}<$^Ur(idXL-8Rsz}6V<*Yvv>5r=E7d9%}MDeri z_kLhMxIHV*?UgO!NF#mOJZ|+h+obOlae|vC+pv+-n)&=wyRtsJ26`M9b37~NVbkvn zcKX)6rQ}-~iRFJ<;WUXZk($!#ObXvtk=w|%i-hMV(!8lc+Mc8*?ww_}qM{&^jgmRz zxveyi2{w3QKqY=tx6{_Sr0#DSYFSwTOh<*MTO@282G9Hpp{S)1Fw24LqL~Z` zpx|uzxF5q@(ngBi3w~R!RG*Y|sU|kesAG$HkB~^@A8M-7o;Ll_)|4{mZo z3!8D7dk=bvlH@Kkg4oSlm0CFpZ6_V-tiL|wVcMD_a+^rXMY!lV%~p0WjK#>!TV!~k z5JtXZ^(LWMNRP{5^A2%Udum#Rib)f0^LZz&N~;NR*!$I}w;z-Ye=4r<$>wetKQ(O` za~Y6K8Uwc50IwwWKU&0=H(ZunrgfoWYUza8n~LQr&oU@MAo-Z%K7y%; zcgkgUArp*x)vLKQUVq+pS|4Dd0XQ$BjBw# z%Ti>HPW}?tg~-A$Ja;vRwC|BZ{HLfjt#I?sTgxUh>T4!PkUr$&9dk}Bo?--2!Cq9t zCqQYUw&VSEp?qNY0!VbOYQ?d6MHVu0DzZrU z2kz92>Wj3uHBA^R0K9tCtjg=SkEL@(9SFRhS;w^`TUFSzV--@}@D4_OYC|adsyfh} z%IZ#K+J0r+DnW4GpDE(2sY1Wqr>To?k}II7+_tQ9lpi%#yJO|Im~a#mQ@~2)3C1fs zQXob_VnH1#M^t3bAn`4sxy{R*pyYd32?LoNME?LIc0c1?=ZG820Rk37`BxCD_Gu&l z@AFSjPB^ZZCCYQmeClIEBtU1s(xNvp!q6k1d`Xx`^5L|G0+O}%UF@YnX(({Ud!TrI(as;IB|z$1D-yfwdEph(Kwwj z{NQ)|YtW-Bs~&XI<|Bh>xFC{9806z0g<4rev3Zui^3A_^8;oPyu1!F9J-Vv)rHV5w zfv0jD@$?_os!%X-v88I{pg;1?PtLcY3l3xGKJf2Yky@h1vm}$(>sPHzN}1eTkCYEe z#hUUR4ZY6tks#Zio`Y>`+l<6!mz>rFaZBYZsrMCn*6by=&a!m*zuNCy((*LhLtX`u z&`t?JfA(6o6|ZCtpLlxKeXR19{pxT(+N+{c*?+hbrA?b9m*SDJ$jYzEcYjKhOdtUB zwR#g&((q67V=klVoK?6aGDNQ@%nclxm+qIPo(WU{hh?>wPFINt2s`}UtA?!gJzOHt--+92G-birjMPkUicn^yjnx@g z^sZ-8%4Y<=D- zH(|N_>2rgdFRK?)4-6?J18^SIUNQ@FQ#-K2_F7l>jNa!7;?&F=gL-GvZG7FUJ-xoJ zv9Ch7IpFi@Uq*PPl!nixe95UmKGtMy&my)M9@WzgQOi|o8;G6A8_;ykScDT3g>AY1 z^=HG6ImB(a5ARl?F%?vO-2VV}wWlMRNb(;Ys!w9lHsH!sDPFbWyN{XnQkyd0oqOkw zJfuyrfYRd`#%sXtC6VWjQh*qGSEq)lq370#qPF&Nux-CTbN>LdR*#wFpWL?P?O97Z zNrZF=Z4dYO*>sq8mkK zDcIKay~Byn%@)E2-??qC#mO()P@BpOh=XLS;kT328-59i-7GO5kHI4zPk8b zG>NA{0`jD8&%0O0u)M}YX&3JQ0KMs7SbQ$G`yHexk{JX1{{Tfjm)fwd^xW;jCYkKZ zgm&C1yyJITVPan+y)ZV@f;g^DbJ24}xNzKKkxn45d=pR?DYpWx#{P7;aaRY-X%*aP zn8v|JLsmH-HtpML0}x4Y-4FgdR#C98kKv@BC|qoEt1u*Wss8|Yt@71KpJ4#i)?m-I zR<4|de&roOSM1VxtAGW3lkqyzH*L_3s#|g0%Kre9Us&qW&eqJa{{RT&SIOTH;b|q5 z7x_Iu-J(-xJzE}7k|Hcok-5O8%*_*dLvPPfLAEJ;z_j^Z2?v`t!h87dyI9k_ND$Bk@kM7hlyfaI=Bg&ueQnYF&U4tcl>h`FV%Z-gY zVQT`mM&Tn>(8}+&ROhGt^XpWt+1<8EyGX4Fm8C2X-CxeRn>y@{HJI&>(Wn@^PcuD+N{yK zAUwZ%zZ_RF&#}|Z-raM`{cAQgnI~6v$WFuh)#Q@qNlA_P^gY_Gks|bQv>V9zT(`|i zva>pw7dyZ4>VwRaanJk;v@QIk2WTbR?)z6IOWe{Zu^}usXKU7#rWb5?4YmIO+5Z69 zs}>fQ&&;d)rTl;Is?k|t^BPtA=l=jfu4y|L6pdInZ~fug-@{rKu48p}JPq5cCdSmU zGhA{9MfI(FL`ja^V{iUFT+d+YZ(2FHi}yXhyImHYV6l(1%lF%*V%f;i0p+F>+PWBS zp(q{uwPR7Cn)dOK%0nH$-mSZPc?@1)Id4X+I|+erm}d?0*6dSlIUjiTu5n0wV5nlt zjPdlXZwv_&QeHC~u-pF4bFU-(%B}cT--YFq?eLUtcM4FMz8&g)<>6u*NQKX26~0)u z!ppU*lkkGHx@=OC0+bt<{i^Dh=5e3l^{t^LCVJ6&4OEeiALUwXZrfNz(x)vMW!kl0 z%Vj%OstlzfNL8d5f0u1QkH4ClFe3Si)FD+jH{IJ?AY_5nH-C6i;g@gA^3`mhJp9jB zt>#j`xTdZlw&jy?`@3s^@v@e+XB=_TyM?&(C1g|A6~cJj#cgLYZ`{g+jD0C5q0b}Y zEpN(>{&bP@+t1YEUT#de{v%d&=tDe&ji28B^?IIVHMRJ7x>J z1M?^MYj;h8&c_nM2$`Fy`M=I9mZpeGnbzs@t-cpOIBMuavn~pJ-K&mScFeOYd4A1Z zHJ$pn49AZ3$yE+F>U0*074|czOn0qBG3@fgU^k_6tG;Lb-{o6Yqsogo`GsL5C!sol z5Fm4p?^ef# z(mW5|94k;+V+?Uk-b!OQs*0CV+|n7fRO}t9C&52Tcq+fc^V6c*!{#4$v*sPj?00k< zR)s;eg-V-?HtuQCA&fQ-YH!P+M5&HGwdJ1@8~!B{lKVL8{o3_0y-&-#nFxLWn?(P`QXWu+UjBK);e%WONGfV^={vWjS< zBH&}@%7*?Lm$6jK>dNc14V!-TTvScD-hP!vLIdt^m;I{02JH04I#yGkx@z_=Ao758 zQ_tT20Cuk1phN+FWpA3Ypm{!G$Aj9nZBa)tpOjWr99a=HY?d%y1M@R~6>C8oMuOg6 zHvQe--K>a0y8w#AWotafA|(F+SX;evO(2TqHtbq8AZKE)%kuZG>q~}EnM3~o0dKop zo||RnLA>z&O?4JCY>2FXt$FoUprh{{GP!UEVOOA%IAc-LvFzpm0_*cNUC)~1%jmy) zuy7Qmb4Y|Pu7_=DXqh_1GD`md#I=LG#@GYpO4{(&^Q}N(+UI&V%-?(Rq{T`%XWgC} zZ$C_li*9yBZ<%)U-nQfcIBLT1;|TQFf_e|V^0(t#18cUzFaJ~!v6rXTm-8c5V++l zvhj1vH13;rrs04Ul~ujBR|qBr*(6hyuYQG`PZoQUM$U1uHbo+};zih@J;Pu{B&Nfc2N4?Dl~D&?tD-Z|N^rg=_^U-x@!rnlb3LO07?UA5FB z%kzJYe_HHxBq}9=!w>Im>C@7xo3x9=$5ZYY zV*Sdo^r+Z6yP_`YReYe!bQKQ%3XheVy%!_cOh#1NG5OV1Y;gSMto_JN>ZyCe50Cl0!YWrM>zTZ^-Yjt!u{o?C!m?2xj>}1 z0DRT#v&tZ|c8K|Medp;~6U3;9%5X)%5{xyr~m%{{RhCuvuf2 z8NOrpt6f+~`ER^BZLH+ka5gNBs9lHUKg0d%*tZH|Sit+e{cE1nqkEa$?EAgzp-}sl zHeS8!j;K>QJuX*6wnLSz_#1g?2MnUH?I7}3e2t$)?OTw?y*KCn16=QNej?l_3c27n z-lzkZw<-oS&|P-Kt-7UP@uyvf_-iQ7nVLd2MN5z0#jx?3^$!9VZIUK=Ks%Qo?AMzH z5&$uWJ^NO+fpaCa(i!+f`@4G9a;SG;Xa-TOc)Lm6>p4?tXCbjjP(9aVo`w zoxfU$sgN;W;Q499#=!*3oN-5)9zzu4E*k-V@#?7q2~~nA=jJ=A#9~&Fk@!vt7&|FhfMPA*B`(_i4W@a6kz?Q$o(IJwNmsuU4Ki`{vLcV@P4tO z7MA}2S3z}j)5eZGr(A?X{5?k%mGNb*B=G+Lhdfk*q_V;ZHn&&e=U+mJocbD!a_OYnS_{v!BmbMU{!QHN)?cd>GV%vhi1LN{@g zB;ma&HupZsxg~QCUbfM^b@1a!@z$3tZK-LnEIN#1ILKUbob4wHa6NyE73|-$U&kmW zQ{jIWUu}{X32Q8b;K#Q+3-tLhj((l1UY+%x4wpQ6I1Bd(De+vA%_+k4(>pB#Prg)z9uPmd(#UhQxasL1;*bTjU z1KPguzVXJNtN0-gtqSYPUUQC0=lGM**Q);j!sYm#919y=>~k6hkIM!oTy^!y{wnP3d;z2Q ze$p=y>*(KSV3J|ig&jiUzH76e;t#@mzanVto;#aNyfXOK{oNRjP}f2RYD-qpeQuUhfpF(JboSa5W*B5AVxwb>_T9HN^+)XI@V+fLTll+Da%YsjBR?wO zjB*eC^ftFOq$#~zjx2sD(~Fbb`h(%8hU|Ph;B7ic<79bb-b0KWzg|CwK9%r4?J;)u z-Z~ag%epIQ(XbC0arcPzuhQF>Cr+COF`)kdJuC8ayxhl!!ZW@mq~G$t%-Yeih&NTIwSi+c1!+>K~BF{uS}At9u+;qby@&gXPa%-!(dJ(`V?J zYxkM%KMMRGqwC%w^Dd%GrxCu`iexhPll!0w*70OI*0bZtd?%%&PSHv&k~e?d0zZiQ zaq`xu?ANW?*qvrOk&CI8KP0a?L7avk?_mD`I>Uoev9$Q#9=WM0hSnRvWDO}zn+6t5 z!;%5{_ILVK@?Exh*s79s=Y4Il`qS{c!kTA>G&rDw1WAH~a-#?CjPBd-Ua*lU+yZbt zYmm?xUeYPVxe5a0cjG&&vJ$N8=420VdQ`U5{&>W>dq(BCkEq(IjrK1m?{i<8f3=^( ztvX4d@h+0d4gUZsEDST|FWvJ2>(uf;hp&45AJp}0TP1mBY^dsgg=_P>_N&+C)FRUK z4Gpn%d316|Q3xD!=t<_VQnb&o;HNiP+p&7v!!|m{z)7vN$r-K&o4_rSj~6)loN-?k zd>_;;^$&=;ev_*0Fz@kz1p0jPtd`Mlc@Ds2B21S9ci!** z)qLOJ9R_a~c!{-502pMqkj{*pYz4P%C#T(N+MPD(v-Io@CaKgbS;g>CdV7#Y#-pK-uN8qNCg!f_BowGP>aKrmHz6 zw(aTsRkT~^b6Z;wILrS4p7fDBK+LUEtg$c37w**=<}yi@?NS7)Oq-N87Mx{hLNPeo zNU*q7a&X4D&mU@1XgXBdiwAh2jI_wVG1xtgYXm)x$xLz|k+(BaO#W1RGtGWU>L0h4 zj65~td)+cEBF|aUZRQZ$J-pw%aU1^e{K0@jr%pKaHT1TD`)_;`@hlQG&F#*Oa~NNe z_8q86%M=nRBjxT+KOSqN>hj*i^CRq3lMLCZl4UB%Eqt@2{?;D_HH*=w*!Zf^Z%YJQ zdACOLx#JO*$R|8wueE14?RD^09b{;?z9fgwm;)4+@x0JvxlNAIslmwp?gxBURVhob zl#%r;a*=SQPDN;N#iZTMe8zujUx9XaZ)Ru|d z`#UKSOACpCaoNJ;q4dbX^%R#swTHnwF&vlvE3^@7hZmqmaZ8S--N6cd-kMQ%IxE%BJ>MNzu{{U$3 zgW8Rd)PLbG)8LJc(39LGazCjFyP&C+314EA(mnQNP!)$1_}*1+Pg?QF{y+R7o)Ba4 zhLg2h?;E57v~=%^o(|U{TdgBovAu`*S{tb34}*>{PHH}_KE?Y;9<{jVBaGBJ^7@`@ zjnaHorE03}X?YaBS#h;wM{LA)$Tou9q2T%+D|**ZhUx{I1P(^;rB||)NxFL)f<O1*osjG5I zigG(tG|Gg#8YE#dTbhI&!_yU&CE47&d7&>vuft($7Q!Zwa=&trx!cl~1Lk0MDesAFv*PbZ0q3UaRtq|f;x@2hgyJux{vRp#XvAC@* zS7YbPJoM{a%lVP65r5tymnF)2>ROs;k-7V|h}TN;oriT*ytyfY#E>fz-ugCiCgFf~ z_1i>aA#-;+=%$Zv%6?%><^?}5$}61y)3S~Hq>yeMv;FGMx$zB!v-!G>#8yf;9(;l@ zPu=R|Q&e8$IUQ-2_n#`(ov9DidRLi$!h7NPU6x%!*has3gz=C+TH&vMY43$v7O>h3 z+Vm#sBeFpnvoe+4yEq-H6$!nf9?~mzeJUe6agC;=A1_{Z*T~wh?QQV7(^|IDVAa~- z+yqd`7}_1%p(TJqJMX~vtgElvFX0`%$Jv`xo^w{%$AwvBaRFjSPr5+C?td=zvdZhr?6LiBn(BUxNi29$c`a0w!tQdziu}jE z{k+0hTMJDD%c(jt&lHb{1B3EBY=o1&I)jW6T!r85x8hAs*5c~c&fiPAi{@2(haira zR5=9WkJl9+*>#qU2iD`g&(`FU1Ppw@SC4A9YjPR4$Z{6H8jtPM%Sdh;VZ;|;G zY}^$%{v%foQX-2{nD!EW^+rJ41D*|41eN>THA>ia{_ZKpLu%q=0^2`^qGkmC{{W>m zE)1KLCe~Vr%B>@A`DmNaR<@%Z{IR!g1vAWLOeaxM7DhPEYEv{=!Y?&6`j2xiN14_| zkdd~z`;zS*&@r0mt_y8roUSVbtesf=wGwHP`xt&)XjnSog>$;bA&W2GyNT`A-ZXBzXt-)y=ska|?rp&t>&D2m{97r)-{MM2yyg=;(x2<-~r#eW;Ixzdy zmMj5(Dpp@LdhM+tBKfR*rSZ4H*H^l1bJ^U85eoU^A3NuxFVp+A@ipTMOP{bvyP6j$ z`5f{5Rr<5yPYuU6COe^+Wwz4aTjm^T1$VsTgkn$tT;Vup427STw7!XuT~Me zIA>KfV%^%uD2<(n*!#Bj`D>~0K9W=#tSk303Q#G9CQAC zYsWk_CDiO%Mqe!Cv-H6oE7f%8c}h&rz2WNe4Ttit2E7f>u)$Vbr=l&*yifr+GR&A= z>;39|oZeu0AlMFA?!?>xd1TY-(Pfu#7-hS|ma)O*;VMP;Xc?Y1Vnl)qBArIqCc-VjeF&eP*Dq!>IY9@_#0z1}}mnkV3cP#l?K{x}DwN+wiS21+= ztr=r)H)?&{6U{@NzrsqMeSsX3YwBMI_jAfHOS@_7KrSe*0+ zoK-V*EcwXne@4F-A#BkM(QNR1>&l3WF?9>su|1 z+AEi4-0C^^s*Z}x<@p3)k5N*{uNei$C$~{ihmd~lSN;Xsnq+d6CW#U-VBrUEYOWoO zy9mlM^XMvZAu_Oj^&6r%+r0UC>(KFA!DwLZdlW8XMPZKLcRrP$Dl-O-G|3#FZ^pFe zRCdA1Anp{l~GcsI3g0nU4%nDSV6*$^QU8l?0nj&yYbG?!B>EQjrV% z$&y<<)^*Cgyw5QC(Z@mCKDD(tT*6xvS}{DHSUjn~-PVau32x7^qkiAVim`VaNpBg> z)LwUve=4bSJG0xtBzvG4IrMJa*GpZFdX)6gt9GSAw1=;6TFr^`AuAs^IrOVHQoNEc z?*9OKz3H+f!B;959dTMChIH?_b41jxZ6%IWCLkN;&l&pHy1{vEG%?L;!NT#yeDig4 zwMfqP10efW*Mj^(b!#KqNOr@Vw(g+%3eMcf@bP$V$GiE7BNg)TQ5HfPJ-ZE4j$+V@ zrEH<-!_urkR%H%@E4%4V4DzPBj*VG2#^ZTCDgIP`QHUI1WYY{~+)0u)degkv_7bBd zMQV)BF5$tOoP{2pYbsV|kb(CX^Q(7PQ9Boa;CJ)}s7owyfhj*R{{TGIC2~;?RpZ`? zwbQ*sP{_fYBvG-Y3)fA8a)%nN3`c2lGe34I(yRa}g zKVNG1;u>ANdsf}Hhh=9w$|3`J!61H>uN*1BRRCAwl`AJJpKDGw(Hx`0p9IqlT?MhiE$?w zs&hbY(c>VnKAnFG@8r``Xw}$b6r#o`*W?)Wry1yHBj#;x%Ts?o6omO|+3%CKxCauK z0I3bqzR;6Nw!8UQ4l13mgmkEbu#HuZCjfJwTIi>U?q?)?iZsjVnlcc`g}DC!>(k`X zWk6w79^%aI#G{%i$NYXxYz{N=35z+jj(c8or^*csS*01Zf(#C3&XT(~blQ7H) z3n)+kIOp-N4ZG4WWxXaQ#>OFrJvx$W^%QtBNMKXRUqiTNswcwF2}LA^4L%h~!Q8C7 z<2!~4+S%leGwE7W%v5?9&kWwj=3&!~sw{GFth?0q$E`js2UNLKy4p->@~BXG9<};- z{{Rm>J3B^Zfeeu2X;HWH1Fuf?UQdO744z46n#Lm29JT>b$NRXgBbvjh&kPekHLUdA zR$WR9X`*C`<-EPjq-IA(rvzJsY0@?dkG-&(nAqt6YB z+}~I4L{RWTWhlH)wMZKcOD)eKPC+bN#tE1uWgw7>sRFvcrGC}-nDds7wBIAcY zKP|NDi5TDz0(TpK$gPWg9L*q80d$w;7|t_ad5?#B4b!aB+n|y@L*ty|wN3v32p)nJ ze{i^oJh<>M6nhSplg!f6!}_{D5>F1@sUu3-gyl-$9`!PJG;68M;OB9xF{-kw4z<48Y((_=s#Ua%F2Fie zLE1x1=EP)@DWqgz@&#}Gnj_Ry_SSHKK~4=swG+944_(`M`?Yh(W?kc=_N{Sa7+k2u zO&y8@w|81mW>7q*#MU=6TbF`8=WyfNzH`;=?jfC>qae0==Dyav(IcIFz2BvC7d{5E zyo`s0JBF*TP>8 zJ-m@z+j);ELm^UEB@ROlc&vB$DdGJ>WtwGlRcw__iU{;Ofv&0;wH?eQLzw))wea?+ z2$J=FMEOYz$F*8rDtxLUl0$!Y``)$sg#Q2rJU`|X@_*6Tf2+ddG{f*K!-;O2A!8(Q z`Do+hz{e~{Ad~8PcCL@@I2nCSpPTV%^N9*ut2BeHTbob0g%U^0ZYrnyyPNKl770TPZbEW8_a?K;r1Te1W=B=)kdhr{E zQy+YhwyxUgH#0IB69|8dg1P?ycl*`)C_W5$c2JwGnJ{ulbGWae$u#-C3g}nG7G-8d z;3v1HR|ciy(^s)?2+z++?XE4RT*T!wjQSeTmd{j)41yHPESNWTbli5^2TG`?eQ0gwA#{cE0h#UV!z{Kv#PU5t{an+zqJZhi4q ze!)M<@@_5KzS@J~4wR+5wP@A9-Q($61L0PRVs!GhN&WR4{s0)Ehog-Hwi^^U7s&6n=k5)7H4nQ^6LO@4j3}3C;-bL~5s@6OM<(_coUix0#H?+x?oyb(y!U zV3bc!yw&!p_+?@w--bJW=)&#)0D)82;f9&LSzsFnL52I>>qyPS$B_KN@q8DTR|-r; zlZC(>*99H4!dD3y`9AWmRj<{X{{Vpg9lyO7(yOEQ5$!-*-)%v4@Dswb&hp$?L}!tK z^AbIdr$3SO&M{UvUKO`{pO*r|P;|^u6(8+!wST#jzy9w13RflL$s&+Dmr4R<}q;+!L)vJ zT3B4Gvy~vyO$FVo;wWJ(?ejPBV!uio_J8o#l!sgSa(E}&nBN0DHyVYK z-K6sRcK-l?wmD%@^~jn$B#+MvdmHlG8i`NWh07e~Z&?eXM>C=)Wv)3ppP#Bjo4%)oMS4npl4_FyAj`+q8ect0~n?9R_@9 z620f{62uoDHg^2gZa;<^4YHWf0;i}oF=JS3 zpCT;gd!>;h*)BHiuT<~`pKtxC8%Vijbz_b))$Ie}&Wf=-QN|EEZaC^T{{VM2ucG)b zOwuPylwI;8Wl8=TC!y1a!}7Dx?PUGRtb^snBH-z{{VSv zE;|=MkU!1$YRDT0`zEN1g>ZN94;D;$65RXp-rlGca9w-a5@BYmniQ|R5Ax&2WmXpOvlO8CG( zF7NmieVYFO4J;7U`-U#Is!0lX)9A-S5}zS83cUzdA-wT_wX(xZ>|fAEq< zk(e3UH$tv|*!ItQ^kI*RiRVuPE1#I~T3kr`FjdEDzi($hnBcD6o$K_vZ-9Okmh$6J z5n|@!1$Y=tb-~8qAHV5WQ{WGTAP4ML+c%Q$)b;JjJPzN*%~Z1m(1_q=)cnY{(q{$1 zICuM%r*CJfME*p!NupL~%g{IkZwht(W_umeIJyS;_WuCiU)HjgCCDR&XXhQYh2*Tzl-xhvtMcg=5ig%2?O)+v;#&O{i{O8T zpoFAx4=}FRlNjsmOn-qM6?o&0b(UpLbDVSAIL1XooJSlpKR)fOt|d+ArndC^D}j^? zfNSnJz6E$@-f&Nwv-p5+zv1+$p!h4H1yn_4!{3doC8Qa3jZRUYu4ojF>l za}mtT8^l|Q;i!UA>x!l>7Dw9u04S*%?l?;jG5+mo?{b$DN;rxQA1(e|(d`*7C&4+2|+HOG0%3dIPn#&)V570 zm$j69>^|@NHTQMz!ut!Gx44;`C;tE*{3|wpgc>E}Pa4L^AA)~}ZCooOj#OU9cJR%! z$u**~dB1yq&fA;%P@l7pg;n5#nAO#^ znEaN>v>vTrqzU^!_$oQP$h6pVjlOA8&%f8N{yS9%?Dyd%k=l5i?rs7~QCHVL-v0o{ zY1GEX;`+SL&rLol#9muB%i6T!f>m@4b!o!5QtQ{IYpSrf5!-Mx z-{t$&^@JY>w20r%LFJOT!f?M_Q{(tYq}#g4v9|U6tD2={Es0opA2LBSv4HGGNcn!1 zp=~7ODcE;c(&yoBn(>=wAG>~j@7^m?C&Nn=OdNc@1}b^3wI9{weBC63E+qMg?OM7e zxoi7#mQb#xn0q#B-v0pMS7~SGU~^XVuZNbJeBxwwl&|qN-<5yhH50Xqr-yevyTX#2 zjW|lnw`l0St8tg3D6TV3y8g|8K@)LWgI7?yXRewx5V;WT994hqGrRqPTDq||lF;aOka+vFs^A3;#dB|~)rxn_@29?KR_H6K7~NiBK0OD)6 zeO6N*4_fE7y9L$ln%Vwb{)hNm{sUR5>O`P^aQKx(GED;l&D^)~f3;sfYPgQ{rnLIrvs@GSHvq86HaqJgPO>^K`)f z0A{@!c%>79rXJ_#TyHE(=eiRboud_I**w>26cw+~>wnpUNwu>k3*+{WJihZ9kKMNz zL6d{^V^F{Bxu7C}1oJ-wcJcwr^*J5AtEpyD>R}usKR)4_S%86uPW1l(E@-4hkl-Hv zmHHN+vk!&>ydGrRWKF@@hE@AF3cL?a{{Y^n!}~G#ZWn*GNcT#KwlUF5`{U-@>Cfj* zIgBhHRA=YK!w`Iv$}-`C_5A8s5!8s7e5g1LU!hX|%>ExREwU_#gZr}l>c8(}lm7Q= zRsETKBB*vnF5))tnf%9A-PmwH9C2Cway^6U%=ii$X1axkDgMy@8r8E?8Z0Q;+28xs z_Y}XghK&-GwI%{jB)0xOoGmsF*~3jpkS5oW2hLaJS8rZ=ZT|pzqw6u~3k=VVBO8}! zZITbW?^+gqXvd$y{vYpG*KvN%T5FK^7g7=PFaRp^+vcrf@CQPDgM6&0fENrmv-cy6 z1^nv?;t-x1N6Row;t_Ak?fbRSY10X!F`{MHt$ifF1*}ssL-NMC+O6|9;>}iV{t?<* zxVTWDh1>qgu1dP>O*}l00F8`ltfL=V(TaB6!hE&w&+x_%l)}4qkItk|hD@lDnKAQy zMPlO6{;uwLKbWelUxDh?r{T0&wVP?7i+=t!mi>6 z%UkmvoKd^EwuS9cwA+fVIjlt11AXPn(|@#3%)}hkDe{E(ItK*cp4B8TwK-j^)y+?= zBuKdBswLK(t21@QSF}iRNa=HmOgSG)=hInJ5|$r!n7Yw-+LS`1MBr>O%X3~8@!ELT z!q;iHe(*LC_kr9x5B9s)sy*-w3w`5UH;lB1d`)CwxETuEGW8y{N~*ath1V(hXX0De zdD;RnN6lV!J1^R^3k-L!y0!1w+Fg03cqCY}_dLextKTBI1^twD3u2Eo`cA($2pB)N z&C`#kHS18s!ZAFmn0a#_AKlzYpvDGA-8EXy&PaMOLx7SYJ(^k z>C0^k&*mx1`zxQaad_Wo-b{xIv6S=!u6_RiO4eAo*u(1bJ~k5}2j=^? z`{Y-)&HFuTLfNB^@-pbTZX0v|0JH5=!SFX%@>^k!7CpHtzolU*E`o*~o@HzHbY*4c zwUX@lVFCNU#a@>O!F$-8F_&@$+<)3X-N*N9PA`SplyNp=`PASI+?B3soW_cjk2yvR ztGkw~SOJ+?IcoG9Z-)2cOw2r<>OS%PD$L&xZ-8?nuLx56ow zEp#L><>XzZ+wO(kyKm!A4~E*SFj)9r?fu{Q4R(GF@Lk4-s0*iUg?s-1d>)~eg&%m* zg*|mXueVnbF7HZm=N~;|+3PVy2!=-Ce(gqen@#+k*snq|M|5Iuh!I9ViK?)Sd7fGO z)t&vZ3vD1%POA`;aWyv)pokgOeJSXRxx4MGi0|#$fnT~Q4zmvYjw+-L7TKgj^3BmhYs+#N z179utYWQ&{jIAaXvH6qjUo7tAKJU?gojO%*B5K98WPWN)@y95Of7XdZv#SnA*1fu4 zfF3u5ByiX}85_$x$ot2+JplLVQ@8B#UgR-Rwx^jY zOz=qAowsL|pqWf*n|?BsU`Rm<0Q004U?C5+S|zaRJCdK zh<7L0v%u^k#^%n#dseEy8P4Te^}CPR`{Eo9iq^59buJgp4(*R&n$wTqUy0rwg5A;A zZam?$>eZC-RQr)r4V9hI;G7{Ia%A>3*+uZX#R4H9v>+e2F^%6!(f4u6dyLF6TC~4j3J~zl->3UD=zSovWyWz?#5PW{Ye+HaCC%wJ`V> zUX2-25>s~WKiaHgK2t|UoWcU5VlNc?OOXRVnB4ZRjvota3Z~v@Ss808PXhRscH14R z?muzI-Twf-nzDxH({Sx5drQ^W^IQ3r>gIV9ca|HcU}~U&1PsJyf6HCvzr(K+voZ3N z9s491!QI`l?NU$RO=f$Pi6L-^c6_0__Bq@4YAk-2PZvRTM-yZkIEpVA9M+U@%C4SE z1M6K(o&eW8mshut>>0=$ZTitKfP79PxBkwD&1U4En`$Si{{VKX-Okuz>3=cLy}r;4 zZMlDo+M4^^tcPmgWB&lJT_EsZi6W4~_T`Xcdw|%cuY)y7h8<227H^mPwBr*`te%u zqEThT6-rw(G8cJZb(DO&y40~jZ4TTr{{Y`rcH6>w$CWL@Tet`KfBMwxPYCMLv!5)w zC(5J`Bsk3B9XZOuV{g0@_H-#uhX>!iKA&cclNHRRKCZaY5YhRaQId3wA5LqQn-zd(9BzpyI+eR7cQE|$NJyf z9i-H*E;rq704f;(z+8V4gO9tK{hskhh%HjpBV0&6`5EKo?A7?Y<1I5*@i&XLjcZh2 zFy3EIN~qyUd;kFS7#_9PgsB_0ev!dW*m=rb&!xUP7LxbDwoo!XitTY4$HEoz)CV0f zLEDYB>R%c(J5L8)_i+hOBE@TcE0yF$5GthBfFRJ)cT!!!A_k(XPrjqHc zmF^|MQi<{(D}O@xLNIyhp0)Z-;@=2p-YxKK{vOp}6WiR|Y{>&EanyQOms+i#Ezd(8 zol~Py5x$K4viRNb<3@93@dv>(i@hgR2-Cm=60ac0e5k<$^(Vg_YRAKWje3TGX%Bce)=S{3QIIZ9VZ z?7j=ltu)%qnl|{M^8WyOknY`%NJbsb(ZzTstEo?@>#sGmLK!Y5+RgWI^LOkk?5~4X za`+R)-XZXQu@OsapeMIy0I7J+-@n%m4^D#|SIgc$@II}ic^c>{%FJ! zHb4#SoPWJlhpWw2XwL_VjH<~e=6$d6n?ts__!*~O>4;~aPD?ACrv;!?!;(LXgOWeO zya)Di@b`y2OXFGe-BCu{+gS+>*C@(YZ}(QcC*jSGv*VwJ`iFt!)E#bY;x^EE+e&#( zxkM+>@-x&g{06*h;I!8s6Zo~JLwj#3C9T+o>uTj;9EaZCl~lA&FLZfIq^V)5QB(Jo z&#|@7*(XK3)1{kD5?kCEL&gw!goXYB=c4z>{{VE?o5A}ic#ZC!D`ndX4q8OoV!EH0ZHlpWL#Me+WpEdsghjs=wbnVB>UP0q;j~6;OiXhW`FjZmG3jLu!hDZMZ zo@Z}G9;2MsyLf}dH{LhY{>Ss$*+|3&4YoxGzDGhmtMj|Y{{Rkke}?`ky3r-Md+U3N z3A2>-l^n5L{{VT%L*Kn?LMms!mDT#oYO~b+OZXS@Y7dDzb<`6_FNm6hOAD>5zEVT9Z$EgQqtiI9^Y%`X`Ymee28H9@5DzAByQ5?B z5%}?5llxD6FxEBuYi|{3Pv-rU6u5(-*nVx`^*HW5D<^2wblDkvsNk{kqq2H_rx}Sya zX7E;~7+Y!$zSyw&V~}Th4l=6!`vN`d#QrFFa{mBA@h$X?ZqP$3ys#gaW5!!Mmml4u zmd}*?OtTdgQc!Qr7QPpF?$5zqH51=Ao2T3;hT*%y3w+Wqt~-wFUg7&hcn?g{-qXiA z1;e$js1(Z|-U>Dil1Gk!j-c1aNRDkxrrei)LFu@3-Csw1F!+OU;_GGjY4I*n*0Q1{ zjmP@30QpifdSi?yUNwEJerMQ!0)J@j9`nPxR*B*Z_^q`YD|CuaFqPaR z`2iW=oB@zCUd^h0(7qDWCxQ{F!6cUsQ3sl#P>$|fwSIQ^C*->azi>WK3U1g z-PX8GE5RC$pW+)0FI$F7Pqj#!i=!)SFRwigRVgjE^{KM=%aozE52L0CjnILgQ| zjAFi2_@(jk%fPygsIpOX^GHFBn`5FU1nnU6lk)ECT))NNi<Yk13dNmSLY_Puip5ZSGd*n>6(2;citp^tUC;Jz^rIfl-c2M{{Rd|wWV8Q_aouA z#48^jXc21mi{*KYa;`xmAMV$snH2(%cUR)?!Jm&;zYly%5!HjfjdBDxOCK*E&Hk_s z;B_LuT{Inb+gQ`B?(Jrd;v0llStB_|2j)@@cT=fn%Pr56;v9x}D(;_0vC@jaEnASIK}@}n_6Ko9pvJ*%e= zXC)IFt=Rs2C0pAV;+{X0zR`ou6xCadTtyh2$X(gRYHIgvAc^OYJL8SN#h>D?N=umv z<0ZVt-Ct0tC86a?uR~(+tc<>6g6q@k_)}imOIf_jS1`F9P~g>AQ(_P{wL@^ zZ&*N8ywh-#IYGBF#UpJcjx)5V9dX*ewnPALe4L&-AE#V? zFJ5YEHNr{>g-2oXuJ2#1GAodin}Nw4MM}!4y~p)~_FGi_yZ#!)KjKoiGqPaFr3_3H zJfE2Jf&LXAgMV*thF&DP7Pq=?qoqgY74xK2bqGFf%oVrbj(7(GzZrheyUeMOPs&%@ z>01#`X##{i5nq4Et?yMNib$V&GCx8Mbidp1 z&cA$d?b5##{{Ux?k9tprG{fMp5NaMpy1Sbebp6~uVap+tJR`R~I`U0@m!bT9@ICFa z+`-~o6@dwjjFTz{bo=3R>0dbLN}Tyw+Zjej+EzX-(v9iU{?dlwbMj}NK5FPcv@Pyc zhIwA~`J?e8;tW<%FN!n`Q4H3G8QbjBM)EWS?hms(qUS$K`cuH46tr&?czz8>P1GT~ z6DC;3cYND&MmuBDoFpWydp51FMQge}-~!)zynDtU7IeQ0Y4hD(+(+g|6q2Mx!aRaL zxX)qS_OF^gKK|1d9s=_;%TSYFpeVtP;2izMTy@AK=dl96EBs~S&lGs>`a8XQQl9Ku zArLIDyUJGNpvPW&_pXd48Mkv9wQPQkc(?Z6(X1uZEVS)8?rtK1HZsbF6_xo?rAgoJ zJr^7vYv#>w_Q&{(tND@XkuH@Bf{cOu&E>ngkT}OdyZ->K@;$6}^19vm3XdNPBYolR z`qK@^n{Z%A_JiN)Uqy$)Q?bPBPUq0xB>kekDC^pM8g1695g>GuC$~`yh(_(-I-H#Q zn)9oVh~7QaCulEq`{}&wx!rLiE`LADxY)2zq;0r=4I~pzCrAn|RDJ67qeeSe!c`@G zO_#m6hIE$h;z^7A#JduA4|;8o`+dao1`Mp<#0TeC^Ou|$h_ek&tA+g3Q zrZTq1Qj)#R>$7hN5yDElb=&^{pwtO55QxrDCpZ<(tkb-ZmN{VB-tPJy=_{{ZLa zu6b2=4peDHB$@MKVx@Q$UR!p#!%pll+lMs?k(?ZDMF$!F8j0^9-MQa-kM8}}W~g)S zXs=@IGTXvl8HW5WKyI0@yuV{V9?4_&%@*S6)1B`hsw`vT0_}|IT8NutC{P`fW zF#{^S{VUzSXO9*i4EX-m?Esf_QbU5jCdm&+Jy-l|&c@MIDe|4zI*l{-{?|}t#O^>X z>0Kc47>Yzd;hz~he}q@fejf2*mK2%ybN6=t01))9=Fd@zZ{9Br_p9WmLB-hh`H}7x zTHAT(LF@Oc(`{XDqgM^M8u`yfyWb-D!oAleJ!(LT3jEuvK{s*+5@&5gBQYu)t!M;0!1ezC$7-WHEQT_h$MT`0IF;A{F-Xjt za1A*?^Y$iD{f^^x+@n^Mn_AT*mz!bjW%!EcXY2qws_@FEWUlK z=glutOIx&mH;nBYtJh$;R!!aeQudJqQ`fDQ0@1>LU!{3Ax1|eq65Efz)U|rW?5xZ4 zoz;gtNjhwi0b0thEy+^1#Blmd7ji$%_c6_NOKs&u$|`GUqJ=!TlL)nC*n}gotdxuP zoW?AcvO6eN`@h|&B(s1^yC3gXf!eX3FOOPHyOGMAg%oHvD;zD=gvR5|fN@@D@h8LQ zQqnFVXi{k2Cl4EehF`B=_zistWH-ftGJlKx+UI;tZEbsQZOU#0SAG){$PQ=X?}#+Z zeFsvK(inex5kDjK$8NsW#~V1@J>ndBnI$@4SKc2U{uF7~R?_&RMnfK@XA#N<+$Kcp z$KKutBOglm2hVu-L3;U?UBy4WkKsFO>M#}6Rd}RGn>_7~eZG>$GaM3x){!owYgrl-_i_F8Z|PjPnjFaW za5$F}=({aRVv;z9Kf~U(tS5NomPlMLntG3$KIXi`N7gNG;}C^l{44hPkN0b}OIJwJ zF(%Nzc#8Q9WD=E+s>0W7?yRL$;O)3@LM06f|FE{p#kNtaZViFPtNdWIX#+PU_?LqiXi55Xh%+BXh6!s&tWN1TQK-@!G-`Iw1R! zL?n_w-SD981J`X{i5*xmIQ6R5^C)Q|2j-?Ev$Xu5l|P64Ya*h}mS|*#7U_m{qMUq8!LccGqByyRb z&Q79|S7sxB7_6y+72?Yyjo&RXnR|kr7ykf4rcA7e3-xNcH9g{5DqP7RcEQj1R5>Js2Ay!MNCzqa z>rg5pDDxk2Z|>HOobpUy-UIe2-`1#08?p0CgeR^$)y8Ct{7?M~^JcCrYCxnVA$z=Vi0)Qju;X@}y7oql3@`PoK(1 z2s62QdVX~jpT18fL5B78tsv~ooC=P+Rf6*4ngj=1P*{{RZ0gOI#r z`&AhoWt8E%_O95)88%Y59&~XoHxwIl^{6F*k|tc_^!zJIJP6r#5YbgeE^z0)Z%oQZ zIjT=^vB70zys^nXfOX=Tz5LknnNHw#{{U!K)R1H`!1~r?yCQ(3S>;6qgGuqiaX$z7hZluLBd5}?yvQX84isXbx=*wX%lHZpGHUuW()=UhRlK%sHb8S1O!pp@ z=`k3ZJ)mQX`MSpR=+|M$%*rwcVgCTvBE5&h8q?}lLPJo4_^4npvf za&hW;u77>RcPP6zD|N1mQ&4W5nZ8K+W53q2z)Kw(&9)B>6uz|;}X(Ou-quA=SakZFCcI03W$EVV|12j=OqaU5Q zu4dKUV@D(A^=_E;t^98Rf!ZDU~caw=%{jl5NSu;3ixpBwHz zS?VkBv+r&17xT_4x^yT-IYSN2)YE_@WVHlE>RN=pFukfp4B(xlfmQ9x=XUI3uG=?K zTZ&S4)ToGJI1C0eQOEMhnGYV-XK|4aVO3*0G7n0ZW+}?$@HZhlxLRRg;|tVMpiC&} z4M0g*SNpX{Ifrb!I~(dz2Nc20}h%J4H-msN+bP82Z@VP|U8CnY z#Vgn?V$#Y7%37Ed?orySlmT}S%B)7nTg_(MkKv_bNbFnOHmE;#oAR&S{{Zzl9ISa)+bd&;0jn-k+7-q zRB<-t+gM*G`MX2Rf|i_)i)?qHk|-l<8ZMT?Tm(e)eYfto1yRTL$aNExd!vyt2tftELdKP@tnR@M{2g`hV)o9feeCD2V{0`L)LX-AHf_RFxBcpwNZe7nEoT6SV$4mPA6khxYzmD}3}dJc6#U=C zQ_IRrMzYAku|iyIJ3jSitK;VRnw3A+E-3bd*tr|DkCDbH$^-6W{54uPWGtO3!V;f% z?$uL)Ns0`Q)MB$`nnjyqH_9saoFi-ns%+6ao<8sKQ-oc`5mM>5<23e})Q>i)NaQv# z^9pcv4VM+KDSX z%C6FBp;sB`C`d{r^Da*ZkxcXUrW37J3{`fHl^J2Nu|h;xu(t>0Ely{NnOOX|toYqu z*b0(46t_P$JC_1xljivjYDAoYf!?6VBvdEw^{T#>D4!*%5tM!3_!T5&7p)_@4W-5f z4nfecujTy6Dr2$NYYNZvL2fu&l^Z!L(yBKIvQ5R=lWzi|R!JLf+){a@$fl#rQM(2H z^(dl?Du0DXBBu^9f--A2f0u?qO0C`cQs!oARz=wuk-?!P3aiCe&h_Gyw%>YNm&{s@ zbLFspw4Q1!DK$vs9of&dGtFJQh~&}}HAJz73y6vKWuiGlh9uT(ac*ME#@d%I1_u?aCdoCH zK;J8TwF#XS_Ag4U41h1q$;CH%vtU(Ro=X}naR>2=u4G(s_eE1;gM&(^Bq|OTg!zk> z#){17HiJ<|E?)=c60;~o$gGL3`I^`Z_2e}=3m{a^rAc?e7|&5 zTc36*ibQbyz?Sbzh0f*qaZL!JS#iOkvXS8`oQDXKleBIhEl7rZAVb2nrUJjC08UbQP!9wUo}Ddw4mfnV2hiGI9}CENhetc z%C#xmDgD{SH6gc@5U26X3SacT`V-AH6HwiK2M-`ClpBwuX65-Qu9!5Gnh=?9|}ovB%3(?8O8? zSdqAVyJ!i*f`8yN%)~IgaZ|!oqVrXKs$}&dNQNA;pO@w0tnjN*M;xx+VLMa%wCM&} zlN=h=uXMMuU7K$yRfc6;$@f;JRVh+%Q_EBT0DRRg0mvgVu*v(Pm;f^T-RX9uQSDxK z)p+?hKYFN%7MK1p#&{pW&&FqjKy-s;e6DwxETA$?}@CRa*n@ z{{VKBVkO&I+S1grCU4$iLbQRr$rQ)@H4-6IV=2x)YLX!y)iM0FT8N!ghR$=gr$$!! znJOh_jq&_7At(ZXDWf@!$&B+#ClTlPiKw6EnMmgp(3?XVn3HZ+Sln5DWyLGVtF=v4 zR`U+h+zK8Xw(`|VO$z1oxf_>y{Gy_nxkhTJ(h_$kMWw`yyI4^f0xky%%BnX~%`3*; zHs-08+7+AlY1tC(0;^KJnQdm<7fsa=bMloH318tKD5(Kx*Jc+L3A8>&N;mntnQ6s? z$Vc$4R(1&LI+}DlRP?KIY|OMApvE&$IWO}t=}$gc01vz>F_8ZNH5V!|xW@Ac^p2V) zTz})WGlREk@lwE{CMWA9YA*k#pbi~+agrlhBS zc6_y7Cvw~!)PahfjB2A%lF?{fES!~EiS89sXiO7OuGLogsx8~O{uQk~q=y);#j!t^ zw~Co>pvPSaQpXBXQTJ+HS17ipGlEZDI=U$Gr$lt+|C(-W#PNvGwUonSnba#s~aBp;PXvfvd9 zw{=W!aq_Z2(Zbvck)?-!-P=@`V8Whp-kbnt;BGVrDnn-8SP*uy^rjHVGgAgeJp8z* zvyHeLzG}EVL9I!n&dyq#&Q?Atu7|hXGzR$sk-(=Kg;~g}6tXWZ#Ywn)%xXjBY*kue z7*!|k)Txr$14vhH+L|Ky`qKz4o!^B`8RH*zr!o_bimRi0z4Unqf$pveAlwbGx6KkjOy8 zkD7?dipa8%z>+HC{sT`Iw)i_xhI*yuF*ye;K3bkRn6`I()jY*}HcYm5dD|lNr!B6X zyK6^Kw1*hZ@evI?J+w>3_oE(mmy z!JZQhO%}Fo^X=w=A}Ge%6ovbv?^5Pt53}18+7s(eODjZG%yg;=+N<*#cg?$FQ|5LL zW`;>=Zpa^JN`-ALwmbbS9%%)=t0&5VaZ)3yCm%IO zzl;h|Voj}ye$8&n_iC(Gmg*bJi)~pyD%E(M@W63VCTSY7?l0KjWeO7_tH-9sLB9+D1}N4+4w#Iw4wp%CTv-<9EsO&@}53xkyJnc>e8J4#Vwx}8)b3V~ zOw-TG@D3?XpJBU*2Gi|UH;Bd?r7?&t^7f!!-dwwthLdLyXK2RLP5#QUCvb!T_kLfO zHGiGB?NJ#?!WHRFTz=kv%v6U?vP1r@cM4R}tPbPlt`AYS?^T9;FU|L;T&ri&ge6{m z8Axc_Y;!i)6;HRzO*&qlSLTUI{{R;1&<+%C+fa!%{pv`#)~LFfU)a`PF)^>xZ3juS zdv!w+?H#t(il305UX+O@(TZ_M)9W=mnKqhLyb}D8s^Ya;9nH0P#WprlH!n3JIDB?d zT63~_`^r7JrQ7}Is1K@XENuGc(QH4le0m}hxow~U!z zdmVr?AAefiV!K-no|M?uH5qOivQm9csx?~bB$hUkJTlD?F9*zpy^iYY*TgrzTBFLv zeLGh+lBj$inQ9A%$innB9M0r9-%?##D{WpcD^Z0f+4py^<5_l^O@vZzNKg!Iz!h~) z!>|q5pw6TCcU4`T6zfm9A%@aeq_mbWV~~8yRIN0vD^7Hl*4+`%6$L`>8KIbUiA|Lsok@#BYtK3%7FiTB&`dSYF;fpl#4f{{VcbA3xTw`EKaLwN~GV*Kf;2 zJ>80RYCfifdad+U38y55ZQ;hj{40(J%k5aVK;K9uymKx(a(-Rjl<=>)w|A*yBWo)B z)xWmT$`WNLCL}TZw zg;&eDvac@XpAKF@;k5q%iDGSF#O0Ttn!0^Q$5%R?zu6`k3;o_JhET{zQTM-wmN+FW z+g6n2<~LiLc3^*ESgqP!`9pk9<|iLApSzL&00FE1A+XbYRbdT|w`7+IZ=Hev0Ea&* zVUPD}{C4u80%3(}wHR+RF|I{g#It9a*KIWQN0G_!<3qM76jp=FPn0e9DU|Jx$XE@t&hGVRNejBPa#Fe?+02Xjh}O(8O|@P-`-*AQQT?PiDZ+!kgDK$ zr#yeW-!*9Hx{R6}vVEQaJl?P0Z}(cXB!VxO3%AmonT3QTZqMGVKCvVb%qm{@GIf~_ zw$U}(K6WTD-XS#t}D_6Dp-IzRPjO;vmnT9R&vD7`Wh_O zveh%h&%(bAqlpEZEB)0Wj_=g9S+@95qv_Yyx`dI3y0w2cKUD3U_v5koYudJ}jN_$1 z>aY9UZZ%64Q|&XY@g6b9mCe}C)o*{dG_UNfVica&XO_{j??waI{*~vld^Yg7DJ8v# zh19E(GxP2K7Rxv3UYcTGAxr)3-9GhLaURtSwSL}KCZ1r&?Sk!v6VBRq6Wu=C7ta5#qM+c9kBBX)!U|3`ZIJqjzljRxGjk$T+A?ydg42 zO3mV@blJ;}%qn6cy`#O4W?zjkM4^1AXC1S&ZvOy#Z%Si)W{1t+<(5o+-2C77)p&c_ z#3WJ^BAnK6{{YJ&^9tzt^-ZpM5yLIdbF=v26hXsBAR)Njw+sIOeAfx_AI17_#JvuG z58fk-JCwt0caC4ocK-lpzkimvmRO-ovTi1ZhMd`yx1^ zbn?_G6zEl>D-%XG{{VWuFZGWXw=u;ms-I)y`;XaQNV$eMuXTHul|tvsi4im38U7l; zxc!vvB7{hnFL}ntk03cDoH%m001RYc_x}K9zUB&>{&9u=8dVUagC8k+f9oDEzu+k4 zRJ$JxC+w-CpjMhxy;z@%d4tC2o4Nh$B{THKD=zc)Oo#0+E}f`(7AqepPU$!9{{VOX z`T48wH?>B%E)M1IQ-N;^jr`PqtT?N-A zr^`&A_C~p$$p(+AM-|%q()sF4ZvFhSi;w{R_fubc`4P?YL@|%}4I*2tdsLd*JVS`; z$o|Zu*!UYy{gQk^Yx~QcQqnln8}Ma!`Fg4ifPd&!ZNFxVueX4=;h_x7j_a2jhkS8g zeKJ~@-4F1OmZ?JoQVr5C%euNF#P!!-z+c&PkAU0uRn<({zSLuMbGP>@K|sCswNw89 zhD*9c@~*W#(mQpDcv0B4?)CZ{nr*&%;eWeRO=)OVPVbld)u;N=S)h4cF30A<{gymK zBRnw89E!NavN(+Z@A7S8Pp35bKV@BU);Egw7?K^nYDCW?N%M2Gl^EUnSLm73p;Kil0H+|kzesufq**{;F z`Hr9VV_^Bl`P2Xt+c#pkGjOJ3YYZ9{0hHKVAG6j z&vbt6FxgwAtm-h2_lK=Id{c<~EI+a7T>Qn8_F3_bt4^lk24o4cUp0pEe*XXgPBG|y z^;l2Y&%~(!j_T^o{ne!0Kk>@_GoMYgk#Knjv8rpL+pxr-FZWiO;=0e`7xp|iiTQOe z?7{H@DV|Gn73H|xU6A4MKJF0p%}Wo!UmID(kjVndIm#g$(ZAYO`F7Xo>gdp-V4MN{ z+G6OD0_IlFO3iT#Z8nRJR+h)+oSy)GCM~7KQ*z}+@dK`@-LEzybs?y^8Vd$y)jrZ{?48^g<^D!3yhyKDP$c#g@Hgu zYxQUQ5;jti5%Tq_O`*oFyN?Uee(hZ>{!3(H@|ZnO%VhnZym>OUvT3p{%MIz0HWl^H zPuKqdLa5KczZ?k?*ZV5yOFDU>VNWm+KKCK9_-?P&1=C^?F*s0vhx^rX9Xu>-7v>&> zS5!EfYoJdfR^0rx{{V)6_>*hp$aGl@JSJn3IVDX00C@o?>siwL5Aof)wZwK$G=qZ@ z25GQ+g;nPr>-A|glwwSI48v)_sqJ)IT;Pxo-u~}Czgiy_Rp^nQ_AG6=`6izRz9bNQ zuMgeE#yMSXXu0wjKApLVyC(8 zXHzU#1^WL0wNO8X(a9`;=jLtQGgP>)T_8fqQtEz7ABG+&u?1Q-o*}z;mah8~v3v{< zb=}8$$!`SfD6`0HXN}@@jnYWn8!yv_{u=#>k3zSxw2syl0yz1?{Ji%+Eje_XSryWC zS&{mO0FT5qCB+l_NKwkw&&Z+RO=LrLrNL(_+*pP)qKvu(jmNbvc5we1tI^!7ozwFh!iyJhIVj~o5 z@~STh`3@IV%c0(MOF>EG*GSg zw$eFx+f9eZn!NCCh1m;z zBjZ6w{cL0>LM<1Jy-BfByFCN&g3GuC5;k)&5cpr-J{{Z+*HFt}bW9m;+Ne_x|#QfKmy%I#R~Diml# zaNom7!DM{x=Au#|ecoMT?NAw3won`Nk=JrZ)BWo7n;B1%hdCm+le>D9j;#LxXwSa^ zHi{zIac`m6yuha;HJ|2!aqC&JUlONvQfuaBZIn&D#eU~QD;U=?{KBd%ra(vC1JdJl2m@UPFWj-L%LbdL}XdfQDaXK=fI(g-n`J^PIG=liw#S#_u1&Q#2PRqg)O zbK2j68(Y#Yw2fJV+TKP`>>Q_|0P&I3R=6z6bSo*P>S(5#vp*K*nrI|@V{f)p>+ZEm zSQ(`9=8e@CYi-8?yM8tLUH!^1X~w`5Nr?p+5Bj-tCyE=H89$+Wl1GxuxS zVfYHs0UUDdja?4!o6NxL?ONAg1EiL0+R9!pygbj8sPsEm^{<@7R8n_Gy@bWaJx?gm zY?Dk62Ho?28}~o{s_ZP}^CEIa!a7%VXYiL%hI?ly86#3SeaGuv8~iSp%ZUpZWaW$F zBqynn9zk~!tL&PJ@LAthr#-sQm}?I zA?~BDD~3^LbaM(8=DC!POsWfizfy?=b2KX3QLAMsD!Xe+EfMyYSpI(XDbZd?{?HE$dH(=s+Ov%|4>H50@flJp zMx?O%Rk#dMs0y1r&QI2yZCyqr=hBO7d7SPmkiU23quCWp8wb?5GZ_wfq=8)M-B!*>=m_|(zq==qjNomY9WDN9CR7hxpv^^iKU1(%&s)|$$W}hXi;3-T4 z(we2%f7&#Yw4`TRx}0xrMln~Uc6H?7ihZr4d4vef7Z$FPVb^6PO_lwphF@sQ63w^d z!Z)e;mZy{}Z7(5AdUva0#!Z>qk^Jhn*=3QGZ6t2(PuMdjo8j;A6pSI{$R&4F6I@7> zc_nkke+tr))<=*KpD8q(Jh>b?V{hI1)AkJwXBcPpj7OZvxyLn}$c&p*eB!r%v*iPx zhrLv7D(TdRUOj2@KBcVB4*t=Xly%@0X6u@WK)!ZQ%2aI?p)Q>(kO29r!f4Y?sH2JHa=CPCT0kwFQ& zpL%3V9ZPj17Ff)`>R9a`hH94S*f!D1*Jj=ym?$VnZsQdX{3BYV5)U{47=3#7G+dbC z>32Dwu$8n4obNd`g3+!BZn+q7*w>*qhc$%{GN{{*fBM3*&Vzj&$COY$dG_YID6&>2 zlj?GCPX2QT>+jyGNG=iEE*m}jS7-kK2$kHYl`25vjAFCj!g|)l^I|cV^yeO*jdsFO z?sHEcN4d;RIhHvVMF^*$9WhwfQHf$x9K1o#%U+Lb;4AlbiGF0pe8JOqr#&f`UJR5d zw~azvo;vZG=!~FZvD9y)JgRVam}2=@uPi&}sZS4+5~`0elh@SOrk?@o32bMQEu~I2 zhRMn9aa7{)X0X$F5W-}PedghD>G!dp!l_k@IO}4d-i-42U{;0VClV+3x|)$Dc-Lr6 zxcPanLmv-3K`eoi*9rm47hW;#oSMnF_eX%B+POUNNnJGn(A%50j`xXi*q1$03YgoDbRQp_6LzJ;V`Ht2e~7T z2cA5+*6SK|!A-I$EZqmCS2A0kJeH@Pv5*ikxIZWBNjh!9CNb9?t5RJq{yek9 zN{?^SnHG_#%OZgh1bWtr#dI>KTqa-S&&yPHGt7Y-Dc=>73XCGR=&@q4l zN{?w_E zj2Ev0oU{C@M>PX7qL2p_EPha4codjVV$00$w2p~O6s*UU>(Zg~S7*v75{zYrDq_Uo zS&C9Jhp4CdxWHMAoa+y`oeNVptens(q0;4x87EKo$v zJkI$34%IqJrG9ggDv~sNlmX3H1$ifoR=SpxM9V(a!&JM7Y=cyK9l+-_^nah{=~;8g znA@Q{o-^rE!z_#dAH!9^0JENy;OeK)nu)Yhjf<$~J$YJp+7+3X9Qsu#n+=or(*Ea{ z1CdHD#+GKZQh;{@w-se>V|T1Ec=J@%DV;-V5W%Zi9Me)Q;?F}pP_4XYLwR##%&RI4Ej#m0Rq zpeQ9HIn7uk20VPCrXnYTT*lmDgE_|E;`OMv29L^7Rk)96JkZgc8KDz7V65FLR+ZTO zDv~%+k}5@ZbMm$YLQA0IN9FtN=Mt1b5i_~dynu&Y4S84mSOLHWHX6>T0B0EP0pAa%wr3Hew7#6PR)Tisy=3ZW73?n z1j!<>_Id*}!?xAJ^`J7J-LK7Ag@IadaykvGP4gLY7n(*^!0AsH5`Vx}v&6A|-@I0# zjFvfO#X@}A3;ZVgTo9S{ra^nZYcSneUT1948~J>X;j6a1rNTz>y&2(Z6}b)6Rzl1e zb@@#yx=8Dvmu)8kRFS6An8v_2DXQ{aZ!Mk`YNq8`8GBS@qi$2ksO9C6P&MsmQlqe` z#H+htCnrcmiV~VV}QPY}ovX7G- zRIAulCwZ1IF;JP=(*u!EIgjp<#YG`S>GG{Owm8JNCn0u% z93Q(!G=R}p!ws+Utt-eIuN!(+SD70fp!?IoUZ%B!xg4g1R|jYBDZ=SM!j1)GO)`HC zIV22=wzN-QbZvAsQsq~c?@0Hbc@1WvRVoV88McPS7m-m$oL5e-vaNZ_tH9dEu+~u- z=A5$-SoWefCB)K}a)T}RXiKRXzDBI`a;`ZTT2^$2?sBzUqBVZgo!h?kNA{7G4auqx zAS;viY7)mQkGoijMAq|h%2NHHKYm4Jt-v3{oKq4{HQ1ByPQ^kd{{Wk_lgKp1n1`(J z>H@1%Be+cPeql(PHfpuBt9go3JGeC-=+TKMGSjty!)ip8{Cx_`-y~(p?jB|O7>BTllNRtcmEoZBTOsz4eNZZR}%~WsHdY5F8 zRhP@-6vH@wmP*ZAoWIS|rr!?j+p34kS^Gp$$%d%Jy6sL7Gc& zsNd~V7Uj12VRoxk1MNz#s@&0GSk@N{_YtZicz0vcvl3K^znw_(ERDEvR5Xji;5zNa zLbnSM$fy;SQ0^R6SlToGt*P8rG(^%CU{`G*l%$1My;WB^9@G~`>+-cYbY)65E&1-J zYkbudcQ5lHs**|NF3-GbI3|t0{{Rh3WI?L8K~=N!RAS|KDE{qKS3nfDCu(hTtuLNxTKO|6Xp4BFi3d-;HAlO14?5b(3#D-m7J} zm)d_X<%{m_{AtT{5wnV=wEg2qz`A?VOink{(@970&~6DEI~vGUF^m(MmL(%;KYFHq zLgY1)MO4RJR6l70rBLPb??~Xd!gUo~!N^`0Nb1@9)T=XYTnf$Ew{L1yca5=6m~IBU zOpDDgoV|Mr!^8CTr!i=T2Woa?@|y{ABst9|oVoU_pD={L;+wpDznu=~Zkeq2Dx8r* zT|nb*Ybl*d?Ixm*AcLN?b7^4Z=x!y@8=@yBi0%}wKZ>#O{6c}1=9f~V8ygF8kXNNf zZc*F}ZBbcLxeLI?Xi{qeWPjPkx4DW;4^WWqm0LvJ4)0NDLDCaQrP3M zc_(6acdI^c8x3K8^&4+`kYV}H%qcQlO@B9T;A%CO``t}sqqp5=`Kes)k7@q^$7uz% zG?rl-XRRYngl^qgXk>WCINMMuCxhOq;mULgIM|?l>Xc1`^L4BgcZ7girQZ9L4rxXp z(ltcmJ4YV1I>{gKn&)Jdm+uOaIe6lqDno&~mnf}+)|~T3Ijn+C6{;3+d1{vX3y|MQ zu)S(gI*P%HMsKSX+;}U+*noLm-Uq&&yMpiChjTiNw?M zP8gbmNTd(p&1V@#(@~j%s*k-*F>;!vmuA(ZVslyXP1h^7qiK%f!2Q~M%x!cvR%Q7E z8Vss?R$OhmHj#SMM6L!}p)#WlO(m2@a%s3A%{{Rgk$8zCd0+l?iS7{8Xg{TYsxW~$BB#_7QgUu_WTSU`_ zU5%Fe)d}C{f4$bLw5-Z;)}dRUEnC!41`)Dlro)n}{4|QYMO9f23G2G62_9qe?)hqs zqH3rFkkv{!u>Sz;ny4j_AFkjkRGMA;kKL)gf-c02zET+C>eUC7Hu;3`w5=nlEL$6@ zjATAr?-1M?WnRUkQmc~RdYJ@dGlBC{3ZIxeaZ!;hcxbMC zx8ADp%6!HW8c_(z4=cBrerBr+6pHwd<>IO)R54zaAl=;Vq*cpCGR?x~nvnw8BWnt- zl9MSzxmkW{jpufiV+z}SX^B2k@}LJRPkoz}bInmlFU~47-(#0yn2rZDsh0bufyP6GpoRvKBQ96wWv1hMZTqEaRAL*R zaZa4eu;~^hI3L4RU+-iMtx`(=056)0RpW0k7bA*fbFm|g$J8}7;8$XEgI0@Sc;M7x zRE%Vr6Jw@`p|)f{yl0?e`=w3Ot=#q%XCgcT~u^L^c|{?$Sve>uFrmu*)ii)|;Gi-|PN z63Rk?X|hUiBOk-ws<)RDE2leuI+2|pY-j%f*`oK{E`Uhxe)md$ognHq;;NN+<=y-v z_^RQP%vIgRAzXy=>ZI;kTtgGFWAf94$>p;VQGAZOyHmJ>%vk<#+|!ZF{{S%=$MDr~ zh>ogxs}Y1)x5V4O_?lNCv5}}q@X3QnQQYnws$#*{`@i0(BPCev`IdzvHpgtkZ(o$u z;pABJApZb%fU0BU&_9PCbpHT)t};dsQe;*tPAR2jQ0k;aM)Gv@! zI1F=9DlAA=HR{==TtzaVIiQF0{Z^yeSke^6m6|m9zE!CJZzW?R=Kl2#Lx)z~idY$L z6}=XrvneHVDB(M~KP_87IAM%cSk;eC7N=Gbf3;0c#3gMB1fm$5%>Ewq$W9k}_o*8g z1f8sDB*Kk@r6*Ugh98;Hu}H}03X4kws8M$DQb-?qjMcf321c^^N=%$8(@~YSy3~_G zjkMF!-3(c3P^+lo^(nh6H6tPh$m%N9wZ1uO9^Fis=nZL3rldB?NJOkzM%Ag<0DeW> z{{Zb%fppy%8C9uV@qzcLIowK2hs$RzfwySpn;BH$#_F4N$T|6!6%;VL7W0>HrADJ} zR_; zs*3_=Y7VtLeRd9_wvAl{QI{Gh7_MU+b*UC8&?}^TRcIez`J3+0_Y1X%I0m&$1r91MJ zsu&V!V%#dmqtMhNPPf|4DyTKRARb#fw-rD}9eALJRrO{$((RvV^7Bo7A`u`|Omwc5 zV^kPHOCrZA;YP+3p#tNHl3SefX{i>}BQ)u4)Qx~~TALUy7v?nK0?V~XscA%&Qc~(= zKAmWY7$8!5@l=}HDNYqW?@H)e-)Y$0DZ68jYYx?<2CKfNELJfhWTpV99@+**Mgq4= zM9-FNnuXCmZa!9|AsG4iM0tFbI0i7Qi;ZM*t`PT|hXk!22k zWnI;kcc#SC;ZuXwx}d6GAXRCUG<%n&X2s0Tb!?*A!)V7!m2}H_B2>j_7+awoDsTes z1Bz};QJlM&>80AK8`G5ORGUZwRxzKJx<`$bS(&p$aG00P2d!2A0J<+}E^W?vblB4` zjkRs8(8L1bwB^r~*ygDYR|MjPD;FAtHnO%cD3AhEil!{01TjI5+*Y(vWd8tmo=>0h zDs=UtFH!qRcQIqJPcfKd9ckhiW>z^5*b!Gew#XevdSO(LD;dIyag!RvOKX{i(g#D8 z=~Wj`f;QbC2iCUUB2`MBJJX?rF~K{9G`o}S<$cWWv7kjL0c?79s&d$)w< zA~01wsz||T_qoL`W{^6J#fwS%F<4I_X_r^4$B-+ALrI1$3ev#kMvUkj79A!zA^hb4>SW)#!i! z(BA&cyg~k~mZvV2caYB+1apjZuc42JqaYoF@~4js+rMAEo@?-xg?&%E_UQTV`#R6kGKXY5`%)&Ea9ciEucMEI?a3ME9@NzE zrM}{F03OuU27)zF^W0i|@}qfio+*o@UZKmc$SdhF;d?~{jBe>tuZ1o8oDhAf#|;1cb~XIiux)1As5QPaZ`^8+PKDYI&`Rx8Qb13nRh;ENGC&|EaSagTNiPiq?}jL zr@>Z)fB;}Uy43#w@Q2%@0*Wwt@lF(46PmH}D73y(p&>g@wMZ>)c6`yC*VC)v2yhv= z2CI(+Sp&(*{V7V6>{Mz*`OY}5q$<8qA6jg%%91H4!*3PzfbfI}-zuo|sUh$!uy>Y4 z54eAKijS+il~cg&3Qc_?-VC+iU~H&U!SQ*&>Vb`DbQsk{eAsO+ zm9}|itlQdMMm}iGeI&jRjGd$?6teg_-wG8JijS+iiA`Mj*UGrxmQ%8kET@osh->Kq z;EQG2+ZX2cs|(FTz}6aw!W5c0onP5(G^UccH~q?!1l1Bheav6vUJ)HXqoeI zwwONMgs`bn(&!8r%QyFH>5<^LBw;6(27jG4PXoq?aEp`Q6<*1i`@PSag`LnU3}UC)_3yMo-I+GfmDQ^nwz zK4K!~vyBIGbUt5Hxe}BJNvnx(b)4)wO?@mp2?K=&B?g7~e;?clkUuItix!8>Q8mLW z0EhdvWXE>An8*UYm51TPC{(n2y{dV>A3!m-KW>|;#}713)$Dx9156(QPyYZDPiU^o z=gThF|X==pV0d|{C0tvojf-cXF~ABBA^ zJ{sGko@%Hk+|b?wh?Fa)K@lli97=oM{JSqQ__gx z|G3`_ASox9iyF+yngX=P_oz5lYBe13RpvrOjSs{31$kD59|C@o1-AP^E#~OBg!gLmu1#J)wO+2zYijq z89cF*?NCMF2&0pj_kr^K)S*gb!K3ChTfAVzerj_^c7>D5C)&QGUx)EGF~m1iv3xv+ zK3Ouxw2cV_WRH|%itUxMjKZddE0WpS@>kWL@UJcMqssYD-r}1d!>A+N3S}|UrO}xx z$I0y-$D6myYOt|gN1xr6;=ZAm;q*T!F;u_sub_~uqCc2>R$j%G7LS$0H(eSsw0Tqf zs#S(->Oc5EB9QKqAG=6?9@~(vQ~0W*g?+=?Bjx`9F6m1X6BVY$w?D@bTKcKJ9ztSI z-7n=rd_96WNo3xi!^Iy}VeJv}lz(iIig|nrmL$8ABV%n^`k;6UCL7u>nEwE?NIo9h z}e6QqP@=70Vw99xeKxURAE9+GFa|uwTN7kSJ01D#PH2@%CR;fxv z-1!yOX4)Du2JW=vitG4Mv0qq^hfzv=u>!GPjA>89cwr{+pv{i zN?8Tg{Iq3j>gawP+w!ju2abJe()={G-V~_W--@+G_A8sY@|00dVZn^5{{VWUwzr>u z2uS|*ePlivTVRc&{{XG@s_XFP+6UMW5$lRx#g!SO<>{c3Eao%wds0Vlc30$t*VL`x zC14Q8oxarN_;(UAxJ2I~Ap*X%e}{`JGKj!af_Bu6 z;24rU{!k=*wEc_NxXp7PCC6=l3$$|~`u3(6uKdrs+}GAk@ct6Zx-940r7^xAS~dxX zc~6vo`npv{oRCIn`9&@6kIJZ8q!t%X{4Mg=)yLt@wh8jK`fa3dhVi0&pcel2Dpe*| zGCoaPTjgfngbI|~T%%#)D_>SY@b=#uUN4kWrucIMl1hA|+NsiE%#V}2xzq#^oNlVd z-sv*pB6io;R^JV*CybScYY&%mP~Q#U3y~k|Q|wr!CD8dMD@{oTWsKB|4Z;p1HT8)2 zX9~&lA;IsOg#0vuFO@={!@W4sXi=JH$p#C;z-=Qxc80RLQG4zD6O8H zRHxyzL9($fexG;!nog4=ogXDFrO=2*iG)AOnk;VJwh_|4xRc?`eo#_4@3d4=d_9UY z#9tul%}zA#H6(nJEUu%;DN10tDUgSX`u0DDFuQMVYBu<9XA3Y8sWLX^{{Vp1#*~`~ z$sZsad)=84laESbCE>skGOJhD&G6dTJ7zz>-lYEkg==V$2!bj88mZHF7cxFVdrQ;C z4k|^ox$@5)E9;N=R`7krja3$$J{nrF2g_bP={iyzW{;8+PrQ+E5RZC-I~&9s5l$=X z#Q1R>ZPOt~Oj8fT=ywoeRxSKp)|!h#<~~F=x3P?QWraB{?&jbF#eHsm8(VUGtonbm zQh&m`wv1sS&gvltamHx*AlqE7;k24Q&35a6roOTN0EK67BJPYCap=Kg%RLf&TS1J{&?fDx&Tm-u~?zk_gQo zCB2RBCBeX|@mgFgge+xo-oC+qhjwbC35Gt@NATvzf)?{QP?nI6#}Bs5oLFcjc+ zrmPpPqEe({zP6j;)wxAM2vEH$KloQRj8ZU)qy3TAl7lKUO!-NY>;+J!l&$dK#%t>3 z_;+lQE>nN|R42oGaG&b&{{Y0&_HN|!JD(|qyF-nq<*0UD9mSN_)dS(&d$3_R?NWcj zx3>u2CqG)RX3FPB$*UaX<6);_>^CZUSJkonI)WqSc?vV$ko-5cR{i1wyZ-<|rRQ?m)eQG8rv|; zQK%l`vy~YKv`5O@Zi(Sqor{D(P#>DUp8o)aaS!)Dl}jhXt8=un{{Z^w`xy(`A23Gp zk+*4MOo^@s&$N$f`eb}Iw^s%=(9o+w!WVq4kL5B%JS+H@X|fowte4vmqJ9sNcp6-&PgDyYPnm0 zHzE+izNC-g%mrBle?PBUSNLUT3ochGKK5#z22U~a_nR_>E~l+M{NuENkzY!`!+T?Z zV;fiBG=IXdjdI|8r=sWX)|`yLYJA4caK{81k26Md^KDxCWPCG-GJ?H-?~zV_hIal| zJiX2T0HD@>%3;l8=94Rtxk02uba!P)uce{*Z2?uv2HW>&{{V$+5c$;)(M32?VF{z= zgk~@DZqMDPhnISQhX%fgKMf&9-Xq+7aY~;KQMr;j94Bj&%#WMrnpJ!zX;tKNk)5^l znD}XJD`jKH`_zZwt-5~dG#LBUE}X{++jHkOdx#rrkCanmx}HP7Fuc6c7q+6L)Y5xH5tzvVDBRF5~{{VWl zHT(i0Mh&^F&{YWy&UIdTz+Ki=l2*}lW(K6;jC122(^ zQ7;La`UU|kv3h=pH}a2*fYg7uAgqv_eFgGJ{b&vSCRhDT2J^^agE9s z{`ws$!kod#`QXnxHq-}q@l(9l2Xu|J*U^#uGmbPY26r}oZq);PFjj5MnO5yr?B{T7 z`R+TjAYI zHXV*?Pxw}`hW+9&U-oMKlO`ues4Lv?rDDLD`#yq+!8U`z0tlO_DK1qi{YaYnPMm#r>#^l^A2Of zKYHA~K=L=;4bP=}`S@_aY+?TZ?9?sr$S`J6w{QD3QKuwaBzPM*QI}oIOC8s7!q>YG zhXZEUU(&0|@YVdL*fEZreed_EjO1N`4~SFoRk@{**l=~92fxMHmw$+T3?l&(qRab3n) zwzu7*?V#}&HSBBf(KE{VW7GT8;qcX>{{U8>EmMmdm5&_zSxg5#YPq^>;2QRU@a{?E z+E#~DqT01 zlk(T7ABUF=yhpP>)cHOdUmyXB>^_w-ixrYQs9c9{?|IKwLKQ|nS6hqCS8u;;C1%Of{0Gs?x= zBJNsiPJGS+^1>rPOXQ{?&R6e-H0jzTCJh#TRqy`*0;pHv?eoM=8CiNS z_|)7vj$iviU8neQQ9SP9Pnm|UwLAfORlKBWHua|u0qQ0!v~IsP+CAZ2oVdPJ;FHZp zx7+t1uDkvai={9BW+fy!@)X? zOiCtwDiGq1d|ooP)Awl>?`v&CTW#RYMGgojf9Xh`48Lai#s~W~qFkfg$y=haGpg>} zQ48gh4$FdTb{_{{BN$VVK5Vr^{{RSG^BzXpEX`nHo7h+|?M;VJNXIMlS45r-xP?!e z8)&MD;Tz^B18OZO-on(#{?i!SijEu2lJWA2*k1@TSNI6vnToh40CKmnrvZKlns%l5gFkar1Pisa;5yQiQ%4Y6idB%mVJIr0~w5 zr8Cj~>8CG-FR(yAIs3d+Sh&c~{?psZ8&`Ebui^{S?^Ma*Z9q08O#cADX|LhULufeL zo|Q`FH=!83jBrg!9-|p$`A^I8(HDm`LOimiJ@(Xz;f+ff+5Xj1G=#a3)t(5(=Ju#f z$`<)Y%TxaVU|-{Fp~w3|oIF2#7liBWLv}Py#XmMIGWMtW*2;^sin0BRszx$YI-j~R zR6ntA_Km<`pHB4H`HMl52AZ-&g?IhaPfri(o16G}^r(}=`m)K8rI*)l6cFZ#+E^8G zqvkaZ=*Zsm;iKFZ-cER@jSlg4f&T!Y({`|+%7_rY=>AoyfK_jmx>T#9>QRT40WmM| z2Cjk-?eoUE!j>$;_%Nxp%wk(2mTD`9*0q*A|yDNe|7nAMRH zu<4!O`0Yx-FDu@ldkgT&JhI<~BHLb}Gjic_=A7H(O7?4P%7Bw`*xRZ&qPt&^#zrYU%8ZMIBYV(5+@N%-!YlJ9lp`ZF*#*ok<+2tl zR5J8Y#f&?AqLG?DN}sz_40npYWYH7`nyYp9j75~zZbOWVacs^A=B617wANB3`(gGq zDhs6>Ss1N2p+)LwmRT1LcH*Qf7##Gf5yNpH=)s3ts(##l@?mO?67FBvH)lO6F&;*L zhO2D8#~8&sb=GiVI5Z_CG_S`nDO8J>U?^P%kq}_8mz?MngCyF9m`O(N>xDq8p?e^_&c#xMe=;R zotte6MxM=^YK*RnBGi%uV4(Fs!&nKZ0CF1(Qa#{^h{@|hcVd)mbO@j?3%04t6RFPJ ztz$jgBC6G9)a8m{4%P(x-qoct4uUxU0NSUjGV&X4YZ@!ZUzqo)2C3&URXr*j6J^Vg zDrt!xhOR;p5J6Zxwfe825_)86mO+JScFoFuL^jVT^w<}-$tZvOx()pILE-dZ1+)m6A; zI~(QAOBB%qzF(NNQeex-T2#qAtxA&}=oD>Q&s&sX^3#^%bLCs^(y^P4rKz3Su%C9D z7rN<}Xk6Z#yuyDP1kcK%gKmE9Rmn7=pX4zG-L|AME*Eht?OFE4V{Pryr(1+BNk8t; z_6U;4Ib|gO0Kj)tYFn(W^NOzSs~+TPVU{)dm+w_31;Z+$<<~VFlQ!I+yH7I3GH3Xz z1!O67cKb*GOqM}UK7(XuzJ!&&7nB3oXp%E*-^GpGklG$3WQj|?4 zk#_y+LvkeBfwwiCxichwwD?0sjxp&_kfyaQL%cJS_gAG#vO8oq;Z$T}^9}U~n1Qw1 ziqZm=tXoT;FROjtX&T_nM(^RM6%?-KI9g#5tG34ZjZ`AZl3feWHg7wAWvb@k09M6Uka@BPR_RLK@H=vo$8f4Z=%%MxSqp%ER;m$_Rg{m$k;w`$ zG8&ZQAikC^38W6qkCvhV*|!mjiOh|(nvPGDs_vdS?@}2hka=Wo+fPXR%rkw_RLV4Rxz8KARfKF<+^CpV z=e15 z9#b0aU&fInOsNNED!KW|sQip>1n%~t4cwRHT2qpC_U~2M$jKus>rn-4uvWmO+2zL1 zo^jHu>=7h#AQ(@(N{^k}Fg*oSja?UcJQ_p_GqdSWTN540%dlm6I#V|y0_Tuwv5ks# z&M6uuDg{=^a$sdf{o|dAoaCGj#+jKLk}$M}B8ilyw)oU3;}rA=vcYv|_MX*D%kq*J zIH6UD=A-iEfypD}YI4|dCI{sV{V9mUJC7iGR5EVPSAj@iV!KNf6+G)=SCKS^FyAd# zF0R|ZyG%etm~*>tN^?f1ImjNAN?HvFCl1FWII8b6rZT@RAYUn4XUrScl2QN#&reDd zCQiT@NEu1Ms6i1Y(xi2fzGdK^-Kigl_VqN}jVZE3lt+?3DuwPi$>?glNWpf$Emb9K zxW^!Iig9;F)TGOQXc2*q^p7cv1Rt$ajeu-+G@C?6C!lJjYaX=;pa0SOnIPI*0~FJ0 zz=>5!_O5^doZ_Zh`49DCEm_O(JJvc&p@_PBG2M0`&vx%92k(xn*S;;a2wr`%s( znS_v-Mgr!pEu5JQ%UY#cn7ApzBhMdQ$%Y zS5@_p{=Fr!iS|L%tvzEW04{M`fmfy~Wdl7bCBv=lAo}y_V0j~HeVD~MI9qmEc&>md zk&JYyg02SxiqHL8mG8`oSodv=18l_L54}znEyv1oE205<;-yd&@F~6-*8IW!p(V08 z!))Eh6*O@SV2*2`2$|?PsRVJJHj0(Q4Lhk1`$6_F#lB+-DlukPEw?LO9C1dy2R^kp zRU-supZd1kRob|tm^5=H+_6ws2iB~|3vS!ex)7baqV3nl^HqPQ>v=;08?Br@2d~(8FV>SwG4je6)3O=o|V&xqudD@H7Au3 z;H_i+t4q2s`$|VRwqenST1B)7a92K+)W;lY(R$RLQaKqND&GscUiyhMwi8VrD=nm*4991&Pc zg=ChDzwIa09Qxb*t$~qA3@avbnZwJ_0fl>XA7H#;btHRPv zIF_?J?u=t-V^uzs#)Y5wcoox#qh;Goj@l(}m$hv!8kUJ{%%hKcvjRI{d2z?RO4drs z3Je2X582SuqOUw>&ZAl$|T9GZ*N5d&K(2GiJ zLi+j7n`{lGGf<0j8XS(b(}++V*r|Tc5nZHYQ+W%Qyn$owp~^uJ-n)h>%EB42!veRy z#}Qm~#YWajFi%S2mQ7MB%^H1qH**O&5y`6B z{RHvLp^7b4LhKZbf<6=)=u!ob105txc3UCE9z?^6~yGB&v2(;nI# z+ZAhhZAdB`?uxp$%8QUQN|r}Ctro+0?o*meQ;upBw2@_C-D{$FLbxitcd7ii{Jq3| z>gWE+i|es#8qv%pzD{C0s#6FdbKbXB*hW5H^(ePO+={AsOG{DxcT=14%AQ6&szqKH zcH+7tZkzXZr=`3(+C?XlPWHHcd06I^V;>t+J)k3G1vJ5cbP+^RoM+2ourHR4d3Xoz(+IYoG8f9~|L}OJu zcH=ZEE?8rVmjoPj6!RMalhT@6kLvxPL7Zf@lik7qk*RbAzA)~+bW%EK6_vVpkkNkSu2xeu15hy!kD z@(4l$^Q-nqB3aJE0>^9OzY=T_lnwb}LxyKbM>_XWb)LB?1CRdW# zGskLd5JMWU*;1Dor!L}f-6*D&gIj7<5UX+)kVZ!1S3x-{qk&8Ff+qXGH>FRr=EquchQ>Pzr2*eUBW{7WAC+n&1berjtFEE?)O`kMRK%u19jb2J z<7qU$S})266*fza^c6jEQz&Q&va(yktj+xBSk>Dg3bxx+^Fl5;BCn85qBCx>bNn=m zZl|})QoAPss%Y6Qa*{eU3l9 zigQ~+%hT@Fu0Z*E8g@4?JQ{8Yo@P@>5pcmVwwSP?8;JR;(D{0DDYye|RA5?UBGv#r zvZ9){kY^x$+OWZoPH9m{dVIPC^eHu^xEorcirU?nl#iw>L>JxaDgdEhIKx&?L8i)Y zX$c#MKbQXiUZiUXHee1~t(FcxVbYv8cj-ciYG=b?Z~Oo&LDar!M3(XSoQ^8~-GKAb zswrk{vf`6gjfRNY8*~^WG~;g){GvSm6(p;{QaCg~#YWcos&~*XL@X`k`{_=7GR%*d zecH7cC9*zRd#ka|?wzPn(3bTwzq75Ogb_BQ+o(Z zoOG!ZPqp38-DWe{zJHww_fM#~CjSs0PtqQhh- zO}9kMX|d1oRcNdr+pwnwwAGjlADWsYV~xY59H|A7oBf*s`?1u?rb5m0rCZv?zF(JZ zIFb_t(HlJja+>LuYRq?pv}_M8 zd8@3)87uPC(fN$HZj}-R8(E}01pv>mmo%@{x%?=4jY zor6ezT1hK}8H@di3a9TQ6(G`WcB+J}K`S$=hT^4EbH0lX@2P-vYe{4nO`&?yK8bFU zea)h`RT*7P2MO~?w2~7>FZKWv!3A%`iz7Q9yGnV=o{L&V4J(}d zS{0X4DgoiURxPv&-rKRTXcDsgsy^*!VjavAp~nP@Hs-D!64LegeRacMr4 zRzkUix+SAzsQH$Wd_Myn?1S^I)dhMjN{7pDnx@8_$3DIuwnp25O#Z{QF38E(_`khf z8O(uSvekD+SKO^lq)b_bCW~$dmWhw=f0IiNgKX`Biof2jhm2=D)1xgLe80s@LauW6 zS|ndAamE|?YBlifpo@DCnQN?;2HGSw60S~nZfX=v?sBo{w*GIL)9#fO(YzR6 z?(V2XyA=NbYKDix`M&LS_V70Cw9^b}xVH;R%`sf$6GOLj z!wwpyT>{oHssOH_Bn!ameQ6#bhksQcg&eNsCXQu1IchmQf7+-Q!_lfUst?Y(WFWH+ zo2x}4P`gjeDcKbkaG%%_ZO+k}VesrxzsQ4WuI*7&uIgYhA>-wxVRLyLe7+ZeLbyP+ zTzFPF2rd`p`K!A^T^Qq~MI3vh%{wlFXyjAF_TF;4Ek@oNvqv%nA1!rrD#tL|b5h1i z#kX(qRJfIMhCUj!WKtDHM=yt<`A*f_UAx8!$T_Gs0LsVsXi+81;+w-Zz+^{*NZuKY zs98z9ucFBJJ-2P2R6s1?o!{t(MuyLN2FLl=bYiN}_w z=Jc;cSr{Pm7eDP(5iCUW&&^TDg6E!1;Tu5POiTXH6$*Gl+s(*{S3cG0h>?+o>c7KK zzSUp5OWC5iu6dyFR4(7@{%>4Wr0_M61W6K>{u=ZMoJQDcln{3j^DQ{jNE2t7r-JQv zCS~(u`K!`4geq#pn+Q@Dbso(GTiEi!;HypBLVez!FW&zEfm4ryAuZ;- zOTYWo=;cA-X~DJ?B9|g6GiR7b;G1a9=8LU3_!`<~R`PMT+Py#^`La4x@SWR$`G4LN z`4IiAk0nn9+d$ti`KoXDL+zwf5l@l&fnK6vh~$;cBmojkwLfNq+Ox|?fGr9LB!~~2 z<@srocoNhQvBogI-+H}Zg?U%9)T*0K<{4k%quHTzGs&Rv6{J!8(ScQyz}9Np(jCY6 zYu2X{GpSa}(m-|(nRim;L-w*fp}YxiBNFj#W$DFIkKy&Kq~<-_dRMcMlQ8V7NCG1% z#uAqz4{FaF{{Vyv4uU)b)}~K~x_Xb@+kj8Ymie<@zbge@sJL2;p*RDb)V-PyYa_@c z_;YCv?F8@5M30_Z;pzr*x!c<`FT=EW)%>lv{vZ9CzK;7m0YbPR?$cU0o-Lblw3Rd;Sef(6 z_zu*r)dzJ|UjQn9%RYT^Uqhvpy5Y+8qDx3V=@gs_jwzo#9|GHQ+94+Fe6= zOg?p{>5uDjK46pK^7)uQGBEz{6sz#wH4A~le8c#TE9rx!TIGQpe|Ch@?TTayY6%w{ zT#uO#!`MN>4WgAk9Y(G54aw_@`dxHb6q4BasUJpNzb^u(lTu@fk@GqDaT}{U1M;`Z zKgO%K!**8%qxpMR)Bgb3(QMiX`qZ&$iohg^z^SlD5i{jx_-wN7Sfkqi0PfR2;ae(h zQ6E3;EqzEVAd2H~O{-QHO|@^C)9%%B4mhbFCl7`|jqM-Z{{Uu~J{!yBWz+rI`rb=e z0&Ou=OJ#23%h|Y5$cOd0A0x%^$&~quI`-R6Uxv2~W)o^9LH(Bi+;;A2 zJ&_T`NclW`IGCNS9tALbIJpbv`ClgOzvNfd$)yt5kp|OOW6_|;PyQyfg(FX`%E!nO z{5X+QA{>gSpAT;%3Z@2CEyv6K+WQy#1|aH57^kj>5<3t#el#pQ=vUVrkB#K`adGov zCaQzL7czX`XKYv6G3byM?52UBTX~*ak&1^!qN9yx#w+mNSqA->2j%;}c9eWDknKl} zU3Y&E-mkO&0O208h++(7Tk)nx;rj*2a5s0S96KlLtoX^kAC&#nFn!*%-}qMZ%lDM- zPL=k9_;SuiU8)FQ_Glg(vmJ2X-J|OAC+kf3wLTrqD;=m#-$kU8;eEZr2zpZ_t zE`e&?fHzcdXfWqwtAR_|G5u)xu>3f>5-TcikMDnU{{XvD&+z)@<16HpKf{{)Vf-@= z?ZB;0o*S_M0;3CBdj>D9G<+@p01Dpmp(G6vst=C{b}6zYUAPU%M1u!K*RV{=BvTrJA)C#L~Zr2xu)>!ahz@W ze}~?jJTGps`MXzhed=ot&0&dW!!mdhV;%r-%lB!=!52`dU5xqpc62t@T#$RV$n|#jQ;?; zPE=TXbK)=fLGPlCU5Syg{54ScM^Z)tF~P67rSN=ge{_o9#Z|5R32!W!kwOIiEL8g$ z6YX_AB$LA0j_|5^9cl7-Q&DDLFnq)Nzr|l_zr*-eV$nphZ~N66_zD5XmOfe~NsZR? zJ}mzLgmY3^l#+py;q zES??IS(ZdORras1=kOF0Mds|u4f)dB_%g?5meJ$o+nOCCE@R^d@a5}m+A_bx#YF~% zsscojn6{pbJFR`MFM{m1F6h8t_E&99AAur~bB)M<+4-t{o7h~(#Oa~x2zN-d>9m{I zMJlBK0J~ph4~Ox2i?uR%>`j43(8=X5)`;3kCY8yzsjHbxQ1-@$f z{%?kmBIRQv-k3ff+pg9rw0?9bu#A!NJeqaj`4J8(7_{w8d1(HhEq#3-!YJ&O z_!`+qmmDeKs!xHfCE*ihKQ3xm{vO%0u=0R&_f9_TN3&p$lzf|yz2%a= zw1x|o3$Y4{`l-GeTg1CvbL;+lRd{>@1X2>Q?nCmLxI)8kQ|1DffAZ2cD@^8@|bm3-Gv-Y?5vPM?N$bGQaJ z4g5!U_i48u3?Mk!9#g$H3+z-R&zG7hcX7w1Ld$X+a|Ulp`c(WijDSk~tNE=>2g9g< z*vpXJDRQurTU_~Z1Ao7l3lj=#58L=^nfPXo+a?Ne&q{HM z+C;|8`OzdIPg+$s4t&Ceb6-TS!F9K=fys=l0j)i8*fK7ZXH0wSQTaM?>=P}3$4Vs-<@=B?%f0yCPkO>_-;++?O)(6}p=~K$@aEeFH z=2-wgDOEnSFPISo*x1`A>Q9LG~*xb4wdb(cm<>Roi+^pYBS&|Ny$zPRhU`a z@pCkYTaV6!outSEZF@8L5>}0ar#{sP@Dz&*$r|Cm+UrvoF*NRY^W3x?jFtPejVP3< z#sRNoUjdn8{o?1;dR1fK2NR%Sk=PFPe64+voKP z+M^x`c~6)k*|(|NN)daDQ^#6FEPSp?)M{KQ-`2gBPXQQ6WlW=YT8I7+M(7m&B9*0W z0P*E~jG^YDXOZzEabCM8fM!X&wO_x}+MjXo_TnHT$0T)Llv8rJnd0(Y2)^*fYB4!| zg#621(0(6~jIt(Jdiv8x!)a18BeE4vsBQxM%=PQ(;0uRivN9jOc&V4+=~)8JZ@A+m zAL~`h$hqUcYGSMX=IKm(n}%`-;8(KC;D%{QF#r~-{{X_hnnhzCcCTMw%8pi4VtEOb z{!pJSIputXVVd;j_<1hf+?F4WK2HJMZCBaUb^3c$xU!o(ph{e0u%WIc>VrPD>9hPl zn+U*l=M@CL0+=t{CO!c@g*6rlqs_!Bq&DxQ^PxYMc9V^fefuv~`FbQt?>rR`%_Ys^Cxciz` zcWCRSSs(w>`}uAmBO%8g^(eT69B&omX{k+-hx^^?VW~{L%e8)e{$Su~E4MJf50C?h|ag>(uL;l77@#|vd07x!4s|ze;bGQLsMHZ_$Vqc)C+fi%LW`IrpT#Ib-*;fnIK)#j8C+4*V5Ta^@~gs7@qT>k)&7EJq|tdmB|kid$O zXN2K*jGub)8+~4A*q<{hYRc<#ET1Xnr~Pl2SP%OZ_dR!dj1oYj?Jxt(g1m}v5L{rY zoYZ#Ow5kqH;D4onzr6$xB<&;EKGgs_S-?K@@p*0k z06hhGtB~Hx7i;oI zN{7ZZn$jqxk*=~mU|-tfcK($z-rF}S_2iQ3Y`7_s-Rhd^^C{r{+Ly*P*V#a_B=(W* zCjQia9%_HKTVrvM0qquBT~??x{whYDQJ7#G=&MfR{aMNi}vkM>~Bgml@Z!+Cr8| z9*p(R?MqGDcTrvFg~RT}IVg z@9|zP+Re{Q^`*7cr)O`R(|l!K%S12iC4J9tTkBTn;}qu9EtKHBcz5=!;Bv=`pZjLx z%H*6?J~PBMZd5|aBmBp+e`?xe@A2N8nw^{St;KlETE)lRCyHx*^W&XBSdyV9f?t2;5Z6hEv zezgAp?Q0?d^8hvD15lawWUy~ak{kJAVr6~9wPpUaVj8oz+)~M4`m@=i)-2d<-$B-G zR~(Kj#)hjQk)1iIUs92yRpyua&4?1oso!(i{{XeDSYSA)W!5dDKzCP-$Ej{zf%f8- zJxRw7*{P|-mF3uR$?2!L>@jP0fd=Q~)W6$y`*#D8UPA@(WZhA=rt9))j3(d=>S zmcuK(c&9_JTS>Y%aCZLy6?oKllH)Eosi3}aIQeK<-DPVs)>TcO!us{O0UZ7{3D)6^ zaQVUJyr=CoQa8ttP2^WZgjho2;B-!)i@ z@@I?%KR59I01Y*r)$R)`f$dMNTC79|2W>+hxoqWd*u{A7+hrdsQ$^&7^CM!b`(~@w z;r*Eek7@qcg%|JVH38RQ&eo7ukBv@dT!BtY=WLw(%TV*0uS<<(l-EPoQ(U!1<(8hh z^`={Fi(WLh4>M)kZYp7LbN9aOOU`PprM$M8>+7qcvl7`9<<=tkL1DM=Zm%UxMqX2( zp>HMmvNE*RZ&fYE^4fczx^<`l*nc{tb=!0)^VgPrvSL`&G2XG=zxZmNYgbJ|8Fe$+ z2D5MFmqWWXQaxTKT$A`$klS8O6C4s0)!}h3IBZa}O0TI=%ju)l6IV|#ayC=t)*%FQ z#d!$7xL3-yDf3)QEM8ljQT?e_*0_IX)4A$tu3H8Ndghkf#4#Bd6TdA>5}+@G*7*pQ(cz%qw6y6 zTyU{H9vyKm5AN7}wD~+i3jB)v_r-a1Gc;|2F-{i`BQyQeN7m=uPYVvmrp2$J;zRdo zU&K)PY|%D0*OaBig_(2Gp0bkJE!L97$t@Y1!o_Q2($mDT1>l4I>Ur@6vYhS&SC*V3 zWlq`|+inZ-QyfJ095C>G4^vMOKwVDk;-20ni1z^3mqzTW+YMD|o6TIe-K$uM_Y|!CA61FziQ;q^Y;~wx#E>)LTOz#KCEEKt9`xhNpD(Rr?c|2& zMQo2xZGBW{JXLh@JS;eEwdV25B8;);(vce{9qBAXzTp}%>Uva~`V`D<%@AwCQmR_K zRUTpGVc4rJ}ps@VB~MgP^+}mYVzq zJn!dqH~tbhnYI?qd6K&+AR0*KD(jQ;8gZ`IQK~8QJs|jjkbHwQka(UVpT9pndEcJl z@ZBj1UcYvaY|zyt_dO;JejumJII6dPA{Z-fRJY6c4cynAmnY>~d_N;GG~HLQdo{V} z!^JR#Rb!g3Cy67^$a$^=u*Q4SiP(x-hgL!Cmt(#jCQ>oSH2C~Qx8@~w*O|NJu$}7C z$T)1)bHqMtTz<(OfftEDxaIy@uzW=x{C~wda0j(g$jdZZDHQ6JB+>iODpCfOi8zsKeQw zjc>088(L139eN?$SDKcQ_YK_ADPXOZrOw63dV}lb216@TWAOs2{`aMMy3HePLHso& zkMm`lr4g+lQ0RIW{3JVfDxJglY7yd4qb_TL-y*KzRN0zE<+DlDXlk9$MxVq;Vci?# z(P`p{$_A6QdD1JO`MOdN{{a5Fm{ii^_D7{p;&6?TOdcj#7iMu@bgb;W3Q~l1G)8Qn zW|8S|>!}wqKIN&u;U~8tfjO@)5;Ah(wfa=bw2-4t`<|eh^0TH7?&=AAM;PG^ zdCYRk-5VIE3iPe%N!sn|W z5kO?gZUs}D#08t>KP`FMzR#8UHECbv+4pLrIdv70-NUV;1_$P0OpnBYK1V%!R|N7h zHqq2nD&)52;}v}D6i-aH@ddlL&h=8`#5tW+e(0}0jL6*Xr?ax~dSk6Fb{wqqgW_n_ zFdKF%l6aZh=3|Ba8sOFbZYg}gxf#V$n;dDTdIUZvUb1jM@#?W3iII;d<*zc4%HR%j zOOgg?_KcSldWi89Zd(!$%9wmd7?)vhyIyRv>|n#SGka%q9-S$wvJ!$lK2H(bj#Y(4 z7P%CiTQ%m7GNZ0D%_rJqgyjt$*5gn;DC^Neta|37w(%5g!^j1ByIeb_GxIe!cg?$Y z+Mj60?9u7%uSTi&m8q6`>|4HLUUFq@V05M|#Xj-FQdKNwdMujcetzXWDoFMCLgGfR zH+ir#o@x}haq>MiGPzqlL3P+SF2~%|^H6=0fo|*pu2^F~DKj}*TBmqN)`B&P! z(ldg&;b~-d`?=w|QOw84dQ@B*yv|P?( z%N{Byo>P(=Xca1`G>=fW*W!~XT~`%xHH%eU&iP+j@*SpLS+Kv|sTtkk*sge`?N~b= zz%^S>kpuq#F zi-}l#o4BW~%Le(4Olw>{nmthK2nb^8GuoN`u?h{y%U)Qw(lcj2dX`(4*^Ss0UetOX zt~GmESC_%2N321SvQN8SLmbmdyXR`Kw-O>ZElpMIIK=fO)|MU2UZjgwx0eBm*OWzd zDEVYG({VIs3V5X|gmRJphYoYbkQ%&&&6J)k()^~rUZnebcqswC85-G?h)O*P!C z+kwS0-%`5`*A+h0IS*SJ#jCqT8RDfk)~c#m_^%=U(33we6!pHC9i--uYpu$O>W2E* z?fI&7y^Rr{e--3^+ET{&R-}tpnb`S zE6n28Ze99(qN>TQ+#a-*O+lm9&D>{imftNbQ^a>2*{>%$tj!YS)NyMUOxP!dq17KD z>;ia7VU0I>SC>hyA1h#NnyQ-R!yMKBm$XCWJvv=N6gyqH`?Vx9#@{No?AMgdsk^pa_X=X`QmOLM{{RXdVYr^W zv)hA)6$jc_xEa;*C$y4-S@wWpE@g) z_0P1$w`loke%o)2yOzA2_31ZqY3-`GJNH&@tU@UDKebzk_N!s45jy#MS+ibhn#`k> zZYnm`t83CaZASU3F|5gzbIvI$f^h13p5kcEm1k4apTMRb%l2EZB|sYJA8? zWh$}cR7L((TIVFz(nevLuNJbW2<^oQl%sRB+zRA;n5ymw`H{X_=H%CvINh3sHHCFz z8|9|j8m8Mi$e0h19OA4i?B{mc5gqP+TG34?ipO&&191DIns;qiAH!T~c!^)-Q^QiHh&Q^AH|4E4 z&>fSk(es`uP$&1kX0ASO5F`HWA2kbjh(L?DWd8tqlbR|gY(R*H-S=q+Rwt!#>#jp6 z`_Pa9B!=THcCw1Niqk^Py!lE z_N)P|tf{atrp2qQd%4|8=y8iWJ)bUVc1zZ|@vXwE)0(vgw;MzI!}oes-4B(UXMWy# z(rpgEF~e6jb*SC&hvloV>b9ZOv-4W>Amues6gyw##W7@IyA_UgnAMmatx7c*N@qFt ztfcNrOxt9Vc!&Em)>)JWW4ryDz)fkk?9Sb_X*GStcN(~&+B9HO8+kGuD}Q#3Hr=S) zRx4_d$taIKY0_#7A9{%~a+|Rrb<1_ArG?MSAKk3)?O0V*vB9QEtw6hWk+!NbT%_!5 zTcnalA9}O7m5pI? zuO1hSR3>&0n1yB~+y#2ni>TYIxF)STjoiEyWIw+@cAl#eMe?r|n+5f`m7R~uaq`pT zytXQ(jZct^2um-`#@b_(<|@RreYV?g%rRO20BeRx7$Nyb%Tr)A?cG9*aKA0Ntj5(32&ZWcjMBnIo9~QBV71URTI>ZK!{= zA#ay;2$+I}j#Z7iHCWn_OcX9^kd+(o9P3 zj8%E=Lbnx62S_1x&!tsjWM7}=3s9u-w)~orUNQ4Ke6*io#Xg0|qJk)L$P`p|{#Ncs z6pMFl%AdMF@#=2cDmajIsUo@nlEXfgX@?^K z5lLN~nowh3lV@6U+^*y!?;2^AB?th|bVOpy%Z<*5b2GV#LD z;x%%!q6Ws^l^~4}ayI_}z-q8?4qB2+_;&TIOPM^e#PRf|qDL5Pray+5vqnkFbj2mb z;Ei&FzzhXSw${=euApM3m5}tH%2aL07@%mY4TLeV5-7t`iwkz#PzspI$2{Vj=50>6 zpsSP(kmrF>MQVd8R3BQrvMhfywM8t52Ic280ZvYkiKGq@a1UCsvWr^A>&O88D!CyPR3M%Mo<$~t#&oep^8Cw#>xzPFWLDXc&1uTY zc~#9;CNc99_h{xNQ@KJNITV)Lw=_Mni4Ox6aVGn~QypUjE^=sBWvH}KHfRG30x6=+ z8Gc|7YPeYuv7ft0uDQuL6>)Z8os6ckh)As(g*1lTJBEC5(~gyLKsy{}p#c$iwNQb0WoSzHg7 zImK1<3GO-|pyc(b<1&{!MMicqik2yaXD6j49fO^Z$y^c5Oc?D@21@gvN{i0kconc?=uU zt|j}W$eq;fWvAf&H4vNzQPkAnqd%dn0<=_x2E>@@^(x_F%H$2*sqwMNZ@Y?!$TP5TC|nQt6;N1|?#5NA zVhmf~;c=O$rdHW~+>gZ4yS_PT+p+ z3{-_Z>LruRBrip&DbjX^KHPUi9p)PDkCvL)TKG^%n$% zQ_`4Y3dMyak`3rVrzAocINL-^L)@V#@ZXw!?_bn zD#^69T5Faglk$p*)MXiIGZ&Yiy;B{;SrP_CCydllm3PZ7F-}5EVS6n|s-j<(wu%_m zJKHP#H6$*>aCX~Mg;4M2oxk0rjySgyj+msND55CXk&(qkzEao?^0hl~506ThZ}DTL zF_0Mpw$@XMo+aCiR0IcXw-k#m#@o7`fV;GH&lMDlh1fn?sppN`5EZEr!~N<)krKNr zaxf?^H?SWqA2X{c`Kd^WLXxx$1e;^VDeH5%E;(hWnF!o-@`@tBew>O1Su(o&RMFmm zyF&cb#a=M|DPf5ZIIDotM8ZJvWA3$A^APT)vMJ-zs>vVAglck_Sr?X6N8R_TaXKBU zI-16aIqT7C+;T5cDx)r7iY>l3*%bB-Pz>pSEQ6#Rfi2muR zRrZE$-!%}}WJ;x3lnO>hTq*18P29=XoYRYLP^Yz44r!ig zTomm>kZ3U!pcw{`rZ^&{aslF#bbU$Yl$+=h+;n4WD%4vJev}Ca`OP*qec<}mT}kLT z23~2)>eP9FF%8M6T1;_J?2BlW9F_oJQ}8p$#%h!k68LY%u1v_JVZK`3HPn{08UfFx zKLvPRYB0kbe-$_!RL_)fu(&zKc&OF}MpqflOS!&kXpwqnZD(OOVe)KkzrxiLtE+p{ z6~Df6w7~xW#mS&x%E#sY8j{)`-^3}Q)D_J-H)K1M)|Swe`wGM7$rP)X3{6C5Ow`EA zcv{h-AcP+(jE=PE(*;3nifAE6r8OB_sp(D;uydh8gC;vIDLsuD1m!+u6ptdR@+jmc zqSTFI`M=qv^2BPvsyOG3i9x{>=92>^qEPosgL>Reth-O$rY`k;wGW=h?((%anX{d{ zTAB$Hh{$Dc?$RuI`ITxjBM_xd;Zj8?kK~W$%?{fH6A{C(016N~{pv#^j=WP#{{R>8 zig!UZbV{fdFgPZoL{?s(H9}=?mucFyB0f3mS;ju_q}_*@OLys2ge;D^sl3w7!(yJ2 zhC5Fcq*C0?riOs~@Om0(Rv5|oMNSGGPDHz)hG5=ap4 z9Mg@$vVg}cQx=Tn8wd&9%xW-S=3=}LT19dEH1Nz$+~aj$DB>V(?elb~_ON`8Da>}2 z%_v}{aw(HOVn&IG+^tOcm#E08OxbP+%4#Q(PZ--uHt06AAyOJm;*oo3V5No+DO5umPB3&r1L+9qDeBv zQq9KSmXTnWB$2?U2HU!r(ghh_MM{ddx+l1ZkGpqDddB(9JwJKXaZb)YP$*p8g?2c` zs=p|v95+ss;`kW#p>|T_Gv^poo(CAHqi$+rY!8IZ}g;V@BO8rb&pfEW-sl*L&YV({WXT~{_hX;CPgPU|G0PfZU_Mf5e|5f-CgXMz zcC?N(h#V`>j z;G?Yz$Z6PWBGe`~GH^IFyvDmz<*A1OcD89njm5o2NTdP%(NQLLvHtZ;1847i)e|t= z)9%w`!tdP~2rINRRF0xR+cS!0Hw@9r9w;W_DiaV>^3s6HHUq^fNuK>`67mL6i;dK^ zFPZ!!vSVDxX!8|$U%gL7eQn&co%7wRwk@tGn8u*osxx_^B54 z+(^`?-dxmscz>-rIN0ZZ%eI=EcKq}X?1W_exZAp%2HlwZ#+@eCBOIEUBV(ECRIvPwvvJc@2t9*cn@X?47@MpBoLlEkrVU@mCf#$`ZY3oUA4{ zab-ChS!tLXbBbNhA3n4MMfpeaqRi3&u2giV0K0bm>SRy``AsMYyRqJcnSUZOvM9?f zRV%-5KQ&*#ae&*6LW-addT1gfe5d26$EOhzB) z`;>~I{{VK>9H?#lbftYr_ekS-!=2pc6*3|R$91Z<<1%2b?9}Y)w;#RlOOsHHdJbT% z)A(vQg7+^4YUhn+*Q|-4wB= zM?W2H)$90|h*JELlQe8H4)vZ)+&PL$~OlahBWX%X0)%nCNI-l-vzpP9aH)l{er z`>L^QxGY=mQrQYI_eaFd^9JqwRbzN7w65V)r1K$tvG=G%kFlf2G~mZ#(AbLJOa0nZ zk+@vus}^XZUB7yorPysP^He>^x4cibe7^qxdX$#NGrQ|gn5!1n=0$ACDn-A#Q<3~X!&K#C zkx_4!Cgb?3qQtf?3!9&qm-&rCx{cgtaTO}e0V%hNh%V!b&f~C;e|}`%TBJAkO`Nv^ zm4}uUaZrOAwg*>VtJl5ZbEyaZ}9fD_FT5{KYWG=KlcDY6iWz17kknNsW!PuimQDr#L2( zcL?ZPk5!pQ!%sJ}Z0p5mqN43l%TT9o@9$6zE``O`E}|-Wtt;x+E^?nMHCII&vQ0N+ zamlp(+Ad{MCGo7x6n_&6NVRF7?;rRLR8@*Ik@uRQSb+JE?fTH0E)cP@`qavs0`#iz z>ems!v8qW4W4jqzO~f`7e6%LV%4v;a>RGv5Qzz7Bk+uTZtid9~xDmFLZQYP}H5!S* zGhsC^v&FY0ucbI@*%+*ZhDL5rN~lqHWxwy5PE2+;(^h!PVA9E{%0jR_?yNOH`*Jy6 zl*WM#tWvvN_J8El%Mi$>~r2 z+Z#Y8xwu2J{Gy-bDfuzhh{zOqj+gsxKse|r&8n=&=KIyoMy4#G=~bCZ26*Z7GX0V| z(W)X0XNIU-QDsnLZNyhO6pqV`R6>89kw@b~Y!nmJ=pxnTW@6`xu-eLF70&E$GmfIG z$TD`7#Wf~hDmrG><8G}?I;zNmFl(6+F&oG5)C;{E=Hja1%8u1_VHe$f*rr@-Ea~%_ ziOEPc=gWP5#(uSLZ!znMpTC(`{34HeIo`OdA|vc4t-d zhS1$AFSVlWW;Mwf8WO10Aa-q}H_KIV+Q&{cFW)KYnw7ONoEqd@HvUiDsCT~hEO$~; zu-p?nIW*T|>dowF{;boXyo~(ixvnS8lz$Z=X?CBRioSMFvO3|b2&BY^CWqD)wt{ji zjwR$A@YE-nAIqH8bKIY1br&^fgpt%fts{Jg=Bu$^28=5ln&MU8aVtP+dhgl|QhJJOq2I%+M+;=O zP_@$>=MDf>sh`!Np9nlsHeiXl=419*0nxtHj%6YL#_j-#c`!E?Hf^_Xd#4 zyMKzN47k&0N_BJQ?fc179a0_NDO%#;^8n=MG{yikLCn4mq!(_LN>1U(c1@@P*)7FK zbAFiw9tCmcNjShf(s{BeUB5ThpE$WJbyI4n!9orxzuNdfpLV&K8bASN-B5?fIQf>T z%IG;xtZMMcFzwQ-jY=nw;<+Mxw+x;C07_3em9RQeyAD&c`*JA+HYz)fLN>-aS02-` z`A6Lq2)Hb(o-s-?(9I*TgHTwGT;`iC*O|(;E0TMxx|IGJg)SS+WzH6bS8!3e)c*iz z`6rW+QXNVbjPLJUYr8PX?MccmUy)1NXf)B&z39Q&_eEA0s2j`O!K@Q-2nxMwi!<)a z9k{J|v=T>TZevwBKT4tY?ZY|AUiHkIi80si^r#`aoHxzTQ5k}X)EmI83w5TO_}w=i zFcT%6~E zY5Ui32b$%+-lGF{4N97#DEXV_75E>ujnC3lPPno(e5Wx>beMt-;$PVv={*xUEjLCJHj5t}Of4Cxxy?Eo$81Rlx?VuAq(-6Od}+$edly zi+oBjX_82#u(=|+i8Xj*mt(gTaBB9c9^!h^kq(BqIAD$ zL>L|FQ!e9{700%t0u@l%+r~XA;_8Y+5OYhKCBg?%mjM@%LX?rb+~XC`E~5&j?fg?A z)FW`jz9^MV0n<9sB6mG$=K%izvTKm{1wwLqRM6_^%0f2aD?V$3 zq;z8E<~_%HSmsU5^6jovYU>tJ+pAW9)Klcze(&?6m`XM}6xbVfHr1s#IR}wk;MGKr zmm}q?167JMo#KvgH+;dgHYxki#5Vl3$(>>`5m6xBPqo!!BQE2bQK*eM4x&j8F`98? za-i2f`mL~K2=v3LM4MZGUeqaSD8%cd{m}KL3@eu!vd9%TjML7nu_jB5ikVcfnbN7+ zz|-DkLB}mzvg=XGqY^D5>S-HcoG|`XFqo81lg$c)ErQsq2`D?b;cJ-w(}9o3;ee?Q zuNLkc0Zvn02!cAqxm7qL?{}zUlXUIR3tZ%S)GP8A6$sU0X+Bv((rp)GtrsJm-@}S= zxI&xFa^q8gf%A@PRn=gLe8zFMpE_hyM?)RPcCn~SlgRa~IQ5HW1)`IRYU+{5xdc%O z1EzFnOp&rlQW<__Mn87B0^^GT#{-oQ+hb# z{{SAP{?>|3xqq1d0O(buH7+q{NcTXx;C!_woT^mr`D>py%L*1RxkXk@QW=I_xvP)F z3Y$9^r9UdE zdv;vBifR+CM;ZA@q~bWEtXb7%0P|8L$2tBQ{G+CG)f3+rSIQL~@!)B{?DTLf-2xs5q2bgM9TR~2ZafQ-M$jT~{>M))F|u z^Ayz6_=#xhR$;hjy#@Yy=3~^Nm3+!E{A!Sgclg)Cm>k+Qwzk1UD0ByoY-yBoDh04yL zOc{QE;;AET-zYrSAiB&`5t$WnPa3_vLkTY7OWFxVqpX@xxXngn8$lcz=0>@0sr%O5 zigdc<04k>5f4x@;A#&<;Ehbq>`=+C5Q~g^GJ*$?JUW|R_+&|f<{{Xe1lMH1PoYl&V zJ>#$Q)GE^+a#?Z8*C6_YF%OyZnvrz~$|(}m-E#wjI<}Y0IZkR-opYVNE0lv-fIBNU z3sSzhY=Mfm$yv%mQD*3MM&3E4j`3KqBOR#F}D>L_NBf)`Nd}ka@-EQ9k`VI zsyJH058DKXsP5NVWKg zV&<52sK`_1k%>G z*KJIyu{a$TNOLDodYA`ZUb*(wtL$4EzD>!-nqZ+J9w0ClQgkv zR<5nIsm)J0J#2I)cRO=PvV6Zc%bMoSs|*AEV$~QFYfaH z04*n(gxsGtE0;}LJ^uhZt|{NzNg3+9O;bWT7My?^A9kTx^_ljc!PS7aVq z{MoDnsHk=YxT_K0+r~0w8L6DKHJ-+onyRY9D^E$bE8o4glk(NV zMa10~5vlU}ttXj>`B|}8i>N{6a%x}gC_-)|Qk!B+Q*t(D>TuK{aN8>oUV`6$I*&yCD7Alxo)7esi^`sVzs!Y(VP3DC2EH?%BtB z!Z)bSL~ru{02Mv1?fPe}Xr6%2T~3V?sWsz0=U4&R!nM=BRmPs>U# zBZRUOxKpMl17<0Ted>hVg5U$lti;qHV63NgMLoo2!vj>JO+Ah8JOmzR%}^Pc&R6eN zGTkI?xSZ6#X+~CJXyqrC^3d2f3$vNUy;u=-?t{_8K>e*V!OT=B+ZPf3z zss8|Vs(qlnnWz|<7x-~fq=V*C+}2RLh?CCcT4P+`_0DRYMqE+6CELL1Rrjvl%6e9E zUc-h>>rwrxEx0Z6)|Vnsxv%Fd^ZYdLFqQef?PJGv53U#eui~bg*!;qQw*LTjmC5!@ z+4F*R?@ca>ymzdrZxxDs*rby9D=ClW0;cTR3*I(2GMxVa1wU@$vEo+}0$sHAM6`KkVBSLL?Soa|=lqgGi8H@eVn2Fxpb z)t4>KMh0u+o9k_-P`YSE$8g+scuSY35~&Zc~b4<>fS8*#_mNqy6Rk)tx2KRaf1) zXcL5T{{VN=mnj!!nVZQ`zxb)_%F4xCZFADzZ)^&1y)no03QFb1J&iV%nmi+a6*#eC ztix+oZMEuh-HL^z9$&y2c%|f#bsYx=bl|O|-y8`_G0D6$At<5%+$TowuX_2z!1fQKz z6BSLPr}wH@<`EY2K59@_Eh6H~BVvSo+IVJkS5KCzPSLShBB3P0Wb~&Q8P9UdOv^>H z`idb28x8AJNFzNl;t@e#z}^CsR%rELvhi!rx6{M8_rC6&8XBw(PUe+?wWZd}y!q7vv_S$8(k^K_(>Yq}5a z)^_Jd&)s87z5f93p0!cf)(E-&u5wScCVZC&y+4YpEW~Fm^9)inrMZg%H zuTBk-wn0?GZIgq6>r=9YHC0y%O)<~z{{V|M4UL*k z-#70*?J-?<@HZ`HiJmY7olo7VBa><}o~=NQ0?NAz&=rwz-!)KKGP@Odt1Btl^H2qb zSmY`1Rea5#Dxa32YlYY&9cmSu4S;^_G*T|Wz{`ZIP#w%ZS`SW@8JT>&r}(LjAlZ;| z1y#_=)?JOf9j2yNRp@?d#(CA)Y#%7AsV07Eo@<~)<;-un=@IhSUaeIOft`lm`|6`C z@$kG*q)p9TvB$IK`Ke;vhi6*LQpAk*t4TbWCB9v>6%POY+IqpiPazJ8Bsx zGB1|r=BLLXBg>HRDpMtS7G5o@LaRp_?yAdh%zkb@m0->CVEyVv3h@%dbvHX@avT?Mo z@Aj%_%EcIb^`I@N?XzP$sv@jcpS-mopDxNe(;3%es0IUc zt4u_wc~E#1VPQOc!kAt?`KP}u6b`h~(@_w+WU~QKp(h-4so11zwf^-p$Y{z}c!fF`T*Lr<%ngbwjghKZQkxSJ*~Dq(SC3LF84Yc4O0l zLRTn*YpLXXw8jzOh{w&=rZ1LkHx*7M*(OhVa3L*5E67+jHsY0u>Us*0s;?yOsM&*$ zlw&omg#IGG`mWqkb1z;65+mbiJGRtOf`=HT)GhB2fZso$sUiq*v~{K3xVAoA@rr~P z;S6{NmohCe#qraOQzHUI-29plqqYxPL7kazmWZ(?Kg``59B?WU<91YSrAIFNTc@QW zyg@d<8>zK%+T;o5#>^j>%_A|5aHEQnK%a4HAjuMpoY4|(VgO?)lHAl!BOReqrgZ^T z^N~@=q_$I@KPt_sFlb`7-azS4s~2Wv9Vz)NN)xu6yLyVK89;#-(}on+17eX%8yxqj zi>n=-MLP?TkiJ<)-f0WCU5&*&1ze)`rgU$fnnQ{!tc{goKJ7k0U0Hys_Qp;JIjD$a z2eQ>I#bT)WLk1ga7L7{`H_R$#CA;FFd=<}n8e>`!<*-AI#cDJ=nV;^|%0q@d>4gMf zFLOnjC9)00R~=~?71?pqy-F~ofzVY}V&%4Q1rh9MpDF*KDFG%tXU+5Lx3q>_R>?hV-@`Tps%_5ZS^?i(luS6K&KzhrjJI{-e--YKQCN# zuABR2)+Py_b6SU3v>RARI&)VlD%+CVI0vx4jO;NSFM3;DKT!LoGn4II(be?wawJks zEPAb&=W_6P#Y=+j37nc~x{O&S6Q5eIEuHjxgotateOAbU`_L+*YF1=`ToLO-ryk`- zRyZi2)R%~(avSumm~HihAo)Zmt#(VO**IQ+RI934xeK^pQ}%1QDZZzkOK*Pdgj4sa z=^miPQP7-MdNmC%cGM$1@+w%a^x!v~8XYYKdz?R&cOEt&2Bq>Z$pKg7?_IN9*dLf; zsxG0YhdY@9`_y|okp^+%Jyk(a2t!0)Y6SV2$gbb*ww-b|nrGTH_ua4pX~qk=tXjFs zLlyk3`?%QEuO|97B!VlkwbXRt6$kpyrxf#dX3A9Kilz*wBy1=+ z9+lgPtmRx_Vxx}Y$O0D&iczMYQ%JLmjV{cYB;(SoBo}h-AqlR}&a=oUg006btZ|dE zGg-P`@TIB3D7y-y2NfuLqql>_cA|Sd*cch55?N%EgOB!UN*5B9x*UiXn*#+Z4My!Y z7-Z(Vc<*$vwOy1SN@Q~B%{NeMHwzY}bB}p%7^qzQzLb;Q-t5?!0=)=*f+ZLW%>nf0 zZ~~5c@ldI;Ngj7+CDdt#QV6XJXT1ncN!?wbn@+<<$T{y;BA&risUzEpmrcEf^hXS5 zy<~0sg+kAL3~KP_{`#)?8*=$T7$5d(Ou(g3sG>Avi`?`0=e)R8ZgJ~Qj`Hd`7%^;D zqyu7CYXHCS8eO&_c9dNGD%=^1owqmhRZL9~k6=8nBsuUt~&rY>o%0;8k5Zwp! z5Vk*uty+S6$1Vst?Ou-(*@&CuMbEWW+iZ)%fuCxX2{GK^+3wYI<`w?+K$mxOZVcp> zuHnVIfC`R#ZKkYN+mx(8f52)d1_uxJiZ|$yH|y! zqlFHG{`su=SuNP|(RqJlR043~pAFs2vg4opdll;|ZKdOEkcQ(K+emD5<;aZ{LeUsI ziV{5DTdCi6OKxgn{h;h{TOY;qSE4Nb{GP^sr!0 z6>#0%NTCoGQNgbB?AF}^ul@2UQEL-&ilhD7n8Z1cIrHaJ!DXhU<=kWM6aN4LuHodd z^Ocno=KkoX80?{SCN<`zC(x-giWfJkzGE>Y{ok6Jx3|vQoy%k8`Hgo9ZP~u!?KL2V z$~it|8)%GJGlOf(q*dC*o7$E;%e~oB%Er6WwrH%$5{hIHS(e^YG+4))Jq{i3uH|J8 zq@TO@s=&Ivg-VUg7Q0fmau#nWFZ>3lNG*f0C^r89yF_AX1aN~_zcFmwSRa<7{@1;g zys?(AKuBy=v$Z!L_Gv_Rk?z`nkN0WD8txZ7{V%VSG%QO00JXZ6?=IXb7C+tZUBqJ1 z-M1>^{n~$(Ya_BUDut=!GuB56bxlGv@|H#bRe5ziLHB;}iu6^6%}WS^vYKa?VoubI zZXfK_$k8htEw-zuGN~+Bk6I+uFSl+PU81`=EiD035qDFihSE5&0`uOZlie+|f%|>* zV?2!2ajj~scB^D3t#@Y1)^z*0p>*2_a>~0|zV%%+h>SHj&+T1SR$nvj)uz=i<0}%j zaa~&5*+bcC8LTX1ZSHBcsa&TcE$!eNw=+~0@=C>sC-biN?DlGbT~&8dt)-p1`G~8E z)007R+~m^c`4a`$uid1U>ger0V{TgNJeW#?i}KS1a7Hpy{smWVqKY|zscIo{A=*7R zQ%0qzFab{nyCH33DsE-@sz#31B*+WJOnpi@KkXaPhhrSISBp`--I7VJ-qt%QIbgV} zDQ{~VFhm=F-KENa^OL>yTKKxW_FBKxKhjpRzy+$(u$~~K2~|u zceg0qI|6^&sMhxL%~K;c^shwwHL4u!7;n00oLL>AqaXLpRALG&;Vy3Pq}q2dTB!y7 z;mlHQ7_UR}?cF};1L;!1ZDbQZSoyuEHHz$TsWs--+{fms4K>=y<%T;=dW0(w3=C_x z{o1P{S%6#1UTHM?lP%9YdyBUl32*!An9|&X@-bF5-6VE9w`~6azN*ZvX#W5rBJKK7 z${eQvlV7OGX6MnU`(^YacxGMI+?9ZU1bcSV(O_?s#tlui3m$y8H)}7N81AWO)HMyo zQNDirtGi)lTX2m=-jw*#*!|>IQU1Ns%pAwTB3zr+ef{3LOW=Yfleu->;qtE)}j$)%X5lt zS5jlM%*_z$T9V1-ZosbXt?au*r2hcBRi#KH$H+PV0A{oe4p{0snjNW-DUGRKq0VyE z)W(*{x;G2{^$Txf5o{v!Pn3>ia<8fC81o5lr9#?{r1?9(U*WE-C8x~AK3ak)Z1Tfy zcGKk-InBqbYALl8u+Obo{?*h-1V2x`TCSF_wYK!8$8By~BZ28sTz4^=`u<;;r0G%r z0BLFxKIhLBw6Vgnbomynv{1Xd;c3K)BbrS^Q%}112dz9_>T0+LX#Vwd2^vrJfw%1Iy_M5Q7<)Qx1AIgdMYNK)v zd;3cKt|n|$k?OjHNyB7S@`(B4?$o9maulei6u`lr{`<@fJJes=dW?S~HbYj=$&IeG z(`gafRPj*Ni;P){HBCgXmbt|>FEuh*H@Ex>y2OSNw4!4a_@jVJjhGaK^f_g^)Zy9= zcKXu|-S9=pE-SN_$or*mY5*bK!hEap(}|loG`Q3wT*b<@JMGt`?8yYzXz@Wh?L^zQ zp^DB3$L|y7G)-K)T;r1V`ClX&m|f}(&TFp!07i{AgyDUu#wZ9F3-eQqSV>so4ep`$ z8?W%v{ku?&I=2Y+BZcW*WGikP z8x$z1ks?;#v0MHF(z1*_;YA!fUf(|;lDnxz)}oSUe-+zpgLm8ux{$?hAz*<+f8({S z%8ExI`i7z~qbGGV-rp$M9E5s`?0lGr{oosxnjwXEZAu{$Ut^XUj-*=#MmeVc0BLG_ zO0!@sbiPDUu2pumHYgyUaCO^GQ7c23YwbXVaQLVr)wL746Y{66b*9?e42qcBOqkoOLz_=m@Kr-`bk4I45eOJe|koTGxA3cE^|U)pfRkB=Yg{)Y?TE-`bj_ zgK#vd&>4oK(MRn$shn*>sSYHDi9wDhgtvBe<84FqZO0l3r?G-5WfsY$zW z-Ap>o{Ly~t{$JuXwr!$h!5=k5Y}anhzby?i4BLHEQCDsM0CuMT0EB~54g12!6?|DN zdsnqE+eBNYYGR%27cz#wr~=H}g+?{|=GvjYYSVo_DJ1^xDe-BLlZs$u{j`yzD-^8OU5 zV;NtZZCXw&Rw$;osxbynxIfP{r^4J3xK&0hyXaH@0EB~3 z-;LN6Bz_>jA9(Islv$${8$GI1Wgq&oFtioSLOesM9uV}Vw}|h&yavG?>e6YjsoZ){ zY+%a(Fe#8kn*I12o0^RHmiftYm;$YvNc_H)RNF!smme)}9>g)<@R44k?#RVMABk@a zM1Vs70OQotWeNIJ=EmGE$i@vO+6a)35?}68N6Ct?JWqDJRYNKFs1n9E`F8TPC)pv5 zk#R}O-5eIA%i`O`pBr*1jpECrhLATcNVb;X?u=%tHIJAwf}$~yMHUB)FN)?p)Jfv2 z{iz}&Is2t*vT4yN+E)grgH42-AG<}Q1o8Ny>OI7QR;3;)yOBW%Le(|2w_}i>D5VxQ zefA~tIja05lslVYWx*JB$zj~>ClG%P($KI%onk(%q%GKD2vhw(*=)U5c zf&T!z(^DRl@i>SsNu%_Giwrzzl+55tw zlFHrWz)jer>@h>g9cj};EVqd-P;MDf{n|zGUF1K#K!4q)eU=|9=3JV3+FL5{DN0g6 zBlx!E%D7giL*na}`2v!)6Ij5zcW|_yVu#IBvuCGJ~T(`_;jwjFKtyB;2&AqXb>5 z`-i<}Ci#UO&fNII5XDL3)|nrS<73JBJ!^tGFjg4lY5xG(D;oTQubi$^y-yihBDU9E z)aLP3nCCQoWLq zo~pGsmt#1dg&&P9Byx)7P2hTu|CsX7fnqskwA4^(Z`L0Zs87 zDgN~|___h}yMQaqTTGduP#&Kim67GimJ3lXVL~URj~3cGv0?!K0A`vzS7y>@dj9~u zUUBvkyF%w_`_v|y>T!?4h&CxNkr+ht)u&xQ% zV#*_7wvoI~44=ndNY*np+|@+WFPC?g#IO5QLRT|!J%sDl)0Jr-=K58n*KOHC@5U>| zt?X}clartJs^VH*lZIwdPEydg*!C3HtUwDR?#)cv{fO^gBNdg}vt*o9scCePJ#Nk{AeBo~Kj9*_X4}8;uM#VIU(Cs*R=h?kgyj3ybmw3_ z#On6455B94jB0S>CRO#X4rw(Z9>jf)d(s=*#0W0)Ik(`pZ2P%D;Yjx{pyk( zUe#AJxEpK3Qtwg1jPAuYYn@3)-Wd8(PGPa`?W)^`;nxdQ6ILYrj=Pq;N9~%f6bBU% zxYf5RBb5XDwKA!3=zENMsxe^Fu4?$ypb6#gQ(g-V-lvS`X{SeZt3@f3%nHV;a@5b1 z_jJ_YZPBr({{U#ig}st*ql2D$D)qiFJ)lcMRIJCnnfP(70hfgpZ96M zYdFI-cx-+o)gwk-na6rX@m=`JINQ6uIJpvg(YT1=xBSahzSt19!IiHJJ}T5LLlBJl zsZWXZ1`4J=KJ^^s-1k?yO`X5ls-}2G){XaVuNY4i-`qaPhS0RB;w!b0Q|1}#O-z>? z9^97*(e4JB_Nc_039l57#8c)GXp~=);*)`aK#_UcU2hm29>vb zqvo$5{{V!V?m2dSyuL3|zkBY~xe7@2Z!sI@{{U*CG6iDE_iM`}@mk?r%ktA> z@o_tO+O#>MBzn)DkGWjbsLji<wD{mOQNXq{JGLE0^QzG$rC7l~;)Tts|Y%w2bgw#(#Bi#xC!eiJ{{RUcv2MHyagdKj^F}^e zMY}-EKZ?BI__Em?M6Zq1=)6&8B*Q-KwA8s>#mlMb5zQFu#Xd(k(cX5&Awhch?GV)ruxcpaQQM{=}Y4P}))xxW|`Dt?tnC-sN<&Ew0 z3bXc=Xq#{GR{{OMXz~8;Mfy_1;;lVFgb>asMa5k11EPG{q+68-Z(ZH%j~eZp<+qQP zn4TcEcG|K4r=wE4Me-x4X-MM~%~`Y8 zEeuCRuwpR6epl`xzI&$5l-Lx>YjxdW2JLx ztJ~)p3=K|o1V-LnNFR2K^bx9EqdEQ>YfKr{>z|KTibf-U`?YN~8*rOl!tV8@BsOZb z#tSlhwF+D@9Gc7*kZ)kE_|z*jStZWarvOITm5Q$8_iAOBebB#lx$}7(V{zqa(BH%p zuHDq+t~(n7>&qks#wycXD2+$qSPOLt`{(7RJjz&`CCYE~Oh z1#21g8+K)1F>-3X&D>=PR^e++P)D)4w@dQxY^_*nh7gM7Aij=FpWzh6)QM)n%|_$1 zI&UzeWPHHWmB3$b_N$z>zD=Yv{LND>{C_lH{p!*P4Z}7U?^SU>0f_5aNp};4Kz>!K zQr-UZ_kS{qb_kt0xCi7X=Kk$Ow_84cy^6*AWxIy?zHljve*{UA*rMaJdLw#!BVRa-D#A3&MKQZ&U5nBBPi@QEmvLaHj~8y5wlc0qo_rwoJj7GQID8+sKn}xhdpa8q*NPOxT=!R65#i%LQqEP-hjP6T8VBDubI#a#D;c| zl^v-XR#WAkaYIaTU5zg=2i%?NBlDbtil^q4UEtJV%!{A9NoY8(<@0bOY%fn*c(_*} zbmFt)Do5`bf8bRD$_WJz9jT_TVWesjfNmU$iR6vO9dWj@-t6!BPy7e9Mdyd>!KTpC zHYJsK#}%LE0N*7*UjX+}NgSx9zq?F{7v!C`Zp|W09dM`bR(F{e0LaOz!c|Ag8VS_c zI6M>0S9w%!LDr}ngOJ(VnuB_(l?Nqg<*`oX^C!%w_-Tehjg!>Ye0Pr;vSab6n(-rL z4tG#Rjdgb0lhjmRd6Od;+gY;QlZH>?sExqO1J;@Z>}(fNw2Gzng3=Om$7;>{Qyw>Q z`if%QAj$^KRmm=-<1NSDrlAEHPg>0~C~y_?O%vhpdG)C3IL77il*aCq*OV^fo>sCx z*c9h(LH#NZw1;9C{HChSlVeS03m#8;jL)($w~W+O3e4e%4 zu8^_?O``*?OFxHWW!uzL#*~WY(BZtIQA)KnrIAsNa&gDjySsl4mV6V0sgH)@NeY3* z9?C$Zk>^o6pWaBv>6)_)rJIfv*LN3&(ekJ6_p4vF+X zvJamlG&)k)agsQnv^Vh+^Hgf_^?pusUV=O;42N?tA4+<7Nrq_i?sKsi5$JAqD!K0$>Dh99W%D7 z$KkeT!wwdd=rQwOQ;k{LGV8dH?$joEcx5>C_peGG8G(^T-j!N!4In)!`vz$VBZv~Z zZQGsLr57?3!6$Opc%C0SR4DnXVd0e--Z`c0CD^`naFN_HugvC_*s_*6Jom1(d^)W& zARYQvx_D3(+#8=tQ=uT|N1ZX3b1-hT8qFXr&TG*Rg*%26ui*wGJx`#leT2Ii#z&kr z%<5E^ec$g@!+SJrt-Y(SkHM1}akq+@d=mSM44vJ7`qb&dMZugun=x-NIpY;=Zs$r+>mBAdAZDXyg3mXqckDiqaaVyht_*KYm`FD3x_PjSULJRX?IU%6Vs8X3ss zlJ0&(xuQ8Fk0l+3>g$Ju3;gT56zF^*EWazM1J<&1nBydJEhjtK$qPeX$lxkFC|d4U z!OWj~p`?SsF@kqwtz01@;?cv$b8txc&lP{|Zqg=OHP|PDBwUt`n4SlfM&KNg>%gg} z2NqIj<=*j?GN+|j7mODN?^jm`gIve7q2`6~G~0H_KJ8a47c%Z~g62ithhbKd@=WEM zJ8P?N1+xx86w%=6AmoNMgM&coBbZ%Ed0B%u0*iaQn9D{VDr=?x0E9V{ZUNi6rvCth zQw{SaOkm08M<4d7L+&ljP4@ZraNR4d9uIdL@qtxGgdR4-5(O`3B3(p|bZQfW^1TsV z%PAz1E2bV0W3{n`_N$}8#up4T^HCVe;)IdKnOZp%RHjx7*L8L0!ZNs00~HkU;K@%6 zzbzb$rqeihuLP2LVC}%`Rz%Lrw|4ATWo_V>EZb44Ht-zGSyfIcdns6zB@>H|?V0xO zBrQz$jTQ#}E4H)n43UQUSbmf@f)+W5bSE_Zo3+IWBZ+&-U|fdlPfOQfw4K0LbN>Jc z6w-Xm2o+7d10Z~(I)$nBQn6}j9FttS@M+O%49m2d>!a{1O87gtsiW`)N8N4Rsrx24 z)QQHd?)<6SPH7rK2!E}16KNpRWAHgIkQh*@G%skQBhF3JpAO;1_C5G%cZ2BO84H4yMyPNqpa zRHfuoX&e&X$`8tRjw;e#<%nVFT|{08l}E^|>$;{M50XZ~Jbfv`l!eTWL+z}qxoHyb zyN{V`uwMuhCL;$cS5v_+A~9q;k9rj;2Qob7?&a9v{{RgZ_cF+Z8cYTCuR}fvTJ?lutjx$`xp9`J;04!$$ta;2%(tp{m*Zvjc(GWuML-;+_TL*1ER!f>V zqc9RIS^K}mP&CTx<*;V@SD;z=G2OOpXRF7+51fIW)ubp$PO9j6mh%`@Mqx^~Zu0*C ztYEe2XW{WxUobN_`!x0N8HlTdBB|17%}E?1U3q9u>;Y7s^=1mkpL+CH@B_Q#D}S|4 zUx)i!Ar9a6zlNq1q*t{(>N~R_032=faHI`Y6b8m$K4^Z{695Q zrznRyHSu40-hx4V#1Rb5TR-57Ksd58nwNJBap;D5u=S<5BZD#pul$TC}JFC>w z;p<5knBlh%mzsI-1W&hkJ4af6&RvZ8k>)nHkF(});;EkYRa_3Hy$OCD24+wg1Ky*5 zhvFtE31ixaNtEU8o^Z0Vs-;^uYQG{^aC{LXrq3<2NWKIim2k>v`mlRcdAmr;c|9ps zc~d2y!3_YplP+c@}@_N-nGW8v+)d$1JMdUMo zz5G=v_<8dy6xsziPN7Fy=g$ab&j5ZdirSKe%+gs(&%TvhFE!^^=?20nqFKR<@Vj0dW*x>kdB!!W;2Br^(+kbXd zPvKJ7f=~67sf*A2$zaPW3EtXIHmZ^`2cMMF!a_7Q zyL~Iy{{Z1$e7m;o!27iX9}ksZ%mabem$PBcta&TkA>2QToF-;X&%m!&pTJ4;D*e`| zCh!?ZL{V{{;%}SuqBLFg9BL!W)_*MR%{8VccRww9yj}`O;zcKM=kI;$RPc04Htg$J zxV?#UJd8}v3C<}5jDv%k_0!;pWEfS(J*mmy9f4WXc0K9Fl)4TwJbE{i`}JZOFsoj+ z-Ufm3l=+sGd=nUD+%i6t{gj1s$io8NDZu{#bmF~YUjwX+K**>60K&a!#z^{m(v1lN zsE;a1GBcl+l_%I#k@HupOW;IB+qZJnfB0AFDk)IGvx;8ELiUNCU}Xw<=xJ6#^B_Fe zsei%*s8twzw7>9zh~Fr`Ep6nzvK`gxEAaR@ZRDb!pZ$7} zcok7F7bQm&dlop&CTmhG$cx>c{*GlnR?PmKb5qhuU7v6gcPCNql#Gk298;na^K#k z3OZ^IXO;`HSx$ahKF~AQIIm0}4-ovRyA?Y8I$!l{7=hBJaF<|&;(0sW54*cGiFdSa zZY$N>;p?y{dT##!JE>pc=3@tLHqjbVDlR9KH0*wHOp5abx!qp6zYn9GeqqHezr%Q6 zEK{d?)7eOwNghboTy7NfyY}5)uP?)~hD0BwMxPD}gYuSc)O#5V+F0^4aCb2DryGsx zyT0vu==gl=!A-SW{uTBPQP?EZN&$x&HtNCiU79pdJAUE@a82?BrK6 zJgH;|KKI_I78{4nw{3cl{2+{tl7n~f{{Zn-AN(K=?~*V-S|b|;&oPd4box^Lq$_>w z3iS2x0ax71xli}1L*N)pj9D^&+2XSHQV7W&RejPw@8&pk;+tUx$w_RQ#KMUz&)*Va|ENxn%%DLA<`sYS5EvHa~{F2z)$n zxKWJ%0D73-0-18BJD2;vttr!x;?Fu+bChHEsX$ox>s{0M4otTVlloLv-UysA5;0@< zerlg*BsfUn!Cm`zaw-;e{{U3A=s)m)Op^Zh{{XE`PXWrL$;)GR+1Nf@B@DntciI0}ODaH~ZGl@xAhUPdG3(35V-D}Z5;a^I;mL+M2 zz%oBVe+quiLCksbTx}Z(pxw62ZRWe^z8i@c07}%8d_1{WzW23Sruv~CdmYB@y{Ws) z46S#O{6C&0%dsQ-)T{9Je=j}0v~o5VvA~H64AQiPm0G)F;2E;a0jELWJA}-QpQSfV z*k=%qk+Qup&Rfi`?YN7HK|Scpt+_!d4tk z0g93G)J|}`bgw{91ImLKIQOPO;F;b{n_C|BP)_8wa3P4n2c=4qF;*?h8t*3XJF9Ro zC~pKyvuf_eS1z{~GB^x#Ps;(bu&&{}4R*VF(;L9|tT1w|Pf+DJ(J3W&e+@v_8}0%q zEu6RIUDEgl^KR0+fAkt?@CE8fs^540nwY1!uFf-m8);Tui^$2Yz<37rWKwspwK=>4 zeoq`w;`)-CiN$2dIXx*BXI3mmab3#z0{vZ;Irpaj0Kx@-8wEwm_vV{St0r+~V&|T; zsVH6zc8TCyycWUA_NvR^O+cN*vg5WWYe7YFoUoQpl~SikOEx4uE2N*nI*XCylekkq z;Re+HWhZqegr&;PXxyn7BNZ2z7-zcIVBQP30a881u~pZ>7vw2FEhPg^W13ltN7p8! zSqmr))K^SA8GPtZE4Gw)D^XCVcg%m;qn6AYIeq8~?x$o&xlyaC9tpoJQHLY{079zc z!P=U;0sJ){&)&GMbGxJRvHV7ufm?!cT}t>vPz&>li~bP(T~w4@{Y6|N`vuN(djaJN zZDsmz!kU`=!{zp6rwb{0HT!u%e8Hkz4p`IVWT|{uO4}Y9)ZunryNyJAJ*l~D$A+ORJAuy$ z33d!VT9`k}y?*U&f5I=TM!SmcAFW0I00`c!jsC5+o|K)4O2%YGku&K^K4G5KsGc6x zvUjJ*Dc|sqYHXQB+@0y%InkEnC{QT_vOe$OtuOdTbshfzbp0_(z8}<4w@SFBYlIBM zlYU6yMM!01w4b~x=k^Ywi@?g$V$n4mozeZ;1lL4T+|N%(*x7Ds=k_+Ezh=^Z;5{j1 z(eKq%g}|rkIHp%eA#oV_m#sj4?@G`bJ>td*M(5gckDuE(_#*xT==o=~=hN zRflf%D2C^L9x@h_G>*iLC@+vIHkLPxqW$Hl$haq9faZm^xQR(f${`hKj+95oIpU!LWeTP=az`C z`_(+rA}x|H1=YUjr2$CV-*sv=M`p%1QV%g@$wTterulSb6C`TVD=(!?P#xQT@TeE( zKQf*uK6<|(kM7cLJqkmW_Xgg-{8dy?(mp#@f}wNw2&l?n2$78a9 zK2hGP#&Midq^wIcbou?^qRfns^7THo2FSx>W=&Qhv$*ARQYP^JU~G;mp28)Vs=A2R zBBG5VNf&7Osz%!*{{VD)(z>AAkKw3`unh>U#uQSmvIEG?R%5s4FVdc~BOEhsssj4M z8DKF?Dw)9<#W1%3)Mj-9X{8a0(FJTd`6{!)7T=I=U-qfQj=pAAn9?dLo!doe0mOVz z!ojzU?WJpY%H(n>V3IS+wn3r3T!7nycA;CSTS7SPQW*Efo2k%49{k9kH9{^33Y76F z+_`Mh<_==QM-+{>W(cWcfmdr{s&0+BA1yS@!{rZEakt!_OIY#09Mo%Q8Cxq%YqK{2 zlp2mnPnJ0Qw4H^aa9TtH>=>Zh#kqK@*0&BVj4Qep5)sU8>4yXd7rn{hb@L zHr<H=n)GfHxzcjZ>ddR?%-Rik? z7cWyCbg1K(<@vp;5R{Z)&t3Cm>YF;rMY@;;bgDR{I1W!OrTaEEP)(e5SR$@E>XhAIhRzl`7!y z!m^66wUEek$dGO)=2}B$s{a7pTC$Uk$^qtrNp=N(^=#s-RJJOc6&p&_M$oGKrnIAQ zyF)JmqiIlJtxRH1Ey^pWhGNf4{hSWfA1JH&W&x3DRgm$wm8TNvnGK}K;NiaQOqMtc z6a2!o(nUWnVN#a}xD9}5*#r`~j4VuiC*7wD7csH(D^fN^W+srbI92=DrjR9bDQzd+ zwO)`|x(&OtTBjZAC6p`R9<;1UnwA$9?Zl1qR4s3Dhl_Cx-!*PM#z)M*cB0)F`NzuC zJq=>)V6BbNZSNxyikTp}NxoKXwX-uuu`c%N)d&%WD<*EM7KWyT) zcZ`3#OTT{5I;|^QoBO6p$8xMwmEBc@H<7zAa=(wuTj=q5n0kccc6zN~siQcv9pb)~ zd2>=ESES`%_4~D~LH-ZBQH0obsoPp7+#@4A+FnZBx!`lnOBudI+FY>yD!L{4gmDs0 zF~Cj%;;Kw8XPEBghFHv-L0zluRBV5=?IBBcndB%iS-*()Z^pJ2dFhI4?cK073c|W5 z$9Jm%w7CS-?LFyr^BCt9U?|D?sic4b-JDY88oMg3-TJmevef5M)H1zx)rC;$kb3l{ z{_ZoftCVqH%u+Yk@jh7MrEB}?2KJL~-qmEp4%3{|N+#|)P~&kkIO_V836*XtX#7K{ zOA@X!-|p44iY?j4N{U-t9qaOr^+^J{9-95=i(_(YJ+Gxv7Vq)VLfg{F|q*maxu zKWeolxH4lLRavb@c>CYOOt{L!Q(C`N@|55nwCjCR`8Na@U++|jYqdUcij5QH%6-~V zM7Bv5w|K77^l!URzOQ=Uyv_wj9l0ZFjzte_`#>vzy=lhcPUP19Bf5-|>yP(oB=H5- zKX!APfI)@%ljYq{TXf4bW17B3I5Jb>3)v$KIAQmVK>GE`R*ky~8V>t##+WTtl$i(J z_N?3;$8nbW<;}Qu^6`$8@!~t)4mP)Xa@#5=&beAevQRg*Fonxw#CM=B(~4vGitTq} z?^6w`?#haSNJ^-1J*uqOXba-2xZ5q>thb6TLi5WtXFaehi~_Y+>}0>nyF%1j+l!SO zG5Cf=>ON|QPZeIP;fKh5D?7?<+d!m}*|%h^LgqtAzYmG$4anejrVkZQBkci$C1x$M zN{r4nnuV=Vh7fWpmCYTEseD+@Bl%8Kf2{{X^WBDY5QX%CC=xsgsiyVfgOFPWTX zqH9B*MODPz&7b&89n?5R!KX*!$+zy>*gxH@BWd@5T0v^a+gU>Y0Cygq^eszrMyDw9pXvQGre@B9YT4iTtUF4fs>XiP@c;wln!xHx;rm%O>Wk^Fkw= z8#px6WkxnSX*^2%f+^1K^-fO_+{g0v^sEsF`xyLamMyJ-oKuVbVVwi`nCw+{`Kgh3 zm6s)lO6R16#xkO!^3q0Mm*zBEs3l{3c&MQBm2!K5=}&JI2}f{y{{Z!?nM+--h8WF7 z_Bjx@99F5^4x9cGlNyD`9qC)eQOm-dZSU(`m)Qe8TyiO&WfApSOG4eObpHVGk^rqN zgE;)@B=IKLmSA$;ohzI2#_g;*sJ_I-K`L^+s$(WDL#1C8vnE301NEju;?2c;(}C?= z{FdX&z!g-%8QMy6v~xGHF*?~iO&BEr`G-G+P?yC2067Xdu6&@4xL&l3gZq_HO>P{h z-L>&sNM1R3+3VJ%UlI%y&tCP*8**g%6XX<xIj^gMtgRlPpTB47{ zrH14LXP$lQ8EgsQt}{^i9!S{BgH1L^vu5?bh@@GIOg>)KXZ{jx-@F4NxiM;8coc%$ zVcNrrYjE~#-A@n`GZ#N8tC4ty*E>sdT$5U;Cj$y<6tw}^fOCvh!?1fZs+(NN42PvF zc!oBN4E+7;mln?&?mPqQQJ7V}@Tuk(A^+F+_mNrhMsrezIlvWPZXc7tspHDI&3+pv zcF)k?F)U+aWQx*RqS`XGMkLDo#|DkNj^4tWf_o2{qUd0}$I_S0-JX9sY+*?GdQ;aM z7-MY;D&+e{O$y@~INehy5tdf_l~^6kj-XVo3XJ14npX;JbL>Cr+wiCPnF=brY769X zR#Zp+sR7-b=AV%*-%`SS!HK0RV;IIkq*6#!$4Z1at|%HcNFzMFlOmN@|`d_G{yl_9co=P_Y`H^vW%fyJm(cEh{#;8 zCbOYd&f~}xZE#5AG&nAU=2tH$Rz^TJ?Wi`EJdSEdT!k!g^q>Yqj@0=^=b*7=Kw;F? zvW)GF=A(d}#Tk0j@?&ynQLwqL#5VEn$sG5o6n_fyNhH!EZEu>E2S0tqCl19avP1zg z&(w6QF`cZkFKS{szS7H9PQ%DNBT^56me)}<VblAxs^w$AN`};IC%QiXXk5Y z<~1Tl7Byx0jbh-7BNGw9QVP`3%Of^q`9)Sh`^%n-PtIfGj%z1Omirn+#zbKBT2nk{ zf|Z(?{yK9g&V49wMDv&Alt`cvwyQ^jCfsfn8nID;Da!1nSPaqZ*24CT&{YcA98+7% zldAl+Rb39@QnMo}f%5ID_Gp68h)458H)f?!xyH^#QjX!H8&rI?Ihk0m@X^VsQDn-2 zA0TCFGBynLs?6*k1-PpRpzoTO1UX9MVwzG{Z{4fV%wv-*H)g6Tl5vbwp`Iq^rBAa& zT)6keQ)-$_sa13HR%1v(z+Sa7yNoi7;;WFWmxaqlFzxq$hNOaAw%IwX=^`wOd(`o= zh``P^RJvCKS~d%iqcjbtk_Ba>xa57>dd@HlXC{YE$Yz_6yqs}WH={mOVNFqy# z2IND)rR-60lPx0%)r(W)Sl@)Id%~TCe_Cp`#^E;6?AW=9qC|z81M{mQP0O`-YOKsc zeca}hNI}h4BO7IfjaVwLW!q+0&|qPftR=>F?jJ2>#sE0~0MM#j$j!8TwEBa37le_;FC(p3 z`%dhr8$qmRW=8piJxMF_RS=n@9m2-hdRVSjRyh0Bj^2>C*dw5sWb+`QEyes#h5Xy6vj zQjLb0X)c#sdo8S}{r;qTq9yhMFSAkaP;e_^J=I66&o~w;ZVZ z+iAqHY|!qC<}C@`U4}TPG^l=TR(|rWkG+~ik*2AHaj*`{v+w)2rxn1HGX zrya$1r`;7%rr8iKG^|%7{Ium_>y%zJiY6&lO)1kFZ+a0Jk*tM^CEO~6o=rHI`Vw@P?* zUz)1nzW4CcP~@nnE1JfF+!y(_)Ndn77j07vP%@8}g<`#ES_=Hdg_ArrBS=uGh}1oD zPu(2SZr&Bt6kmp;&WNqr&dv<)v0(!V1z52$y3!SC5vH%p0+uDyn?HA>yBw zPnky^wJw|L5|xV^*T3Cg?^M4i3n3pZQp|`ydCJnRHz;$36|7>3aV9QE`6`Pvs&@|6 zF$jgczSP`<^HyyVgiC_GSLUnBakMY@s)MSYO+9uM3*1t08@E#8&NG%?YRS2dL{x4o zIaK$k(ONdirx*@0M$1baJ3w8_OlyDv5w6|!ktC8x%B#t#z$^yl#wm`Zk!mSh=G|6= z`$yi*WM`f#NK?z1pFCB>hKtQJFj3l~Nj$NPQwDO_sDT9T%|242?(9yI0k~mli85{F zFv6e$HRXiWA9X3V?+cT(?NTfAyL|zyZps1Sjkw<1+^hh%6@8hofu|TT-7CPzG^_5n?H7lgC>$h@|8l= zdysToR3~sDBCU& zIv@ZFd~$>zG6Ph}a#$})a%FI7u|%{2y8P%VgaQ7n3a-9kU#_zkHf~5x`j&V@pR9Sz`MJn4WCv@eA>eWe^w(SRsQ0=z_bgdAXbUGni zr#|$>a>oEwbz%aRpD(;zS}(IIu2mGb`?V6u8*<16P%<{`8k5W)!#yc? zwi`68B zXsSqGn9_?IL{FVJccvr1-t9xNJg-VnMDvbY8$PU=s79Yg3VNA_)yTmzrj=qB8)^u&+f--DR)WmHF8Ysm z?|1g8j3O#*h8;e`4Z1Iyi1Zs7BHto~sdolpw}q<~~nC`>Ute_n6T3E?Tl#BZpO+kf^tpi2V#9LKXtwk>jjMQT*^ED)g37M^; zS&+Nq7@;&PHF81*&1gvDYUF&hqEzz!UMo4%Onk<9(Ddvod19+JgQqFsM%vdy+?8GJX_yuKK*A30D-YTaM&Q~b_7Ye>NYosrL<4_PqEDyRGg zoBsd^&5=e@02Q!h8@4IMJ#+j=<*W8_>}l;0i~j%!&5Fg6iN#kw8Pop&)&Mx|T`xhm zITY9VLYkKaYa%(0b^J4@6Og0wrniOkx8cxd{o3Cw0pqnQ?BjQO&Qwh$CXR7@DWL8)Tbqym=zQ=e|Ct|T?fq0WBw4W zE!!Xg{OPjzGfr`g4lAX}U$|-6C6^}^P@uXJ=OdDT2wO6$t~S$8f-GbKrcRwJvLr^? z#XVhEXSHb>3#j8z;(y@^)7DRr0iV51J_xb<=NM}39#v-Ik|IY9-mB`-6O%Zf_(HVu z6|gw%N&f%{MUf+%FK%nMm=L)<9@PwG!iDTA9Ri~^axdU(84&UU{{VD<4O54~7MUb; z_pb4|8649A*uUNek7W?&vBFQ_TV&c}T;uOhJOvXKbxo$b=vaZ)tgNK3Jq1_Q(Ok^) z*6<~njfwmIf~rU0J9!m%4wdNpS%>>H;OYk2nA45*Bib{~zu{fPWII3oRHwjk`CAGG zWba;!=j>ghkwRQb!>`L#8Zo)2J3Pz&5EVm$I@FPTI1d|4=Lg*X07~@5o>$s`xl@U7 z8Az#Eb@qkM&m@0`Xo|S`zux}!FZ?U0O0ix~Ge$!>M6%7;N0%dZ3%(<-z0=f!o@>!Q>JZ7^b|A7PI=e z{ic>YEB+8Gh}FEZLjM4@Q73?Ill|RR=wS_{4l}(8jey4RAI=hzOFRS36sJTBAl*PtN#GP4|Gd5(hYn5)Nj0j ze+p59BYcD9_M#YYa&|s@Uj<&q*yfSEEpr@9?egtzzP0p0P)=DvTBz{E?Sh{#(wDFl zW_S(1hA$jougy$f30^xk<=WrvSG~h)8apsfDWV9_=N~uwwJwlI@YsAIeHwu4xHU%p z624!XZ(8?eNe^$9n5dh-c(g*1S{@Ld5xo*_exA!#zu^+SRti^bd%6LRV^&|KI|@Sl zfmMF(ONEP!&jXXfm#T&K;IHu2bK$K>BQh^a`U*9SGZ#Q=5|F6*kbl5wDD))osQfd3 z8n?@m-|W<1@Qq!$*hU=te|Ej`23HEJwZGY^mKft*?5e~4+PTv~(E07WFR8~OuTk`) z{t?Y#m7iw|Uqvi&NO$ZXl`>B&8(1hGO4He{IPL+g}*BL zG{XiI1RPXeMY>CujcK|hxt~3MWZ$7-<+f@#^i4sTn+Fy2RCd;+v2NJQJADhZ9HigY`$Pa&tqRk{{Uy%ZYs&SDbZuU4?^JPkUrCLK z@|XL^-k-3Lb00UPcPQM%aA}JT(mNN3s*3tg{t^8$J9;ix4#joQ@K*azo3MdMZSD&*6*#Yb ze+_Bn06;Rm=!3(SG5oS3oYr!}$j!{~5eus{iAW=uFU+RB^!Q@LzUYS4sawL<6Aicm zoM^D;K5j!Qmh%QF%C2Q%r)_-?KY_I6jYdX(l?m`|jC);J1~k2djUwMuz@yBM@}88! z%*STh_r&mao{|>YHlDv#9ZP|S;}ohh_r7MYZf^$KHq4Gk zdKbY~tuqt>NB3zsu(~`xcaeVR`9)V#D?0xG3X1o3@SUJc9B1iOM}#d22vlLI#*~8k z9xU#_=e;9M(Mis0-7dTlW~!nj$USP9@EyNZBaYNYEH7kumzYbcZKzgFhkt7J@!+T! zHbAG%;F}^81{)8xOd`QE#9Cn?%sHne(!{uLm5qBJ{2;dRjj<8MR+qt%gN>V*Qk5sr zE_ndElO<352B8-&h^%?9VgCSxMkWE3bGEBDf}@?X6b-dptam(|UXi%U*;7t}=t_qj z1$vn9A~(pR^QjxaF^3xl&7jMJg;RnqXFpXp6Oqz*{qR^f;s zF40gm#M3rP^sc?UBPLm+>s6xgecBzs<-HrFRiqJUO>yO#!Y zYkTwIzwzpGT_;-GPYFy{6RT&pr7XS@m1D;3zMOTY<6<3-cu$tx2jfkWd~$mF*Fg`3 z?>2IIsK4PDx)Hom4C1CR&_)v7WMe!fM7P>zP4m;` zLFrn_;j6RBI3u+qcz*GDjz5~FQ74fYM(bg~&%H(Vwd`jz8V0 zbe}DXE4;;3eX2LOV1QMzqh7NJSqLNfRB~unBc68EMQBtCCgD`>`=`Ak-7m~!P1S7Z zmv0{Y{%ed=;?OS$M%zoYfZEp;}P=PYcEbS zNgsx<$i{F_^Qv%m3+QLH)MT(ydc%5l#EW zWw=Dos?wW)Q+5SPnmyX*&HKmFh0<=rZ7YTBYQ3C^(5WQfyV9^-kW0OSgY5er$VFgk&c9S^v=Y z!rA<4)L3turBsOrR^(Km;cy#@{4xz6p}LHid5Sj!OEF-?WK~rRtO5QicoG5aMYRhOZvlo6BChV-yqc&K5syllM=Or>#MyCnG7Y?9 zq+gSis6brf6sW&21FF)JB|fE;c8u}PY2lrIUbPlPYk}6E7f{W`O~Dodup4_*u*}CF z!%@k*>IFPVsMrFC?p4PJai5ntsiWi_{8cdAp4qDi4+T#&Jp|W6bW*#!3YAGtJ5+m4 zeshWeAYdE{K#5fU0C>{JA>my7w504|{n`}#{Qm$IF&7CPb4wo}lfe~G$FcU0nQGFg zkEh-=0V}XSIPFr~K2+r3aaBL>q`?ZnyKVHT6_^}##RKGGam5H!jJI0n8rMMx$=-U? z)p9aAnnhFTx`51$&)uhBBP+16J?UWva&kUee2Uw%+M56<#Ez7kD*6_3IHVhk@IG2! zymBcr!<=Ij;!6;WJ~Pb?ou9llBJ;SO)lKAfd}AVu4l?LjD5aJ_e(ebPf18Sh$iky= z4Nv7T3Qu}0H)3It&NvjYmSK@lv1Q|^rAG<=%@IXJw-jI&1n_A#ZDlIhq=iBGk9w7c z4o_-K%_}jHw$qbHqXCXGDGK1I6!{p!akp@-At13958XdDHh;YX%#GQmB}AUsI7;|`Bt8pEuTur zMVOVj%|^!sz@+CEwc+;AT* z<|7|kh;9iHXA8Icv?wmap0wc-N4vP8fyQI1p5U0^S~0Y+!K7B%N&;hZD^zTt^rX=0 zY&jFBzLMsS}>a80|5{pF~z95HT{cGOMSo+G<= z_j}V$GBZ)DY)@)-NKU;eG%j_}UCiI^(?Hw+>56JIbTr~N{KtyY5gbM`kl#6_K){S0 zv`C^t8yi}Xrp`u179UZ`obudKvHQ3OZAA*5rbb=`NV}NlJX4b*S~6$Ga6VdRL7(BM z!3_Ier2Daqaa9f2M_~r+Q=L?tRdtP*2CN1f`5R4AOeEFFQFb!-rzi{BmG>$8w1Wt| zn#rNdMmr6I=~AdG)aI+~ldkS6!Z7>Y7OEtn7D2VJwHZ zRZE=qr>6acw`zCGvz6P5wID;Wo?4N6?deD&Du3CaVn4n2Xt?Yq!bVBO0U1?E`?TJR z^7Lw$5ZO+`lw?ha9UJc<`9(Y^VV3)%qXp1obv(1GvX#w4mBQqTpp1b@9^dh%A!Et; zR8-3vpPLvprOIRq$Ob8P;PKL;1;e&QTEWIZsuCh#bN6X5c9rRxSa$)eTJvYCVz!#%EO;pRU3xx;+cY{(u$8#Q@b1( z0iLxQ^!n2R<2mh5AOXPOQ3)B!BR+lKFCwKXRsMQpc_VP9GdsV{o-0VZl>)#68&5c< zgiK)5RfaaGX@|%CJMuY1np+v(lO6{MaWx^rE!{hc66q(xvF9 zZxqO*D%-kJw=!V#rzu<{?jo);p7f`M`MOl6Bw$nuS=VkVTPB=Gs2I&RCYnZDZ{6Eb zxfxY7TG1)32jP`6Iiw+(vedvBjyhAz6csQgVh@z&r7k*ms2I2zQI(`jb$X`Bj7K0O z$4W@JW7#ka7s^SI)`yW5!b~e+oWs53M(% zZ9Ixq^4V0aQk0l-lN{%-6v8;hC{;UiN-(dA1mkfrwBS@yHqg6|G_2Smk7^jJa#xzA z%M#kuYi%Pc+5V;%^RrB*Mdi&CXNhyvhXRtVu?`1hX zMIe3Lj+8II%qgge`%#^#gT`sVhT{}QE1{IGDBFxU=};>ue7D`J1&7KIaC+1m z0OFbyE;zFtp!A@IA4+K$iAO_CR{1`($I3X6IW*N_x8*$0H=z5p#Zq}IiVIwXh}jsY z?&lPtFx#=fq+Ui!^GV;K9)ouux_SzCA--;u*$bpR*w7`s=Y-yP&P6AG}0ZBDQ_z|sJ`n{NNwEw)UF9R z?Lb)*76CFj6o}-E^r+V(f!>ixeld(vu#^z&@w%I}WeQ({4n-m4{J(ac4#3AfDUQpa z<{)&WM#nysI9#(DgSQotC6kXefZ$S<+JTei6tp7n zVi*1DuCMavH2vy>C!E%Vq=&1O`~4|Q`;O9jQVg>EwH#`saZ==wak4CKNf(9b){rnn z&MFPPangVoC^+JtjC_fX4tttHdD;gR7e9WUtVr}~%5?5UoJpad3P#$Aw=?sFqBSS) z{pw_BTLMlNl{k&;SWZ`KcBFE|B`v~=W?9DCXk0j^JO2RBI;Rmw$g;pjFr3p{ zCN&0CuGf@+xlPslgQqA-KTF6q0#tRk~FB$>F%gK*I%# z3@s6YK;~9)CgHRAYGETB0zUO9KPv3&Kt}Tzvr}jzA`_UKb9bak-*4{$BCI@W!0xC8 zy5Vt}aYmOUg^RXWaaWc^Qn;$f84loTXF$XNF-I>#AUTT3fa4VcuFiW3kyiw6rB9R; zZfPqaI0!^;2ekkMUJgYIu&Cp$E2jli(?y{cJgYmm$yLN5h8mt&s9)~Ul6Vxx0lcA( znWfwS-`1m5UX4fxmOfFq-~s^9MdhyD>oiEN2rSjvG+E4o%FaZ;=N-RY|N$>~Cfn8^NCVEt)r zP{P^Y{_QZZR?kvuTy0)OLt2_ZT<BVO(yYyyYCu>h5#Ua+CUW)Z~3uF#RMNhL(;0dBOZ9GOUNzM zR7k2MX2)8X!XeJak&oTy{{Yufgp&mvZrx8(cQN#*$jraIJmQaLiuQGIU+DcQ;EOfR`Alu;6u%DGs}Q=?}4rlXVsyN3pmpLWIvZYxN|5?GmjT#hQFQcb^Z z+L2pvuRkIPCVk7pmlOV}bglOl-( ze=B^oIaG;2LGv1?=RBWya4G&{D9`ZIbP7y~)dOzX(vcizbe$TPEKV_zL50C291hh} zq-S{%5Mww*8%;G(1l&-3)hdz6mX=aUQT#PN$rX7NStCaCHg&1h6t3b2H3P_3;Zt^d3seT;zsJZTDKa$TRm2o zs_dB~IH4d~q9~wP)mLpYMTx#bxT(>Z7t~W^RS3q2#H6fJiZzY)fmT}DBmTKJ3Tk|# zrgu^R3HiI#LYS^JECc;oXB6oha(Q^j1Eoekb{G+wH}@l&J&F*>(l03QjBh^Fz>sai zB9bY`emc}aatS{v{`DTn31o^17aIl$^s0?&fqbDITtOUh44#z(Fjj0fGgs_@r-h7c z5%ct=2^5N|V^S&Mf&oo*kS-A6%^uEO1vw%aEFju(9x9Ss#RKCXPAf}$2)4Hvs=<+? z5eZli?vs)aTv^A#E> znoqmJ)RNj*l^$Y(7Lk+|4nGPWvGIapbo(U6^AaW9wAnK5ul0+oCSqaZbc&p>~dYQaj}ac_Xbe zJIEws6&70}Q`D}}N57RHl`vYOD>lKOdb7EA4mhEmmv?nMRVd$K^Xh;9(f6g4M&OP> zsiJMo(}Pu0ZaEk=JPgHmZQI+L{5#!0K_^gGA^Hjtx-#?>q(_XCoKnWw`Fduro;wcY z-fsP^(w?%7_{U0*W!?Vsq-lc zmG4ob?ij`~OCdPsqAW?0m-%vgRIw;=xUs5nZq5j+eo%=6;{}dCDr1Qt3JyV~SxUZh z#YTX;@_N(q#AFYq`?7-1AZAX~Fra;26&w)H0eZpOk^Nq6B9HwI=4p zD((X`MOcX>SlY2D=ZchLcoCnyRhI-{@G3?e zt1c>doTz3erAFMh%ThvxjvMaQG7}YKIl<^^P|Szt9cd+2{1%+p$o?!)tPfG~7cKMD z#hJcy(yFP#oKxc^3Wgk3nuUoYVn)I8im=2fz^Y@0!02jlHk?v%xLAD(N}f7XSMO}6 z@=3tyRH0xHgV(61#(Bx6s2~hdat>)mAdxaDC(P|j-xV4-z}eocF$d-CN~Yw-HW(Wq zDD6l$MtP?sLmQr#C?Ad3tBW;?B!mQ)FY^OZ$O@gsa4Mn}^D~Yrc5>hY$Q7KFSgm2{ zxq5M$K^Z`DX@_xakKw0+c_y=*Nw|e_52YA53rM{6=}J@%GewEHB4s{NPfwLe$6AY$ zFi%Q$Kvl;zDGk_sZUD_JgC8*dDvufYO+06(T6PPS*lqy*-L)#a5Cea}YC_)JW};xj z9m4jd61ho8+yQR%EO;spD^g$rxfLclW4Br^J0UmW_&Ci-Nf^si1yr7T)7Pd&QJux# zu;&ys%brCj2fZMNX(p-$k+)H)$KM!Qw9T9lIH*q719ufJ3hUtxQI(0+&Rr_0%Vv1%2_(oQ*=0!?+R!KCwB&((lBkTF-kt@ z;K@$s3PmB$SNpW3pJIXcMF|^4&)%ZKv~`B*X#X!9oyd*K3t|nUTV-VmR@nhPp&|y&x+X`FvaOi^f!^u6`k^O4Y*#Q?*o3369KRZ<+_wU z6M;s<*YIgR+a7~D|<+F#akN{`*-Y^A*%5F zs(1O-wz;(t!)dYP1KKPsU@sy|KUSkRFQ&@9M&`;sgMnec^V0WTOzcd0cbyzKaet(- z{+{N{`~Su-PJZ>=4pYTL--lSNEfzDrn0WaJ%AgloH%5_R#a;EC;k+5CgvZmr4}DlQ>MD8-c!P1i(jU&=d0SG4F5l$9U|dz&>LBi z2|j@|moul=9^s1aNQ5r(3hLM3LoGYg*qG5Ir%M_JJVSxc7Qf2Riz5C@?SY|UKHP!C zJ`({(<)gf_SML`7t30N9jXLfL_HpwXlc5_4#km_@Bb-0fLmH(TbQV(D7r;0>Y-M+a z2>Ny)#mh%zslKC{CXbS~%eJFEMWU+0@jX(mK7~EX!f#I{JW0de#+W+(pjvjvb}o?`l+RZ znTJ0G(m+)&!iFvFe_(L%ee97qgR5!zSBP8lSHBLl2Zhs^7x~FzJI{wyjoPaIZhu+{ zIG*L*cHpS_;rFCYOBnhOrTvbL|0Y>R_OGo*kuR@J$6O_?r)XCnF!;vVuRh*dS%jC1~HjKYjUA^p$F?op@xG1ve#!cQ=)oz3e40%#eYHK zL*mWy4CTfSoQ=|s^7DY)FCVX@`4&N?^ol>5=J}`xVX3Bbuxa=F>|PEPoBBxa&cClz zID`eqI=@V-O3D3sX<^)^EJ=Qst=5o{Hpdm=N9H`bm7&=qv=u_8#Aav2 zn&G~k;ynz)CyOELv5<5K#9@)=6yr&h!tGP$X->3Sf|Kk$RInwYu1kcuih~_O?ey6;)5B0J+pgvX3v&(FJxY;(Ca~QTZ$?b~rl`AbH^G4^L&VgQ zo##Zsp=fJDev|*6%r2=Z8s3TY$kC&#mnQLe(D7K6Sb^MTw47TrV2*VzLti`3oixl2 zIq|Q1oT*y|PqwP-E54;|#lv?Z<}%gyiAsqHJf{`W?rw9V`crSsd&0(cI>n#= zQ;i*oSsxTn<>ihcw(Tfw06%ku&(Fyzf1VR^-5e|K*gS_6p>stz0$5ct#tItUY**z} z_3f?eI|b^qjrFEz#0#aJthZRH!O{kqy$^5D86o8-$A34dXq2Km(XZAmA%#l4J@TSV zK{;lF%lP!}mxaqx>F75K_ZB6Hz=3x|F24R35|V_mvjL;#EuR1UK32?}#}q z*stn+p`>{a<`3L~xar?x+SMkq+dKo0&8~?v{^#CIyLW0zilUo$27zlM*tSmdFx{g- zc%yy2p78?@pSf`Y2$xtnt%%h7B}?=2*dI3CsR`VJmsPNWnVAnoVoa{dnMyqBf1j(s zPU|#ylODQmblAI7&PoEf?P_gt{zdqCiEleshRQNd%~sN3jstk@%HAhWA1`|nnpct$ zvGr$?sA9)uCys9*=Kn0L5_abmFIOUu7gZs#rE8D_45;Kv?{Ho3VafpzR|0d$XUAFn zhNq^&rYv%#6l^?gpscg_`+BlC6Ixk(lDTWF4*NBYUjFMN9a4MtuwWMbrco zd_6bB034HdCc%E?#{idt~XN@!u&xA2WN&9qKK`_YcZTLV!&<2 zk9I^OveeO0I;O zRb{72FHdk%8KcZ1(K+lOjEaX2#~4f6{9!o#>(+d8?N?R%(gobf3Sf@!9kG}HmeHWm z9dVAtpI!Fr30abu)8F|OipAw`hUYM*DNYEj>nk2iwN-cJytq)tu~-YC_=!|xi-oEV z*Q<6rjvS+y;j7SzYW6RY4rbNrVEby4zK%Z9^4Yniq-;MK!34*^`^4UE^8^MpJG|@~ zE7+DGz?1QSQ#kR><+QJ>@)uP`%;i*%$2*Af+}(Z${Kftqu*67^!!<^#pWbM>LDIHr3YS}xc(+8EVy(}QNQ&e z=G_;hx!&7)g?g5#>IluQZ&vNgZqv5JbuB-&ui8yMq3`b&FKC@4e@EyjDBPRd;$=ZT z=~FRN{DlDDgB#hAEk7nIZiM-rAG7cS7xR-H%X2NG?GQY|x6saG4NjjuUCQs%561tj zd{+q@N_>^qX_XR?+gS3xToIwH!!>g2wJeOxoaI2ae(~7q(p+6O-G_&%kU{D9y&xZ& zuNIM*3;O(aVp-MwkG~xi8Cb!%nfOVpj_Rb@$S!h@RYcE!Gp?D{!{i%K|afms`50rvX85h#={a@f)iiWGY59L?Wu8l4`8lh0Si z#BB~22ONaym`$2_+;AUMqn>Yj_)!!{X5(*xE)rBBlo)cx({o)yltLjyJ(0}`9;-KJ6QAAPNtB=%B51AbibH=3n zrFT=U3wAoE2qmorv$FY30@#8%jt%6+2bZ(No`;m)@Q4l!v&3aZExu+I_FBNRo2$}_ zQ=m2B68eL$f&-YTXb|Hb{ZmQlBV5_TZ=Hc#eCbryp{R?ho-TbQr*9Wpb-8JamUp{p z(l^f!F0LgcQW0XgYrs4YH)%_CIm}rDcfDc@$wJ=8pMlTbt>S0KC_9(hUXNk^IoN&W zKoAI*<8xbS2d~Fzxg$$8>GBf2;A-T71CqI*N?94PCh_8QV8KLglTq#qLaNTm+-KGy zxmLd3?^9_5pI9XYujptc_lv52x-Wm}1C{`1C=VG`_ykXr`{~TjVgshm8LxA;5?jQgXx>@`6Oa=9$>ZYw`^MrB#Ienc z#T=}#*6B_9gqt}k@<`cH+d1=-f4x)f3pe_N5is%lCI~dGd)+l%x`Hz3_4DMf0?wFq zxW>z&f5J8P0yVq zt2m)J*Kjm^x!eDSw|%Zw(cZJv5H`-q>%?74ES6Wb@OXl@nr%4|W(>kBiH`I)GgF0fd=*h=q+)3K8?c zRupS&|9+Vj6MQVTADutkOtm0&;`RdbQW?_RGIe+ zNwsPR`Cgk^kNfTxAOBQ$pIm8aAOknJZ;v<&smTX{y=b9%u#A|`a}{3tdBAR4oS>*A z6H0ojRzk73pp`%#{)}tC7ASNu zIraHL8P^MX1X+RVk`7Jr+u`StYjVvQ+9QVqK_7I?bv?i)^0)6#m8SmsSq?Lt|1%MB zq&%W4^g=6pl;JPxGV|3y)F`kv*qu73O=UdOD;*ixg#kzG9NxZa6V=q6f|9SovCO1h5Q!B+^nJ&dAA zRvs+#S6S)-&X`K3Zk6V8T^VbUr*OwDIb+99f){?1Uj`xGKRl7VFrfhxU@t{-#=HRof5%Kwwm|Qz<_f{_ zHrM|nWIceydiYK8hsZ&>#%So)W5u0xcv>emw((j(dJqp#riiu^bZL+0MU&MF|J^o> zvdyR}6vxDiSAN!2%kZ?zJfX?X8!l&dz;#Xh3Dz7bg9I23Lzdp@(NgRL? z@2?-s);=J_x8VM9m=@YdPww%O9yp*6{gz5Dn;89|{9hxirv4zdkgWM?$EcZ#ObecisPt*PyefQl1sKSTT}oszr&BU!(hdng$SGC;dY*Zx9b2 zs>}r$dN}v&86qWJxp#!N!@v?HSpzhS4OOx)3@tJa#B^i6GXr+mgChVC{hx(LJUidx+> zzh;J08j3j);A3HT8xG_)pX_?_qaGf|U)m1+*J)%rdh)Bn#-9a#_ufY1DE;WOvmAb$ zl1^cm$a&iW@?MM+wBCg8)hKEte9o0?m2_3ktNfTiYD|@W&}dv!5_Ul6NT-v@ZpIGf zUDVEPudV79slHA3^1SRfn;WAvLxY~*_qm5`NXCTsXA_y!Cl6vw5Y-rG`h&xaeOhrU zwGDYOZ=cl@9A>l@@wd6a)YEsHc!%+ZodMZi0R1Rr@!XHSdW${w<2P2k z_obx~?`Ik0i7R~3NGN*TfnIjX=vG4oxW%Zz%EXV+7_{~YSGU`T+^8IL^;1Zykr&+< zG4oUD@cJF?+;AY1oT%t9r-Z1g3sfp)Z*leY3pV~EYDvp0_nU+N2Y~II^D`_R(GRis zob;ti2e_Ub(_&Klh7*~xLi|7Fh~j1 z-!f5Txqm7l!FykT%bY~02n}0$7Qe?kXlnq`VH@@Pe$D9V3jt99+77nEiPNU;`ImLf zRpF}}vV>_XQB#-AFc@Q_~=ainRXY)&C{N0wT%g>mu7w-JvBNLhU zfUuxHBNLgb80wUnbz+9!4lXpsV>0s>_jC(R$o$WHA7afkS2Wh*=0WH2U}u`NnK{!G zU2AOKQ&vnao0C~u(0IuuW;$N!zT^HZh-%E%wt%n}sFEx$szf9(#uQhu_p^@FXEJ|P z91Ar$TW$?c(>!|DdsbZ;+pem_loPz>nwdml;y4C zAZ{K&&mOfpcTC4(Xz^T{hp*1s@aD(+C*RD|xdu}*ezBLRiIIC}wyPlSYSljQMSiY@ zg7a?I-5xldE0MX3P1js%KtJ?7p!~{K!9CZ?PR=;x?#?V*>T?>&uG7d(&@D#k8;>ed zJZmB!5cg5}XYH{7`KfAq@Au`fbuVv@Wk_jGf0v=1FE66V4So^2W%mcEq`phqaC08c z&u+io?#H4YmM@-VkL&ARtORM^>aDg^35}Ef#oly8&g8u%VJu}C^s(s;?{8aTU!dRP zsTe|~O2}?{15(_}pLQ(wLa=mDhhC+A9WM-lh62+>fqRzl>U*fNSyX*o)y<4$_OSSg zN7Pc6lHQKc!)X#*d;_$IxoyQI?o)>QY=RYG{BvSBVILjDRr8uPMob+!<>^robG1Te zqep@>rtiEl0^?xN{O=X$%AuLgL$RChx=2Q8Pl5^}hIT4=u718@*@t(HS8uIb3B1c4^WtdGORk$ zsnOPC9`j9m7bVno(*zTEPE`(ok~dSH`TCkCF;%Pps*l7 zj=@AzMHCt;*&}6rsnRYUK5}_i@YQ|(S6N~oZ6@3t_Iv8j2yQCc3fl3H(RQ|3;6WNj ztgTXuq#0u{LF+VQ#!&Y4fic$JEzBI$`@9(U?%C8bxrzqy#gL~z+PS{^5+hK#7Q9}8 zZp<#277^GN9b~=54_gzqVqWAQy=w!wm9RfEchtdxQ^H4p8o>DPf9uDTq0AAuooHFR z{<<2>TAn3!>M>ZG-;Aw+gYrEZo;R+qLdXd)LyvSNCjoPdEg<@JTIL+N5 zM^k*TzT1KVy3{w=L@SyPd~tEMV(|N~`=<3lBu5jC;%GT!Vg-jXFHZA>fmogqXKiDS zk!}QrjYUtMP(s*sDh$zvToXf?jOe%O2_&@rn4Z^kt3W71Br}9C(h#8{sNX!xapKOc z+5^(967XA8Ye->}m3rY`$k4O_Zf@xyDW%gmTgZ_#M!+G3Yn4&ekMF%kK6#9W%3gw| zT~W6lxxDV-x9#?FFMPXd10+>+2c|2si3PW)2`)lURknykZ%_4*cj|;)p&4A=6$b#M z^y?QVEklz{_u?J#L8kqN;LnXY@;HmTEy>H+q=5KHF;3yb1F#tBeoTk@m?6ATydnh6 zJLfL_K?`G`21sz-Nmehc%pNy8@GZAQ)}ad^Ag|h?tFABEReQ+J-oM~*`#L4KX^v|Q zurF-VYUZc5H2*<%AKStFf|jSuwPO0yx@U{rRI9M}&bEo8yAa)O80fut?|}%-h{%1M z!k@bT13X96IIMQ+YtF}2R)p-pnt{oPxd_0VnOGB$38sYJtu{fh#>PERkz3GjV*juR zlb3ZE7f5;Jya6kzj#aEsp5gJMe@|vx)L2|yt%VI8V=*&gpH$z%u=xMd#tbu!Sx~?N z5)`~M2P4Uu4hNQYzrI{;GfNy1%-h-b1X=u5xqJ5&VwE7Nqbw*~o!_ciLp|KPIl*DP zJmt>Y|5ssX_@R=c@CUK3=;!{UchZJNqr7Gi(Z_(exAkjg*{)wf&=#lU56hk)HBV&f z+ciYPqNj!3t+-W>mDeP)Nn?MvK*=&JXVicAOZJ^}z-9bl+$!&ZtjQb;%m&1Z=jjY~ zmqG5clB4>~9)6AQ{$lO($>G42P~bWd{`g~jr@qc7*14#zE5sqGDuPUxJ9n@*ezu@U zdDZj(_Z!N?H1&sm)Y*ILHoth7ba8o|1_M$a2jO!2n|y2B`Kp!}`v#pTSm2M38IkZ% za~*i{&weu|2OSWBo@=C%nBtP+F}c-N(?g8wb>T~_VgvZFmG=#(r2L1#QbCsd7^XZc%a)bbIu?iFF{raG#C70AIDoO!@Z1ZMDvYgYZ5?PmXh|I3Vv zj^}CQxeJFm;{$F~f`359h4Pu>c&Ma5`~F|(HwiBx zS|i&G)n+H?D<99ANgxNwRkupos60x~oiSLdwOyN&>-52N1h@E9hJ~hDlaH6=Jrkc9 zJ4^2#bR@a=HCJ5+Wv%+&@VFB*Z|?BsY1l|bh^j^cH)zj=LFlu?6AIVIE{kWE#~H79 zeJrIlLc3td{U!HI;Mnt(oWggy3=@RKUSm0Mv$8GtkWZ&-d;7YF<{aw|-(ysQy=so~ zkXqY3p@wp=f4r3E6+QX5ekKh3+6zSvlzJ?gJcy(3M#pZFQBNg_b8=X2^f5YD8DyjD z>p;`^L6q{H`HrY6-}zleJgQ3H9UVEy{dL2~Nn|R=wXGRYtLQrpN{2V#Sl3e0 zPZiW1o6==(P-{tcihAsoDL6*zMPS;n*{@ins(Lm<~a**LKgyV7()73 zKDNd)BeAWh?D~|q72Q)sSlFJ}Ph6dQ_gdw^a@)ir(28I<67AReL_zX^ytB z)Qa`H(07Hn+CKQP(`9E+f8oJ9#bFJmT1P9m53>8iBfC*t9``VAZCpy>$}nT-aE;-g z*-uxXALgY?fUI-k_+mGx(pksmmxb)y8AoW7@`cZp#L4l;-Q{ko$0^ZDP3u0<^NMbl z&P0-5Tn;WtS~X92w&to%EtplJPQOtl_nX2fW!xC#S@gVL9~ z1%ybXAJ>8sT@t$K9o>A|CKFG^s9o2G<}HPrz0cbeQN()NBh2AzJHlbs8}&53yqn3j zIdYo5`bHvs2AHdGd#mbg1sm07)|rT!K>xj@s?^?A-g(^vdDsSgE|eKryD1keT_=?O1LN%5I$WLSBm|NL1^@gJDWnJ41y$NZG7Y(r}M zCQkslelQTMpLh~uc>&E2(hdgUC?END2-DW4)%Ps;an(9IDMa~c(XJET9!TWtABw*} z_wqj4fX+c=i+02qCdbQ{g`WQ<$oD-w8|B@$Q>}xLMlTjSTkXU{Gq6DIn!=y*Ep2Gf zR@H_dEy@+4g`rwr3Vq6zaQ~|JQK^Mg(&m|bm1-L!W(&ThZ%cS5=TG!9Zmm|_qog~N z)5T_1ez#JB@{^~QuEUp#pA1qVBx~gma1% zBxuXT1=R)kXyk9SaF2VfjB;xxok3mGXL;x1TTyra(OF~B9M6k&MRzn{2FRQ3{5l&` z!i@FWh2HCH=vwS%=CsGz)30(UxV3dA*(LoTcIJJfQ_*eV|3*iG zUdTiN5Ofc>i;{D>oJ$xTSi&vU;IPq_A;|& zF8TsA-^G%a)=89}dKL!ARFm{L^U?m)n6!fu`M=RBuEub>OP+Q&Ic@ys1H|S&&fRK> zEV{`Qqb{2bWZAh#B&ab0?k*btEeh=FAKh)G;@M&?W%p0yEL@*NI(|XA_7H4TvOs$p zxppy3Xxz&2y4weUfGwzwNsrLcJ>?$PSPDc(LtV53{e-6qb#&BY2bEOR#?dn))8HUZ zQDWI_ZAjaB#+6lp!YI#Ia6jLYE(nzcHF#!7`!_c|>N6k=#N02_s@w?`B_LVX>qMkx z&ZY`2euCoLsz&$!zq7R0ea`HsY+>7r%F9>qBC-Fl4H)eohYlhWk=hi&0&CGF zj58Y0uG6ArOTcjO6_LV;zfT~A+yx^>*<#L z+Z3T4pdVX)GrNb9gui_x=f24BgSvkQ&DIByprCChEA>H-ZSbAL1CP0nLNX?>jQs2 zp=a-C#KF&2UVrjTdVr#)s{6OFCbM|JFAev>S5=fP#Hl29RU};@9Xl!3?WSP?q0Gr` z-x5#Dj3iVwSuHhqX3^d%h^8b&lQDE&^1C?>V%+A5aDn#>X{!D|fT$dlpRuD{??8)} z=Bw(rO1OCs9L>3>Fx_IV@@;ur05FJo&`EZZyJa9Q8^@Qn_wlXtevwO=DYTI{C%8I4 zu3mt+^)s%ZjoM~L==<#pOP!t_&Af{Vcqg9fu1V&?V<$@Y85}h_l+%5A!4rPnDnqq# z9mF+c-%G%PSF3h~ep5#?tLLW@>TYx=WfOaDi=sYjV)YN9ShtO8Eb{UV&G!pIL;lIc z*F{Bc8u1Mna7}g>(lM7_@Vwd%BsX4X_{hk+x4-4y9dql;%x~64=A%yy{w|ngYSUWa zBPk#6#*vQIM>=0TO0PJ+AN|8S%KIb)tlH}OlUL`l)T*g_$-J_tyH5M(R4XVT{$SN1 zK|S(w0Q-#NwjXrOCqr(-WVH;TDYZ(F>vIlW8|_YiviY97tKFi)e|yLcM_JN`E=Yz= zdij#iiu1sWBz_F^^W|l{lmBBNBM4OW1<~uo-s&f7?@gXPenY+Rp9yY6w@@RYLiuQh z61Fh%;bEH`#I&1s!D4Wy?X$KfC~G_FB&x|9+Xt|MLD9M**;;na$V<_P>QWOIT2~hJ z(fMK}F?Qtqu}LNODF&Warf9(_{8Nqr#vt&jcq;Wt4)t=F|9s#oY2Yj7M%v>jPN8<@ zoy9MR^@e+zW4B7At7A?)L)z{aqn`S(N+{sqsZn}L=0OJ@uX;s%u+m`!=?Da}Y=D*E z;yZ%M%oCAs?e&wYr4*vLH3acS-1^;H+VhBr*SjB9NMRbS!)3$+c@rFdwAGAC)0Z2` zj579rBgJmF3LYhpCt<_{vRwX5PLa$eNV6H%R_UXY<~3O#1a_Ui7ZB|z0XC5~)6P$d zDjed|7hwWFI*NnnH1k1cVLH*(99WWB8?&~#iGO#pdDUk>BMkKr#FfO*(}pYC^f?9! zDfyBfwWEW%;eFDR7|2=zNv9{|beUkxImiB|WmRh_%mKu3U11QLG}cA{x>05UosK8{ z3G$(-2JOo%Vq7Sb&{8;0e)iu!Z>kw*nsUIFQ6xQpUBOwTbyqij&<(bg$DNa9&T*BO z7_`tvRhox%*D+uYLdNQK4nnLQiFl`vHoNy4`1o3jdkY&JvN4@N>aO=a zl?BH{;cQOvkaSNOM+#vAiZaj#GQ3mbT#`k)w@?;C!|~(1hgn}O zGo$FgYPC~Zq9oBhc1ZK3d}QF-7j&gZcn-?FLK)K$|9iUAM&jj6w4^EBKj$^a9hj1G zyq-)b(G4#*OI9dY!AT`;<6QMMP|MCP9kj0%8s>V_J^e0$b;9qXC2d`l4V8_rX1DIr zw*=tx_6;yi^~=!NKi&7eCGj7XOh>^^u#JfMoEIcNZGJ)XK0s>#yLOb$J0rS&#RsM= z`^iWe6J!7vq3M8VYlcV4NP~7QiD~Q+Xya#3|Gt7nS?Oim9B`3mngdEW7sk2FOHM-do0%So zs$ZN*VV#QsHF)^ER!vQfPEg6!lV7(cRM`GU5b78WKPVJS2C#1FIi|G#gvI_9-74S={>V~-oEPZL^Z|J_vOkW19$Tbd$Ga_Xf~;uEi77E-~oCsFWzfD!3<&9 zlUBU+fZcYe;bK@pvgxscoP?32MZk)?_JZMc$B(8HmGJFKSt}A28k;l94UvS?+-y{V zEHPmKFt_i4r_KpIm$FCwUTtlIBrhGSEhUIQ{1SA+nol{_(#0i^L#6fl17;6O_fows8kWng~OCIIn88PCE|g zIp}fn?FT1Ixa!iNW z%|H-y#B_7-6@nS)w&sx3Cz|6N%Y>gh-l+-AL4d>me2qF`t|@yo-iAOC;}=eP{eD3X zUz`8Q4>MRH>7H#~d(v%Vz1@;0udg`P>R~$*hBJvEXy^RC zA>x{aiRXS9^1{fBC@;L4g*~)nX-X+ai_p&^_`M`Gz0BOfIeg>jn&z}uWoKX1oPGcJWQy>o;BzaDB z2n2qHJxfZKdK=2wFZSVOjR9&D`TibgiEa=nAXneJjSq11#+DTnOx&S=q~SW-D3i;g zCqasp6#vYMOng)Lk2A!&Cn18iB^LfA^pW@-J}%ULY{!-8;XPi20WTJdg>F^7cXCCm zRiGDnZCI1!+gyUfU_fy0GZTcDgEC*i)&Bn4D&zW}xty&<8~b%FM zis4}@3(j+dzZ(+KFc6m{w8LR$T?dPgaF3KcZaIQJwp&VFOZTuCrmE!_dVW7^7gpl^oA|l6hpicN-*=xML7QdDytx@xO!)f}|O zhGAmA@dxo>gfrSanSxVx%73w#UUS4aT&8~XoF-i#X1Ib=(gns*!JBN-SNS_t(``BN zyaUQ}d0r>e=b)p+e1&IumD6+#cWj^Q0iic{|7-4?>AY&6aDlEEj$ zjwi-qC!Ig%TO+ZMY9bI_S1!Z1t0ytnCiu5~U`p6SW>pi%|H~;HlY3U2eum>!q^T8W zB1(?+WZZd;v|`TW)NiJ2{xbJ*mg<>TxeF~wjy7Pr1{2tSH@Kk%O&6<5&rV%~ZSi($ zUg;r}#P)4d$9aXD%D!Ir?*MI{rYw6O0Ob+q4-+vHFCe3%B@B~10&2;u0&w^3vj?m% zRpMHXE#|6d^c+{Uu3%T6Yd&?W5Yk}hx^^Afv=!jI@oc>Lr$Fh1ve_8kD5;_HN&(S# z?}Lmk3e@x#izSo&^nIx&S`z=h!5|8fL}J}K6bFf2A*BsSqJHW3O)tkP_4ewM`@Kz?>YBBYBk4bGa!$>IpPAy>Xf%AI#aLL18(;{Y*oi)Ev1Z}#D75_i} zNM|c}j%VL27qfzL8?XM||KM^B#G2$Df`yMg^VkDDkeOVl>cW_AQs_xgM2}S37=)cd&F36xz@w+J~k#p(k)vqCq z-N&|h1x&GzWre$wAa6oB_XdY`^VObyWmvx%kf}a;VNQ(ZiFth@c}B#|$o2|k2B}0D zH%YMqTy~P%lqma)Qog@Bj5d3(dDt3kq8h8fNO1-ni@QIu&%!`UBmu#zl+^@Te5s1y zMzmdo#tU2Qn~Tfd$|hd%(0O09Fp!)S0MZ#ESP1iFX3J&rdiu@(dVz3E6jS^tBfVZ* zhb)^sYJIokyvy$n12ZmTZv>^_U@)e8hZ-D~_lp&QKIImWt|_ze6YBc%en7r_VO~zr zeq+2@RIEmym0Gp&2P^73?PixL@La8B^`p1Up=z14UnCuLHG_Vcn;d+ZjDg6x<*syh z+D-nO?c7w&+^%-jdh^Ze9?<~kUuS?jnDg6eo=Z&k52?F^_fsJb4#2rlJFcut7QzSW`lD^u7 zNcrFBuj9%An2RUNI3TXUX?AF>DX?fcr*Otm!zc-%yEZs<{9+~$#&w|NtP?aiF@hTnaZOUs%a``&p!Qr?|omkydluIgchcN%1#hL71RXXrb=55}DYaOV zuvZ?3chTKC*aZ@ywCSK$i6|YYv3}nBjK}XZKh~~J@R+MdEww8kZMz*Qq_w%V#QI^n z*d#W{ZJPfku7CqrCTzB-Rg)*ORO4$h)Oy@>A<4ulka+2od_ZDQjvFpuyR8m=-wNexkr0AlwiaBMK;4Cxr3`+CHdHd$GsnRoCv;P%ZSl3T=5n+ zeGF0k$dx5E$dyN;Ka0<-@eMJ1ljY5iW0#H=;mYQ8XGHicox(@MHTpW2NE#hPL8s(x z!e8hHJ=e6;y6ZdRjKaU=sTFh|X7o78L6nPBJh!%t0{lLGdXMgf5;M7h0t>|`h^*<|X z$RK0MW7%zDXKZev`C3z0yXEv}(IDtAnDR1%7Lazp{zL{a%@1dw3^ey-WPl!0{ijpU z-+wRux>?nYi%#t@d|&1T86jq#(I2in7tA4F|9mry++j320}in={K>a6grTR&z(U#I zMCinnI^ueg$81p`S}enZ8+$+(S6R@25i6@&(ku2qqDEOx7O@ezCyI+vpDsJ=gbypjfapGV*8j;nsi>O4yeIdxo4%* zD*Z}oT+PHb!==|m>AAUOUym?B+U8o^uG#A*)w+I%8$X(+g^?VpO`p=hX4pq@ab(niI$W^`2h*=x_ z@85M8A5cj&d1{dWjtFhhOsr3}JOPdi-@f>(AY`t=MpYznds=nLp$*eQ9z12Af5O+8kmFW{n z8|G)r{O+o~(vp5Y7xVo1?~K6nVc%;1q{-p^`A7NAP=KnD2HfyVtcp$S?T7tO-q`W>`h_d zh~EX6n&Fw4lj#!qF9?(Fi@6AImU!A$&7WaaY^XqAlXh%jZ&H%Xs@L1_MQGMx%$gzA z%_(=mxzPx>SKxhQny2^ehu6o`nH7bJ9ord(jcX%{E}%Tz*XWl0#aE(sBCyKV=z)(^ zZJwU)#v|gx&cOcx_7N3p$O?HRs6GB-R`GU7ae3YCWm3U&k~iuQos(Mq-}uchR_=2Q zXZ4Ps+(bpI@;aEW+Ok^^W5~;~(^hh-X_}EepHw-LCe|pIG*Y4Qkvz>m9O&cf% zOgpM#ftLybHdr4mp4n1TH*tr)u@g%ILFYPTnT+d-FG5*&7KBFwl(tRhb*{dElXCU` z#&h*kI#HHuvqd)Ye{4^w041ZjXbBf7g#=>I#bwv*!-ub4 z1B(SkQ)F}+z$VRRePuNs@0xvde|U84Z{yz(cWc1o($NRK5Qi7?3k^lf1$-OGp_&I_ z5Pe=#kiu`leHbbE_qqE6@TDnUJ=4!pXWH0CTEQGhL}I9t?7_NxDQ!Wx!dvESaa^hh%;uaMjUom;*>ogL zrHfw%)}j-uX-;=5BDku4I;{o|=jGITxS${*2_I65UH1sQ6eVY{Q5WbbB5nW^m?|V@ z!pO5naygWkJCIZN=dbNu+96Y=sS(N{*x7qc;mhRP<>%z4jPX<;zy$HhvAwcaBR7t> zA0}h8iggF^sQ4Bk7h@T2G@MFOhaJ(*t?NDmCt0X9g_5*CXTixm5qjOlQK~6(AJf%t z^jpRakiSdXonJ5$$1KMRC8ofN~mma6JLim8L#o{~r1STGN@3*Ks>ia5gC&7HGbW8WocIAw!=+u3-KzX@`HP%Xs*R+Y z6)%h(Mu-caDBO3CmAqH2d44vzX*Z%v1j(ZfDlb75q~KyXg_62438ZLwv;A{9qx)@B zwkq2u8PMJOywq=wUl9Ho@(aqzAdv|Q#YzH1UgBBo&X$0~6BF*RlU_!D2ReoX&oVN8$-=&$@fw ziz8GI0QMV#Bmxt@vt?e1HgyVzhU-YBHo->%B=#<78gKI~#&jWD!&qCQnrOSsKC-A1 zo5xTprAwMF4oKpZT1LhZH`CWAiqi|aMI`2lR{S*YR-qWfQ|8qZi8IMvl2$$`VO8HR zTUCmd{<=eauYx0}X~jWea~b;zEs8R5x+Xm~I6WxNj%|X_+%qJYNoI>`@>H39>9(8L z+6<%7oY!o--y?kj%ERv%HYN|mKS!e*3UQttmFtMl(zprGSydi_m8Bl@uv|pBZb1f_i)~# z>oj=Za1m;-0V{Hd=l}p`p!ZBd?c_lJilkZnT8WQsO7Y!XO-O^n*=eCBQLuA$`AuH5 zL)$WT->ut4*vWs)WM|Ii@t2rr-Q7yDxmJ~8H`>1- zK103dCVyoEV9YDq$bmv$T9N5y}vM2m~W)eQ)kUbUMOpM`)`K?So38JY@0- zSX&v>7}`0_xvXR;j)};Ah*k*ATg6E@9~2Q82sI^oxvNJ}YK8%k2Mxi|m*Jy~0}Io` zrKtd5Igh<0@mEPv2^B4ca+W&X(q4(^)@e9Q=U~oZA+kwRkNP`ZQ)@Rkh^c+eS>mOe zit)2gzwSK<_%DQo!B`JRy**4R4zoIS_iO7rw^@xYfNcnqGsy7yRX(_WKBq|aVe|p6drO>A zzgFa4KtKA4CW>qzOgJ|$mgA|j;Ao};H?X5LofB|{GdYFn3fX^<*ny#AkRoMSuYkLE z9F5#K39`d(Eo*a|WdKM5iF7%VQ@C2TTCOz(ku=aS=r{LY0yWsgRW18?xP&WtD_b`?|5w4u)rGEl%{CQ5$gMPJgSy}S>V|U-=|Io2i&EYc zoz5wO76-G*XL7#L1&)&&p^QAOYU%l3%UDn!&8gf*fCs8cnoC)M`OgvvtHR;pKLF^w zm8;PFh@%@}scIf#??fog`%?BIl ze1n5U8Ct$S&(rtHWpTC`eF+?j zgVoM093<2iz2btyMtEln8_bh}T){Fc4n}$7tH%hE)Jx%!xV&QF6glN*<+{)y06@}7E$K~>tyuML~lokFD0b4PD6zZ=WB13NP2 z)DREM&MZXZz7>DVV1A2dCG0a;JW|Mn$OIF*Cv&8ii6)FWP?) zp7is)5fOtlHps3X*usfbit}cx(m<;{UY^HLivCA9vbMX>R(S2xLxDTtdH*G$S}GmJ z&y`K*{r6gHRAe;Z~*=-t^_`67ZdL%o=y|8MQm0(MLMV|^cJD7L6kL&u)Y?EN~{ z|7;0%{B;+CUS4X;Ne@jzHOrVT0*71-PHd_&0+mek+wSpstAV9wV_~~>cG`^c&Rr{B zkm3dGK9J$>U?O$E)a0g1=r>-Hu}Xt)VN-9@qPQ=17;M|4VnA4)EFC$KUbA+}*YYPB z&m};VuCD}UrzSw);(pV0@+zheQ|Cp2MjtUBa`g#IOY(A-x+&eDJjEY-$PDB{jc$IM z+4LJ!D{Ha4N`EBW#q?>$Ng$PT7bI(|J|7iWvQlV@qy@~ z383Zf)dLxn#CxVh(JrS(IjffBZcJN|VX9!Ur4M%1uc${lr-eZaluW?;X+sOUp=QG9>Ack}gt5XA8HCEqy zoW?Ri{Q-tQY9O6cGykGeub;ECCXBrA2hmw_dSBn-YAsjXxuIq{xwh-w&#}c(9W$o@ zXX>|_nK*$-64sWxusaKN;l@gtO``rDar{=RdV*_)S2^=?2ULNyMY zJ}Gk7{cCP8YR(RgNEmS=p>06)?tsENus+(|Nh@tmh?YX!31MqK=g1NiOie55Jfd#R zoz5uz^G|&`=~>WCOT>74@&Mi2)x@JUY_u9VK|Sl#_6eQHSFI_E)Qy5HI%iTlv#WK) zf%Xqoh;D&nOfRDfGh;R0o#Ii7+cen_{*$^8cXwR5C*!c6nm_jUFZ;r!ZNK$>7eSQ*|B+8Sb*nvD zN+fi#WT)8^pbLaiKF80+b#b&L?0yKO#u~l9;m&p8HM9-Msa~xQFWW11+hEQlxvR!u zT^1yW;Z^RkX}%7bEVu=FWKyk)_^DXPw}0h7@a(f$7y-U45%?%6N3yOCM!eq|mEWNc z1(2pgZ!rL7C?8t2HDnv!_~P84|GuMXin^a-`YUFivx4RmdL{KQ4kgh#;lrvZW9W=O z{n64Y!JgaZb;OvtsXzCqg`g-tfv)QLF`CSA>xF)r0Du62&9YsKrAJc{Y^(ak!;N!# zs%-S_p&pvMgPmK!yOWKzu6@12$UvG&GfX=+hBD-{30vv5b5*+81F(7*K=i=DsXhL) zYox0z`bdUl4nF~A1PgD;J8w3Bs`i*$)>3h|*_O232{Qqu<(f{t;?$<+{qajWNrE}s zx=+2BWsd_GeKV`oT0ibVBiG;rUvq~?#2lW@ZHye&%g@-yhx`U5lAlbk~VprH&=$&&Fyj$bR)~J9mvSATat@bf@@% z&tjco*ML#>v?_|hlE=k$$oc8H8S)yh%-*Fsxcwfo(b;Y1Q~1j@#Fc74_77!>(kR_> z7N%p0!`N=LeWryLygvqhcGC|k4- z1I;RYalnJ9RJ$#TVaOdYm7$Ycy^K|92hLF?j$vv<#e9Qfr{*L)R&udKaQMu^jRl(g z95Ty^%s521H21~!sM+2PwlJFa`t~)octOS}J>?Z2%nnbuka+ri8`fAYM=bi(65j8~@8q%DJh|VH=L;rck zbw{W?0Jh11eP`#fGASvpZ>BA<6Z*P8s88rMVk%U)66?!%AU;y8+jz2AKX*sy*P%gQ zq1gU}f$hy8FwlI0e(k`^7hjW5E=dejmy003m~$J&_L)hk1AW+I_lUq&meIVHPr;{VravD;P8iW8sNqAyua;=1Ys<;9aWK{m_Yk+NnY3}l&JAp*&t6WK8Ud6i~ zwRc~rgN0p`w#T|@@QMV5Cn?fAzxU0Z#A5d)mvMy#1?kOPI1~Y1C*BNXlR==xl6ZnB zF7(cS9e7v8yBJeoxObu)gCiKI{5=(#(Ahg9G>33kXNtAAQukq|jy10HYkIeH7?>4d zhRb->R-%cgc@o@)ca_(5CI?CdxDClPLT$}Yx^=?fP&o|1tWVQolMx?Vg?d@$F~yP_ z^KZK?5ec2MB_a{D#|(TH3eG7))me2dyGCSv>s)u0XZX`xZ`qE%h~b!py`cLAdt`rs z>&JP>b~*DrW$_`rq@E&FtWWEFe`cv1hYR%Tb=5Oe^FH-;; z#q0?yKHl5B+d8hO5!l9+2CLgdb2La8{OR<>a`6fcXFd(XSO>#+ow8*DhGO39ae~ zBeuID?0*KXp{U90eid0$*Tc&}m1TbIg{MHvs;x;vTo{g#>!(QMK%&%K@r}O zQkWOIRTux#Yv2)r6(m!hLC%icO^nDsJ9H?Tc*Fqm5+guL+sXn=t)8(VBk!CMq|lDw zF~;K3AK`Lsx$X1INAybm)41XXE>a{5j>AP|hu(ww#2 zq=N`#f@tAkOpDR{*L0|re9{xv>4=%Gvt3d}cWz(i`k|jM_QDWCq60`CD@yk3CA$BE zvm!^?)mHo-phe~YnR%*t z#3wxYQ434&$)H^D#%g|hlY8x-&CXT-uzK=Ex$`Kn`pz*BWrM!#)B4o*7BHDKgKRpD z?i2xE9~KBP&eufYG=#77qO^L6eyz@uhokAh^EWMdlrnB;21k4skgVLCH@)>iqJdKg z**=j?X(%VIdcjbaE}aT7;**qRn~EIA+U9I$oXW=~6Z7oRw<)8e@B_|c53H60`lD;q zU1!U4yOhoQaJiVx9}s9ol8q#r-Z`6J*&*8%cpduM`3^C_=GT;@R{x*s%BzP#HXAI( z;$E8f)YH`5DM#K*k7sib3HR?sU>)UpAwm$ihF78bGktnbyxzTk2+Qn=6C{C_sZwD} z`hern{-FaU&((PAZr?v%q~Bq)x71I`Fxg}_kQYt`#Y_7sO1qaXJZ2?DOt%U4VMjg^ zT*&gU(4NR9=C9#67I;2YWHsIG-~`dHQ!&KkG^-J{*2yUSxLY6Cs->w>Pt(GGFHKOc zMs4-BKqg3X+M}bT{ptw&^C)YdnbFo|R)!HMefClTisj*8QuT?T?}Y+GH}Et=ODn$O z8&uATuiFt5?~`N|2RT^V>8CHwLXFs4wVcJA-dYiY+Z%YOba!fz%VnI|B9g1nTBxu} zytA5OYer7;hNi%KrFijL3+npS@80AkdJFe}Oftz9bV)^1(iNa6WV**|M2M16E;Q!0i*275qAHKQmm4u8N7guvKB+Y+M|KVwWhuwl)`=RBa&VmZ zWROTR?i!|N>`gTrlrb-vTbxgJzo%zRHghnG*ToN~#c;;&YNuLl348C;-k{%=WM$J= z1H7WN8kl&6>n{5#)+t{x7L*MTOxkxP zqFwdr*W3uz9m-PoL%iTX$At!@FL}lP6!v?K_TiaSfob?KM!ffv-60FN{%-J9_I(*j zzU+CMz+?keOjWn{`@NI&WnM&HPjYX^9>aSE0$KOc6_#NLA$)m*WIgyu)M6%+HU|h= zYSImUZ_C^h(V)+$wE=cbc17}vZ$v>3Al_GM`VIEuoG74yZ{45*0qh-%Q7R)1s4$aS zVMyui8ZRA>;`gQ1J3lDQFsbsAkFCM3Wy}wMx1hyt&6|XGH~6P=3T@A`wz^f5u>^8?LY8uhjG>=blxdn3jr>}Il zG;ae!BABT(Srx752E+M9Hb(vt9!o`2S#isMV=C<5S1jJK?6uC?f%Zlm(-(W(NQ_11 znOs>Hw_Qf95boWbSoMQnd>rQ!d>QZ>RrYwKE+L)w+a#zoqI1P-#_B!#Or#-wjqbNm zSzN20O&#-psXrYjJ|x{5QGKc_UUKXcnybH|da>O@N*JXtYn-X3^1k%7qasAUDDgP3 zRjyDX{Us;oI5wwxVby-{qB{GRw^79oze$=^qWtwY>#A{5I`lH`(qSu@iloThXPWH1 zpUv}BPDiqo@9$}17O(mqK1^PfaQ*cbYGkMo#Noye6@^x<)~_fZa)%=YsF{TCWK!^B z<6q6O4SopqQMvTROOa3IxWqNn#${g;`S?y9^=;|p=CbsRt4L=GVISixh3Mvfx5KPf zMI{XLFsb=>bYpL9-3tGA2ip7mOzrxb&7$WF#nPMi2dYh~lqbO6M*P#^SD(_7C8ZbEUpkJvUY~hoh-8jZy^7`RZi0N4 z2@O41Q8a+;jbM%;6r(jPNC@&$^X<4>=>NvC#);Cb)}Cj-kZER^6QziI>b1D#BO-r4 zj8VB0OIQKa)t+So=8E-my)5{y^V43oP5VbO{AVV0@dR7wz?v``ht}E?iubY;j|w<% z#jjf@9jSNW>YcB{CgK}sFINce5#IK6bsLf)raU*(m)Kd}+M)*sboYx)BBKpKjTPdP z{Vxp2dbDbSf13x_@0m#T2LPo7{Zo(zqrx^7ze)JQ#gJ;$z;k_e%)QTv1VB9ZypsCw zXZO^5gkeo8KIu(#V$h8AFwSC;6bK2^;j&hpDIW6?`VD{udEYHKh#G!&Z-KK_;`mzJ z*Fv?@2Y&eIokqM3nF#K5ra*hkk5sG>C^}En@v6FYtA(3~Rp~rDCiK6Ow{e9x=o+ko)FqJ-lfg9s>8u3yeQ-cTb`Y8#%q$sIM&@MGsk0B2DyPmbVr%|f z>qJmZ4OiC#$P92zDY$kY@mk;KzHo&SNZj5!7o z?ZbN6%pB6dtu7tNWQhZkmES+?vrHN-f-@io8{D26$1nr*rq+64dQz73EHpQ;@PQ=| z&=7nIO+xoDdSN>AYYodRBa<2X7S~kJQEwxW9&`SiZvwON?A@Ka#uxwhW_!ySM00I> zSH3M19o0*xC^NZ}PgQfbVm`E=*>3`!*%I|WDtavwoeyas)>+HkR-;X7s0jS|xXII50Vd`ylOoL zGdA2LJ38n%pMgn*a|pA7t`Q1Jru&=544*7@?E0!NU_{>(86tnjH7gX?T5)Ite0w#I zAUMdS#Y`D$pI&qOW?aO;14-T&%(j?vT8K$X{}g9$e3knkckwpdy4+E*P8C=8B1#Ow z1QK-jttyPC2!9Q-3d&4zamoUNl6y?eFg0Km9Qd_$KYn$n7q*}M=c5{wj=tPl&vlz& z)bF|_v8_?1Mju?YWa~gVN_(GW&!zA_ecY$m{L__TPEqv2*kRCC&FMmr7%P(N0!TiTHm~A>jdgFDBwMOTNxE85=1dT1UlCOcS@qg>$gFJ%QTh2s{zXOo2qELUxG8j%gR`IZ%8?5(HOzW9M3_R(z4Xm zfReiQ@dx}AVHNo8+h)Z($ka`e6^N~hKKXIj((HMVi1o11#D2YWhByn%1|FF zMR>`kuLnfUQ+%9~IbP0}3W-XgAhl=w-b4U&QG2p|)z|F8_w-ucI3=TK4FaP3PffVg2YPROotDK};}>!0 zANf`V6GoOuJEMDZn=Ic%aEF<)dM1T^UNY(78{e?8C5p$9W=J*O&J6^DFCgcAvJlX8 z2>NloG7zL(q10LbQiHkMqLx48v!jHOX#cZ<=))&6sKloZZ-fE+PsRu>*@=XsbYSPH zSRaGgiF;X@7qAcY>Twm~3=Cx(hwBCx*4CWsWL-waN3N;-(fLlWgH<_k}@D62u5Dnfbrx_`Oq%Q}CxM0-UQluZ`@aejTB z+`2=UHC|H-P-r=3URrVcsf}V>=|d~wh370n(LN(hte67^C;J_q1S4&;=A+mVRdu6& z91Hpo@+)|SlpO%G4_4l;JMr1-mhQbd9$62OBG5TCd&3xYl9*h|B~7G+-Z$R?NYNim ziHzTaoD$Fx*5KrWJoNmcK>D;H1)5XP!-s>JAw5U-I+=5`gZ^12Cw|~^N~Ve>#d{so z>d>?EF}9li@5e`Tix+|5i)VycpXcc^Y1@wj3mtJeW=rFNx8Lf^+OqPEPg$$dEbaN< ztE@K9H80x~{#CN$Q`@AmWP3?toD7}5{UqYrO>n!=@2*A8jyY3u(;BYjH|YaVF@Gz= zY@yiTT`uEayXDrlwZJ2^V$8E`(R_>*1YyuTSJ=8j&|91*+ayFlDAdx+;48rh*q+E^<)b^+#U`b)%h8+M?&5t|lsTK|=G^_sYW0a>p21s3-b!}eZ*v=FI1 zHh<&9i0^V!7$JhK>IHs&9|^Ci=pUiUEy`%BI+6Fx$&hcq9Vj>ZRaN}d11A?5yX-ym zUNGtCs*6M{maC5OPWPpn#GC1?`(lxkWlw4Wpfd34r~9<4 zG)A^Y0^C2D9HN7&+5Dz2^BXXdDTn=(fOGnU7{vIt8NF+{8$L4lo~t;M2xWIV^!L@7 z$wxbnY3D6fiW0wMzT!(SyS91alHx#pTNPnh-g0>#)1m4P=mMY@N!}D@B<@+;hEs~m z%|Lq93B45p>%{pKQ5bhqwFDS7h<@3r8doUA65hYo%^PLKv8$wyk26v#<98u!Hf9AQ zfbzaXD@vDc09o_Py{u{o*3)rc@UMD_`FKB~wp6V`{>Wf2bp7!Y{+LpW>C36_!irpd z?59}sJor4R+K3l?Ad-OGLs{$6%xSA6%mBIxc-y^<{LtfUSU^#KPWb&ENkVk;qX*`lms|r!Yc?R42;531CE)xHjv9>L z;U-x7(pL#mYO~_Oux}Dxn{(sh&5D46&M4CACi7hf9xg%(4fP&m@{VZ_UvBCf5jq(2 z4Qh%pp^7O{6@%l7H@luMN%EAB)ySgn5AjmnRzf_I3Hi;d-z#D5DFXDwbUE6~aE979 z5Z=6M_+2nOQuYtc)qPw1PdJmT?&(?t4BGz%_~)@xm;ID-+FN9kE0f&jT9obQpbdjd zEqdqU9!6oUv9_9V)t3c`nV)13g3Q2sVRn~|D*{nixk9Z!G=?j>u8{pGP_3Eug!uRh|w`}d5YP^gt%Ilv;!RUWC5X&A#i=EtllHO;RKZBT0 zvN?0S6F7hkZ$lmpF|vt@sT8gj2QDqvH1^l!+f1bo+P{Bx)BA)Y=|%6e&48{+RV$vJ zwv#S<8vbp9GLecyWksK_ed*S)es1ayfE({*Kl!AenhSe z;)kt3;|<@HjOkwqn7L;ac*Z%UlDfztAuL65WxEFg=mc+Ph6+X&>M4;AN|xjq&&d_u zuk5y!QdL{>sVZumc^)g19IzX`c&ib;)L^oKSAzxmUfJ)O?L8tXx#q_8>4)p12xh>u z!45|Mz+84eCjc6*zfWaS=9Y}VqTl^>H=p?Yp-Oq%mSA~X&NJLiJZuVtTW+Cgt{D&IP-STdvfPph zbL3;l`Krg)dfr<}D#Did-^d$)t5Aps!)_rXChNe$VLhGM!oo~yw13(~6%f&1*6L8C z5!WSp$Qe`(w>$1rV|7TagQD>xm}-~^^g$--P$mVH6aOLox^OBM1mN>f!Mg{KCF8r! z%ZA>E-qlOQp*OZG-!*?STGvx-tg5(@3lvBeBg1Tfj z{dX9x%jBcFo2#7hO!Ai{WThY|s1GKH7;x9GZ;_uZZ@T{ha=OKiZz1P6uJ|i`Eb zgmx+{Px9M0JPge4yl{O%(WQTAIJhS(`b6`yc{X@sOq$D2fd-SWv__l-`ix((7`0({ z9jQ+9?uRy<$O&6Et>2~f)a-PDM)z@+e8LD>r9mPZm&}9A7H=efTlbCE9-$Q~C!v`v zCNiR7oN`3@t$27b;l*M(2E;9F<{^x1i!L)*G;^O3T4vG&&JX>Oy5Ayv<2y3!`QFE5 z8!5RAvUL&Y3yS_^o~O6AN1#E_mNpS~B3Y5=@^gk!-Nk$EOzWc}r`Q*-=z=UN+j+%% z&wirKQcWwa>1px51zPFZ=ee|)x6f0(+?IrgV#lW8Kz${Y(Tl7Ux!-1>qDb|R?C8g@ zXunkGC7}Tes5FSI{IT}#a~%4DmS-{ChR+#qFUf{ef@6~Omo*;#772s?l{hMP%6=E; zC3nr1kCe-LcIIw%JN;2fF0@zZ+?{$eO%qr9?t7_J)xk{tfPrXZGj%gx z<|KTd>$CW7{RcLLdllCU&j39kr_QVf+UyD=)Sb`2D9@VV-)SdWV?HT}=Kx+VXNcxglf>d?jM#DHY)_}#gPy_nJ{)>L$0u=$W=Bj zPcFICdF(~jIVJ;bgT%kfa(+$I4%FJ0qnb?kY~aj_bDo!Iy3b+cO7g6zhSD9jg)b66 z(f(RIu)ry`y!c*5`kS!Nd?mul%&Rxj?>Jj6oHjoY7Q>(8|uB?3J~8v{)e~ z;JMUf*GM2b4tc5Sy#r+r0n{B^eVMSe(@VZ#9tcjeg>)1LB`U(lf@|C!0dYG88nbJPcTmG zLkc}NdjD(Sq`vN1@ZzM(Jc7x`U!&2Ai`y$|@UDPaZb7xiWBNs;sW2#lFy%;H&&DMO zO_Y-AEFmF9Ro=r6WG8EoTi=$bVvp;pkCFOqM@n45UPe1Mp%oz+a93vj%}NczdxzZH zN%ZN~@M9ySHyI%D@N^r*m~!*NI)oSb5gw6u+Z z_(u$XU{5cme64SHR^29DS8MZ^RRRC+?`zU>M)XU6R{1NN<>WlAgbKbd&R=r z;5B%i&tS%DZtkG8H0xpo`XuiKHAF(4>25lILe)0-?{8|cn{DZ zFV41F9+mX?%dZ|iBjx#yOEv^Qp2-~dDe_QttyK-qh7jvNkqw@r=IO4d03{ZKO)U8h z!TMVT9jf(wq5p(r^T@Qt*sW=kmxSpP^W%*hDv_GnFq7l{&xcW2YO~7$M`Uh~3(T%- z6?NyK$^L5?nD)pc^C5!XZmUJU8>h!HnZh9G7g#2Dn}vQWFX8Fx>+GQ=<=)`5D9Q{& zjD(aNPHEYdR|w`Uz&y&=UVyGv(}xIB;vTaFFeS^X+ec$>hgG13r9v$d9J(Z;`Dj*| zttEGdz|DIz?r&sCQ|me{J7;S>?;ZAgIzQK;l%1yarZ5JF5h*jgiI%rYb z8kgmp%u^oJU@Kbz)ODn(&|`SElTLv!N_O?*qYWda_)5r3YT%7dfVR2QhN}$)65lr4 zqI-uDJ~_TV6LTVy+F#`AOfE8+-B3M`TIOyVZ0k0W2c|ziGr)dA8}*(C|M?HK4*!Zn zdvJS*^V<6Nlb>T(O)HJEMZB9*0g}pV56{->|CQ)88fb`h=BZ9)>gI-;+tWzNtFEAg zR+o}*gPBxFEY^0z@-5VxesqGLH@ORa~?mxPLXhnFHD#^r2}Zj*7w?>Qdr zwkXlk?D&9U#Z+vl#zKWgYQyXe|DphvXb>1NyNTe;dB*n?pbv-~q@6p)_ z4akTDM)Jb8oqAWiVus1b>{ej`_&@y$^89Xd82tV~MyfCfXVr~|kkF)@Ycwp}{geE& zB1ehVrTKaSa{I#?(d)=Zr}uVS;P7~o|)yQ&G2`|?9%5A!&``XPfC!9#-G8NfcynNzBv z_h{F$`%)H!Shc6kDLl0W+ZL8V)f;vPsOX1n9Ndf2;vp<=_scvb3&&(XP5rjh&q}b5 z;eJk^jbaL?ok$gld#^z|9MeRGeak~9Tkr`QA8m$Y=C~4`X#b{iL{5*Dq#5c%&9cVS zWIy4ti^pt*OeE~i124rQSxj$8A>x2?Ae;JM)WINLaWLTYS9we#VjgR!^>-8>1HY3eg3Zt}ibWs#PA> zSj-p|GR)BK_n~utVz+A+nwZpAF78$QO-XjJ<@ec=nayQC-=g!MV*PKKMX$fV)iqDD z1WlnTvo|s*i~G1okX*uf*Trg?$Yio+a_8)2L%q>WfAZD8D{DAPfx}<4y1nkjXnZi# zw~PbhRAiL11E8Zb>Q=rrZ_Re_D0i5S+^ynlx}m_hWVrX<#qJq;!TWlTDhZVgf8Q9pfC!7Lxq zovit>5_RXlnk_QFq7gU9v&~wj9ZGACB&r;cf3g<4)*pZANeaIH1;vO}%2_60ipLd| zu81((&^-VN2j~Bp{nf_DiS@5Sk^{(VkJ5(@tB`V;uxRg>8NBG0il-?NyfugnJs|YX z6Vzom5}|k~BDm~U2C2hA)B6px1OTW&+C=&%m@siX^^gkw8$#t4SN%l=EU97i{TTLo00d4>MG8U{BOrmm)LYd z_0tABpZ?iPQV$g{tM~x8FlZg033R0NW(1A6l#KN#=%Wr<%`3_;x!09Ir}XfuIzj>5%IF{he+IAwskuMI9}Cg3Th~lTtm4i?q@fEK-vb$ma^P(N4HK?)k0zCKFOG`% zcn$hw{wIa71j3;hsktJH)bNb)llET>@-AhOKtM|7-_J>KeY6J~%(+;K$$F7!8FvLQ zZ&Z%g<9RLd>>Op5;6^uqr{Cc$#sykN*4Xoe&!`vB6+cFwfZL63iV9_&N`fU}jd*A0 zw*<(qB595q?d7OTs!NHOA*Y=F8OkxxmVk^k zXzuRo2Av7zkKI`yWhw?e<2X?QUMfluG66S%R;7QR0I!OQ#BnX|R^5V)g6gXwPiBDe z8DU|$(`;d+GdrTlYs@{S$cb8+g$4WpU@Z1G3ft>T;Vg6q<0H9UU7{Rz2F2Le!d2j( z#o0=c_bfBc;gtNXqq8N{abxz0yRduxW#uUo)Gi1v4h)JY2d)1-SuKrVN}4Yny5u82 zup}v50_lQEIM_xc%hMy^h~u6mJGs42)|pom3nTU8#)Vz<`q3Q%je z>A(?411JlG^A?)j>U2#aBu=A_0P?Y1=*L`NP!ML_ySAe9C_ue*&E$65-hht~>4w|3 z|AM^S{w_y(Ak^dD>O(TvV#;QU2C~f6bJJ0V8pKak4!gc@$OeZ7d~2G8%2K^HBD8P?Fg3&4`exwYbIX#dq_?5Kjj(vbIFc26 z?UaKaa+WW=BAe@StC-2NP}euGVRi{;qJSGC2r(LTcF3srYkE&yh4L!2>E4%_4U{U9 zocU(-@+N4tBMAjMeZA19h5o);*;|EJ1wH@9DLF5So01D@q*5N9@}DZ8b={8=#@w3u~Ql|*SIJWt9TzvA(O5m(8v zZWh#iW3y;{@!K91S{sq2TyE11_O~{Bu6}+Qyj{1?Uy;A*OAY|0`~j)08t>NfKTHoS znCx@y)`PDchR(zzVc@CTa-TC@{N-0D3N+QYzTm$?lX+x3gC^hqE*G|EKBDDU2+LZx zf~{#q1bKA|R5muO(ZJX7aLt>-ovTVYZZb&_JH`6@Z$vsZg)^3TjSCk$fL>AqI{uL6 zdOvPC$OjIc)94N+o&8C5>z{rs02qq#_e1h4n{iYwn-cs#5J)64255fCd@AE}3_Ww6 z{;iTtf~=(TVv2ot zA21ReD22nN@>sgnaeY9EC&!-YH%0GuU~seAYGc*QfzZ$>u7~QMV zJ7gu_4hgxERi{v!udmI!=QG{RV%U~<72XP*uAR3+D8FiqpQlJWN5aK)YjsNxrlkDh z*)5Tbd+YA!Zf{k!-!xxs3ca-VvMW|-2pe`J|8Cv!9`r>>-S=uiW!`)4ZMeGXm#}oZ z6^8EVv%Zb0Z*y+LsIpef?OJ+M)PraiK=7P71<`L=gni?yG7}rY-oACA@=bzY#vve-j87U zxN~;Z-*As_BU}x?kRrailov|PQfG*mzPJ9atWD!|y7u+=>7!o#H45zVgVA$ustvQP zJoVsjCUcm+(tDcT^Zn(5DbzJMaH@2SKG2;3Us?&QhaPmWGwfj;;k;HlGc~=8-9Av5 ztZaXnBjWlcR9Ijt%cL=t1f%CVy%_Q4pCYUJIQbnPKH_hk6QKs1(gT?&?vHUHHACB_EL)2{}S^hbL<*~SHM|RTAsZ5 z!D?gT%&L#oHE_wd;W#yx>wY1%wukGbLk-28(gd*Z73OF~jE zBz7c(74TlV{SgtqQ6bUVSo?w!MBQ+=-K*`CktU$-b1<+W*B3Foyt5rZ7eW~Bfo*Vd zo6hV_d2$+J?ACYsn-aD%^@h~b>j5LYfLC!KK}(#R}Py=-Tca#CEp>c0Q%%Hml~j;TiF6EIar#`gmN z2!QUiNlS@N0VcV_PFKTJOJ4s}bhDsiV%jzoQNx1VtwziPP5%KB?zhB9|Dq(0XAWqR~;z|X#9OjV>CPD}Vo0JW`3 zhH(SNP4^N2&3jOjS8T@l<$Ep(|BAECn)IX#y+gPslQ8;dnSJ<$)yXV)7&C`j#WX&C zq;o}bJLeIuj(2@2X;w5fko?-uGp+H-Rlpjo-o0OpnO>NVhcOAt0 ztE2;cjOSQU?Lo8fZp@G9{rx$r4pacJGFyLhnBhpxeJJ6#$mRb4$q(5gbi<}7oE9U5 zdH}4<#Q5`2UvEg0PNz`?<+{$g`@_Bd{saE<>csA zQSzM|#Y70s%;JYJ>1}_lw$<(4LYn?dc`^ouemIYwRslEklS*g4qWr-#z}E0yHM1L+ z1Q@&7CF<|Tzt~TmfypZ$O{Od<9kn&NUokU**sAr2K?H>Y{^6z#W+6RDJyNQ#q3v-h zEK-LYkXRa;batNdn&WCGm8peZS_&U>w#OuvN@+rV)Q#-lbb$8kF)!#9x>(E0Tq~i* zZ63g((n(f*qQ;L07I)zXlQ6YM45^1&pBg5tQXcR#gW9yh-#x3ju!i>7RGz)*UK*+! z9}~W@d6d8_QwwZMx3kuNLfK{ZyVCGK-6A`+{syKJa&?k0%k`h@Hop8d@DLo5^S?Dto?A`Q?z1i0CwWF(LFmy!+IfOEvzLOo-4IzJ~ow1K+MM zCKugS(TMI+K8XGn0Dd_CqmtzCaw?*j{!3ILf`8sSZnMD+th<=XC#Y=K+#j&cplT_o zDLV3k3>^T`We{9GZf1Cz{)T@%zxcd@Ptd8DntIe!Kt@!QrP;F@Po=J9GN~0Vn-6gM zeo>5-N0^g$bh^SreA{peL9WhhUB>O3E+x<2$`nh=uD{z%X^^>{Ut0PP^tCKLIg4gE zW$|8xVC@QNq5ACI%j`jcM)qMV&+6df-1gMr(N;aL0t};e6LWVL-L)Z$LAxNVQiDLR zV0xbp1P1RkaLH|O*i*J6zsjIWOXz!P_y~g(I#GWG4 zzQcMx`~N>z{k@iWeYc%Q7Tz01EuSTJQT`v`6R1*~!)Xr7$x64Yr5E(ey@3xYmq7-S zc?HD09kHrIR7wSmi`495U~A?Z7Xf}(b2VGb&7oC{Kp`t?)+Xt1aytA$JATLmL#~Q0 zq2NhAj6XwG?j4VTzUVhzo#nYfQPV3DLEzt`RPbgwn)D0b**5)?az$f4Y_0<>hCuG0 zKs$p{e^PT5L2p;wJ>BxV=II2tPZ{JA#V08h{Clz{SGAS?oFa2Kmh{m$VY)ueE4~Lp z_xJqpUiVV?0~BO%L}_hIx7}V}?)uSioCaONOg)0B5 znBgX~?0MXPaPWk`cS!0>bv$;3P=DviMMrm4RTbH*Mw`tncGgfgHt^dfVwTs$FLtw; z;5vfhQ~`xgX8!?16I6+-A|tz#!E#mgz8}H}Gk}En3udzx8Y|d9FK5J|n8sRndyIJG z+$g@<15xB(_Z?Gi32{ zQ?tDGtfdN(cIBnWTI|J-iCf%N%C>l5hOIpIBC0$AclTpLH0PRqlP}E!wd+& zlj|NpkPt zbT_D0XT=v;&R2~?ni;zLr>UZ-zk5ntj?|#!ckq~s@w9UhyhFRbS41H)B=^?vs4Bxt zzeKj0@_kUm9JEdqBnZwxkmifvij3dC&rhBn-W~S|wNVTUckS%2VYZ8CplD!S&R{^G zM?)({;I;<_H_E*Z$YhTB$k4~hCp>?3QpQOY(oFy5Y)6u%f>E|90Ci{z{ffF2rV&8S z;Gph4uSASGM!Eu~i6^Qhmz^VdF43U|TU)jUPY<{>KU1K&KiL+UsuaZ%d}uNZ1>5$v zxnhsfFpN=Ia};=#vS0yy9sWHR_3_f+vpy)iv zAT#8=7yKu!c-5#iRR*Jqrv|ZYn-ijX-T)~c)tghdt2xbCrE>_~!-f`TD-sMdsk(}K zr!nG*B|yQ6sP?T#jK${@pUEy^L~=+@4=+u6jFqI<(d47$r*X&bn9eiqp|)Zf#fyO> zZmx!^u^u(pqc=B+9Xq1mPfqcuQdW|z8c^n9_1oq(oC@}zXQP+E**435x=JnJ8K8_i znZ?bB$d#^%)9H-sVZ=IHWQ@8{`esY!TBzQAS8kMFylt)yLE63^!Rq{1GMB@7?Zu&R zc`+wc4j@@4Y>I~zG=?uD6Ug3JadEqWs0C9yf>SYr+o@Py>S+&4bZK6DU++4#1YgXu zRud}326w~bIbKc%x0fqs6zNlVLfwSlL|`e&X2{04P(|UoGpFRsrX;r(Cj0!F(DK~< zUg-{$sk5XwTNVYAXQPuhRZ(|718ID39SoA`3sR-?UukKm4gJ8!by=E4a!Y6VK}~S#*lo!VvZm#S*CD>l+y-M;dn8bh|16+&U~!VE=xp_$=#;SE)5Rn-4cbnbyn z@BbekbHCGs3}eDZMJ8J)_scMLD@o;6Y#~E#mE)32YvwL3=C;{Jib5Q9n##3Y8g(Qj z*H-9)9NoUZ&+mVK`F!?yzu&L-^Z9t(X%y0W3BIK_EXQiTDVq%`ji=**=Ai$y{wt7` zWDz!A+$(VcC#_@3LpM|C79k@pDqE)LK7g>ztToF~hHOlmyQ*Fk0 zU_Kz6HYMP5w4Me&;Higbr0CIbzTC7lM9)D)o`kX5VM57ci&W7XdZFEh)~QfmnR_FRdFdG2O52}tm1bqj-1yoQ*`i=$8)FW!Q+lo-34|Or}MRuHw|Q&rOd<@ zQy$l>Cx{*+VazIaweXG+`w&uqwgb)I{fe2c^G4vNZMvmFzDu#L7^mdbhvtH-Q~7N! z&iu10P$DVXE`7Q5vvL~~adR@(BhWunv&##gwDdPIHDb0Xeq?qgGH9N2nf-yTTkJ86 zTY*-l68fgsA&26Q0JJtNMa62#NTP3blLzwBp7SS9=2zLxm)#28kK6=f2PB0YdjU^R5tg&8UWKBGjvgFhSRZ6ww7$S z2)H)zlv4UNaly-bjReQwBIcP$Nygum6Q?A@u}odqCa+du#o>c2`!8h7Om-f`-R;to z;4H@0CqMBfmy9{auX>jz`KwAyLR@Nmk{J+YPl|N5f_w@3^?ZzUp&esC(RjqtFfOb=#@E9d*+M`RBLM&Ey=nFEu0C1noyD?V z7}8N^IkPdKWQ^ofG383_Q5k7qSwCKe`nTpBJwPQJCWnka@=g=GQcrwSb@Cf@pLWL` zChTg{kPXaNJo>`TCv=r`Hd=TCe*^Ml)g^kqYyhsQeeARyejt13pu2%th^WH-f1ql6 zA}2VR8Y-Alb;2n+setC#HH7brG^ZyyfR)396#a?r6-famyV+~UY_t7A{F{U4-fg=b zp9b{@c1E51{qAZ78g%JmgRPwtL^ye-ykSJk0;$t>0<2GC$*gZyGJz@-pt@yEho`4R z*k}~5pKMn;7Nz-T&((6}Hd_GCtZbk4`y+L6AqiWmS6@^)LFfc0ntQH=+3KZaho-$p z>j}7Vl#{Yj<1#WyHdg$PhSGZZj(Yw0&DxP2nN$+2a2lFHy86e^=PJ!-|BU#j(@ud* zMdRb-&6>DGoh}!vkYOtcn82Pm@+zimPm3zRazE(G?DjXn<{gAe*WNOvh<%`k#?ZA{ zT4sjpTh#b-=UuM2EY*G-;z zc}CXDWGtTiKnAYo=A$`T)mH;DkKjXeiuD?K^xUEWh?*bdW-t$Oy}`ZDCpZ?V*9C3I zHD7(6rWsI}cDCm7BDJ5^Pfd)a%~o*Mc5YM$(k`2J&EGK_y;Z9NFPxrmQ?X@d7Ug&j zE)tX;45h7|?mbm!`=sUU2TIaX>nKEwHuS)(i2X13+*5^IUG%}JC?5;fVI~W%XIiGd z3RN(8&CO>-S!<4J$`4g4+@QsH1ZGs+c$(PgW`aF(I*WB49&MN`a9W}BlVt32j+AOR zJ}=4E3BflOr+hl5IWQvonxPcq;C3=id=NH3ATcRTh6CCFw!CNWf5WKNKgje`c`iqO z8P2i7)@Rra9HDGR#wYx9p)}4ddiQN_SFnX*XrZQJRu7Qgj)0738>`T;Qy;9lAAC8i zaC^EF-0nBD9zuSWp_Vm>iUJ2zTVDtwN`)DqM=0VpK+N$<*9x?#X6=7x6a2rITSkWl zp1)@E{^d9RXLp^VeIFY8eoPTafS_?6ROZ2qG-}$C z@;8--BpZGJDeSqrh~qx{(LF7YnrTNPFu;StCLKg9Z%Ol<>9p1B``-(KUUfc~K7Lx+ z#|Y@9<74qE-+B*7Y!{^}kIcz@wIL1%d-r zd!$Nc8yMl?m87r>#4+O6_6HG5x0m)w$C07{+CdCP>I+hDXjnK$eD%O=LF`SNOkIp{ zK+J*Sr>=(HJl#)sJ}fa+>(uIczw@(x>9W%C*T5+rvh+6H3t-*{<{u33Du8Vr<@(&S zjxegjojg)zCwT%(Kdi_Xw0Amu49Iy2nC`Qvg8$E?&J6A=pnB8pyn)q9ldenf{+0l06wkPdmLsSh7riW8OkE> zw$rFvm1N5TWk@-@K46J0QdBLkR4esTN!BlI93In0R3N=f>9OXFqGO(Pi7W4(APJ44 zto*j#opeb?2Td$0Nkm)_ppr-a75f3+yT^%jq?v(_$Wt}P%me`^g39G5CvNv(i^!qp zbg$`X8nq4;qnlPjUEikpfcbVHwai?~1Quuty)YGRlES6W?9a?20`omiPQq2TdDs|Cfr zl!gb&qtv|n8Ce8?*u_U-kM9btq_JXmaN`?<{VLYp50tzF*hR!aj0{>&EL>duOt`b# zCf@hkw>PI7+Dl_1uX#;14tw+qxAQR@P2o-VD~HA15|Z`+)i-M8l8Yi0^l$Jeh!iV0rrI6v*? ztQQwRR;dX%O*!O=zoioXs^+~BCH~bUz zPoeo=GgZHc)Z+i87Xr!ZC@Dsdqfy;ppR}R<5Bgt*SF(M=g4OR1DE~R2#x@c!tRb2fc6_r_6Q=Qd{j6%y$eW*w~Plpx#YeQL{X`nwFU@;k{5F|o0S6=FW$Sk@V~a*QiZB@QY) z&UeMk70WhD#2((P;c2+7R1Y!UcP)-J6{-MkXc@Vhidt-I&j zdd(A(y|~0bWzqdi{&X3%_$Zku?b;iwmCw!3;| zVbDxa1DH)KG(#E{ysxR$r?|^;aLI74l;XsVSAH9SY+A8&CggFNW>!} z^#>q-No4UG6z9G#=NNoiNU(2vgo;qDe^=Ezha{w=r z=6ZoDAGN?oWnZ~O@L`2!a$YjPAE?&FS3nJ!J*|`eyQXjG-gw?0NKweo@atJXiLhG` z6{!?h34?fDqsu|s@>kvE#qDWm@^62w}W2#R1Gm z!JzP0a13@q{w*T`HOA@iKy5I>Ugr?%MS0AMTdjSEN!Q0nQtHgjIn^|?C6tW2!(se} z;kRMriYd!>jf{2&>35^&4if~AgkfioNpJxy7mxcP`>;H|OF^g{E(Bs1moCzQ&L ztTa&4%@$f3Dy?Hy5n8n~W28fp={p894cT_z4if|)>IzGQ`2JK!G?Vk4+lO0?MbyJK z9HSrZk$N?F?-@;Wvn`3M^uie!f9slWXG`^{f5C9&fIt|;6uzWWuk<*f$fDq_cn{$(Yg*f`l&^)`4em=xW`Gcx2q>&4-ZBD^@aq3u?{SN}F z0bC{g-oQT0BL4a@ap?-RsA4%*4myrg6lHqH9mbcBER2y@M2JKm&R1&dt=N~m_kn^O zY%#GRUv@XV-7xH5C;>dZ$(;s4$we2EsjV0X{t2tHUIk2_iZpVrMC|rsw_6UZsMqJ} z+K%A5a0M75o#aX84=lQTdAh#Mk(ISbfpB}ozHzz=h!iQQ1N{O>#D4{WjGovPLMQaPm$$h7xb&Bh}^N>>p(PJ)0}P2f4gief42Swf*?K2-IMVUM=1@Qdutz}x%^|$I)GVuO zO^=O#0H$AXjHF1vMFEu=fzHU@NCVrLi32`Gbn*^Pex9)a z+qAJ~U|gRkE;9z!MzJJ#A)+2Jj<%`iE5o3)sS=BaVf0utReOTW;x-p|We^mQSOaYl z@-l}-H;Z*a$6$8Z7|x(W3I|`Z0dxhD+7ZPOMow0 zL>c5jj^=TUvWxtn`)tptZ0+z>TVEvaP=saCfECrKg^hU5Il%wcN8XGqHyi-sNUDTiRwi8o*{e1@2Oo=vks_4D^YiJ-c*W4mrJC__gY> zrC?wGh<6enlBDyb(;^wNZGZXUd~KP0EaLJb9W;lh3i37yKF;DXh z?+4)hn1*8Em%~KdpRP}YbD)d?0~?#`G1Exb&A0eQ%geiZ58XbL+cBQ$XS4qmEY<(z z<=dY8e_@3Pp}Nj|)vFG+mHVqr4s7?%B?7g#M~?GNZoZ!2_`Z)mdi;!9uU z6Gd0G;jKLI(&g%zpKac|YNzeUDJnzLc<372bLGJ-Z$Y|BNCE|?*j$-Ne+x#q9$_Na8uG&VoO9axrAqOA z$a%1$@}&Jf*WP;|y-VX0yQB78ds~m&uW2w4SW>HFh&1-iayod)u0kkh;Y5+<>1+{)Q70^7s=0kaWhB)Z8wycR^Osq zm#ibeN#<71Lj;F1z4yst7USJP#_Ei5+%u;F1}YdjVS(*%lWK{ss~cG;naYavQpG^O z^IIV56P7jJT^%jkkm<{lfzAbHd5uk*e9rUzuU1eSgUA`GePLRu)V6uyyM#^6Jtn$n zpfKTg%WjHg>1PUA_08xSSo48NPp9Gi_B#H#c-q~>;ZcDNC-hWKNZOWF97dKou`);w zqWPlTq?A;#`=TYESb0;{$N=$?j!mm02VQRN>Hxw=<+JtZ(Ol5wFIoKAZcm#*RX zG!7|az6}hMO8x@cQF8bX$kG!Eo(1c{th{@bEk7rAhdPD`8>~RUFmO{&c~(pFW^CStm~zfe|>MD6ND%?0o3Rg8`JpJ;QIR5kN)`anx) z({3p?Vz3`}?y-)yU-Hjy+-C&lEE)OnuUjJ^li{#B2Jk;dcXi(;Y*NVr@V^cZL5 zCzZ9?u)xhZp>ftSm0lW8hUhokmW%~HA>n3y&wygYBR3y~Oo_%k#rOdmblmNSG~erl zk#CN@cCn+w!^b21({P)u1Kkfh3@n$6CogG1;!Aoo&mI!!=kR59go1^z!8IR({*fJE zrgIavIDbq3-%;qxV$Mo6wY)!W>L{QpuWT;g;(JZIC(GpBVxQk@F0U28k z%LrE~J9yvrG_qt&!@?bW_GGhzf5tdH$2w<}S`^;rEGo+yD?3U1Lq1q3!A5H0fW=@) zJO&)VGRcXkN{}?aqcpqom7~ z3XB*fq}8`V&*2jURfu<|s&s3XsNvL$dMG)BQB5s7xww$!8NRp}Er3sZ3aN-I|$==EVt?Zsyeih)Xqs!`ogaN;nQu1FgYn3tx$*HWD29EYiF zsl+|Js7H0RyMa<9L~}i1D^s^+LX-CJdCi{Lj*4`jy2PV>7>J-e$ljnSqxbL6T?P5v#B5M07+ha=!Jb=mj+(`&r) z?8+Z%@F3$(rlmxW7$=3O31(3w?meyHd`B8JWlj?(i~0kBE91)X?UXRuA~D0YMl(j) ztLhz=&rn@BrrtunM4<0-t!dm3;+f3HQZYh;1#-X~4*p3M*V{4C%M zS^2Q=yd87l>Ag%3>@GINeRXTT^ek?HJY-^~!}BP!lbf$q&Jg>ZkY8%DTz0+tG}x*) zz~hbj0&GHQj(_?|30e=W=^G?pwr$YubFOb%w0jHk;{F%6a|^+)Z(Hc9s3rs~RUuEU zX7OUZ@&iR7>VbN=bXZq%FM4s$T`iDGh2T0+CZG?w&gFN)>C_gh_jV-Zw<7Lwg>J{; zAY(c+(|8r9F#c<7rNPSIZ11B-hyg3ZO|A**j%?z$c!J5C1OF^MzwPS11}hfE88Qfh zt#L_%{eijC9`+NBa*2DXzbh)fbw(vZU{U1`R-Sp}*cow>aTt1$Y+I8Hz{bk+0bwZ9 zPX~`>=oTLyuT~%xbQ9%46$?CUk#^ntE*aL57+IzET^KSn;q&o_>G!N2+?5bqV=OXW zCD`3!mxWpM5Mz{2KW%9(%CAYF5{^VSTCu4T-zda=ls;OYQR^v=Enlcyjl zrZt@=F7cEfInF(xy?9ZKN0#e)lBdw0=;sY^yUV=v1YJ6((e<;6s&2;nWX~Pq^E5XB z=ur&X=JePPi;aY;%?O^A zXKNFIw0d~QVTE|T+=j?$+c;#d3|iWJVAwKU2q-*&%#o;2ADqYyjoI%A)J@!wWuTqz zFG!bf(Nt~%dQb&=#}{UvDf=G3c=0#lshw@c>*8t8{F4-P&F|St(OmEz;?RbZ`HRb^ z9*LFCo^+t@MFZ&D2O7R6cTClw7WT{n0LzeD+DP||J_@@e9@VVob!aK?n5OvSeB}AF3KHJ#C8yaU~_mAU)27&PKYRF*kSCD zB?giKEMUr3nao^!g^JqC`WcjTP>Mi>mO*SORh#KtB!(KZ+a8PR&-{b@JLu-RxiV)D z_*XYA;}cfi;S%wn=X{;WJ#6Twg45tiB|Zntx)#)=mP$5#fqEGs3$zhP#czyidWc1Y zZ!**~mQ+Ky&KlMWse*3!A4t{bWl4b;_f6uXi<+u7zcfDkGd4hA`nuTC@e@`;%J4~e z1}m0!zX1u$POY53!LFEZisJ%IgA@1tmb4=tx#@!!+K(!a{ecLzMA7IERSAiNT3_+&siHE?M zZvl{QYQ}#ijWv&frYJOkBv}Ga^z1Vm00;}5O}#AHnh%ILOQ%oX<9jbnoPC^g)uc_| z68*`W84DyT<-S9{C_?v~rvWWk|Kli8^S|vNP4Tc%h~e#z|7?Q0mr=psEJxiRU+FS4 z*`ZbiST`NrZlX$j#@l8yB^gyL1%i^1ohl-4gT=%v)5Ng%8!WF)wFF~J&di7^_C~Yo zfKCntBhT43-k05=k#w z%1g~LDUPx%^?Pqp)oW(|P zv{dXBGw_`$+|@C8Sut5d&r%Vn<%EHpMlph9xTZQD7;kq@de4N#Go-mee`!&zvlxUz zjOinD=D|)OFYR~+;Yv?IAhlAW$gA%UC8*A^D~KL+cZQ?n0U~5xy+p^G)Qv&E((@e` z_1g}qzEFmRTCse(6=Wn<=x!m5FgndX-2SE5U|%4AK)`;7$t+cb|F!Nh*cr#AQ`gnD?+CS)D-JfT4Y z4EabsbmqogY-q!^v~aPgC`o-CQJ*CBm9Rg|bT-RdA?-72%ud~Xm0iJGTws=}&0keg z3npeoJ%D>z1v=>i3?}a;NzHt4BkT@_D z28qqe@bll(1sqb)Yd?r!{fa)syJS3HWkd^fu1IZHiSK(EX*(qeI6WAlo4khakagq5 zjN%LJCZe2ISiT^usEBA3Ej@J)`4hWloH_2LzB)F&KkgEtG3L8|+h6zD2$?1O&BjSm zf3Ot5TaN2`Tl$-Foqa_ad=#rJTe&riKBOfzp;*ZK2SLjHG*w&M=9vObo%zkYnu425U|5~V zu2gp}D1pp${-T~R?%Z!ZP4eyP{GhDZ8Jj$;9hEgn@R51eV4XFfX_Srhh2K9A=&z`z zs#$lrx93ug9DdEKdvUYZrp4d_*XmwCI{Nm2UJ(qMz$>0y;JUT-9Yo9AmiRU=kpBI$ zW=&f%T>%jKjieG7>_-B-EsziU3IZZMx8cm5Y-l~(j7VPvGT$NeJ}eJQ=?Q1KHtA0EZi~~@b;ta_ zL+4o`(7+RNk@d?a6>&$lQ^7KOse-8`*Cb$yqk=XA<^VPzn^2Fby?3Z}M<6VGypQDh5HD;0L$q|VGP)OW=2k3J z1e1!1L3-so+dQo<4Q)U!{r9u&m7CMBPd3@lhNg+pym7~YGNeVBo~AP{I*99$08$%N z#WB|gHWj5B$)@z{k&44Gh7~~tS-d1~r!2puR8r2JK29+z_M0i&X^nGU%b{>E%+J9QP?LldE7J zN~Chw{~);s{YyZX#_r_E@W5oeUY>f?5 z43BtSlz7C_3J`87{58l(u;HY5#k?;cc|AwmRVZApcXo+(KzbOuJ5WQqNCPL{N_ztn z-gIfx^3*NJtMGn@#yQNYS)8Kn8LDrMAP%$UGl(N43Lr~ILg=y9JPn5rS+aMjMP7J( z^wds&VCkITOyFxX&g0UnWuZNh$IoiVP;NKYSSxM#!dBqz>Mj5Nja=PVg72J+|7F7V z52^U3?0O_|VSW7N>aNrRG|=a}y3u)HRsfnx#WO5pN?-IvBdu8H`3k#peh$-h0m*RI zuv44cB!~>12%b}CD3qmLoDq{3U9$VBdH3?b>2F4jZtvck<008}*Yw;}GU4IHMw)e& zQPSJjH-*c$HQjweYa*XqL7@7Fo*k3~Xp#zJqa!azC|t`%H`|Eehp}!x!LG(Ie~d|K zjd>yEDl1ZNgRB|1WG>kf!p^)Qn6Ee?2Znqusrf|8mNB)4zYe)Li9U&%&^ z@441p+VDutGsYcxfCTF_%wpVvNT-@@E2f#Sh44+I9h+ZqSHZnmzcoF zDXnD#+t-DIT^qjBNwnE~+2s7tfjCP9_@DQl?+}B$_enA%$hsq*jHwg1WLZr^D^OB; zSLpFt{)l%t3&YUP@FV`KM>%oA@^Fdgv%8Wt$1S`@%{^c1f4Ci>pUj_5mpS}H^m)1~ zq#7GS3MuyNg~5&I^!sjgM)0u5dmOE|{Q@IF(B(UJki2@d?9nnCb?-RJYDyo{zAnQ4 zM`%;H-DKigJ!X!4jxfF4aDxJZ&DWEVxMYapni8gOyq{}5Qm*NKa(tL{C)9}Nd z@-q)K!Mm!tV7SFx7?kY1KFY2TOhebgfLzSw?v~U&B0I~x#@UDT{G9cZ4C2VV%IvFM znMCFP<|`FXR{w8&vv#{6wG8)~pC#$14f)En7CqkcnE1IU%oHx-`X?4mHI?tAe~|Vr zA8kjsTr)cKve$b6ZKDv9E)=*dt~m&V;WzdE2ST!}dyh3)DSeq%Xzg?D&P=~V666ey znl#2&mvzckb5BUe_fw@hjCJEjsby+bvNi@%F}+?|N~sxQ?3^gHXv9zQwuy+t%A&!t zMC_X%9x8;H%7%ri$H zH6VojkX3$2O8@BLOq=L_8)UYtsi%3S?Ap{NKS|9 zQ$8fU_aox(=-jg-G@aei78H55aa}eSiDmba#rPa@7<+T^Eie=~5NhnJulc~n^CU)3 znM~ki;0W?PoVUo;Dr}SFbdh)G{huV4oPInZY5`8?t(OOYn5wC#gdMYG8Y^&FE*Aa4 z`jg9E4J8#jVjrzdU)nvDC=|~8t9eKV6;YYkr2B+PEnY09Iwn6SN=`?}vQ)e!Q%UG` z73vUU3ta=MtakEaG%4-L&I7G|@?#(j_JK}Zms9wAi{~B-^xoz^?;PI{)JvZP8ga7& zF^4sbAbW#|69s<*VfO6la(EU&vZ=q>ZD6eQtmgoCaD)Qhm9gFGdwhBcw1|(p_9x~b zk_=P5#bP`Qh@)_68DcNHjEJVo3v@s0eZ#JIjqb7A%_|22@M$?ElSHF*+f3xy7-8B) zwX-FQijK@k`obD0DdT1zz=Svv=$Mo!fRn+$S@;m`Z4*X|Hj0~>!J=Dw z!P|Agago<2d^Og|Aeg|GX+3=Kprs6&YyZGUWPN^>2^`031P>$_`baJ5JanHOag6qX zIyWr4rZWfNLl8l>HYy@d6ZR3uOD}b(>Kl8m=d3)yR!0DKv@pLR4l$i3Dh;qJxudGh z(^M4IjzFLrIFAEWPc?&{O%_JSTp~^|QYG*v5U9Cx!Cjl*FSAral3#o>n%WVKya5GioEJ-rYqyfE7ptmnGKjza5ui3 zPUsxhugx6;UZV{El&ghuVuHZJGPyY_b76kx9)kQR(k&=@lRp6sLp2AR=$r#WI2Uf- zXO_A@J?bD^J~LGsaLu}vbg?#Wn121J&0+f+_G`VCdx4_<1f5gBVoCHEm7OX+k^-44 zpDXM>p&k5HOwdxzJo2Ss_cVAxQ^m`!T+m{1XG!O?FL7dAZJG1rE{;lU^~&=G67^9X z9|1&uhL1nOr;yl384y<8{YH;)uyUHR`bCa8miN+7kzKm=whYd7Hpo;qQTS%IvhA^K ze`i%cv+~Gk6Lc$-2!U$+zC@zdJP5o&`Fs+9Jv|W^9Xz~Tq&;7^(|3t( z|A=Q)G9j`6(!^pG`DgzH>Nz=(=>2HB@m(V?pbgOrtz@}}I)WdhhTZ^-hbJ>Cw@d&l z^}Zz)Kch0{`UJo#W1V-dP4Mep0-CRt3)+wu8Z?%NU92iL7$ZSsPH675vJo7%)hs87 zb84_7qx80daVDce#j0s6X^xI$DqN ziz#hWt%uNV1<_?}c1}m)eo~yKvu0Vfg)Gkon>df*sWM!O_%jwg3YnEWgoJwGeMd{_6Eif`Y0wF)owJm8`w%(CBX_UG68*w}P zUA(?5l_V`Q`$}4QfXMD+Gi)zUh`Kx1yqB)(IPhaF`FA{dE4>~}nxi3cw&IM07uWY@ zZvcMd@*^vs1UoM=@el|`0w&UT5(s6z&SXbZG;dcCD_E*h1?edH+uSqC#0Hmo5z>@3 zxaRAo;I)Pm5Agj_Iho&tK%4$)ww{}U#6WFqoZKQ_UZ>gVpE8ZlBS`#E7*v$iry5w7 zt`r&Qcl`fpYsyUdgw@hR{Ip!szvD6UOTZ=N1ALiR@B8dTmKILb*s>?O z*S3?_{D{oQfuN_sN_0jp5Jn;5mM%gQF{9iAU~s!TPkR)#%A9StY;en-nH&cJA`peb z2LNBx9pP)aht65&0rsf3u^>s7HQU{4mU$tyx1Xj3hizaVBWe~f>lB%!;@@`1>SPwz zjmq3{vZ;~A5vVV-ZSu7o%~2YD>0PeB)wq6{bwr7O`Q9EqY1i*EC@|X(d(-2&SNchd z6wZ;(`YMg7$<$VOhNwhJX_=)BfJAbW&R`o9c58MN^;0b+pktPt3sCxhI!08Y=SucEd?EtUj@l?-QaN3o^EP8Tm20L6GN#N|AzG~sVduj)dBu(k&3>5up=OvGJ)Q$4`<6~aaclALH~N^U=N-HB zAu}?T19CGFX@T42uN7aeFT-$z_7l{&!^9k|V(QD1Y+<D5KA`Du^Zk2ST# zm_pp{WNk{)Q$^t`rd(60ua2PfM<0WWZk6SB1TfKD|D;{OiyljvTSGT{f9LyV+2sPK zOsIaDxr|~Kc>q&065lzWJeR;*xA&JhDaLj?F0P=A>g@`Y3#qW%JfNq;lmSvQdht#z zod>qvBd6R&$=vIyRZog~?Ac|i<*%&-Ep#VYFg2# zA!uQ$*c}6WFfE#UVRMUP!xW9bfEbnzV;H^$0i)N2gbp0ENw zvSlzEwTs0W+&e8hbU1a~m<(Tr64RoXXn|bl%@Nhw29OMbeHsW`=n2Ex(V32Qb9Rhq zNUrP>Dho-QV%4w@pDP{kF8ym-8_b0n$59S#4)0fuDP2&1VuX&ahmyRz6JP#9t-Pl+ zV()I>2he-0TLZ?-NW?ZSnG2H079W?a zLt$WGzfi9qBnuuRk?XU9YM#hQEDx5IDT}Wp6ng2b4ZBrtu=a@Nu$aCS$+FS2VjtZ? zfajmbeAvpz_Fg*VDF=3lbg;%R&=bxxA1Z{a?xYVu3BeMh*uESvk6+l0(euy$(zF}$06ypf8gKf!Izno zZ_!iTfBz&=6SIfC4uq1UUs%Q=Uhu~0!NF-CdU!FWImX9|pfVaxVZ(MUpagF8Q;@

EvrFXFVyI_Gmg9(}EQHR39Dv7AJ>gF5 zhYCd_Uc`_D0cUexNy zw7-g;ug##WG0pKu=Dl^pZgSOAol#A)LQANdjatqQg%?u%Yak8ZYvQQOKfcp4al5IY zSb#1%gmH`)3LDlEfH7xf!|pQ0$5bNqhsvt6pOYx-G3L)6lFE%P-8wE4E9nuva;IdfczayypYzDEXEPd|0Fl3BX*Dqm_xxbu@x zA99*K{SyeJNB5FAUCst-OZfXM&~cgftPqv8Qq=9qGhru2o&<}F3MbOPS&hFgQ@_QW zcpMvT15>L1%cSt$y6hv^Qm3X$Vs*3Bx01_m7HLyO?q?hXw|06U?+x|eG`4w7n$~+z8ZRG!QU8oxR9n2*(DV;YRGFd^)8{KDS)kWZU11L{JooIECcUf-$(HSco~ycJv(6lO1>6H#F#Vjc zj%NqBGwtzs<>%BzT(_5^u%Ttj@)6?2+YAK^fADSPR#Q|#j-kQKa<**A1d*JzU)eg@ zXW>i3Ot!D$yZG<59a}Q>`40?OH;0tAG!L#)jPsbRr@?3T zz#FM?ibR!fhZe_H(P{=Z%=eXq{m1X7o_dk1Jis6NBKPT7uw}W6a2_a?6#1M2*kktn zz`2R4aVUK^ta5C$D;eFOrBMv(`xtBtRS@;%8J8drcJ{hIV;=VZ=@MKC7S$Kyti(Py z4_UU_IUU_6b+6SwnVSdtyc_)TnhQ zJFS0R&v;!}RQ7fl-ST1PW6N`m_zZ7>9rNPsy8}jbI;N2V5;#-U9H05LXjq9A85RLt z5ENj7Y`kHkv!>C`j0VTt^|^&Fobz%j*D~)=Wncw?H?IcFef6jPLJb!GG>*;$jnI6D zI-HK0apx@klTmN9; zowns;u=K69I*@KqT1eSYtICi$Y1)3s_ow_@oc$4Bo5j#%u}j$#LYF#5Tg(dk=Vc}a z)%-Zk1AE>U7DhjAd>6iUCKYrph^6DK^u2*m^1+NS#x*(=bXmB`capxBN@mB8(*;Jq zrW2a7mZt%})~b$+zhs5fmOz!~k9fF?LHubv9U@!AAiHYq(+8`u zB{~fPW591wtLL@sd;>rB8+p)iP}T;l<&FUW^4;{U&w<~Jo<$sweOg35bmaH&C>KjS zAHC*dSJtI1nXRjwq7j@9`iwu4bW!ZPORalh?d=Z{>RLw0zs=~{XaAenw297wvu;VJ zk7~;GSpug!c{#iDU+=G%Sjeof9R-C|kFm{VpdaI}uIV@+3ElhmE|pMp>WlU-&8hqM z&Cxy)pgDu~WXF57VxfMS1#o}FM&27NVVt{t;iHGtSk)E;ZycW4lS30#8w|}A34c>H zM{wvSg*Zz$hk#Yw$fF!9!hsQqVNxIRiF&7gI@SLYof~DbsViW6^4?&R!MTe~-Wv*a&6UsuK~ZJ~yS;Q%eLSe@=wh~pT+JaM$V~6f(++EY0%=@X=yucf*%#cI%GBpS$nnur{A&L z(^{;Rb`V*z2U1Xi5!B<59e;I;Zo59!-(pmJ4vmv!Y;$xBEICs8zs8+G=n-k?%+>z8 z2S%x_y3!YJ@u;_(+P;b!-gah)uA=Wbcb}x+)M@buBMU>mZ9%pcGNzjFC7A%DG>z8l z&dc<5a1_qhW|*uhuuOD2bsDFo_ckUw9Ij8c;mnj5_R;5M{1PY;Ipb9B>F!AXw9lO*w=d_ zU@@qo`)E`9F$u+uG0WVHKzAdb7CvtJtIy!E@P17Q!>W_?_18f2Y#oBZ22Ac3xF?1> z2OP|grgn;*2gsh{j*>A&`kO@sD!cPD-gR|&gPbvf76j@^%0v~Sxk?_g%}Q}^I6AVi znpm^tv+bYzWDp>v)7u_S{>0spRQ$snKzLL-%XRwbTT=O*7m|*iuQfd~Uk$9(RckG7 zO;_D%f4X(P3!HXZs1Un@*8PvX4B)2ph97F%CO@jntB3gg@Y#B>9)6VDbo7$<#c;;b+&Zymc2M5qSsOWy< zP5y~IBQE*eiap+;r>#v_)WGP&A#!65BAU8&zc|+EX6)Dc9LDmmPkQ7^cQkGHsonLp z8LqDEOsY;T1L;0OIy7dLcy)fwU`4-Ctu;!QvFe30*4|)wbs4?Zx_%whkb|MZa47wz zR?8ymoGbxYg%py--Y@tu*cllF=I1-EX}t7lAVpSWp1@=`@QHCtlFuI#d+Yj=V%IPd1`%!`mT3PvErkEvcxOq?xUPLl8d>eP< zG)RnXUDi62)n+?_^tCj-Mpi4aS^5^!sgb)!@y8NE_qDqfU-jX5y^yA@_XIgGw|I zQ)0eSMMi|kO2uzP>^l*!`9k3~;7vmyF{mo53{NfCef_d#TbhF-u->_k%u3q?6tQ0! zb;0$^u6O}k9>@d9(v=H??kY1cC@%qIHmOH4Y%ISsW>3AGZFo}6;;()#=tnIG+ z!Q|0L?p>p@FyepjyT^}944b*adM)NI*VE+|SP`aT_vGF)2%hD&;sE_pZrmYusXM)E zopQOc;@LIhXMImPwfX-MOTJC4RD$t&BcPBhkIQDce zn1wrv431K9kJOM}d`a7c*xD0*Js-s~*zt5)$OCq%964k=+a&Ru>=1^ZF=-9l)F%87 zlyQuPTWoVUVVOjTU`#|g^&wA9zRd_!w##e*O+*)4`%Ew7LY79~JC7aHtEOJRYfk6_ zc5MYQFV~z>i_JjelksJZ&#R`x%>+&g4XxWLc`aF(!4C*w!mxb))#Zxrf+J<5C&o4U zPgu8@P6k*Oyt%AtAMX>y_C?NZHvS()=i<+F|Nikg zA98MTJ}+!2bDW&dGt6c~N#)FTBcqTcXSL=qha8$YvpEz+NXq#vVoDAr$0!u4ubaAm zpWolGJ+|w8U9Z>k>8W(-qU&6bN;TAI4ex#Cx)190UCEk@wJ~9_7#UeV#kX|fSn-1C zM^+%bEE{@n2!u!V(EjBQ2d#=1KL9Hy)SnsNaxog}sM=JUY2^$`lT*L^fRVhh-Z3B* zu-yS(0a`NyV$#@k-f!o)<6Hdx+1IsOyfcq~vmEe6BMiG}cl?p{c5-ylm);*_$~0sf zmTFiRJ%7W>3fPDM-j-Nbx}6KrR`Cb9evwd)FP9wPZT#9@qa;YlB;G&_E7x50?@A7L zmnz4H0ngBb0bOIf-;WAS(wv)0>2#$D{WbtBqWR`3=&OHXIELEO;`N3{ICm>0L)g$p z6NrT}jT-`DEzGH8r=HzNazsvLH7uoeH>pYT+9;5TAzF23k!<{zcf}p%LaRU#F;(+r z0jcT&Jf>Sl*y8G@=`RQo?J@uvomRuqap%k8(ZARzv&+HIp0D$dL{y&OtT|ph)Nvaz zC0?%{*f7d_I7GytxksJW)}+DIcZF*RLs>FzlKWAnaF=?>`7WoADbB!xYz(1X5ok0- zj1;Bix?S-ae|!O#xz>AUq`z<&IFdMcmG&}6e&<^p&w7h#*LIz;d%h2G3ZkMFA3N*E zm|!lenbv{z;WzrPtnRVOU%9PRY{#-54ENNUW&|}Y4Rsmj7;U+jP=`?BUF~(~HCV7W zLe@3>HHu`Mg}Rn46jR>GWy-T0Zn2V0{he?`IK`IH#Vi93(N5P{tsBUO>SrkAPX@AQ z7`(i2Yrx3vv-%?SVrtJaPKJlh+L>6y!;DvGVL{)91j?_lR&;X+`~lG`NoHOvDUbWR z-ho!BD9KH#li;K&7h8ht^t#=1Yu4wq3-}-s#80Xc(li7Xvx8cwG)*CmN!^u-k@URu z@DOZ^YRp%6x3|g}pR`S|?UbFZkA<{Ua2KDxQ<@Fm$UI`3Xk`b$k_99rw+TyVd!mTF zuZifpf{o?h;95vvNe}3-Rw9U$^w>y`Z0JuGe^15kiB2hXuTrK?8D32)9*B?uuPYv7 zIJ{^H1ibcDbfjfiIF$0Hq3Q+zh&Rc`YY64hYRB!_t46bRF3g+~*fCXCC#da(esz=# z3K1n6iX+tYxEG)n+NQy5kfTdhuGD8y+XUlVKmi-#H@@ge3vv6iK&JEu$zltCWDVxY zDiAFt0oFcZfvFs(kq@>(;$D@ux;-@-;CdjBU`UHs#>joaB~MyAw%qOXoC$oCpcZ|s(yD%3WSNX2S@cq*@1s^!LQkT8 z);5PPT;R98YKH6Ha_$K;bk$2fhNSX`->ON%nGX~b&dp6CY98ZHSjEDDNOHg2tU_Ug zhve_tyJ81q9~HHjHB1u6d)U~Yw-&=+e-mCl#IS7?TC0S9wOBTfxz_0#ifhy7y;94u zA+EE$E5`t0P$^AUV{tlf?!IWb_gc-A2{w~X3TVC{uLB*87TlRHzbDeMgXYQyzLv!{ zL$2Y5@VoJ>~O@Eg}Y^E7{Sl{TrBQ)YTy7KYojYyOWLw=>d)aaCS898 z)0VQA<hO4+cA_}o@wKfaY1ZZhMiH#^?f22y!63V zk3s4fg!(F724MoHngw6);Rao=bq_lA5N?n^zJ&UZXBCInrk9P^*U%C88$+bDu=ZP}2Q_ujY{ z_eWg4x68>@WYvmxnAiP8P9Jxd^07AO=dmDkrOM46$eVp0-oub+r-y4EsykdwZ`74k z{0|gcpsbtsScCL2#bloar})ShNUld`VSu8a-$~Og7dJJA<&pS0J$HMQNUi|uat^L{g%axJ?w*)cc$duYaX#2{#hAmXLV=! zE~-SzAhL(yU}~&|$CQhv91MX|Gh+~CFY1?nnoPHimK8^7%_u9mp;vQ=T%oUH{G*tk z#=14$6~VIWNNC%A{^gZ=x-btplE>5qymah0IB$b8Q1)rd0csM3(-~b{8nlGMnz|~Y zizV`MaEb~~*e!7h&O5uMZ|DZioCnTS99J`iZc&GYao|rn^v|qx@l05s280Zi;cBt~ z>Wkzl>?Gt_cIRa6hil0|tSA`lgRkq99!RDZ+;s+)u#WwqMFYI>?PKGrQzvny6Q{^#{hAf0o4vRb{9Pn$21I>kaS z!1r7rgBB*m^=jtljAtISrz#jCw(N^XqkT&y*$i-(@P6dh-OLN3{%il@*)mb9WEymE z+xKz5XNiXHzQSR%Dgw=>Fv%X-s7Bw`Cd*SAI*Bdb{JsT7^CTC| z@r%HvMBcRTt|D1^MdNn2by6gz*-LDw(a1q+GudtJ+Kb4KRgAu7m81sH4p!dIMLDkx z!8xn7)44fW{SO%L(A*kMY?@y@96){>1@a}c*p@o#WNcj7+T*+b&F=YTi$u#77n}G~ zKNUCdUh8x@Y7>ZhGMH=jOTCRkw{;xUc6PHC0FSyBQ^=ZT;O`% zm)HaoR$;Hj<$%n!)B!b+d}@KwmOD3cwc4G-L?96dJq3hxoB`_9BiUGf8oS+cBstMR zrL+_G7%(r83!5%yaVAeVy_79(C@Yw7qLJP`J0%t-n95%5pxr5qN{2*}uPm+|I2eQK zv(X>(by8*h{sX61O^5qHi0Wm6|9K+jj?$s#6+ zUHn`ZLfQYv__VJ#o1{;6>`e1I&=AEzB74C1&?lRTo&!~S4q_(@&s@{JkJ}4=S!Qm>(`W^8=ZBBf z*owNJP17)JzjY>j;n{rc@aN{~y1}TMwKfwkR}%<&=iHqFuU4(z5KM!j& z7JMM?5#Rn1wR+k%HeKb*r}*8)604+ccoW<#sx*Qd5Q~!Kdv*ZJoDDWIPTbkTR}TB? z?iYhE>}wc*5V>U07qy$O^VbdIlWB33ihkUGgXx+1OS}X8=JrfpZVpQWw1{sDPwMcA z7Vf1%ZUl6X&N%pX0+Ewgf%DT3%02rl!#>9UL}umaPPu6xLClFwl(KO66%i7z)mmqI z5gGyHFToVD*Xn#;&(KHt*XrO$X^1MhXAapf>HnB{pY;;Wbxr7rxSWMbkZ09RbPA%i zltYZp2EH-I|5(R7lp}(NIjL=-$XXQ=LOx&cq9!z)CQWcRjvSqFWRH41hRR6lj3?ff zkc!CB2)ka|b-^`;AMvZEZZE#Q{FVFM-3v(&9^;;$)dHgcBn9v@K*9>Q9GVB_ilpLw z^OWW(RdKTd*PH$WJwtn}Qr$$AKfdGZ_}3LWM}*{^bBo_m{j{Q5gKhSlE2Ihb5GdtC+n6L7Y<&WblNCYpFYdEN|&bf zby+?<5VaTv+JVj9_D(k%2^ArFVj0QUP0pE7TA12RD-kiHhSL3npQ<{DWmfG*&Anj+ zFjpR_t*`3gtda2>06Tm6-<6UypN@3FX+HqW~aSG0z5zmUo8)7zhNQ$ck8kH|*Yu}Y6&@}F35Sl3+sUj~@&nw>`|SUdx(Wjfxrx}-(qBZ=H;p~L zvX!e5C%cenSbGDF+WGx6ZB1hEsUE;EoIh`s%FRHDwwG8=z9iqjp z6c{_m)mP}WKU{U-^oixqlT8KTtTO5|Th>i{>sD`5lRI9ybUM-_i=)^dOOO#aF}L55 zVjunjuNv(jJ4WOf`$ty~J1-*|Wptl?;r+!d{%-#6)voG(ba#Z1IAjS5@Hg$uXu@ zBYD2&8qhz4|b64!bsB8&uVbG&yGk@R3;oFnw575{?X30DK7Ql zXx8RU@I$2;6aFi6MiUn4Il{z8O1y}boB-Rj^@uUnbUExpmE!flt5A_tU$Y<8pd^T^ zj-!BImtHOf_*F2Ee4YlOokl$pZ-rP$#kYtU;4eRK8bC?;8JR-6hBG?S)Q>K%u2;z_ zSR$(;+kY~nzO${r&Ns4K-(Pec=IMfeC}gu6G$C6nei^gxb#72}=Rr)UgPz-?3SykQ zBVZyZVIZx7@vfxb0*XHn`Mi|PTGYk-e*yd@(stXT-2N(bBDwdw@${2$*xF-3jkz$k zWmhifgt}KK(1wDP<{ef5UeHc*?R>G0u--nWH#-SA^v_yUd8ZKc=V@Z55qDxI4*;2h zF0s6)H^aU~mv@Sfy8ZfDZL1WHV9$?tUoEx`acIdDJa^OgOcnWPTYZ?+R`wT9sWVbd zUERX*DPzyua%HhUYWc~tUKxe_^qVkxFCIHJowjZpE%n=|Jaf6@E7m9gz-b$B+qV)X zMw3weUw>W}s4WE_0Zb){7b-kG0ky?D|`u!!@+t>pVPAu!C z+486;MnKI%f?82k-f$`T*;69S&Q?UD^@rnLrisvhpwUN@k8RB(@<&jgk=Bs7PR0o7rOk2#3(j6>4|Ef&j@`s1Kk!zGCcmS*Sk6C^ zR6Omh!kv&82AvFRS$5!u>86Ak>3vqREOu6r_U0X&L45&jw(7G#M_-se<8|2yq3Ac6}JVy+0@fpw6(rLBS%cR z6uq(?hQFfEt#%DT1D2()qv2>yxlvo?wZkv!Q*UZ|VM*1Og1PX%^s3zvaT(!99My7` zGd4sHGh%?0zJ$AC6jMY@+sxBz@V)FExbwots%7XT1W$Bia|@T1;8829I<6|_-|w5Q zkSPl1k^d?Ch3@OTIsK@kWB$U;GVaAQ`S&NQ@gZl|kR@z-K%fddzDjlvGJ zJ98E!Kxe(xWb5<(U0bIMKts!TVuouAH1>-{;6uP5Zh5c=xgoBzRvBI6KUnq}r76w3 z$)Q}-$y+8wa16L5i_4Gpu9Yl{E2k#7c>W`yBDL}eb$2$>lD+>CMp~9^d#4sca$0=S zxnASilIk89%ABS;+I{lOJ(sK)K-A{;P}6s~$asp0I{fP5zV=WSXK_lE2NiG3pDSgz zDg@sr-{bP`kjZcyG{mD$PL>D*61-yB@N8IzfP_l5LxMO`j!>U=C7Dr=91V^*8Ep~g zpt?{Z)3>nMqRoG2m62wnGufCz29=qz>{Q%~M z9f@n7%~eVBO!fjQ|>plDV4_&w#pk8meoZe@F8kEp)VF(%FN zA&1!u(3Odq2BAlK2PsFfftAPUa<&k4rM2&$&U?nvR-!kckGvcE4Pcy zznOiK|2u`1(rH=wsk$QC9Ia3&P1%8`sr--G`4ps*jOtG?n_%D$kdW>vOP$hJER6gN)9FTIZ*g|cV7{9Oj)K05L| zty~qN?0qI^&neLIKuBV`Y7nuI&&XW*0Q$4t(%_`5apAC%qyY7dtk|otJ)8HO=#RgZ zCa`>Z06I#>Xd6{wlhck;MKhD7l5Xu`FC5?!9DSgmQ-%R!FiH*WoZ{`z=|EtlhsMK^{!8;xhvsPT$I}hy7@SJ&09vMDH16e zx<&q{QYnz}cgx-M%Z4Lx5Npm^$O2DExlFuESUdP_tD+$WpHFC_WSp1+jY;70G9DdR zCHn0upeX45*7ei+siglehG9^+DYSdp|IU1ZZoc22?YBxDO_SpuQVgq2H5$3d&LCwY zX~huJ1>L7cw7btmpXC+G$VMDCd<1^%FiOeIJC50Gz<3)HQ5)XJ zf35Hw-*8n?xV78&@IF4L+}{uO_0887(s!mS9)yHkoX)u|?kiFyu(|<0RFtK+o;Kc{ zK$hjJ$pw>joeu58*?l(ejbw-0Sv1^6M3>Wa7JZP*Mc*+e4_RdM5)N7?W< zu`^P9QWd%qO1x)pN!6~Wu>&}Hioow`P$ua=(7THDUPbG=Lq@i?QkLa=egD&}Uv(7z zhu3#!EjcoJ?G_^lwd+^8?9c}zLwYB1-Ow%1Jm`_-(x53(uv-ual4xdfgeo2!;e!M! z=W{y53M`+R;qjJ_!kkeSp*`(&oBRfuB>eA=V!x<-&=zf0zTOlPw zI2vM4y;~TK!@XG7j%6X(><|O0V%7m%7v=jJ4Wl+V56}_3Jv9(ieJ7&oK?3}!i&)8i zIni3>j0TN9tDb=m2_v>hQ=Ps$=!I$8eI7uTmF5YRY4gigN(t2-X<)KA1(A>Y(GYB;h z@V?qYmWtUyy?iYE(UkB~fO3GE=jHR-HLX(xH67}U_EG@hwr1?1I5smuGZnw~!|7}$ zd^(+nVBWWd)lJN3wY5XKWj}XoAFvo7*-u6d{p0_`DgQk~YO>lrB|{(~Ar@~f(}Wm+ zTEr(+_)W6c$&Gl5iHRo2Z7a(}H|uFWvH%p`0gL8wILtX?^04@UTU)rDF4gtbGTKPo z(_|O&2ezCp3Q~E^Ug;|-+V&*26a>}hOr~+rW?X$cc>7Lj%W7!K;@HF)@JdhoZ}Br$ z0=ez{r+vmE|9iJHcPm12FdWcQBq#>yUwnpiWYwnzOvLL#iFX#UA%;rLBG>1$U^h)(p+3qxk96Svivct`3%d63p%>FmwNJ@S~{EQgVf7H&f3Va z{Z+*o);I6QsaXRDqKU33&9{Ni@+i`+q<1yAiYM&iJExqL&P;punjxz$V#U*8UAnCc zxW;hA6sqlL6=inyv}v%cf~U{X8_#^UtAaN6zLvBfNBFwsgvv&Dt%qO9bo0E;E~xh9 zhbqRnVlaEVED-GZ>uw4gTrLZ(qvUF;9DxVXM1P1t<}CR7y5L%nUitCry1rm}Fj_Lx zvZr?MTzuH9&`!pT-sg{Xp2P{0jusq^z5az9;tjC1Sws(n)h? z7!j))f8Fz(AM|XqqQb{5mqo~_!~v`7l8&wUD%USSd)F6%_>k;67?IlSM$X{~VsGeC zeVg{>A7e8=WSFx|+-9`haqET64RNQ@iG__?d!>wK+Vro~gNG)AH$P|2tKsT*>EM0VvQ$>gFvxzS6GQ`{G7nAV?;cEeD3;7n|MB78H3HwE9 zxAA0-H1I1?6lZNbGK}@!RYs*zGqiIrswz7{=uH)ys;TelgYUF#=g-~()n9$F=77G_7JN29L`|u-uTOZrxP3&(Uy!U_Kq+p z_+(9c+3nL2*&{fAZN7(;P3Q~bFDAelM`_y`rPon!Vw2P$Clz_{ESSAMcO>8jdfBEA z=j_a}nHF(4uBjdYabPq=w0Th3VnDmh<^d?gUHr@sN!+`{Z1@)HwH876Uc7bTFxu95 z-1wExbfx_30cQn6H3pL)KIR)?X-cSzSUhCp<$N6iPzu+J;;(t88LFoJjGGV_gMF%RkcdWCoZV<7$4)WL2VHm)z(en z7pAg{NOWOsi&0{`Mzw{nZeBQuPE+|_^L~x-W8~W67DWS;Jrh5wnrbv9;WI z{uNp%lQ%#%GyjRosZ26rqRuiW-O3>V zkTx7ehwbg=sKj+z)^H)lDC8V`_wb(GL0cHf)(+9^=CP**37&Xp!mp!a3p<%Rlnbu) zM)#dM@&j^vzJ02dYI1h&)quh$7LW3PaXPEJ4SsBeUAO>J=elHYSOZI4`$4`@;VJ(8 z^?9pE4E5kx-wB0Wu*ahKpNI+NpR++wjBJM)tj@?2y?3FjHD~hfbXS&@4?oB`X!k8~ zvR^Ija_D%Lq=D>^0GmJO(#PC1wKWW;thMQ__da&f7dMpg@KwL_!IaB*y~bW~?!zBK zr=$PBZqxoPs8QWXB4HWy(zjU7&2Fza?<84j(b;L8afId5lu@M*EC#&t!cFBo=pw>% zOCKRBen>#2_qOI~2uU@)wZUCN(H~g3Qd{{c4FTVpZWDS%QTx*yziJidDnHUbmjAMU zqA>s`(Pr4(78y{>ZZ;Rx2w9mK5TCcq7ceP1l`8%`Hy0`MPri{}M~kFv{qvp{+~3eK zySpe`qcApRgooI@8JROc4zQTnw5*SG8Dj?*kxiqh-e9Cy;hiJ!U_H*9Lq=%F!;CIN)zd;M2i$Ha&ee(RC@w zAxC|_rY5x@@S+U&4pZ z#Wdn1cgWiI-&utwrJkw7W1&pAGNn|(n6(+rtgdzc)F-9Phj_vq-V4oKx5Ry_dNy0F zf7`j!#8X;i!B2nuCV+yl$=NWQ@SU`(RfY5H4~9J{DgyASsjBq88`XpClpn6*uusus zCFKU~uq>Hd;KugkWQ(JAQv$=l{4p`@n78r1LDNcU>fXof<@!(sbp}pBgCC`Qbt{;i zTXL4vf!H=BI!Mxw7@S3>F;{2L1m}}R{Q?1NK~u*@@i33#A!E$1?j3dRy6+91Xb!Ti ztHVle)C{m_`w}yu@yt@S+38hM8Lvo2mo%*d!1z|2+qg}E6l`_ZgOnhm7#_9o zs|38xt{OR{Jxje>`|CcLKrJnK4V#gm0@|_WHjMo!?0l#_Sl`k}YY=K=1W*^1(DMya zZSbo}bt}OomZrDB?*ed{E4iBW@90*{ksSxqkbtp0@j0E7K60FY(?(j*5PSZ`p;VuD zxp(-%&kRouaPHT;9I;J$rXmIU`4vY=a%~%1j(J(h*z22e%r}|w>t|Kf!Ycn=o`woU z{Q?Nd{xg#Wo!k#HVXM#crQUF{W$F-AZW`xQatiUTJl2%8&IXpmkO+@t=W}FBz2y!V z-{{nctV^rfB0!`l^FGEY_)=OqAVC2}UoqExPlcX9d+vLkNBIWu3ZryXMdeeJMwX>B z+6o|d=5O_f=zh!-BzM%TY22Z<`)|4Qyt$kY9ta(hv(;~wJ}Hf=Eo5qZ8LIoy`T|#p za6f8u3y9JnQ?cN^!HhH=p){@Z{b*8jsSG3KxZpO!<$~oI$<=&do z19{!~Y%1l6-k-YvKrt&xWvNt&_otjNOGlp0jdNJF5ed(#KofB+1(&FFH;TxWZ_>I; za4KE=D;=<}EwGSJaB|rvTlU}1@}$b#h*3D-1$Vd$uq3^HGV+tcU&q$$wPf@bB^a#k zPIvm0*&i50(lDK~ZPF@U2CJ^ujgDUJxVp<;+!>EnU&FCi9FSejJ22(O`x70(?|r?n zP-Am$#z>G%r>mdl98(2N*?CtilFV<&e=qFFYNqN+26pI8%n@-_^g^_jjbqf7lmE!) zW^#JeEK}5)qO`hoY3a06q4K6&B$B(Y^}>wX2Q%Ds(u8H3ic*flrKcWp%)hwo@?hB5 zGyMyCMH>$?xgsE$PKoXO7L$s@va@AKnaf>x4EFwE8DIsHyS9gih((ga{oUuyb`WA? z``^|1y=$+V_qk*VUDSt*mTvsrL6*ra#Q)@?;C%rurLIn!-j98?-*w2|(jxc#;Y}Oc z1%>Dhh5*IIT+2&AH*%kxK6+nh@3rl4aIpNPx!B@}x`LtKgl!wz;eZ9eG_^GfRvb1~ zsGG_2OS(Xg!TXf1R7DO3w*%#?+Vvq6yNV!d`4R48B}N8jo|b*|R-=xlush=~aCr@= zEZFmR&eP6nwa{DMTB{rlnQQ5(6bv)jOmF}nC>rHFr+i=PGM9ULh6h1!+UBJ^+`@Ip zyZlt{<;39kjIVYZZVPkM6n5+L09Ux^Z_*>#Xwgd|af^XfS@hC#M6u3S`-f$ellJ2l zHJ>}>(_)Z$VQ?5EgrgXfY4D773AS^hoIS<{3K1Rt77PKXNl#84$TnAxxF5yn*}`*% zGB3Yi2~$o63&yF}#%1X%#nXBr_P?3eu!cT4BWP&`iU2bnH0YrEa;U7cTt8 z+7KIG)R%chG~HAqNdEn4JBwBq8a2QTjV6PYefy95c*sJ7MAE9(U?G7~vg@ zAF3nlOZpP0>zm^IS}#UGFtNTBVxdPweDXJHjUC62Kd^`&scsV%@qUw@wzir*Stzh$ zqJLfC-&Uu7`|$}XO2}fbty;%HR}IaD_q${B=>re{#LRlN61jm0(^Wl598le-!2#OR z?u!S{eA|xohKnj??ynSWAmKyr^`7p6*rsz5g{&P8bpORb)J>Y=cOWF_HSJ#v_Ut1$ z4SP{L+ln8XGH7B`QNo8K*F6*X8rcW5yjqRYYHs)EiP@k(Ggpx#a%<5}7nh*gxKmQu zwH6FdW8pWqKgHGraC+18F-+X+{YE{tkDAJ5qrVx21}@c#q>^!MLEWhTKza1T0V$$l z-o4>4)?5|8(MGBAJ{VYFGF5N8DHnIhXmD%xDHlocuTfodR{kc8sO(j44z2rtp(69Sx zzle zM}|6J5&p^3;ejsLx->Q=P??jqQ!b=9v0n0_+V5prSl*zkR|10Z-QLsY7C%}d7!p{> zUN$WIb`tUfRpgUH%$`22m?T3^ytmZG5La}w8;o@OmC&E{=E0>LHauy*B1q}`Ywcgv zln|qB;YP!7S72G-HG&7u*VA_>&L$u! zI)LKk8>JKVM~)u-k7z5`XAb3gSI(JL(1`rN%TG(h)HlmC4@jIAa|^f$T8^EK%GI3P za($>7egSW#&m%aX*Ka@h5&JH?2wsYwg@*XR>d$<>S8tsX+F|g$exEjL7=8sXIfE9X zg;?*$)HBki2$g8Of!#T7=%c77XaWSc(CQ$?c|$c>xidgQYQW~1ZkSWJ@l5sF8coY$ zsQhZ4zHd;|_vPnrvFneFc2K2C=j=UGva1aJJiz}*h$&t*Jtb%2h}CfX{yZwM0(PM`i&Jk15=R zC(_>y3m+aHZ~%|Se_6vk77ZA77&&CBu$O^;eRZv8NSP9tx|b`$b%&+&6+=#wLm={p z22)5=05NkqV(oHA*sQu*l(CzrAjaIc9T~^3DjjIhiKI=5OfnGrkv0<;4IVZ zb$Y)z=>gk!((~F+NmW9y);37;1k%56ndM+C_CP+qJG>oC?FjhAcq%ElBcp!b#mA2%VGZu)__!TZ9~_>F9P-|{43GM?B9Yja?tN)>peBO`!{RSIOwcv zOG2pw@t0h{hnfpGMBV3f>_=J@x6p~Gr=618T$hT7M|g$A+54v3&qg{TE=Y&?2PIEH zEs)Qz@GZ2HpT@YBur>TNyX;Ty1mCMQk4D8s!{7p*B=0db(-yiW*WQ3~U6-${@Y7eZZ{L})suIGp65Wal4VS*6A>}_Z%BUy$ z%3&%Sh`Jx2y_R>i(2IP-$CZtai?yQ{Bc#5+jw+FtNr$kcmeSCGojIusZo4}m$ERYv z*0W96z6zDfvYalX?B?>bzAqc-?!SvHw45t(c!L};S`Ba?`dGK6><@S>Mqu)H)2b_x z@U6FzZ(tUdVXzkhMjzhR`SSWClb;{m+mPK^r{=bSf98oG>z32+4Au&CzLzs)BF-gy zenF+&U_M`7yHTT~eNDHie69jmtbAy+=LtlW+p|~O_Lj8r57*HSTpV-|k_@Htw>94$ zhTy*|ml?Z^Uzoi!D&*{Gp&})Y1>19TNNp2c!Gf!0H9MR^t;!D4pJNj}RD)l?FvVyu zB7EK@^dNjjsuvR!cJBnwGh1>8)VOUs@6|=o;V5#g-i&g#C1db;*`!251dxlRu3*$IL7 zg$6fsPuxn@2;2@zOD$>L)%IqAizMf>r`Tf~m8ek#*9t7`a9Wppl112?F=n;w82z~2UsTmZ9__6uY{asgE`_qGC0Qa^b z+}OS8dLi``SDa8j9EsmC^{oFK9lA8(*kuhX?kEs@B`HA84vEGPu)oes{&4Mt#m&-b z{l-~ekaA3&j)fCDD)&r#bk(_X7QGe!=>=!qv4Z4A`9nL&RefEZoc4|K2=OKt)n_$- zmLc}OWo;l9xyY;eH$x)CUg`}2O9|#5 zqMAl?l?g&Y7vObP#uW$qq@gf6Iwefo`}O?g4+KA{GdWY|qvm#2NZ+2&&+DH# zoj@kV5l@ZT=IivDlX&811348BerF(5kj>+amx+m(Ga-~irfkWA3n~VUSSQ+_NejhE zsguZ*aJZ`qrwRUQ3=eg}4Us*y{IXvDurgBT!0qLm*o}t4;brKaOOeu$<+$CRr?-re z-iptsR1^LTnwg5Y)_)-Ns-LGxOZmrn9g@SQ1V70|a2U9-dy&g5knf9K;i8+&SF4jw zXZ4=Yr2(T`Qd>V6;;BIqb64}lN+=^Ab2U?*6FQ%=4XTp^l%l!A3I`Awoetpj53M-x zHzZ>?om}Gp+RT@%=@c8w>U6!&Zhv2*+J;gkPiXaNT?~fEjX0lk{I${mfwujj!_HuC zacneH`ZNx4pL$>1%w}b%@2399qd11@L6O%0o@lbNY4a8IOaDF@g-JwRd1T%-fi%)A zk9`;AaVoXV=CLNP4L5u!nDJ|Sag8oosWQYI@j{l} zQtwoU(_Xc3+Q^=>b@N}pclmB*T6|{K7+Fxa0ISF~iox*MRM4Iuoh>yM^Om}MFTVB6 z=bT8?E^{H&^^)VUvHh-uSgy78(RJVbyw$qAV0Ct*6(R6S&Cy8YwmA3~pguSi zDwk^4mwk=m76GR|OX6UgrgdH}{zu@>yxYxBmlidR*WKPAs^)cH-kF!mGn<*tjXghx zK09c5)}N;om5_6pPQr!pNUe(V`g9bMFvX{pm)ZyeS0t(TWJ4JjndYcC3p;7MibA*@ zOD2k?ih0TZ?5&~D&ohH+vERAW0&V<8)zzc&C2N@+8b?677Y~csQ#3FmXwCWh00%*X!k@<|# zcFnKTIqI=5nm6iw+T>%Z`U^p%;sVg&4oc?~ugmXvFT9^7ewAFL?X^*oI>b{g!A4%o z-<&V(uOSWBwpjlMYIL4s>oJbRa*KLW>++;>Xb~q**dNiv8e(=FTU3NmZ$A4Y_}JF# z`2M;}Zo|eY;t@;R2v!&o7_<9G^YB5!adJ7owz2C#Yu=9>D4)vuw)&<;o9q>Q+>i!F z_oUO}GviD9^&+CJ>(cjDv$uR*yuSd&Ie7NtrOdsYM&2Ji;?gz@N$Jo$MK-)QEA(aF z@DcHvin;b*>8P3YWIESHWp)F>*S!Q0T_K{IJN7`3RVVdZC{G2Ny>pb`jONUx_tH~N z-p=?PIYL*#v8_I zs}c6Fu!{3z?!{l!kHqX2pSyVG7x`_#F-Kv$o$=Qm{jctWt65Ug=nsLX?MEa_pLPmP zU^}P5Zx3KJE*@4EmfXwx93w|O>!GIAJKJG)Jv*+QF{$vCOSGiN%zI%Eqj~%C#yW9Y z_+2^w=)!GxTmUb8aPkGz!Dr8vGfPG$+2vxAed2VR^7@@}2|bq4!jiK?bLDy+GIxFC z%LTlbGi9;-Ij}i3cyg>K=IDLXlQ>-47+}ZeZDu^J79p7!bsd%MA123q75IL>-c?2X=(c;_TXFeHIQ=$GAm}SO zPkhnQby@S#tKIE%p)1bNF5X%5*Y6(cFYLFue69`C{IEq1_U?lPTNgeO`t~-#pi#d% zB$b0qIxhMN-gaUTjSTB{!br}G4GZ%5l5N9FbsBdDhQ6mVT?$>Tdz5|&v3?$ToP*h! zo1^Z9jRiJ&sEAr-0*Y)wfU;c51iYj_}@P;!Xw8u z$1R%y!Lvy-?Luz+4R^bo1V)7bXrAIIAg!Zi<2dhjq1NpTcuNYK|4LgP2y5L?Q+@hPfu%x-~jjE*O!_5>~(9QzG@JTDjPs`Z@MtlIPX}Nl??PKCFP%6#=C)lYI$BN;?dl+Rk{WIinXMVt8LKLL ztm=#EkX3!Jd9l|o;IHt#Qyzr*E-1L}I?pcap0(1#Z-$jWiNbHBF?v#yYJQIJ#ehb) z^}@AV$syl|B%9x4`d(>VFOKt>(#@};oc~x^fL*xErqBz`=(5U1+xn$lWtBzI z<;8f64J$-dsz>`bn$%WImknJd3_3|pFgr`Tod2xZo4OHgC6DOziS~65eM8+f+gk#+ zXPMI%b_ZZKIm=J~2nx&as4v;-6}>$rusG)p8*R@35_KG^9>qkaOyq=YwVqMOMnS%> zSCHP@4bj&0F-wJBBfVVS!3EK#KbyOMcR(~z2e6CepUv}*Ihz}wiTCM!tf!fG({fb+ zbFY$)4nqMpeG8q@U9&vJtZ+9s2bj?7c04HL+Ttffcdc?rUegv19Bd?e=Yx4##^-o| z0rMf?+Mbp>)bcF0#>jG&gP$5j-Ag96lf zFI{WZ6aEOUm0&EV8;FF~*a@rYtIyR&nfYOIc#az#x@Hm#S|VTloDB#;Y)E3NJ0N zwYmNWste7$RfbVk)X6bgz;zE4&}aE=#ux6U(ZJ{amp(?j$)NfJBS5@2OfHSU1^|@L z>1O>RkdYy!pX)yGH8Y+F6v}4pVNkpC@js2k-S%%W@{isu)mv%%h5vZI2~Mp#i#n_= zg%7?vZlRU~LU5>;sAQb+>EDDOPdC+Gqg1dR53QZY>~y$yTD61 zxAZdS(MT5oD?d3xor^I;t^q13r8hjL8>+}kMPHcl{g_4d>~)tl=_h!_l`y+2862%T zu20Ubz|>2ksZ-?IJ4s?9qd$Jk;fZ@a@+~U{Pje6WF}&MR#r4B+t7jphlOJpDBS1m~ z{^xtuh8xy1`d%YSk#HQR+^jM+F}a)JcfaTvAl~8FWoD2mQ@#BsiS6Pt&~$o-9!uty z$x89W%l)XgZ&J%u6s{)td)#X{2rBB{TLy_|td@CACFExh*%w>HO?b2ljG?uQzu zeo?yBl+NgAES{-n_(SB0aN=~We_xtuof$XCB$}CJnMtzFW)468=$kR#&N(BVYdg!Klg_v2aFc*{WZ(Ju8PI$7M-|{5x%=)8GCT!`Zj?tFo}&s()->TjLG%>9BYm zgv&C_4qBc4lqp*r9!qw#{1|b=$F-DNU~dy7pf*Ybq-M<$H5ABsCd1cJ!% ztD3vtR7%v@gLkbxkdEV>HDF3>iyH9VCExZEWQR}kjU>8EejHLD5hqQhZA_Y>1 z9zK#htPOFuU>g=U`ab{-LGr#Z%Apu$tDK?Q4;4sJ@*^dYLC*r3ua*o49<)f|4k|1$ zPnUsAnG?x^n8xAWn6W_=dyztC&{SzNaJb!?ZhW@G_osAJS^!F~%grX{Jw^>Uk{1AC zsgE*Gn;=psP1yOd(wyfbb~@Aqj=hIkLhQR-@(l)eC;3%XfvVUndy1Kq7RvXk<8mAj zXfs*|?_IWzf}$j^L5A;A?m5U)QI}RAdUc>_jUa=Dq$32W;+3#LW$DtYNx1+yqC4sY zUv;=S6cD@j4oRX+pa2i8Rz`3)la)QaD$+xZ*(u(qo-s}WQUZ!!yxi0-&Ycbbs6?Sl zlsIlGwZx2|Z0X*m3ex<~-lKAvXy{B8$QD=Nk=M0JyJ!TD!mGYO8+oRyJGMWHi(QQ? zf@Bu!oYFge)vFQVfgK2{(l|rYBi5MgA(3)8=}5pS`OZZ(RJY9BW};Baq#nJEStHs- z2M9XT8H|`M#wq6!rt{yA#-MfpZN~@JmzeLVT(KPE6&R3$wJ4E8V2tgiOCpwRezfm# z$=qSV1R91i3v>jj{->Zbf}rbNs5f{nrdK4LW36$N$id+r>7hcb6Y2!O6$- zsXyT?vXW0N-Bfn>uYeoI`lHIzOEi)^zb;$&htseft5JMutWKd~m5iuHGI6+%dioP40K!8QY#cuw#aWkIwO|}D8S7pu$#I>bhy>EGm^Q$~=ialqq)%$L z@g1j|<%j3gbox~5uUb5r4_+PvE^x$W-lRzG2?u#Rvm*r5&}oPId!XK zQtsFSyiy@3Vi}kL??}%pWIGb0j-5;j50avULqcO6ZfoedsKhEMjWsQ z(AHe+yCdA~waA`DXJAsT9ahv9+T%TI!XEnUD3W*M&oYwbfASqkQeZZ9E5DqH>;cvdT^-6%8z~;tO^EY1Nzhd0JQCbl@b8Lyd`e$ zHhjdAI#9ZW&g?r7d((9_&`K!xNcB5xWSr)&e`wo;1I!sU;K_M(>9yRE+uEdStGL_D zMkTve5}0x$-6PbafrAn;^{b!SmX0?wDEimWzuKCSU%W*)YWKwXZp76$pqx?k0o84! zWdcEpnJ?|ecSsIv=e5*zMQyN4x7wBU9Z3%FIF>yRTE^n#N6;fsiWkUnk4hrdBa&h_ zfTp|``%hGOfM@xZh_!7_BOsCSzOSE46ykf})h+js(gBLFm-aw>(t>)|&*`dP7(iy} zNfx7i<*?`JL@FRrN6}*X(pFuPj2c^u`$$*~!HKVz@4Q>7*u;KrSAmmU5j^?$5?n72S&0EL{?q?W0Ql-td@0G{PUmA~!7i^;HDU^jB4dwvt#@qUL6m3fUn8%?hnR^2=jqti-Jgx_ry+nN9nUl;ZN$;_4ZX}~GIN@j5pKBC-+%9e7KO>H6Lva_(cY$99zwH@s70eOMbfiph09MKnGsqlc-ldcF zjI)Auw!3*Hxn*WgEK2QlKIeyq2ccEcw2~~;rOg9lMf#8sC>S|Gc5ho-J*TXUX z&=%IRA3o+N7{+psApP5(gbZcrU-pdBB8^C%TjTPF5k^#j+~KedXDl3;dsv@!M|Ev7 zoJar^)2Uj+z+mIsy?i7801XSeea#VDNk{I$Zgc8SVtp#jpU3j3?{yE8j)WcGOoNW~ zq;N7@iZ$0$?yv1DSLF`edefIshGGC8b?&E^0-DFy5*#RH9}rF=zi z@!=NSz3YT=_Zw*d{{XN@QJ-3u{ukwr)i6Z!GLRqV+7$YXf=+9iG@5oQGhGk3KHqIA z^2DH#PD`74I5Q3_;b-{mBr~c!8w7)i5?`Eq;~fWju%8)PGP2vqZWNA3Dc7f3B}v-A z>O~)J$EZXf60l|MR^YyhMfn&774X%^$0=>B<7lESCjS7RCm~QC!@fpGwRf5y#J1Fu zD}*c-KpPx`&uWJY8bV4()y7yiZf5`rl-^tH`D6roSI)Eew*K#!hQK=2S$tQ1u>RwR z9qC2&W93KE>3eJC;UoudT8!L6TX~RTzHhYgMy3ceW1p`rR%G!F;*7l8OLeT>NZfIO z^k3WUj@_&_(hXMCcyF0^aBJrg;w!k2`E6Dg#Fy;N`w!SjzhW_EKNKcnm5zbvR=oI4V2W#gFmI-US5Z ztBN_mVvA0X@hBllXL|sY#IM6YW*Jg{8@mVY*VA`(Cdo z`Rm|2@7g-TB$9h8m}XuF`qPj|{vD$~fvFevn6_gBJ&VSYaCc0H?|&Z){VPR*pF=rf zVX^nm+aTOYkZlyHdu<>kSXaU^{?k4kxtU?MhUwope=w>HcOc~F^rW->rF6HHMGP_! zH+i2jf~pV6fsdaflhX%|deuh*P-_zuedI2!zCvUHO-OI7+Fgv_O88O#0BD#zhu}#$ zCv0eV3I5hcQ`g#}{{V)MvXI8nv0H)jd1wv^9YH6hIN+yy3F4s7yv@=?{{S?AVxE`Q z&bbl*O?(#@?IEU#=WFpjyl&wz514U|zP*3oHKSqsMd?ym2_&1%lsiV@5z_>B!5P6H zhrK_jNQa3>+{=3sjl03mdUx6rA1MHe_;7r9((dhE{?_cCN*u1)gCgYq@6*utr^EX} zM)w8*aLu_3D?aGTk;vm6D<7-PGeub+ajo2OoV$h~ zz8P-P*4!@U2QICWG3|=(bblV|H^(^+r}&rUVAV>WFT^;jv+8xcjTMW!;+VRHyN@u+ zHj4Sqe%ww&~=+^lKHeI*_20X)Fsq&khcJy&&n-Twdyey1P`di!*%FnEhn499jD z)ke0V$rI=`ySG+d&z7kdP=Z3rthle9rSTrK9DA4V{*_Wc6Y9lFNc#%)3-Z)KroevtMNTQ~N>?H-nmK)S#1SWAj(e zaQL@V^!?Mwu<91RWd8t!y7e1jE%MaI#+rgI zz#E?RZlX0wGw8UlqLU+b-+GO%A&iADy1sKhFx4YG7Txdv0NB)Vc*9hXZk-(u``fot zgtaNdL+JSK?G&+{lr2d2*1H#Dj91Mu__tG+m5(q1s*kV^dsw zU)21Tl~D-!esQ}yyN$KHZfDAUp%v}C=j54N9`z@gW{MA(124UPbZTF;zM-Q2?$X0! zAC=l?`A0i=3OVEH&uU|S)Uc?vnFGlj+4+GR_kGq@9le^imL7I8bz>dR(geDxr+ch`d8;G{?(d{nuL~?_As=2HVD>6X$kK8_*@E@{?fPchmXriM-Q+op;cd% z#!DRKsQRq#Oe@E8^hGbMkO?D@6qCQLJ??D?z>t5tU!E)bOQo#V@I9u>Ne<@;CS;5s zK)@l#-s&p-r|k_5>`3NcF76%tG1{DT`Mc-o$K9b|>R&;|ygQ$LrQ{o#cMq4XK0E7l z$S$J4J7oQ(;<$?z@l6zx54|DaF#a45o1c2nwf&)^c*Jh<#>v+T2tVwKPXkeE#qFYg zf;OQEU!8{9SH880HZzUFz6ei`iE}EsjK^=gmnY|6pzr!sX8oW*lkCAB;a{IKDwqfE z@y=;`Hn$IL6YtpdD^v4%fYKZLXvSVe#e5xY@#I}cD%xgA?Nf8^QjzER^H(7F?{wh{ z!WbUpw&r90?`qGKCsrrjX@6@Pu?>Z&lTo!La_YXd@TmCRa~S(2(Lu8>xV|&~&une! zijF^xmrDpG{c-ZQ%Cy{l(Z;$y_4{?3orxmuKQ%DR2w$DUZRjiH-wJs8`@~TB&@#5( zGNk6a$h93^fJcz*UVzox$kGx`9_Y8$vHZqCwZ3k(FZPAJ*e>c;zI>YNR1N@R^Hq_l z>aj$j%LJtv^c+uliu%!V=0(Lraj9Ey$o+n8wcu;1>cf!u1FqpxHTI(-?Va}n$MZLDgr29bVj5AS{Iu5oV9e|=uk5TL$);8fW45E$=} z6+d_V+W4ba__e8N)5!}&vb1M$kg zg=rW`{3J=mAEFC;ZL=Z3#WFkla>TQbmcKV`{{U)PuU0iS`H?1F;1L)^#t9pBy-U_M>q;GB#$la7(C04Il9~7r7k==Skt`@Yty0A>92D z{?WC04kTT@s9X3xVde&}&ZPaQBpQqp+gg{hb$>E4-@ZBdl!Nz1&-T8RqYv#Wml~mm zPGwt9D|wKqec$Yid({12VCzKv3R}BlxwmcG){!pZW%*y_ug<&w0NO(4=^ZUo%Q190 zDjj?0_`l#(>p$8q;=*ewZZ3`N1q#W%e))fxACtJ~KZdDcs#@rWS|{kU-rFY)Af~;@VG{j32x6e}y28M9;P%lHFTiehoQihBn$-zy!p9RC1h)+f8I+z_1a4AmF*fK}eWDw^>#sA^+` ze|nAeJzTc)CmqFfL7-7R(REvGyII1Dsr{vH&w$t!;iBsNOS)6NYUlQi=@`x`VKhEl zquXWF?ZW)B15ibKY@v?vUMc;hs1(?8wGv)mD{pCA`@edeCMzE1*EZn&_1#b%LIBF4 z*DGEuZ|}hBcGoYic#l=lZJKE1#G{{^=2{^jQ9hVk=--7Ro#((LY@82T_%BxdqTfej zZn=AuT;Y{b9lbNjsK@O~X4iH>qc3YSZG7$z8iDtlsO0|uz_D69G@80be$p$c_raRo zWzU$Vr2BQYTjw7wd;=HlJ!C@3a&a<~=6PsBb>m=WC#M-T3x3m^$^5EihM!?ZX}ceM8>pl^_XVVDn{-@>1$@up{{V;=ek8Gu=E;8WT=VkQwEid6 zAq+lk*y~*U+`1cB`XF6ISLHN9Q0`wfewFidUN+Ru-@X3;0jXccSJt!t0IOr3^;?cH zK9Ok=Q{`%jZ()aSYHwtLG^^eW{rCqBic__ogqzEkytlNAkB{TA3m(W9aB)4jX8vEb61m zlZyG`ABZ<`j*J$iZywLFWpLjuOk`V$^b@p43|H>bGZ!jP-LIdd_=j*15Y4utm*N%C zL{(o4+tv_tS8Li5r@crB+2KcURAn{6P}Qg5Ql>Ux;wSDg=L%9QwEa0ApHeXUcoD zcQCQr*A${{`;=FKkBF%mGW1g28l-=T3B6@6wS6k2?k5x5)tU|8?NssM(N9Y7X?`Z6 zw&@!O-km4KTS%bX@0|79{4_-*J09SwSD^W-!6bq)#eCGi9K1B!+Dp+E(~mAwu(AID zX0)w-H0Y)@nn^{lC?8~}=BbUzf$vht%EKM0W1WidH&=wG#(xja-c&az&fBrKj-M&} z)oKrlx=zfk!kxe8ny9C-N4I>#kT5CAn-1L9ivIw@*U}x@I4)8`qjO{K^Y?bQ@qfT- zIDReZGc4)nDoGzWZ@SCtyQLAAyi6KB)mI}PwF548vVRSDkodKuOB$)WLLcScKfO@J z@oPnbH<(_dqOy#(<@t+k@99oRdRX_B46HXCZK%QX4%Hl2j30`6RO~ifrhEL{tv$Xe zX;x;Z*608fC9l>u= zQ@_OxAf>d{^KXvpcE?_vb*NP?Z5$m=$Fmgj+Zo&`!Gaxwt$4g&6ZDTEuA1aY7~8Za z;>Z32)Y4k~Q_^ICZqjsBC;Q*Pt+yhHRbOPkt4`Y<%==4j116^V3i|D@7e5trlEyn} z1D(pJo}2#dIld+7u|QgTw2x=Xa^H5ca`&!h^=WoJm2&J#{JUxs`@q;AHF)ix#Z4uq z`#MY{W$TZ-`O~8Ksi051o5(;$+t#;(_e%CM?0YU7DocE{*O-o+SC%itO+GX%w+KhE z%|74aK9h6^^U)bI@-g|2I_;rNL_LiA9+Mk6T(1>2NM1TunOl58(zm>VRA}N|&5z;R zPj89(4jEeRI1_H{$Z!w)rK_LXYB@r2@t&Bm8O_2NP8Cj9 z89#QD{u8|=RwWYv)19b4i|*vN&{ohyx)M8vEwO)!t}IIuBW9&Lw-J$dJ*j8w>wlOHU}MP8RJ&mYn6}1ws`W>_`SKPhl=c@K3u1Y(we-0?c?&~ z>UQp=Z<0(NmB}xPEZLKDjjiwAoP1lP${Hn;e%`(7M@Ywz>((WQocy&Clx6u=xm58s zo`}gC^{1zaZ4ngjT3*Pw#>Y}3-SQ5%OI%N&~U+49z$+*k66_9*Gr>;>X`MaFdG3(Yt?nr;{sy&k`2fMF3U%G*7cew@}Qd<)z%aSJtpby=5OEvZkb6V$71>VA=dN z6OTc`E{48#vV|L}O`%)mHIll$yu3!rxbIE=*td^!GX|sC3)!0rGL#q&qtbhU{4=AH^rjQAO3W z(wt_DO^nl3;!c#z;42}<_NfCm%EF^6rBLVPrD>o@`t6{0M9xSV6vc_6!}JEJ3(H`+ zR^9ch9%Fo?_-S6+k78L|Zr!$!Ixople8iq}nrdSzLE@PzOj1+sflrU1r+F%OZ~1C8 zXyfNOY6k(}d1=oyu13x(5hKcSI#ZY_UCd~>{g}YMSItwl-!HD}g(p@RVZ}%p2Hbm9 z-oXfvF)XT0SQr6=QvpJoS$b0$)vy5Dikp{m+A;0&vi;hMP0Rt3p>`Qu8c`z?^MBto zT!)YTKISOA0ZNG8TYt4l2u13@H9SZc zhFUCS*;wz#Pnc7Yq+s9d{{Rg>BaO@JNCb-@+5Z3np$LXYGGhbo)UdjT2Br}>DgpU^ z^+7MnNmbj5Lt|1!4Cfy$4>stqK3ZgBd#hEpNYL5{;iguE!1ohIM;#Jp_Hs_yNBJTL}OKB-l;Yrz^bpxDyz%$;L}NO-?#PYn;Jix^6`9)ZUMJb<3Y@S-bA1hH{w?Z}AyylitfaLQ| zeqmBa`?Xu;$0MZ*>;Y$W>CjWRw2g|ACPhX&erh9C&zRHz(!-+;DmIgz4@$hS;4=@J zs1*nqfcv!CcNpYs^2VYnrJ0A!X<_~0ZNi>o37q$*u!{I)A0uteIhle0MswDm%z;sx znqspr`?WXdfEjRAn~_p7`KY^k(y&t7kKL-$v1ZC~MxZuG+&&!fQY^bhGel!>+D`HO zUezCvRahfds8Ryw53`l1L?K^sA1SHWENirOsa|FB${%gCTFlY~IOJ3~KZQo@&$t>H zPFb8{rFa~s^y^Oj2$Zfwh`{Bz#XXmy^rv+^p46y{115S^!oaRY8Derq7uKRs5VH<5 zR-#cJLjBI&s!RvmX{^x{;c-$TyUWJuJ5$jFiRLXy zHaBv$d z{?#>*9y?Mps&YT?nrZ4?E~6zm0Xj7xfc&AGA!&fJzUCMvoFxw998m@q_loR=P8Xo5 z0t{7^g{Q-_+hPPZ?Z=92 zic_EA6-n928ROcfVtl?is`3bo=0|U8e2RzVBRhGhV?QdD;8fo$0Nn*R%al?=XXRXX zs`3n~=kHRMVc&H&VIdoc=}vzMI}xmbMmma!<)L0Fxhlax$UXl6yGtOHC<(|EqE_gP zhv6Jzp+UU)c;r;sm<`R>y){Bd^KQ*jh!K#;*~b)!*&Opz`CEfAZPi2fi03^j(?vxV z5fzY=)oQc0TL+~|#bfznY!>FC`D9jXVXAJJN;(gUGaGwUN6RkV&T2AWa08&Gzmgve zw8@RS65JVhK~SJYQdm+Q=)jDgD!fM@cz(1Y4#9kp(9@DMRU!HR01A(cWqMU-V;RnR z&`!vkDw|67r2t9JYOqiaSnZ@Ne~XWLX;_zXK+K_#^O|C!V<)XwnVUQlOo*^-Hy~3; zann*`(BSl_1caR9j`c5_8Ew5YO`Iuk5ccMdRxVZoL@}~AEmb3k5x91z2)6KgQzmew zLj1U;)E4#y-Y|2;MC=ISpOV8MVAOjGrevULXf&%PFnAONR$~3?FuY)zgk~Vh=7M$} z?UvwU6KN&ZI3>rE0g zmq{t*Sb_c8U?pV?!-|lN+1hX^wh>)O!xwR$f|1(^fI06`zX5ao>VcV+vc2is-7XaF zL`$RKjs-?Ob|H`5=B9R(XLVKD!PJVm$!sY-1o?Bc^Ny6wxol^TdXtFG<>wU(Oxy4) zE?|ol-9v3WVxwmTb~j3CR+n=gXjl-2&)yZK;uZmfUbr<`m~`(`w%m-41w|U>Po)OY zR@{y7s!y#|I9@`$SXB3hX0+)Z&;Sk>@^Re82edKH`;j%XJt+(RpVF zj=AYy1y*UTPo}2X_HV;$WV+I0eT;%t5`g`FW61pL)92Dcl^Dq$mFM3G+2_-3<5Up@ zLAV@cfEe69r<(TJVi~|3*Un8^N2;Y{ajT}r8{uHA|a{Mm>yBCay!U|a7axg|HOskx0X(TWuGCS0%r71ru@GG{4 z*8rCpsTSD}@Zyt0QaE9w4cTEh32gNm3HzzZuHXAVZodq_FA|jZZYjrN1&fC-n&6+ zpzai_3mlAaDpi5Z;ZsE;J+{;T0O21m^Wy^*-V0SHBBofrU8*RLkaHXe(DsZ0v<~#q zq8LGA_*Z}BD2$^neJP?9kokD5Ev<=*ICas{#$0ekS4{v0J33dSE}D+2y#*|GD;Xm> z0<>{u^B#QKBO{Hg$8$|>7?x7Qt$H%Ttov7}rCT*WGblK$8q}3D&i??i$~VlUibJCr z7-V9-BwEJAmQ1Z8#Ts;9mYs!vc=NyPcMXFd6=^hK9AZK-UFf#mgvZJ%QxI|?Ve$^t zptT&Ncn66za$;ve)0+9#{u3SC%O|NI4@&zh#x`H^FJOz49$SvRKVPMMnXMl#@UGr{ z#dT1NQ5DgLZ77o5l?7FOMQOm1v`Py5iluWZ#$%2|&hEJM`c?aO+aM$EFWs(*M9xyw zvQF5F1?RD-S>*DB80M_O3(C#8zHYvh$x>+KE(SvX02i%GfSS_fn>iXb2){S2dRBuv zKGY(-t8}r)y#XiF`^#RVprl9^A`S6wUrYvFeDrt^aS*;T2zJO zFq4g=y?GywZBgKFCpaB($34FqZa(od*z)HYDvaBh)~qBWv?>PjFn0E=J4jAWSdu+| zyYE(-<{-i?m|^@wt#1lvEln7ginhLFjJY`c39k~?u5~D`-sS)q&kd7|dkXPQx@=}Qu$vY;|<5HUoR=k8BD(OJKc=@_~hs1&&zXR6+aA^PV2lV^ z$NoL*UqyT;Grg=ZyQu(f#&eANdIMaw`FT$KJheTp2=^1m%}3e7HcIuW!aBHp-*%>1 z1c#d7cD9G9P2W>{t787R z#y{GxnY>(l$r>_nOL6UAPv6FZ*?{}4UpIKzMP+aW!P+F{dxQ0=rv_nCT@D7?0x=t% z#U`#<(Hkw+PkS!Joz)qFD>ns?9D&!vGx5iS?3R^7LCb| z*znauQ~N?{lFcbBvNqtom$%DAPU@gWK2|$cy?S&~Ji3!+s8lkuMovDpV%FEmcaq*i z8F8F?H?2auN-1;mb;VfH^y`i9f2m9p&p*0M@Q6AOUTWM?KJjMM%^6Me875JOewp{$ zIHwC_o_Br3ebR7h%%U*C20+IIbgJmHK+l7iTylHnu|~1xCezH4$n#w}c^BnD*+pGT zHhD~d5UdV=y--Y7o31%wSW5RCWYFm5nWD^JI8@>)l4_oCcvk>Ve4 zbZ@)!R8w6^<^nhg`qJk%jNQxjki7Q`v51jt>%Rc`M^2B)UoE!$%bnkk<6j+F-Ab1+ zv}wC@cCWHN9^9EM1dHFfQX-76{ij0ZRPFp(g;I zxvrDL2#J1%Rq4{EF;*LAZExY2WwHQ_v940xS>r9DOppG}SxqU(!wxIgbnJ1hfK!-I#i@M*z$=q39zynjy)=3+xF)b>z~=OWro^;G*>?{ z`Dn216UpY%3qC^eL+IoTD6dytB{wkJx}MrP2I=xIdQmjyJdWQ%m<9QBmg1$8N0@{D z)q3(-M>f@raZ%4>2xU?zi;&wqlGj2D^2|4TQ_g~OlhVC?G-M+n{J5kVKn=HV%xT3k zE_m~3WQ~J?S^ogoGNWgA%U<6emjDb|K5DQ1jFNwGNWsaR$*(lTS##U%YCsrHs!Ex$xX>jUL~-Up)BA2<@*{IL95w`%BYxeYtz5 zC`XqDzD)Ro4YXIQvM-de$MJ5hsVk8t&n%54f0MEUjHNZP^UsQk+(|5wMTCoTs{3~5y?J1@igHh#mHVuq@m{C#HYQv1 zWkUX?0$-16(oQ$i?Vu}H)b^B>(OcH#d3 z0{hi_&SJaE94OT^qTkv2#B%TB(v5v;OYGcZ4;T}1NN4A^bd+oWf< z*jah3SVB!6?eJBhSkfp#cRzWT<`wkIF2+*lrF`A+CJ31Mak!DeJC%Cv?ntku>dWmQ8i7MRfte5R}*A2Uf% z;AKy09ngaS5Lf0^sI~^(k@Ho7ye3d|q*O&YZfSaz7?t5&{{S!dY4qy3jM-Ey7x8ncZseV)0>@(B#qgA_xuO7 zeM9jaUdgP;@(@`4^&fOFAK_muc*+ZTZW4FOzZ-wruU89AT=H>~XyqogN#%+)n8r^n z{@3GIJjoy{Z5tMfsi55(O6%p5(Ek9nP?GqE8@C^s{p-3^?0HI~HB#m{-;h`MPqh#_ zxsfBvt93Op2hacYm0BF_q65B_eojLxLy^^)Z8mxLih{eN|9AI`@zhz{W zX#W6aa)M^{s!;%uZ)XIb;O|#$)5=s1a$oeU)ify8W#qSZW;5sI^!_TjZvt)!l05}g zjg=+9-OpoJA-YGCsm#e{_L*r;>~95b67UZnrVq3noGne`>>7u;NQhvCY@<0k3TEtu&m2eN!3zT1Pa}> zW%<6szjyoJFDqQKv8!*PcG>|W68`|f+NVTux=9ZeP9@#su+IK>k9yF^aH#(P!(4o- zS``+`tFYYRSD*H(Qj0CzakKDPQ(iFc!5OkCu-cC{1<%jCZaqFRLYiTB&Qg>t-7{SNQx4*S| zSco(EhP>ydRCBb=F z@U6F+ecUD)6?w)!R{sDRyP!oJnw&AtO2UK^Lhp4&Zg4xACmlBxD!%#pSMX;-S^PT# z#}-Hqj{dHv<{0gcpYK<9s%SWpR0Hm{U-%!StN2?_k_33;hTb$y{{Snv$MJ*6KgEWx zSG?0fSs14*!oGG(Tb|9&ozI744ZV6)7aCNADz$q=wy6#fr^{LIrN=8`L5$PqW9B@L zJrIC%_moqUMt1pAtADdzt^Jc6FUVXPwQr>=K4V|^smc};JY{q_V}HB%e}<-m!`CNq zJTLca*Jsk>M^^(h_$))^c6I(L7rUVDc);-M$lD3xrT)NWZk6l_q@CyG+qRVHQG>T1 zEnJsTIUYi~JMXC5MlJJKt;?l_`GWNOw9o8?*@us9L>e8>C5uLR0|F{2^l3xku*+V> z9*`B4l`0dV72L&YqfH5(NZJ&Ea$21plEf;v0=-#ukE7^eA0bIEQr zHUnnWsh2_W_Q|^?NB3*h#*&*9<2z_=APz!(>WBi^@)gjYNq0(WQ=oZgn4dd7F6of8D6RvKlGdp$3K+vQ%ACW++}f!2pFbf~0{7neen-;}`q^?3J>wAF$mAdrZYs9&2b zzjqb(Gic+KBRhqB_3FKWEu~6~)^-=PXJhBy+(e9$ z?A!NQPCjaiKkY53pJ+XH^);Jf%!(rb??JY;BSPoQUCXk#TGY}qEeWsT+!=~zuRnYJ zs&&M2uuM*VQT#@uONmU1NZc3Ys`ARAL14gtdZJe}r&0AZw8bKp4j+q-l&Z#nxp%Jtk_d!OR1_SLm1Rs?&;Nf2#KzujNq`c@{hqOO&7 zEsST%{qbDmKhLN4sswqWjM}l>2gT7z8 z4Y6fucYLktwVw!wVglPF#afACNZ)we&)%kXJL%C~jkeV9=T9%qA#v9qcB6akRLUiJ zyu-WY4f72BDvANIe6}a}aau8}BJ5$D{%cVi8@f^KSxsM4L}&9d&Hn%a3e`;NI)t(L zayC%>xb0PP$mK`Qe(e$?G-g8ENatfh68oub}9ynbv`9x|;cKRIgB33V5%?T@7}pafmOcKZhr60^8M_FSI_`iyyw7R+bTmTXmzp~bxs!`P(Rq%IOAE&y1 zm8sardub;1kZ^sdlFixn`JAu4cn`u~A6v&XJ{rHha_jQON~=fe5#M&;e)c~q`d(;w z5;FX)T=1u@&!4GH#o3svYFWV&wgqWLWF%!}IH=eNFc00U&`Y^@ecIL((lT%@MWrES zF6VFiHDKw}va*B4Nd?$DQR>jR5sU#(*`jnXj+ZvzrS}T6{f~4;M_SsAyvF&4YF{%a zXG2TbqzN3`X%|@8&JS9rYoXrTOwvN$TE5-u{p@tE#hYLUKU#QWBJVt6hZ~QPoU&P5 zvmMS@(`2x`e=HeD*xBn{Bq7-|#Y7yH>6}zYaak0;$8_=V-zokYjV!L1s0~{2NK9B^ z^rwrKgn_n+q%KrtrKYBgKx`+qJ#6peTyAE~YsWcdT=l89ux<|`tCW1lF4}eajt&U) zsSFyZP#N={wbJg{j2^U%&Zm<_gmZD(YGH%={%)<+4-s?Y7=hN#WzC!@a$y$yH>~`{mP2tR@D*~8>>;_EPnS+)tz%1x{->C zl+cWOj}mH7F6{2bK)x~5im5!~?uyU4i3_}7?yAXd&f{X?R=FCmTIWq4iS-%C1Z~^a zoIF*iK-u}5H5QYkNhG_68ToPRTNC(pP%w$Lt2-u!)y{5zAL?;V4%TqL!%~lkcPOj- zwmPxbV#4FmR`JC|sDMQ9dDDG_8W!UU5>V#9NWSG48HKwVV6fX^{AS<%0}# zqT{jLC&VrZEsxfw9}oh`?f%tp5a=Zzd)24W9!1IyJ?Oa-M_@i71;1TB2$WVRyPQ_c41C4WI*}^c*@0? zZkGYRT8I7;ix6_Jm9GVRYo<(`?*9OKqlO!T#Z8Rv323c zzcurf&7In=S_pNo<8f3%A_75vzI83hF@Cw!L9Cw z)kiq2+skYC<7HciUOMOIU-xOoNxKO8PCpgdG=?^i5<2rwJ|?pR2*Io3RMb2}WxZ}^ zXI3hPqiWOg|d931R9h65{pUX@}0)vUl6~F^(QKV zO|FXH@Dgh-EnfZ3=`Icf3^{&B{0g74V@KYj#8xIxBuSSZ^uyu{MP^X=$GvK*O!+tgK z5Bw#1oTFy)&-_hL$Ks7z-cuwKx${pUzli$#Ref2H*}c!YV(}K7@og>B`=*BR4S*yQ zpYGoo4_d$UzWfSNwtI{l{H7ykgqswMFSi}WO~ z*1j)`#+uVxM*_@F&N<|f=xVz7&t4KP*U0<7dl>%!8eYIrj)&Uk#8wP`@L~6UQ}=0Q z@eQnMi5E|;d~5#z33i|p9%F750P$|VvE?Oa$@(69{uDzD$7Ah}?f63NSH(sBvuIZg z%Zm8k*TtHpx?yK&9~mW%?rOZ=G}flJFv%-8ZYsX2gG23<)oh|0_X=>Wh!FL#6mb@x|5Z|4uNd!@E z;(PFnxFh}rMqk^)GEwbze;qns7$Hiyarzo>Pau03B@${vr^qt z3isew&$D>;XruGTLGsloz9UUMxF-Pr06Np^%^|u+(SC4|@DCLeT|kYuJuByn?}-;N z0TBT~>U-8pd`*fG`^I1ped;xN))AgSkA}RcFh{TX-Q4Zxcrsz^89<#o=iWQgbq|8 zI6qU4D%H=&y9gm$ac?}6JeXXNphxORC!F*cs&u8;(g^ybNWNy(rpl~`avbKqZHMB# z6YOB&Gt?Iwsj_@zvbGGWOtS;DAtgc2z70!=K>A!0!EsSLBrZ2}J*(#B_`hu{N%L)C zjf=aMC-eYSq47r1rB#|k8e^$B8Kje1h0mf=SpIFp0--mMfr|Ov{wGrmc~s>BYA2$`76fL#q$*94;3H$CO4){>JB|A zN!bo4^`@D4=L>#$!V?om)X=aY)@@#6X6m!Tk3OXHc9 z$uXP(-@QyEQjL#fXN`vJb4lirwN&RH!(K+-HC9f){<@@mb0l)(CwD>VOPv!PbUm+l zS0P8;s^yfNpPIaV{BbeL0fK6>`2JXt1hE~%D#Nk&6{J}jYaHyN)iJ~xkO55pdmN#m&Ekzrw+f_Hi!OncLERuftt zoF56v`Kkb2q}`q?%m<7!zDMcXHC{g)Fn=tcp)}&rH%RqK1{XfG(K@En+}D;L9%gNW zoPR1=ykvn@+4(1>E@W3HQ`DMbgbul=rIB{$y?Jr*o(5IARBz*?J4P~F*i_t@!pEmE zbUZdUQu(`wmRlb6=BLKdo&g6wwH%%_wPI6$N~G0?YaWrnQu+I}SLP!nvPF67c)Tzw z&&PU={8q8ZyBuPiSR>H9@Zm@l=8%A_c&-Qj6Kh3p-pYtaYN>JKh)Rcx<{y<8(5)x>f%F?cGs0Z#9bm0{+Dnee!zl%Tw<$#!o;)kl1U^* zNl6QXo}S{V(Qjb(ZR~o(kOnFpfQ*h5*N;i@BTfa++7WgseY?JLqp1tlsm1Y2PM+PI zJ_?V!xE4OR_2aKRQS~~HREmrrW7^V4ljH`FJZ?4v*1TZ+O3|Qb%+q|5jmlIKSaZl9 zQBbGFjRI?#ZLOWu+v9UE0dvJjGTa)3f`l;T zE5gsk{{Re_jE3=IJHl;{6=9w^1atURn~#c`G%qEkyrSw@{{Yqq+DsC|Iduh2Nm&2V{L&X6W*=<2;{yl3C!qJOXkC&`@(;Rmj==hw=PhlF zdu;@Sq!@25?7HU!A#Wsr0nueYNm^_j*;T+^F*<1@|US^>dKSIL19W zz#VJo31Sg9T#EU_;LX#?YX!8<9!O#fk4V7zdG0_Q;=Yb%&I5W^jaokQJx+x~^0iE> zk&0_BGN4kfReoy2$hZ~~Fn;&mTCj_>Wb=xsxeb-;Ru?L~^O`Qx90`Jv_eBVq`G1O% zFO_gj0zX5|M5I}5kdd_ZsFiuzM@p4Q3Aoa(#mVH=-2pUU06pfjMK=+ z0Q}U`NEV!n0Zvaqw^hQ7VI+bf>A#GCEVRT;aG{O_i?1 zP(=Xe9GV&fzX;U$B2)thuQg|A#s~1wq6JYH3d(6B3KwhgDo}SE_Z4KsHe~gr`9*cq zuD)2#(aj);kV*=YPnV}^mnj@(X*g6FKHr5>T7qYtc(gj%zD@=?$9nlQ#A%ziw=1=? zUtM^<%A12>$LUuWxtoD_E?v$D0C0UOA(FxOoC+lQ?m27#E6eZpuem^=E;+w{kabuORVlt+oi5mEE2_D09~1mgkg4Lo-VM04aWe(G-!GiDmDe zX=V}$89?2i(yP0;iHfF38OLhqrzFlvUd5}c$Bxb9MCFDL(!4KNnc{yk6!OzNSGGj4 zU0N-{A1jVS3=!LQFAg!ADWrqpHbGjD8(LrC7HI*47^G*NYAjVAL}R0yMj>j z>MDh-5j=ik0F2#7dbtF!*lrL3=EgD8pf$XkIGH=U#6`mpr>D6!r*Cs@_H%b3$parZ zsjOM8)uN8(VVO_LNdC2GLV_$tqi7p>`MUL|8feu!MChz8A(9nr?UGMQy#olrjmB7a z9Ok*JZPxx#R@$gAan`p|ctW2npEZ9WSk#Za3TCuXY>kpM2>o~adR3U#LQ$Ln8w_>) zDa(ZMJ<9pBN9ACVu=-YW*r+=fn_;*6D|4Tp>t6HljI4IW6}~|EBaDNN z{{ZaQfl4{sf&lA}yIHASh_hM&BB4({kf4*jZFi?P94 zK?dwG;;cp$RE*}hrj^fT50r_S+i0lWU#>skHDkzfF%+O}^`^8%pLT026pGxi+~WeL zjUCr++z;}us_1#tP;b|?TnopPk)3$5S zq><&+JOfr(-&1Me%PRc8dxP|*#7T*o*x}Iq)6?nr*2cXZm9#3+A1(a_V%qs>ZmSX9 z{qWt-y?PM6v^@Ko7I&r9%&}~B>b-I8?^e9#k$jn(WM`vhu~I~V{L+VPAhW9V#ZKCl zwbI8Wq<(Y`G9RG_-F+)Ygl>j(+lSn%Q!6oTuf}UAT%$}amZVCAnk*|wC-NbWa)$o^bYi!Sz=}M$+CZ#u?-)K?4bT4oj@60bn)VV0%;WfX zZ57JmhZbtvu)2$q1s4CY8LBM=T(5 zC4GbN);#Hv%Lyz$i#&YT=jHUTj%}_47x5$f=&jGSeW~!}#JWn&@}YH5R;I4UUJ2@V zBnCY`YC#t5&b?`S>s*{}l7&)wS54t7qiw3D)!(}d^sHPgR8jR^ zgckO(uaoyk{{X&gF7g=Tk>%;SwrmFL2-{~SsOk}Hjfky1o3WhtvB%2_$S^W06}B!u zZW^@M1sKIZtL2}UnwT(5rm%(SN?~#^4Qj@LqrvKG2uLN-J9VWhWks375?Cz1!&V*@ zm2-`?bIViKg^g3MY7|0F;V@oDS0M?R~Bb-xwt}~6Iqm)V9sH)KQ`_!qG48N^tEND0*G@e=wx#F_0isTc( zIz#;kOQI z@(800RC7`!CGp!et%H#q#;k}e+ntO?-=%z6^cl%3BfiX?Sul<~z}gtQ6@ZZ!-lQA|?wJ!$L2O#~I!1DZ_v+u~Ki zUf;_E(wP$9Zy5WnUQ6aW6pemFKX|uV_AiJRP}!G}BlB3c)BHPe_gi&%h}5CJaU5#W zmj3`}YW{WV;i;=0MkV{!HX&y?Ob?g&)X{Gn{L{NN0_=?t6#2ip8noalpCJl7-M=+l ztaG)g9lWl|v!VY0YPD=+-EGJG3pI|@2=0K|zF_V5zdE{;N4w9I;WusD{`d5vOG25j zj9Nv1DVJ#L{54|Uc*WnBw{j2Ssy=f@yKTuvZ{=FHk*I{W>@dd_jYxuJ(X-AGpx^!7 zzr$J<^2*4&!A#GAgJiZZj{oaTDuS)q3$CmTUC>Bq?Ss!se)#_mp$3_bxl6$F*uL=@*heFp zmT4zh7DfXgbnQ`Zb%bsCJx}{o{{WqB)nESltogLDB+HX@GGnd)B0+_ckrs&yn4H1(dU^vJAJ5b_n7Hes1GENN2 zcCYdO0D8MyR*@rRhxkVCmblF<+|1%F#IWks*;%AeyH6qQ_kX)s&c(r+Rx2a~GJM`| z%5(fRVpt)HOe17}6LtI50;&7xcH*XqvNEau^>NNV^~!|1k!^1@6VZS1+I_XVE!-u> z?6CQNy+UF%`MAwbY{hPE`1KPXiU8ivEOO>Ue>QgF6SgXakZb)y(I#x5(Zkl=i+RFJr+ioagp2Zt~k z%Tr)Xt2hfKrrX1R<1AL<(#Xd#`3z!DIdIX z_kEZ0{cF*$ZIw5~i}zU9g-$5;xtWaH(l zwuPC)P4k>YtJmgQY;Xhw9yeB&*89O}%O2(2-=$~3~hrOTct+P7j*-mt)m7;2;!OKF77(h11>lfWXtxVXvBkQ9V+9dSekN1 z90GpzP`cd92;=1+cApCMC%s-VV}i8bC)7quQj>bpX zL#Yma?J!$9jDHPo2tbUNA2mjZsxo*2t~AKzF&YNiyG=jr$94g&WRH1eQBDyUNXX#U zceB)d=Q%7G%9Z?U<-d#mQhlKnSy>luf8PH9X1=<4xoE#!BSL=zJrn%JFKuSNQ&KWvVWjR@~n%>fF|}@ozVo12F)Sb6Btf>4qCuw(sv( zWD`6o=^|+DR?~o{HwQ*mbqJ3oJpO$Ep?XC68=szSxZ3jShdNQcSZqVr>rtR*)sHKi!x z2#Y>yjk7FQ*k;%pPrBpo`&Yy|M6xce z3P!m3({6t5?aTM8?(Yc3&8MkOnEWfAs!Nr7mMJ3#{i>mBf8k!)tI^2t${9}OU%gq`w~9r& zRoyf7{{VKUSgLoW%<5Ag{Bhj8+Xc$@`|VD%C4xRkM?Rw)udGtw;k(3 z2m}vq&*yxH{ht2-?^RNtXJ?Q${iBui_pKzhZ!Mx}e8gU@{?${CSYkzm;K}EoRjIvz ziU}Zfa}M_iHyy*jdWJM>yG8T9O#R_n>gVA|#Q#!JPf?;`wVnN$sI6YJ^MZTc+C9DX9>wgfd&I zv59iO-Sns=5yP@iy08BLeAQ?b72YBDAES2v0D)74V&WuuN6Qv|Wv+-mQz^`4-PhS< zRgqd#FaA6K0NB?zbv@KFC}vT&<`}KJiS6W*?8uG1zlnc_vhFsPNTna}FZO7R^*H3p zkUHJAXZ_rpbMmj=+x%4n%DzmF4-5CP+O10R*~lata2IN@{_R-Ow71nHGOStM*Zr#K zr8n5)l&!ggq-wWTPEX&BSZ*J5zts8){S)|M@e;?y8ZDKPd0tqf5xdCy+j{zz`Mz)A zHS*VoehunACACYPE&>;JS(JRme(xFiN&f(5zK-xW!4&YsiE|8+332<)=j3Pm+1ZXi z@2aU<$Bm7gUgx=+7GSP9S_C^jLBOl<2`$t>{L`fYm>{T5$CYCuJ@GSt6(oE1=ps``0xL!x-sWA;1brrD4F;R>tFwl{%38 zb~T!kD<(;)44zsYwAveG6ijF&?*!^m6H;fU@ONGf4A1~$q0KRGi z!{ys`BFVV(+LA)ew`E@`aYg0%6>-3+<8LurilMxQP&(7nMnul)6h{0m0sDT^O08vJLyE2YHG$+lRtEfRBY-`m%ECnll+-KdW2+j^Bc8V9g%4=pb~RJ z27kP~Rd$t;vZr-OvTf#G4HpY&Rh#!xZ51E-N8WBI-rMrsYH;pROr0ou6%v_+_bX@a z);-H@+`gUbc0(ZfP?bu|xPUJ`TC!^7a-7hI4U^KY!Dr?WO5-)6En;3s`KtA#L(E@F zuI+|m!4u;hX<^8xcx4r7p$MpE03R;?zH0>m=4(5`5c8{{WVy2pD--+`_IXY~hZI-BeWH*+C*7Ep@92RwjW5aZzDj%;MWZ zQqASA+LGT%3U(CAS7`7fel-fJ#9B36tx_71$w{Kd7w+Pj9*h*Uu7efYi%{u?6y>-1 zbLmRKbBsD%VK;>zH8^Pz$T9#G)ucj0u#PG5+x6#fr4}XCeGU>mC(3>oAT?Mza7XhU zKJ9jE1YKqO!j@}cEO_WBO2j#w6~>I01A2^ARnZ7m%5ASf5F#S3IHySzdv@&kjVl^P zN1iT@tGKGvk!fTyl9^iX&8%@Y;Y~|qj57hcj!{Zy1NIaTunouQP|4xtaguP~?$@A0 zZh@J|=Bu<>bAi^Hi3l*`Z#$UZsMdA3&j6!_1+&n790bK2;m}6JKUzU}JeGV18 zGOL~VZ2thWS?9wm3;COPHR?tzDxKdgK$d&=V0^T4lgxR{8Yh^$3XBhG$JX>)aceAP zut@veE7ts&<7J95Tz`llhA1R=7$+(|wWN7L>U@E%D*de6lb4LdWeFz!hnaq$k5AxK)HH>ULVxdT_THwvU68``Y{{ZV% zlu;w7Jl2lFxabIqEXX$EpA4+h6)V4g=}{qyQt00{-~9@eGMjP5Tv`HC6p%5950kGn zM~%ZMN!?OME6BwkAP$A7i)eDh{&h&Wk}9E%vBo(y43Z6^BAErhDzOUi-2N2|kVuCJ ze>xd(BZf2#%7Yabl2&D#or_iyDI>$U>*-b=JTimR(yA=RMJ0=LttQjYN^p|mMhI8r z=ql=(9$qZQ}|V zPfu#NEQ*42#(2$U!V1P@5spF+m~^d+coox*H+2-)bmAK^^fk7yEMY(x_n{*0X2oIx zsb7`1cdaFd%LoX`9VrY>PCtgM!hF&MgQZ+hudRpqNX`QeSN{MVp<)Xr+|{orlev5J zrYt`u&A&A`?iU!r32oh}UOzM;i{;pJNQCDMxhqzp-}k~*$~PwZlf|`DXg;V%yg0GfXpOv>#eWF6j56hpI z=~X0!EA%TJ(lIHKb7ZJ%h40a;_0OPevEg)>OsNTbIaS+c5$NSa7 z>le1kF|$dCkpBP;SiHVnz(R7_!1p!I-jtD%**|=p#W=<8V<|EzE=(~n9EJILu2LCf zX}k1PgZ7p>6^sg@E_ww$?f3pU999qrQ4pO_Y(Xz$J&A zc_Y8q71YLj(hD3B-m!G7E^@4~y34i}ZK1o?=Y_1~i%|1KnMXJPo&l^`B|;ihJ4%ob z(!CGi_LOd~46LD*d-~K=vfR6NJt`YXSPb?RVPHjGM$=sa+j(RM9IXj%n@ceIS0wCh zNatj?U@%2j`zXqQGhHFH5)QPmz_GAGIXqTP>Ra+K{{XYF6~N6crkJx$mmhbfc8O=S z0K@58wpw}#Hx#RkGz8ByxzS5V#0+~@6xsxxde^^Aq(aAdQNXT#T{a-wLe_IuV{INb zG#KMhxyyH` zJmK_q4flR(sXmn^ako2b)rE>m8+gI0@1`IdNX9DT9RzvAdTggFvo#m?M30}B1LLgUNZf+@hRW6DZq+o@?{cF?W(;^?b3(Z9)m=lKsZE4E6 zM>%O@%D%)=+GbP0=jbV7(@cYYGN+JxSEfl}2qS9XR7S=kGQ*09*ip8}nw=h5w<>UJ zHt$QC81ff(I%BnZ;I&vrK+Y>KP_&G~(hrvao;z1fEg7ZNkCi-M8^o(D>`=Bw)5jl5 z@!N}w!8T*u$Z`THE1$2@y@TQlG?#8N-A@W_8yY->=cm)_P{hnwnX$XCv8dsU#s02VW#x%);XcB; z+}PaFGF)ETq6CeJdL-qk`1`)BMK?D@d;?`Gzv9>)49bluZ%| zRDf9hHyVoB(A^4U%jzMkve($IQwrlI_bXT-o4Dc(;#IJbu z;MI!G$AT%uuLN`JNXl64UI3;b+D=7sG+i>%_&!Y{<} zoM*q+wS8f(ZI;>J06DLgylBcVj{d}Awx+cPaK2b9$Ob#+s2L<_P$D0bub~xYSxEw8 z@_N+K6_zhKe(>hDr~TtOG1Co!-Z;zSpdD#qk(M&NxrzjgZkMR)!hxJhFGN3f-E<7~%iJO=Gu&xaZ{b&nhqidN=&86J-JAGt*xg?Rq} zjBW`9QF6`K0=<4nfEX*+#BW+mmi1Mu4o8|NrE6f$tfu7XaSiRFi zyZ52_jyR~VqmMavn#G! z?*hKNtJ#&#PIDn%neARV;_ol*%PV7gaCZCGp@xp9C3kq3s)84hh|HME{{RT9HqpGp zCyJvATwEkU(ikVP}n=ISv$zht4sI=#td)>}XHtnNx2mw1PTSiEYv}ft5-q z;Cod)F6cbs+Ey;y;m-oCv-wXYypsO_7Du<|S>2(n3q;71tZ&0GBo4G;(gGyL*ncW?gyT~7i#Zu?UCf-Y90nb@js#-*x%qcmj!_0MY72$C{I4p2fcPp)e^ z)r-btknBh4>suCxU{)vhh5FV}xa>~^cW8$hF^`w#>?uTnp8J+ z?N?B**^`~JH&t(6N=bJaJ9#NDn;zf~-v0o4uLoG8+@e$kcWyO%-shyBBS{Lpx}-uF^5l>Yt1lX{;QXSY!bcWMWY!%^jCB~*VVRd}~3JICc&d#++uTr;XOc(X{6BZnwvu5X zXk9Yc+nVI78;&mMy98@82T4Pf>PI-KzIXsh4(2@@Ju0$E9gg7?J6=twaKCta)$9n- zBr)$+`@QkE*0bb8h`wFN*;GZ7&fT?OY4J-4Ta$u5W!pp>rG=CdAFs>BTap=#pP9D- z8|5G2S}I~b_+c?RUA$6(`?Xa0Tlj~qe1~qaCB#cUe5K0DRT2?}ZPEx{j!8lpzSh3Q(#I(w#9 z)ZnBlB+qJ1ico<%#!3Qp11qBz(wNF;o9>0JqQ z1UC;GVDzaMe4Vz6Ig|zd?FTzmds0yq$+A>zH3A-}PiVmkHvH5Bw|3Er zlzrYR8xCT*Kwh3<&M?PyG$23)KO=I1L|H_8O8kPJ$IB{D%}&FoUi8wS@M_k8JRI#m z!&8PR{{Xq@)mdHfwMWTH7@)_kM3}FsW#S3N|9TrhEMM;6$_J8thzj#*%ba*U_-UyZ!~*s-n49Bz(Q=ZowmpB~?ws{i?a8Vq0a%XNpbegKMQ|+1tCKTu-@N{{RnW z{{U*Jc_}&BB5gn2>AJRHiT>%6ZqJwI=~-V<*tr$@M9enlVydEj+TVeSLQDhaZ@d1> zfA%%c#v$3}$hlv-wbRczA*p=#bXzK=70@$LHjyK2&`iyF4v3N7P8 zrb5`OC6{A``?Z6XrE?GYW4H6%ap_Pb&kSvI7s_9?E6P?O_Ey-$?WUmEfd@sbWeo~y(4Y3dyes6LPVV9>iI(atA#<_6*{`hrCS0)8<`E32=-amLU-xU} zKM>p`cP$Od;F0niSE+|g@bRqVo_P^ZoBpihCaa_^B6;NQMmx6u0JBg$$XHv*HtHjA9k~v*wzK;C68$iH%r>B+Qj=z$Tw~3 zwVMH1TsQZZaQ^^iw=J4TRd$SS@BQk=X_mAtSzIhE%Wj(({qOd7S4nFYU=CaFRvbQL z%aQUg`#o!BCrI%iZOs_%(z4_OO3|1ViOx5F?6tFM%mV^;?f(GBtDmt*CSayqKi(d- zuIeIfxgq}mhO(Sc%j~G`5u5)2v8cph?&0$IK>q;4Rq~F8Ed11#a>@4SR{(s&>0E7c z>Td?my1pHYh0)MlpP2v){_6Cu?7WBXecIu^A0o@5tji!d18#beUFamPRD88Ey^m&| z#b@P5y+BAf9V*F-0A&2tQ9sc>GWOoiCS--~uz-{i?V-GAA7m&3_rsua z%zoN@4{!L9D#`w`b&bo0$oZEmgXp5Y8ue7kBuIB{WB&Dd@4;U#Eha^`Oe?D4J15J~ zdj;)X{I>2DkKJv?zH&Pw-CLaGi0I!s?W#dtcq4|ZvdC6N5_3^uPd>G>k)%-pjhAU= z`DwWGdQ^pSLa?B8!28v4U_2rYi&kTcJf2Ne++$30PD1A%)Cp)x6&6gdN(K{h;-CY| zAzG~*H_SK&lLC^&5wpvGy-^s#e9PXisU|W&%~5sAft|Re5!?auK_Z>y?~GCa%irZS zDsDe=owXs$u}!0G%i5i@Z%@5e)p^SbiwU`XD$t$Oz=brXd#O+*q(GsVBy-gcI5w1Q(#W5|(b|R(+EB)G&%n=?=>Xz(L2}EX9 z{wj}V*7?7NoK$DbQ%>5f6vmO$QOZTu-(EsOItM^a2}K~=5a z%}j<3H_J$v+gJREeHJgbG>z0NDbn$bV$` zM^V=&c}m>JxHo0~?N+k8N#WkVbv|5E{6Mj$sPfyU@4c{p5Bt>xrIW@}CmejrzjnIg zvEk3-HWA}^N+SONz^hkJjK?9EHW+^mV<7o4_jdfl{i@oub}|tl`S{yKO^Sii4c8Hw zNd4jd8i2yzB#gV2dH(>uYINJs50}^ds&f3;>$Pb_L=w);xuhF$-}|*z)GYhT3~c+= zDUZxM!+gKRQ(8nYU{=9)tT_!K18c+UC-#I}2INvVe|r`8SA#+R%D``w3<~&PN)o|- zma%eQc#(!xII(z>B1*=4V6WAE?WgPyz^_-{;! zgiN<9wc>4{58~VWRr*`;Z$*<;@Fu5g5^i;m%}uNG?u>`rJ@6~@mCR-*OJcr$?cZ9~ z64J-$`7KUrDm{x)JTmQoMc3u&(ym7hx+3gd({AfjW3p#m!M4B4wEqCL-lwy;WC!gS z9-r>iNiK)G6I8-VsdiA~`?P>NF?kht9-r*gUUX`#;5XKzUCMmaZ0G%|#MA7SA$1;X zdzi8gtx>3V8#nx|-kyJXD!|Lf-uZs^>Zu@XG(oo2wCqc{aha15t8%}^>r=Cpa=5@z z_r2>FOolaya}!6^zr9+iBizER3Hg5Ms2N!$1vWTszr|IFf;gQVVndY;{>@%kr?wd* zcd4j1Lh^-9d$wy>*hFwmZ*3ZsLn9BoDvqsXVW@1H$a!ttZSVfoM|bF&Qu!k`-h#xB6PqUAhcmD3`SDsV48*{PVtHToSj#4wf{{S7K);n=4 zpWbcxar{-hZDXClsU(*0s-mAQm+t=ndv#Na?q^m>kIdb@D&pD8cnCp_*L+t zJ#K3&?Rwa?uqs|MaprCQB7cM_{OYMn??ZzXT~k*)x5FL{zSjUj8FaWIW8L!OZ&GXR zpNAg@G_5ksTwjkeckVXeC-+Drn)Q7L!5S`{U7)u{-GjY`4hK%3FU##+mz5o|d2y~6 z_-mpoqdso7Ey&8W(rh%$M{61c1E3h@uE=rnMlqU9o-yVyp?Ni(GMJ9u^|w4GDKG)TbgYY= z%%zXDB=j$#8N#ZtZ@X1e?CoRxD@!)*q-TR!PX1JaEO69{rjCXSuw7JhR$;ne;3J$m)nVDNpl!u-W_6A;hrxMaqndAyt3g7Rmk} zYJp^oj(T;d;gKTwK*%*Z647m1RBV3@T#5FpFKWsXZeXs}KbUj9x>UtG6%yf?uM16% zM{;*nV<5t+@G4kc6`1tJ5g#c&7)DC<6uW@h!Lvb|kw{|h?TT>N!Y2Kg24Mw&lZ)D->#Hn9Ad4@l}s5AXJ_jrwJZL&zhtNySF`8LSwN- zVNwYPH8gN1-KoHf7*V#AA1#V6T2Mt5Oc5B0zux{Dg(DCyAQ;bDx#j)V6i7CeEl$Kw zVTrYRE@}d$QL?{!rx;OBD$TTkT0l8$F=9qk&)%nfjBFceQA+IfsRNk0e9K8bSp-p@ za|-1aqF}{xz5f7&)#*7I9qJ~FX4M@kEJKyZVqYzO<|*m7t|n9^SYT$xstmA0ewxW(5%)qs4c}XDVpb;u=+4F9v zZ+OnymEBYXhr#pf3sbTUo?-m?uz5QbuW{rODG+cPvgZnEm9Hj zKC<)ursVYnn{WGHHxCT>DoxB54psBW3+-vYb&! z%Yws`JAiq|`#2QT6o_Ln$O4a>rtDK>$(aXT+-9C+ zc~g#R#8Am0ja+=Sr8TKgVGL;$Iqyzr6Cs!G)S}cAv0s7BT!Io;abA@&Ru-EX=;O@T zM&c^XyiGF}bl_FU?1z|Hc_;Z*$gSQ$jJ*d_Rn7dP=VdY#P(vc(pBljPhzIc2l=k96 z8wVr3I@-o58_aRYp|5mJ+#t46FuY={n|RYC^S8A=&KUP&?-i@j!O16u6hSiJjKlzs_UAa#6p&}-5oK#C2 zsBe~+iiIC$)Fbawv7Cvax7yhsb^idJJrY4FhwlaZ zw7bHt2SHCvkQ$Fd;}J@1Q?PSLSOv*ib6|{$iOFNMjIAie+|F!k5XbKPwA=*wGfOOn zB;aEeSy|*jTY|Mwh*HpWtC!f7QfY*5<*?*aUSq#-IK@?wk)+&sC#@W;-P*(CC7Fpe zO{8@hA9kLFSy&#Gl{*)SmNT>pVlyX^C6%FJv%O`_EODSX-6H+d=~3NCVIn|&Wdwiq z#dE)Dlg#HhJ?TA+V=W2pr!gs;?>qX}C3OtapqNXKJ3obOO?P&G<)53h@yAiIW?sp_ALCZ6^d=1$(p*Ps6ak44ADiF*0Iyu6_m>a%m>CZ>e(4s?nrTkvez^X1 z&lm~)`En#5k^0gybs2GP44-{>$&b_4s<<-7#aA@vSsfMQWeczY87b<_fN%Itf8Cj4lYx5d> zv9Qdqk+ZNJY4+BlIZeX8;f{metT6%5ZraaIJkcHO$mNWG7aVl-rui)B$r#4&q;;pV zDk+vuxyRO|i+Q(aUVwrC>x!Oq8rT<0M4Vi)0FjS+*0**~k<%mP=AL3*sUc3>@%<`z zJp7Wch5q5FgVeYP@XIWrg8kmr?S2EDrYLsoaq0P2l0Y)}8To72{0#xO3PxSr07#Op`7QYYMgLOBPtWO=B~#^Sm9PzOzjyNJ$Es?u|?+$_55O z>rr8*WQbJADI|edyB|9jc;*r$V|yRAdfMQ&AOGJ6vZq zel>it9EzYmX*S~(qK~`$pE+OQJu6tUfs&`5^%6#0;PFuiYH1c@O=!w6 zKN{z?X$&^xAo=sjuCnO~R$xv?>s)@jE5TyY#mkKKuB6K5vGO;>)-hhaxqxO=56(ai zN#{R?YrMxt$JV@?Rq%|7ELSi;+|MKV z5#GIeK7x&8^k*g&&=zVz#242XD!(d6Vf|}b*L2Z1P$X_bf$8t*STS465k7f1;36JM zfyW-zq$AXsOIw!Ub0}m0lHD^`Qbh9nrW<8nr+)O?Wk}!c3`(kJ9=WUwo7LR+6F-(Z zU?04FaaPsASGMf`)cndx{$h?Wpl&4k3X*RznH0X{atb*9EcN5Cq=^K~U}W9TU+eUw zlzDLvDM$!T)dLtk&3qhrbUpa9>K}p!WyJ7dWZSeWWbaZ2NIs(kVE!Ge>}y$MSO)Gh z>C(O<_$GY2voyCY=fVgme~3OlZ_^d_y`%58QC=P;-gZ5TGED^8kLF%Y3%QgA;*w6g zTcrSo`@IEmwAr=n$&x~>M`2bWAH+``s-o`CJgr-dgeQ))MH4HE@5utJ#kUw8>J%G} zeJR;hJa?wiR!E*b#OD|T)|?1onrH<5dDlH9(r39RCD#EeJCZR);LiDR4 zM$oiLbR`xd!vdp>Q0NE%cIs*v(PHRw4J&6DQ^g4)iIgfYsHKgz14$ki0D+8C#tFa_ z-G$6NouiI(+NKW5xFa=LPI}dhX9SuApJ7iV7wuAwjKH3>oRC(C(+4e3(i<&&fOk0S zPF=ZTIPXv@oyCXUsYeIq6)|gJw{m6PhZ)XlLA()~hdDVTflp$f1?|?QJF+xRl`)tQ7j0Lc zA9Qd{BCuQ+r(v_3*CH{*?gs=M3i*e|N{e*Ola8bxZn&?iHF-d_a7R6}UoiOE-X|qo zee8_-X0&XEk1C2qb!CuaAFWRSjWM%@H69WbNdETDGwV~^Gf6RV(RvSh>88arNJOz6 z(5CQss0_P^GA7omyUzWP=N-jG5+Rk5$6j&#BBD!EE7^{+lHHfggyD08^{&6e%x!LR zhbnolQ_EP@Qo3Ce%Ui#jmhD&6qtnsduj&ZSD=V1J&JMnB9%mXawhNF%)6I&j+P>7m7fM z8KeE_fPu3cPEUV)dsl8AR*}nH>7mM5hqr{v7ZOSL!Tx5YjXcPmBqgx<9;4goQ2DY* zf#g3p``O~HSWbp5kdHA3%1Qgx*5|3ga@;oY?^4GN)d!%f(pt-NZpu#8{{H~QS7}Ls?2t0G^Rb;3co&a>Gdei`09G-- zx6RxA>Z)_r$1Puk@&b<e+~ zExd%;>@2-EI|32CKic-MQj~2Q9Fk_=+F{)BLy@t$&)ri?CBn%Nwo-A7=caMmtJ+3Y zPudA5`1e)$Y-Ramw;|)(o_%W3DVCs>?jj2j+RNE!21g<`KQeZ#>nKIE=W#2M(zFCj z^1jsh+r2PSMyhRxZcZa^xa+^u=~iOfF=Q?8_;#$Qt!@ejkc2D1_xjeAjjST%${#O} zrU!9c?ghqXj6nt>Jfd-i{`G7}sM}mbfmbslZ9cqwwN>EEYcM}3?fvSp19@_02N6ToGvS!!o!L$=8wRsucWG5M*AcE8rFJiIFHr-;&2%Y3BPZYb%D zN{zV&SbV0szX*$O?FDA*y1BiH8nWXew)`rBJw!C0bc)7u27RHWNXJi!j^d~8@sIp= zpL|%O5<1nLHPT%=0^_&dUz?xzt3Og^MDn_?y=w2uXB5s(Sj#(L)d=Ge@W+8yq;h21 zIa-Iz8<}MO8p0A`sRICy@{TF!72gZUryT7A95qLPvIkSj^c7L&Dk|fGn2BuQEg}YN zj>no(+xc#kHV`h_kqF0WQA|9XXA}k?U<}jtnFc`nv|ruIQ14#2oZIzHBq?1M5;jxG;Fe?Z5gBTAgA6-y1_!dsrlAP&!vsCGQ-q z9vSfs7AvD9j69#ZHuc@^)!=XD+{jer+A;c9xBOBt%O{dm(nvG({AXTE7YSObn+^@$ZRUnfQ-L&w|+IHWbs7OIXhgocGY!jxa1Ixtb^tM0BM@6+9qIYce)d@Lc}@3s*;EL72H4 zwhn6v$X7;;a(SC1E65xQyZhUKA8yefKP^M%nFi$JcNJ>MqlywhKka|C)yt;i=PSi- zCUrk_4slkDN{Z^^aNSGtI;+O}aNj?$sbj|7h*|di<4c%vk8|994l4bmv_~Vq`!)5e zornRilKu%u(_UO)Vl-{PFWn}-u0?4Axm+sOG?u5iMXpKQaAk;B1T@ zqN0c9n{i#tII9>rIb0~BF}NZq+AtU~sBRD}5=AQRRut@TeY@3(RDGI5-xT1AQa&p9 ztgzZ@lE|lghy93^Yy#-mfx44xB!#>GR8))+1 z=7H1hdiAMs*23yfYblxqVe(bTl|0a_-D-`t;QmPI)Yg))MgT@a9-g$_HiVeSVDhBG zH_ZN?l_#HeFBSsf;ZO@6`SSY_DB84TP10NLPHO&Y};QCQnqM4m$u;8!%Is3h3?c+Zy7I_^qj7V?s~+qoEi6xSY2!BpJKkD8VzTUk;x zc3th)?`_ZbYb$daMn~Qr0SGi0!VVb$41Vzk__(gu$_k!Zw$-jH;pSxU@-i<7p$8jy z0~Oq|4Wrh%?9XnN#2IWTdN(qvr%)-E0gjdDzY#>oLy|b7 zS7JAO#~8si5j=5u-^vT2ZGPCn6G<#m zqpB$*J5N11#y`77SD>iJQ}-9(#I14R@jP$mB0k)ozFYgpZF)t~-{ulA^BVKtg7I5e zXm1^|ZHTbj_zsomH?t^L`MBo1s%zanxGijO^6m4AxyfopA%;Hg+OlC)%kA7M33d{t zjY}MIqs_)EanQoq7tg zQX?R-$oW2$@$!Z}sT43JnwS~b{O4#C>_tf2P|_aM^0>+Mrm@|$4k?V=TaL6fc2ovn zmh{B{GCl|0q1f)mK3YJe?O{!=2NWEGu&p^TpY2fOyM<2lDh;F_^d?ynv2T@nRLdS! zLwwZ4C)4iK%BntZy+bo_8i7wgcND62zTr$?kRRd(l@RSy=}3zaOpn3aMiijP+qS2Y zMO-WV#!l4`X4!(YMVpU6tTw3Jw679{UB5L#k@;bjTZ)i;yH8!TM9tF>{H3=q%TP+i zwzvAv{g$pq<<8e1dZG%kmn}jes~DH%WVDhv{!N4NuaAB#T*xfsPcL?ItUEgU*VuZe zmldHc!(-+D0BXKO_?tXPzI+XrPxISn~g$KAlk^?KZc-)5wyDFAEkBKo;26I%VJ34bW(a(M`S+JKlgTx+}A%1wW)<= zglv}|H~U}jR=Y@GjXb};_{kr`Q#%e9HI`L*StL6XcUrj~)6nPUssKkW*k$6b#-bKf zPvNO@i7^qpxf9FA(mw4hQGDh&erKn=a>o|*89Tp*pJcGhbBNrALCr6ACC6QjKMcX< zYNAOSW;UpA;`gt;JPNyXbtk65Uk&(vSXWX&!)htoeJk#d2iy~-jmfz%D>-g<;rBML zp!Ce0>26=ZyRpL7vxA&QQ)QKs&ZOw$LCbxlg*8Z1a1ES z(5gyg&?NTbYh0I$8N(dns7zssBXQ=g)@{Ep-v0o;YQ%vC)>hA_`_+|jiRJmuyIlR+ zw4Jpk1z5$`+cpO>LVn>td0LWEBWJgCWnArMUUN~vujcuOg-WwM*k;)x;J?ZlYpM&D zCU4A!7^8;O;a`*wySlLs_@i%>ZT|CrcDHg_{Fy#gBmViU`C@`BS@mZ5w|@w&qSr2@ zmb^SCyVYRR;oKSaJ{Y!s4S_ zX-hJmDcRgGJ5-TR`Af0RSN)t;ly_%mJHA@Mjc~s;Sc&j=bOM?x#>kaR7yG+vRhBk6 zTE}VdjDnUsxWa8b1r z$~yKHi5&aWrCzs{Bsc?U9<*3*b4aiQYV@UtVQetXQW6Dyq*Th|cHOkzi$ZxzNX)Ii zGgenVVutJdRZEo{N6OW0U};@l&&^ph9HrZ6^9QLxR5csSk970@Bb z>)xA<>cH?Q3^DRA%}9;&vbe!Dit{7XXjxbW-S=u~ByQbBHwvM)ns1oFHUYbJD6;95 z<8965_o>wE+@F4{qV79|Nt}Gq{xww5F&vIYTliL*X5GPExTyBbALnn9oXDr{^FsGS zVkY86jz7CZko?$Vx|E}J}qekjT-C8Aa*n`VpFy}2#h)9X#?ZTe*GO9=bJw-r~ z+#i-!+5>U^*VdauZIxcz$jK+>J!%Dj5~T1wYeYz{etZ@7roepH*t}ziYy~%7n~lL0BL&K|e=gd! zZjLu?$p`p*Rj~@G1rvi)3w)K8e=12>(n+>9G!iaI=}!@1zFM6l^A{bD-l47Q0JGK3vtWCDt{?P9#|NvvsLNjOTKF+Pf{v%B|9in#-7uX(TfhUz8e% zL%3s{)ur;h!yn$qN|6wS-2GOks1A%|f=3BYMJmOC`Cqr8_N6m%kxi558wOUVV>Ld) zhC#Q?IL$Ti#|EI<3ha>bDcko2&)!;TT@LAqBLF#U)j3;YE;!9f@u*zYCXgz!5uAP6 z(F72rqexe8$?H^_MA~uA+6?X?$_!R~k^vu>$AQ+O+KOdq=W&mgveN9t9nbMqi;KX9 zQV1dW9-_JBm(P^LCPFC5^r}%Q%EWgviP57RpI(@*ZsbUyLi`2qR&K5q1~HcTMQ6;? z#@KPZAszcuNX6)jNhwQx`?jx8d;Keh)UQlZZ3!~ZE>a} zBue9j9S3T3FC0>=dF$&=iZ(>r&&T^+s#!t}gn&rn=}pZJ+Kx%~Fh|b9a1BV?x0oeh zWCQMxN{!GLMT}t<cmNLYK>PAjGTy&tuyrl%@Qj7V-Y?dOid8r8ba0u2WNkksxXud|kppaX)HNR>}9Whj4hk9{ZktrKOR0NvCk&bJC@m!`D$S37)zSY%D-GtHLTFlX1 zOdJ9+>)3s3hSio>?inHbg+|}6f6BT|W^_xbBP>W#0At_qu2SxBSQg0Jp1HuUMw@oI z$t#$P6YN;z<~--zRcxiazGQ?dj)eR6tr_NsV3x={`+jwdS#M_w!Cn+R41CIc>!nJ> zDKwpj&ooi1Pje_($-vKQtkEUvJVAEt#t9!cuQhnZD{Pb~8%Y^IUMRH*4cn`)-{=pi zu8Zh5Qd#-E62O$3d_3N_=lhvMHG0Iw8|JD4#-*Io|O)tx|;Afov9+h}qG=W*7KQi-qMX4AJGnlU3Nr(W^Va7>dKO}4{vnTQu^BQSYOK6~KSSYaE zjDYM0dQ%K+8w4B*kftzHa%y=v0JmIK!Xwz`^`vLF+MTQCuNf7NCwJjf^{=F_@@>gc z%8qO2ZyQGn7V~kF(SDulSs_WDFDX*NamQM0Z0bOctxF6j{$a^A0v)aLCIPKsD@4lW z*cADj+k$&ikVz{c+6RA1rx0&5dlm!vRI&)>8>Mf#!2bXmrnD2>VT~hg(m&ttT?UCS z`dImPkMOR3Mnf`N?B0N9HLIq!%e65kgYk363p2(Hg-1cw zy30NOSYkR?IpQdgTT5_+2T{&X@~pXav4qc`t|d1YY}ne_bX1)tJ<8YB*sG?1{;r2>rz7k4XZK8&JWk#p^2kr z(m0}(rUL|VT?BjNL~>47xvphH#|ttJ19t6ORgIT`3`kJ`e+zm*%Rz?L^}E)^Xy@1I)EXrxKEfh=H=_jn)Y6{~NwpuzdafA(uH z&6>_Xvsz<(t@D@Ud)3QH6=ZGaIq&IBrd&;U?iMqEzm0bu2y2vI*W)^2}v_j~z`YZgbXN>EciU zJcU#k`}5j?8!DZS3yl5l;-$B5EXvb!yS-J2?3P92VI6DJk7LZ7k0kMcja^AVf4pC= zJ%xGYoRSNNc) z+Fo2bzuN-2E%JrzKDBvXeZRR@PxieB`?ZH}CE$r3NPM+s`_->)a?0w3@bB34t;ui5 zy3+YuPnG5Y-mSp_SB%2Mi3aSqwO}l=2Hzg=shZihy+n#gS^Up4rhe)lYFcz0O%+hg z-eDz)&(PJ2e3|^n`9F8svn`rNIAMkzPxq@%(IbO+keol={{Usb!lp^ssG9IyF;?EA z?{V{X_p1#so+Ayv%HF@-tWk2&%%~$IHg_7-iYtVD0Y-jjtq-W;~C*G+86%FP6<5@Ipz0%s1+tRkQ7nVIn zEx#wsIbLf58A*sP+&6mZ{4y1_1w;3K?rRyX#C?&Zai*fkepu-*m`=EjdQ@5Ca(pW>%oyTiC+2Cth!Iho5`6$63uRTUWJ*OsZIW4WDbxmO^z?zNkm0TuFb*i)1J zXI?4=1}lBZ%Nmz}icb_mNHrWm4aml7I+0b`cjt;l!Z*#%Dayl&xYD6U27elnGk`i$ z<8jF!g*;%6X+jocwlHs2`pq>$|3^o!5ykVat22f)KS)vdH~(3 ztn51o%y;unEV)sRv@r*YjaARgI29bM89Vg~4+5fI4KbDSIpU>VxCWD50coi78>?+@ z^sIcd?NG7W=W(eQE_2jWxUg(_&lnsUVHj*0m<@<&BUCAu>q()Z1couiH))UNU%O6J zd0&%^Qk=Hnzb$Cva&9b5yX5JLR*#%N&F@jF^S2vu-ke#NhNi&^zb6NpYGIeyQ_?mq z{>?CLXV~KytnJjUZiM+@#~*r@NeET-rmBt2<@6MsvCn#b=_fC*0rpMJ+cok(#3@~* zci6k5V~wYu#=f@kBc>HsHyLR=*wQ1OwS;QZ8 zQ@5)B0JT-4REke9sEi+&UpX|f zDky;9mK=8qWq**>S*U?i-;r}W;+1xDW!yM z6eyWw>-6`k@qp9C9MLiPzE=M4`^#JE36v{*xc>mqt2npNUPRU|tA~^Fr${7AhkS_q z;kO-|{{XL0ECpr;H^BSNpXpZPF5;(e{v%$KZR0$0j*#vAWf$X+a2WHHAier&P- z01wi>!T6ao31;6LM$%^(IaOu<0A{{L@f1=bmsiB+<{PWk!dm*CMlj?RB$6Q{e7E~w zE-A2(uX7M07W!q6S zal(bB`>HtGR^-QGNR-Ok*BD-vqi(1nk!Jx}t1v6usB+lPVOHTW%fjd7r&Lhb&>}SQ z(?7ixdRu#mk}+?P+rIX8{Jw^>kz$V<{{RpBHO$~|9ShdCQL-z>yExlO zmol*Oq{ij@wFF5BlX%>t_*eV2ej}Zqy6N24IwX0Wj4%g(dX z0?XVn+&{W|SD<>%){iRDBPl~LF89njs5Cs!z5c-2IkFJ2oabd>p(q^N(s3* zly1TMro7+cQscw7s}mtF11g7I%G-zceQVL99I_sUyyxOnNfwmv&KPa?`Gr#4i65ID zGm<+e5gpEXUz_^Zm*eN&N6G&Hpx3N;{^AoP)5yUY|k}HSoYqjt= z)DMa5Z8Ynpw{J0I%QiSeldyMxLEQ0FwT+6Wx%-9iJrVpPZ#;i3ysPFz60XpQe}f;x zk4o>aVDmR)vl`%j4-+1P4U}2hiZIW#AAi=p5@J-e9X?}TLRuc;*yV0;GNYwrwjEPF zcUHB^kmWlH$e0z70ot=E4iT~x2kz5$glryZ$nrnRep+)V%Wv&YD?k_|U%F_Bu1H4d zO;p+r7v-h4R0Wg{X)%&A0(bq;wBMNWd7&AK?0z=W9}Bc*sy89_9s9DxAmmd@%%?xX zDce`mky3-S;PXwP!Q6nVm0WW}5C^%Yp-|0%#V#}RH%fNUP4pYNl&;EZ#^tw2Y1vlc zMrrad$}o8p(iQp;vY)yRMF1V6niqCJ^`~JF0r}O=8WhJW?c`LEe4y>-jm5ihO+bhk z;<0N&RJ9~VWAexJ z?$by~lH(3=KD84o?&t2)fXi`D0YE}d;3$ki?jIs9+~Cw)tvS#&DAMoH+N*Wzld1`Ee zM2V5Mz8w9eG~}@HrM{?9Jd4X^-rqLmF|#K>hxcpl5I4v{HS$008Epl@v%8ySMq9SY*%O5HLsUo~beq>s0Lt`LZ^v{NL?V$@{isk@NF^4OMksYPl- zcG!81(4#AlFK?#aYcnez=gxiWK}p+|86Wx$K`ba-sNoMpF)h5U3`kuMD$PUJp(COXftagu(t3R9zXN z%kY1#Z_gBt%2|U${od-58n07JLaLqsH27<8R3#B4?)e`3CRA*Xk#N zEq=>vVRBvl#^3wqzb(8sZ*gs{t{coF<{#bMzjWi;zfV3HUVmul7SrQ0<7=JS+*5*9 zw`#}EXG-lJuCU77!ZDA%x~B5Oh2!NP-Sw)h?5AkvmP?JBHm)h3IU=~(xQF7d+Q0fc zMZe{&?<~zTHhxzA8jde2)?K|S`G_|r!p0Q$thucm{G?zSw6}{U;=>_obGBX0BW?Dj z6{sBZ>4`Q1ox5u(p=544^sdPvI|o|g#9t~sEsO=zxnNUOJPR+aY1*yAl# z5!Off_{}nDaOjK5tqdazmf&sD?BB3|wOY23#>&Ps_|^7{{UvGbxTh=9m~ew znw9SoEve_18_ci2mF-lIr&`jx1z4+(yIC;Ack}nF2%5uU#6K!!s$H$SpSo$DO9lDI z2A2nB)Ez&)PnC&`2A=zY%W;~G6^ZHBr8ML3e|Di6!_% zrsam*uM1SR2}`h{aB%bnbtLEIG=Ynp54veG7v)-{*#f(q;+nW#NX;Nc-d(SrGe)nNWp-i1KwwiKTlr9SW+KZUna|R3u`_&05 z-+HBqOOM_zDi!j`Zg){}^IuW1hGp7|_i9CAhm)V-q*VSP^3qKfIG@(=5I` zy@T$7URmRETGhxrD%Yk0-zZVXb6#oVNSxcsl0LxWZb$U1jCIgx`DXIg*7E81;H!P= zm|G3%ARL;PZM&CMU8kHiEJ|7Yyy1m()AK0^wsFGwcEPA6S(ZdrT#s7O^4TQX?dFeK zr#a5jr{(_uX0=HHP{L2jzbW;pWPnI8{HC7?a4*UmcLS|4V0Jl^nz0NFgBabKt5{s@c~oG0zv8J3 zNRTdgq)^eZ&&!Hy?J1CV0awttNI*R1+CJ#156YfgXKU4DD8MUaeFz`cob3BPLCVvL z965h8=Zd6Z5lCDQz1QnXjpeT={n`kbaa=%rrW{mD zFPNuz=~UiwPWc}g>&IHE?!k*G`5X11nJX8Bs9()IQmlmMJv&xBmny#_QvINS6!Zfo zf$}obJd!@)&{ZEaqqhD?sm0M@uym|@i5?4$%y=MF#yXV-O)byLRR#h5D<QMdK zuO+~ZoGJNRty7()F@EbcaZcrx0|6o3(JCFOv6%=5ImJR}Wim4io|x%a?{)Tf4o@St zdeu|-jODRP`rV~w0kQS%Sc6bvL}28n1l5bZN=H{fzaw?yJR0SA0Utszzf+o&uRN z7x<6zr#-|r@tLF~ueV&9U_!`CF+_f%rF(xeGY~shuHn|HuXqO{CfuK&+NJ^s*awp# zhkm%It)p1jM4%AEuf1PLRNJtb2M4Jf;wFBfO2Xv9Emie5|&idPC9ibF_)dqu$KKcz+v z*2(8JD=^6hs)4-Zaf;KJEF`4kIKZGC$`t3CSqls|rB`Qm8<(X+LXiswT#?$N`-B75 zoH9rhDupyJF@2IZ21A7;eJT@`B~NOwqjpoKJu1G^jNXQ*a$fC-&=trhic-WUCjfM% zD}~wyX^b(q1EnrtxQ`}qGuoh3 z3TDRuvknDToTZWm20jMdRc*w82;kMRAdKyC!4*fG~%T;-;cal4V(uh{D&K_`Rq5IaI*N!98*-(Iws#=cRdvi=&mHX-oW= z#yfxd>#CBlNgqG!F(=v;7=qm3VmBri!x&dVQTdM$m@3w2H)uw3gB)2Cl<2!-L zdw3VNeh6 zH~Mxym7K9|EeisGbCLY1sEs1SUa~Vu7$v$f>}fD!lW{p|c^TAM*-lJQEZw_w0Lxav>lYsJ3SwxFm(DMEN2p4ID~B)i{h zD!~?6_zZaYk8xg00_}hFr6@TJTi4#bOe#rea@EzJ|JMAz(vZgQoT=&UkF9RR<|868 z-5c-$>}n|EjBY!&fy$3>rB`i?{#$d$PUgQnzeC%;to1L3XY88X3FR!YPWxP*p}MZ$ zdi(Fg?H~4dMb6d7Qc3-KSLfe=CV%Z4crAbh7>&94x&9^h9YuZh;h7z*6(k>VK*{QT zNv$R2J!8S=OGU#o0EI(yYc*<7mhDny(N-Pi)kH z0NfsxQ8j^J95y@Dq3}jUM;>-=J!$Hy8zj)xh-$@vKpU!5ZZZaH5Wx;H)}I+MNG z+Q$^CLpH_#0QJ>oP(}w@l0F7cS_x4s;6spksbgZpkVn?5A>YB|`qbG3XT2q{aD7SF z3ZBNS#s=NznxwpQ>r*ZlfyHLgHZBEW^KQ!iwNB*Vg1qGZRbze=WmRHPnGp1_OGL64A402MSSn$S7MSRd@p}rPL-*gM@o7ik%8ICsG*isBpfjR0BWaI zA-u!Eq0_deQ+kky*@%zRrCzdy#J37)v5tniKT-ED16)nO^d?%K5jbe3Aou)g z1dq;A+4+YARh#)4F4%10Pg<|$u6+LhL5%k`vcFT7NTRSpC1%OXvCsH@JJ+9h%gB?< zvzTOqkbk?fyZIz-r;HaoeJjs=SqyV9^9EUZ{uR+f;yJ3PV~v_wVE{|h9Jf=NuMxON zuv9o>)lEL;RE`CVe(}9Oj1N&ygxpTC$Q%F$0Ppp#!Tyz;g%5PRRpntL{n65|Ac7|QM2)Zy(x_XxkRWZTo}S{Tb_5v5AT?o8YHtHs z**HJJ{3p4p)-k+=iOS`=dsIeq@*<%Dd$<1p6IvFsd9Kn)@)+B1x%?=Ef$m?1*5*iw zEr6UZ-+J^<06dV$@yrPdKp7u@)aJP>catm^jP|a-!zX5`2ru%f>EAVtO_|wAtDjuy ze&m3sY0RWEAR86pwU$dd!_{cpm^`y9OGis1rlTlv+ zfNhYe#~^&Q>A>?R1IPSK*HYcIbDi<0U~Rri>~6SPme@j(ExriaIv@6F(XW`n zi273KE7+4ymTP#tqq<^F+@84iJ?lXt%-e%}>sc0pK_&>!-@m)~t3eBy7$*uUbwHW5 zAKGP!yu5B!UJs>d+e(rh(Z1g=j2fVjG*ZVDZ=J)FPY_28j=Mfy*z5S$B=t0jr8KYP zh``3)-7BGtWT`=pKU%|u#Hk#U93rJ-{ zj()XVN4n$Z>HJk}Vl`FA2hzEw^fZi$(p(&ej$b94?*9M|(O*pbFLMIP(umfsgSDhXYjtLRn-g zItuB0KP$(56rJ}9=2rmx{{T1ltDx}VWz-R|fUFH=Er#HIo#BW|X-dT4Fwf^nr~(I- z7~X0AAGv#tIx<(~P(K>GauG+EI@2&XM~};Gohpiq91iubau<6KTvj@(XXU7eQpYLU zar`u=18{GM`l8kR7qGv2B&OJUqm zfY}C}fO?!`tw)jEeAOVvFhwymFmr&SrUjQ9swK@dSIArpH8DO^Y}AU`$TUD~3g?n~Q&a`VJt@JI z0KE-4nM$q&CvgUH+kwqCMlQesfITS@T?Pd_M~|51w6KLGBl(+(Z^*+wl*a+U%F~2Q z56kl6v5dKk*pqAS!gZ!U$Op?)0MVlmF;&Ujtgh6mlO*~auD>UpZd5NT{p$Hc;smNT zM#pOtxUXfes`Yazfx@pJ!(TA?g*KWt02WCAI{+$llA-Kf_uiRq4#A4P1b_p{#Ap>>opZE=Y*9D-KX(zgTnSN~l0Cv61 zEi1(F@lv#zdN#RfMS+p+X<$Kg0gZRy7SG&Fdyu zoHup<0BX7`8Ioy~Kgu1ekFy(DySrCQYvro|%&LEge|oT!DLWk$vCHQJ5MM2Qdews} zh<1;?*=moP5q|#A2Ro|lP=OzwqwjRCYK;w(3yHSH_K3y@-l*kh*~8~dJrjOn9ealalF|l*=3W3%Y zUBP-%I&LxKE*VJqsfooRCmE)N3fVkWbSg5sBm)V@7^f?7&jOfEMg<~e_|GDgfUz3J z10H@_ebbh+ko$D1$nTB2XqpoxtfxB{6kU?fjeaTaj`CQQ#?AYOsBc4GBY3S^Pv3p# zi#Y!PdcL*zpXWZYExW$%jkS9U`8UPz-Ay#n!oWlKRkr{Yy>e^T!97nW5_#Q>`jpvw z^br;4sB#%<`rMRO0d_ZPfnj)IRa2Ei&V6b33cg~Vxm^Ag-%-nR$9L!uCCo(2^GUbw zXSFS>q2BT5FV?2FGCVIdl5WZ4{h?KsDO(K#V4sx#0J12vu-3+}pXABr^$a$V>rA&P zBN(nw<=b%icv@+VB8npKxmO2uSXo{-K1%$j?wZO-V`ZKtWdnnXOH^k@U^Ym4P+&2k zS)<>#u6x#vuIEUcwnBZ)-iC=L1?xx|#7Qvv{{Z#tP9U(Z)gLeLuklqoYhNw=-Q~RI z+;;Y<RpJ>Gqh}{{V%vT$6vwZwIOOPr~Too5PScUp`nrKi+Ee z21Sgr{G3+{!+iyGSGqW3-9zTZ`^R)3$7{537;dr(C-&flGBB8;AfttZTfc099HsOhL7n^;%VYh9;bDC7~7yf!NcRsSQjFS(G(7RL1Sz zn_`II2!1Pp_>+au$5PL6c+mIH!eH`MT1)O6NbtOj2SPYHGq`m9V+T6)KNT^-&$xOgO2z z+8m&|2hjwx478P8xUrMQ_{PSdv?Dn`pLPihK`e7sa(;Nq$(;c+v! zC5K8Bt2aF<<%t6$if93T?*LWuF{ug(R{sEIl|yaDe;SOCSJI_ks-m+AE~p!l6@P|+ z>>?FY)8(fh^^SIY zoKz~Wv3GpGH91v*!=2S}Cz(W-<~xokjn^1|nQ77d{RS0kt8Q6*z1)53&Pv5a^c@-f z<`3PeOEjM|ar`tOR(_mPI~dmdK1Uyyjway0oA#jkKJH z88XaQK3*eq`BZ*&brdvP(C~imAI`F42mvhnwslphBA#M}Ty*=V`?Zv{ElC|Og=3aY zT^dud5Q_Vw!g4ISLKJL;A2oa};Tcxq^iOrd5))8Qp#)6@aA7zPzGj)zVe zogKVDXFcoYui75jAH(pfgmg)_I3RhQKJ;g|xUZ&Bw;>9((48d9BNP{vH#(HDct<4HyV@?SB)lqs55i2S>`N<=2t@2iK z##%NTu)QkWvPl_CrtEyXs>j*9!Sb%zSN{2Y@17*6kLm3jv(m$m-MR$B> zJ86gUxi%}rTQFhNks zyy3p>RWl9yTdQ}c8;h8I)Dc`{;}yqUX_6-Gqczp6$_pn@wAPk38%V=YC8_3etJ|wb z<+9?deWk!sqvo$fzk)k~x5JH=-Yo!doo>EYeFm6X_Th|xY+IjgvZKHYTLG*opx>K8>u3BWOW8W#3%98epyE0vekl; zNxh~&Ehm_1Sp-u^1|9}2gwxzQuv0WS{Q>|A<3coikR*;gJ z^`#wuP*Eg>pHKI)7}-G|bd06s=gc@z>Avy9@JSG5Y*>&@EP&};XH5+c-&qk)SWmlxB|mtv=sE*c!!pT(&f03rCr0E`U9+^f+qSBqESGx5?I7dQnhA5f8c@hr z=lit3BFI@g(E&h~86D%=2IK2hgk%%A)S+0Y^4o4HfioF-dwkVWjoG7G3QPUf?dwm= zest73)kyTE8<&$=g)xoh$hl62yvN4Ot!&E21p&dYPLYC!732Oqd6w0|=vQ$59&1V+ zNoe`C8c}xY22f}3R+14XIKxud$r+ATl0CS3&~#nQ%l8Pbxa?eDRaa(d4C(isWP`PYmM-E?MZk02S-lBo?FM7Pl8TWRiTYZhY_-jgIPQ`Ga zy#YJ@>c0$OM#k!DGa3fU)W0j0V5PA_M8#?=!xmd3IH=SJ!mDs9&z4UM(W)7hm~3HH z2^vCH5r!lJHrg7Q5*C$7A1|#kJQf?r$}0MTpX&KqY4k#i5_q%9{n}X75*#mH^*m9Q z1z)$VFO;YY9*a&Qa_l6&&&e!B50hV{?I%+L9@hbssV5PA=Po8%3!f z0e(uLXD-`VkQcR0G?>OtDyRX0E6oGtEX3QsWjMtl!%4WcQ)cocRvjrKk@}Iq>GYtI zNn{8P^OYScsxmMojXr&ZNj~5YKgLm=_RR=Hm!hGX^g;;JmDNT|&6D=QuB+!s-b zr!fHwqV6Dc9clAemhNJ`?9O(C`qoU6CDhxQzVAcrQ%iHb{I%fv)_Yt4-y$gs!KjYp zPDXt5izyiqx}Kzc;au(1jpiAUa@-oRbu>=w(Q>2pthH%YKp*b0$Uoy-R9cv}NKgg& zNjd!~lE&{Ep*Z8WTD;31)G=c{&w5-c

3jdfqGy=%EtD99KWRD07qF9qRK%9(nyK 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

6e08ZRFHs$O4c}2wl^6ifNoM70F_OSHO0nEm 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 STyVJU>szh09Tj(LAOG2cxRf&h literal 0 HcmV?d00001 diff --git a/gmail/snippets/src/main/java/SendMessageWithAttachment.java b/gmail/snippets/src/main/java/SendMessageWithAttachment.java new file mode 100644 index 00000000..16e1b8f5 --- /dev/null +++ b/gmail/snippets/src/main/java/SendMessageWithAttachment.java @@ -0,0 +1,120 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + + +// [START gmail_send_message_with_attachment] +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.gmail.GmailScopes; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; +import org.apache.commons.codec.binary.Base64; +import com.google.api.services.gmail.Gmail; +import com.google.api.services.gmail.model.Message; + +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.IOException; +import java.util.Collections; +import java.util.Properties; + +import javax.activation.DataHandler; +import javax.activation.DataSource; +import javax.activation.FileDataSource; +import javax.mail.MessagingException; +import javax.mail.Multipart; +import javax.mail.Session; +import javax.mail.internet.InternetAddress; +import javax.mail.internet.MimeBodyPart; +import javax.mail.internet.MimeMessage; +import javax.mail.internet.MimeMultipart; + +/* Class to demonstrate the use of Gmail Send Message with attachment API */ +public class SendMessageWithAttachment{ + /** + * Send an email with attachment from the user's mailbox to its recipient. + * + * @param fromEmailAddress - Email address to appear in the from: header. + * @param toEmailAddress - Email address of the recipient. + * @param file - Path to the file to be attached. + * @return the sent message. + * @throws MessagingException - if a wrongly formatted address is encountered. + * @throws IOException - if service account credentials file not found. + */ + public static Message sendEmailWithAttachment(String fromEmailAddress, + String toEmailAddress, + File file) + throws MessagingException, IOException { + // Load pre-authorized user credentials from the environment. + // TODO(developer) - See https://developers.google.com/identity for + // guides on implementing OAuth2 for your application. + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault().createScoped(Collections.singletonList(GmailScopes.GMAIL_SEND)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + + // Create the gmail API client + Gmail service = new Gmail.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Gmail samples") + .build(); + + // Create the email content + String messageSubject = "Test message"; + String bodyText = "lorem ipsum."; + + // Encode as MIME message + Properties props = new Properties(); + Session session = Session.getDefaultInstance(props, null); + MimeMessage email = new MimeMessage(session); + email.setFrom(new InternetAddress(fromEmailAddress)); + email.addRecipient(javax.mail.Message.RecipientType.TO, + new InternetAddress(toEmailAddress)); + email.setSubject(messageSubject); + + MimeBodyPart mimeBodyPart = new MimeBodyPart(); + mimeBodyPart.setContent(bodyText, "text/plain"); + Multipart multipart = new MimeMultipart(); + multipart.addBodyPart(mimeBodyPart); + mimeBodyPart = new MimeBodyPart(); + DataSource source = new FileDataSource(file); + mimeBodyPart.setDataHandler(new DataHandler(source)); + mimeBodyPart.setFileName(file.getName()); + multipart.addBodyPart(mimeBodyPart); + email.setContent(multipart); + + // Encode and wrap the MIME message into a gmail message + ByteArrayOutputStream buffer = new ByteArrayOutputStream(); + email.writeTo(buffer); + byte[] rawMessageBytes = buffer.toByteArray(); + String encodedEmail = Base64.encodeBase64URLSafeString(rawMessageBytes); + Message message = new Message(); + message.setRaw(encodedEmail); + + try { + // Create send message + message = service.users().messages().send("me", message).execute(); + System.out.println("Message id: " + message.getId()); + System.out.println(message.toPrettyString()); + return message; + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + System.err.println("Unable to send message: " + e.getDetails()); + throw e; + } + } +} +// [END gmail_send_message_with_attachment] \ No newline at end of file From bd434c5687bd7a653804e6cc05075a74fffc10d6 Mon Sep 17 00:00:00 2001 From: Rajesh Mudaliyar Date: Tue, 8 Feb 2022 07:41:08 -0800 Subject: [PATCH 046/262] Added file CreateShortcut for file's create shortcut use-case (#168) * git-on-borg files of gmail-api-snippets * Update build.gradle test12 * Update build.gradle * Added file CreateShortcut for creating file's shortcut use-case. * Added file CreateShortcut for file's create shortcut use-case. * Added file CreateShortcut for file's create shortcut use-case. Added file CreateShortcut for file's create shortcut use-case.It includes Google ADC as well. Co-authored-by: sanjuktaghosh7 Co-authored-by: Manvendra-P-Singh --- .../src/main/java/CreateShortcut.java | 67 +++++++++++++++++++ 1 file changed, 67 insertions(+) create mode 100644 drive/snippets/drive_v2/src/main/java/CreateShortcut.java diff --git a/drive/snippets/drive_v2/src/main/java/CreateShortcut.java b/drive/snippets/drive_v2/src/main/java/CreateShortcut.java new file mode 100644 index 00000000..9e02dc20 --- /dev/null +++ b/drive/snippets/drive_v2/src/main/java/CreateShortcut.java @@ -0,0 +1,67 @@ +// Copyright 2018 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// [START drive_create_shortcut] + +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.drive.Drive; +import com.google.api.services.drive.DriveScopes; +import com.google.api.services.drive.model.File; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; + +import java.io.IOException; +import java.util.Arrays; + +/* Class to demonstrate Drive's create shortcut use-case */ +public class CreateShortcut { + + /** + * Creates shortcut for file. + * @throws IOException if service account credentials file not found. + */ + private static void createShortcut() throws IOException{ + /* Load pre-authorized user credentials from the environment. + TODO(developer) - See https://developers.google.com/identity for + guides on implementing OAuth2 for your application.*/ + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault().createScoped(Arrays.asList(DriveScopes.DRIVE_FILE)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + // Build a new authorized API client service. + Drive service = new Drive.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Drive samples") + .build(); + try { + // Create Shortcut for file. + File fileMetadata = new File(); + fileMetadata.setTitle("Project plan"); + fileMetadata.setMimeType("application/vnd.google-apps.drive-sdk"); + + File file = service.files().insert(fileMetadata) + .setFields("id") + .execute(); + System.out.println("File ID: " + file.getId()); + }catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + System.err.println("Unable to create shortcut: " + e.getDetails()); + throw e; + } + } +} +// [END drive_create_shortcut] From 500408653e893814b4a7800f2ed8b5ac25acc611 Mon Sep 17 00:00:00 2001 From: Rajesh Mudaliyar Date: Tue, 8 Feb 2022 07:41:27 -0800 Subject: [PATCH 047/262] Enable Forwarding gmail snippet (#175) * git-on-borg files of gmail-api-snippets * Update build.gradle test12 * Update build.gradle * Enable Forwarding gmail snippet Co-authored-by: sanjuktaghosh7 Co-authored-by: Manvendra-P-Singh --- .../src/main/java/EnableForwarding.java | 77 +++++++++++++++++++ 1 file changed, 77 insertions(+) create mode 100644 gmail/snippets/src/main/java/EnableForwarding.java diff --git a/gmail/snippets/src/main/java/EnableForwarding.java b/gmail/snippets/src/main/java/EnableForwarding.java new file mode 100644 index 00000000..838a6cef --- /dev/null +++ b/gmail/snippets/src/main/java/EnableForwarding.java @@ -0,0 +1,77 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + + +// [START gmail_enable_forwarding] +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.gmail.Gmail; +import com.google.api.services.gmail.GmailScopes; +import com.google.api.services.gmail.model.AutoForwarding; +import com.google.api.services.gmail.model.ForwardingAddress; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; +import java.io.IOException; +import java.util.Collections; + +/* Class to demonstrate the use of Gmail Enable Forwarding API */ +public class EnableForwarding { + /** + * Enable the auto-forwarding for an account. + * + * @param forwardingEmail - Email address of the recipient whose email will be forwarded. + * @return forwarding id and metadata, {@code null} otherwise. + * @throws IOException if service account credentials file not found. + */ + public static AutoForwarding enableAutoForwarding(String forwardingEmail) throws IOException{ + // Load pre-authorized user credentials from the environment. + // TODO(developer) - See https://developers.google.com/identity for + // guides on implementing OAuth2 for your application. + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault().createScoped(Collections.singletonList(GmailScopes.GMAIL_SETTINGS_SHARING)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + + // Create the gmail API client + Gmail service = new Gmail.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Gmail samples") + .build(); + + try{ + // Enable auto-forwarding and move forwarded messages to the trash + ForwardingAddress address = new ForwardingAddress() + .setForwardingEmail(forwardingEmail); + ForwardingAddress createAddressResult = service.users().settings().forwardingAddresses() + .create("me", address).execute(); + if (createAddressResult.getVerificationStatus().equals("accepted")) { + AutoForwarding autoForwarding = new AutoForwarding() + .setEnabled(true) + .setEmailAddress(address.getForwardingEmail()) + .setDisposition("trash"); + autoForwarding = service.users().settings().updateAutoForwarding("me", autoForwarding).execute(); + System.out.println(autoForwarding.toPrettyString()); + return autoForwarding; + } + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + System.err.println("Unable to enable forwarding : " + e.getDetails()); + throw e; + } + return null; + } +} +// [END gmail_enable_forwarding] \ No newline at end of file From 39c8e0c9d7842d4d32e2452e7d210513a8e42164 Mon Sep 17 00:00:00 2001 From: Steve Bazyl Date: Tue, 8 Feb 2022 09:05:59 -0700 Subject: [PATCH 048/262] Update CalendarQuickstart.java --- calendar/quickstart/src/main/java/CalendarQuickstart.java | 1 - 1 file changed, 1 deletion(-) diff --git a/calendar/quickstart/src/main/java/CalendarQuickstart.java b/calendar/quickstart/src/main/java/CalendarQuickstart.java index 0ae61d8f..8cdde63f 100644 --- a/calendar/quickstart/src/main/java/CalendarQuickstart.java +++ b/calendar/quickstart/src/main/java/CalendarQuickstart.java @@ -44,7 +44,6 @@ public class CalendarQuickstart { /** Global instance of the JSON factory. */ private static final JsonFactory JSON_FACTORY = GsonFactory.getDefaultInstance(); /** Directory to store authorization tokens for this application. */ - private static final JsonFactory JSON_FACTORY = GsonFactory.getDefaultInstance(); private static final String TOKENS_DIRECTORY_PATH = "tokens"; /** From d68bb45733c7965791711ee07ae72063eb58a877 Mon Sep 17 00:00:00 2001 From: Rajesh Mudaliyar Date: Tue, 15 Feb 2022 12:28:57 -0800 Subject: [PATCH 049/262] Drive create drive (#176) * git-on-borg files of gmail-api-snippets * Update build.gradle test12 * Update build.gradle * Added files CreateDrive.java from Drive snippets. * Update CreateDrive.java Co-authored-by: sanjuktaghosh7 Co-authored-by: Manvendra-P-Singh Co-authored-by: Steve Bazyl --- .../drive_v2/src/main/java/CreateDrive.java | 71 +++++++++++++++++++ 1 file changed, 71 insertions(+) create mode 100644 drive/snippets/drive_v2/src/main/java/CreateDrive.java diff --git a/drive/snippets/drive_v2/src/main/java/CreateDrive.java b/drive/snippets/drive_v2/src/main/java/CreateDrive.java new file mode 100644 index 00000000..4cdd999c --- /dev/null +++ b/drive/snippets/drive_v2/src/main/java/CreateDrive.java @@ -0,0 +1,71 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// [START drive_create_drive] + +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +//import com.google.api.services.drive.Drive; +import com.google.api.services.drive.DriveScopes; +import com.google.api.services.drive.model.Drive; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; + +import java.io.IOException; +import java.util.Arrays; +import java.util.UUID; + +/* class to demonstrate use-case of Drive's create drive. */ +public class CreateDrive { + + /** + * @param + * @return Newly created drive id. + * @throws IOException if service account credentials file not found. + */ + private static String createDrive() throws IOException { + /*Load pre-authorized user credentials from the environment. + TODO(developer) - See https://developers.google.com/identity for + guides on implementing OAuth2 for your application.*/ + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault().createScoped(Arrays.asList(DriveScopes.DRIVE)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + + // Build a new authorized API client service. + com.google.api.services.drive.Drive service = new com.google.api.services.drive.Drive.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Drive samples") + .build(); + + Drive driveMetadata = new Drive(); + driveMetadata.setName("Project Resources"); + String requestId = UUID.randomUUID().toString(); + try { + Drive drive = service.drives().create(requestId, + driveMetadata) + .execute(); + System.out.println("Drive ID: " + drive.getId()); + + return drive.getId(); + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + System.err.println("Unable to create drive: " + e.getDetails()); + throw e; + } + } +} +// [END drive_create_drive] + From 7664e2b2bc22ccd880bc1c2b6b771cb24f8cce26 Mon Sep 17 00:00:00 2001 From: Rajesh Mudaliyar Date: Tue, 15 Feb 2022 12:29:36 -0800 Subject: [PATCH 050/262] Added file RecoverDrive.java (#177) * git-on-borg files of gmail-api-snippets * Update build.gradle test12 * Update build.gradle * Added file RecoverDrive.java for listing shared-drives without an organizer use-case. Co-authored-by: sanjuktaghosh7 Co-authored-by: Manvendra-P-Singh --- drive/snippets/drive_v2/build.gradle | 1 + .../drive_v2/src/main/java/RecoverDrive.java | 161 ++++++++++++++++++ 2 files changed, 162 insertions(+) create mode 100644 drive/snippets/drive_v2/src/main/java/RecoverDrive.java diff --git a/drive/snippets/drive_v2/build.gradle b/drive/snippets/drive_v2/build.gradle index 609d4c93..a9b22fb3 100644 --- a/drive/snippets/drive_v2/build.gradle +++ b/drive/snippets/drive_v2/build.gradle @@ -8,6 +8,7 @@ dependencies { implementation 'com.google.apis:google-api-services-drive:v2-rev20211205-1.32.1' implementation 'com.google.api-client:google-api-client:1.23.0' implementation 'com.google.auth:google-auth-library-oauth2-http:1.3.0' + implementation 'com.google.oauth-client:google-oauth-client-jetty:1.32.1' implementation 'com.google.code.gson:gson:2.4' testImplementation 'junit:junit:4.12' } diff --git a/drive/snippets/drive_v2/src/main/java/RecoverDrive.java b/drive/snippets/drive_v2/src/main/java/RecoverDrive.java new file mode 100644 index 00000000..50022eaa --- /dev/null +++ b/drive/snippets/drive_v2/src/main/java/RecoverDrive.java @@ -0,0 +1,161 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// [START drive_recover_drives] + +import com.google.api.client.auth.oauth2.Credential; +import com.google.api.client.extensions.java6.auth.oauth2.AuthorizationCodeInstalledApp; +import com.google.api.client.extensions.jetty.auth.oauth2.LocalServerReceiver; +import com.google.api.client.googleapis.auth.oauth2.GoogleAuthorizationCodeFlow; +import com.google.api.client.googleapis.auth.oauth2.GoogleClientSecrets; +import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.JsonFactory; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.client.util.store.FileDataStoreFactory; +//import com.google.api.services.drive.Drive; +import com.google.api.services.drive.DriveScopes; +import com.google.api.services.drive.model.Drive; +import com.google.api.services.drive.model.DriveList; +import com.google.api.services.drive.model.Permission; + +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.security.GeneralSecurityException; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +/* class to demonstrate use-case of Drive's shared drive without an organizer. */ +public class RecoverDrive { + private com.google.api.services.drive.Drive service; + /** Application name. */ + private static final String APPLICATION_NAME = "Google Drive API Java Quickstart"; + /** Global instance of the JSON factory. */ + private static final JsonFactory JSON_FACTORY = GsonFactory.getDefaultInstance(); + /** Directory to store authorization tokens for this application. */ + private static final String TOKENS_DIRECTORY_PATH = "tokens"; + + /** + * Global instance of the scopes required by this quickstart. + * If modifying these scopes, delete your previously saved tokens/ folder. + */ + private static final List SCOPES = Collections.singletonList(DriveScopes. DRIVE); + private static final String CREDENTIALS_FILE_PATH = "/credentials.json"; + + /** + * Constructor that initialize Drive API client service. + */ + public RecoverDrive(com.google.api.services.drive.Drive service) { + this.service = service; + } + + /** + * Creates an authorized Credential object. + * @param HTTP_TRANSPORT The network HTTP Transport. + * @return An authorized Credential object. + * @throws IOException If the credentials.json file cannot be found. + */ + private static Credential getCredentials(final NetHttpTransport HTTP_TRANSPORT) throws IOException { + // Load client secrets. + InputStream in = RecoverDrive.class.getResourceAsStream(CREDENTIALS_FILE_PATH); + if (in == null) { + throw new FileNotFoundException("Resource not found: " + CREDENTIALS_FILE_PATH); + } + GoogleClientSecrets clientSecrets = GoogleClientSecrets.load(JSON_FACTORY, new InputStreamReader(in)); + + // Build flow and trigger user authorization request. + GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow.Builder( + HTTP_TRANSPORT, JSON_FACTORY, clientSecrets, SCOPES) + .setDataStoreFactory(new FileDataStoreFactory(new java.io.File(TOKENS_DIRECTORY_PATH))) + .setAccessType("offline") + .build(); + LocalServerReceiver receiver = new LocalServerReceiver.Builder().setPort(8888).build(); + Credential credential = new AuthorizationCodeInstalledApp(flow, receiver).authorize("user"); + //returns an authorized Credential object. + return credential; + } + + public static void main(String... args) throws IOException, GeneralSecurityException { + // Build a new authorized API client service. + final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport(); + com.google.api.services.drive.Drive service = new com.google.api.services.drive.Drive.Builder(HTTP_TRANSPORT, JSON_FACTORY, getCredentials(HTTP_TRANSPORT)) + .setApplicationName(APPLICATION_NAME) + .build(); + + RecoverDrive drive = new RecoverDrive(service); + // replace below email id value with actual user email. + drive.recoverDrives("test@gmail.com"); + } + + /** + * @param realUser User's email id. + * @return All shared drives without an organizer. + * @throws IOException if shared drive not found. + */ + public List recoverDrives(String realUser) + throws IOException { + com.google.api.services.drive.Drive driveService = this.service; + List drives = new ArrayList(); + + // Find all shared drives without an organizer and add one. + // Note: This example does not capture all cases. Shared drives + // that have an empty group as the sole organizer, or an + // organizer outside the organization are not captured. A + // more exhaustive approach would evaluate each shared drive + // and the associated permissions and groups to ensure an active + // organizer is assigned. + String pageToken = null; + Permission newOrganizerPermission = new Permission() + .setType("user") + .setRole("organizer") + .setValue("user@example.com"); + // [START_EXCLUDE silent] + newOrganizerPermission.setValue(realUser); + // [END_EXCLUDE] + + do { + DriveList result = driveService.drives().list() + .setQ("organizerCount = 0") + .setUseDomainAdminAccess(true) + .setFields("nextPageToken, items(id, name)") + .setPageToken(pageToken) + .execute(); + for (Drive drive : result.getItems()) { + System.out.printf("Found drive without organizer: %s (%s)\n", + drive.getName(), drive.getId()); + // Note: For improved efficiency, consider batching + // permission insert requests + Permission permissionResult = driveService.permissions() + .insert(drive.getId(), newOrganizerPermission) + .setUseDomainAdminAccess(true) + .setSupportsAllDrives(true) + .setFields("id") + .execute(); + System.out.printf("Added organizer permission: %s\n", + permissionResult.getId()); + + } + // [START_EXCLUDE silent] + drives.addAll(result.getItems()); + // [END_EXCLUDE] + pageToken = result.getNextPageToken(); + } while (pageToken != null); + + return drives; + } +} +// [END drive_recover_drives] + From 4e3ba72f46d29f0eeef011374c18c98274d0708a Mon Sep 17 00:00:00 2001 From: Rajesh Mudaliyar Date: Tue, 15 Feb 2022 12:30:01 -0800 Subject: [PATCH 051/262] Added files UploadToFolder.java and UploadWithConversion.java (#178) * git-on-borg files of gmail-api-snippets * Update build.gradle test12 * Update build.gradle * Added files UploadToFolder.java and UploadWithConversion.java from drive File snippets. Co-authored-by: sanjuktaghosh7 Co-authored-by: Manvendra-P-Singh --- drive/snippets/drive_v2/files/report.csv | 3 + .../src/main/java/UploadToFolder.java | 76 +++++++++++++++++++ .../src/main/java/UploadWithConversion.java | 75 ++++++++++++++++++ 3 files changed, 154 insertions(+) create mode 100644 drive/snippets/drive_v2/files/report.csv create mode 100644 drive/snippets/drive_v2/src/main/java/UploadToFolder.java create mode 100644 drive/snippets/drive_v2/src/main/java/UploadWithConversion.java diff --git a/drive/snippets/drive_v2/files/report.csv b/drive/snippets/drive_v2/files/report.csv new file mode 100644 index 00000000..801005b7 --- /dev/null +++ b/drive/snippets/drive_v2/files/report.csv @@ -0,0 +1,3 @@ +"Name", "Phone Number" +"Bob", "123-4567" +"Mary", "234-5678" \ No newline at end of file diff --git a/drive/snippets/drive_v2/src/main/java/UploadToFolder.java b/drive/snippets/drive_v2/src/main/java/UploadToFolder.java new file mode 100644 index 00000000..6348be81 --- /dev/null +++ b/drive/snippets/drive_v2/src/main/java/UploadToFolder.java @@ -0,0 +1,76 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// [START drive_upload_to_folder] + +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.FileContent; +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.drive.Drive; +import com.google.api.services.drive.DriveScopes; +import com.google.api.services.drive.model.File; +import com.google.api.services.drive.model.ParentReference; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; +import java.io.IOException; +import java.util.Arrays; +import java.util.Collections; + +/* Class to demonstrate Drive's upload to folder use-case. */ +public class UploadToFolder { + + /** + * Upload a file to the specified folder. + * @param realFolderId Id of the folder. + * @return Inserted file metadata if successful, {@code null} otherwise. + * @throws IOException if service account credentials file not found. + */ + private static File uploadToFolder(String realFolderId) throws IOException { + // Load pre-authorized user credentials from the environment. + // TODO(developer) - See https://developers.google.com/identity for + // guides on implementing OAuth2 for your application. + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault().createScoped(Arrays.asList(DriveScopes.DRIVE_FILE)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + + // Build a new authorized API client service. + Drive service = new Drive.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Drive samples") + .build(); + + // File's metadata. + File fileMetadata = new File(); + fileMetadata.setTitle("photo.jpg"); + fileMetadata.setParents(Collections.singletonList( + new ParentReference().setId(realFolderId))); + java.io.File filePath = new java.io.File("files/photo.jpg"); + FileContent mediaContent = new FileContent("image/jpeg", filePath); + try { + File file = service.files().insert(fileMetadata, mediaContent) + .setFields("id, parents") + .execute(); + System.out.println("File ID: " + file.getId()); + return file; + }catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + System.err.println("Unable to move file: " + e.getDetails()); + throw e; + } + } +} +// [END drive_upload_to_folder] diff --git a/drive/snippets/drive_v2/src/main/java/UploadWithConversion.java b/drive/snippets/drive_v2/src/main/java/UploadWithConversion.java new file mode 100644 index 00000000..52cab884 --- /dev/null +++ b/drive/snippets/drive_v2/src/main/java/UploadWithConversion.java @@ -0,0 +1,75 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// [START drive_upload_with_conversion] + +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.FileContent; +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.drive.Drive; +import com.google.api.services.drive.DriveScopes; +import com.google.api.services.drive.model.File; +import com.google.api.services.drive.model.ParentReference; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; +import java.io.IOException; +import java.util.Arrays; +import java.util.Collections; + +/* Class to demonstrate Drive's upload with conversion use-case. */ +public class UploadWithConversion { + + /** + * Upload file with conversion. + * @return Inserted file id if successful, {@code null} otherwise. + * @throws IOException if service account credentials file not found. + */ + private static String uploadWithConversion() throws IOException { + // Load pre-authorized user credentials from the environment. + // TODO(developer) - See https://developers.google.com/identity for + // guides on implementing OAuth2 for your application. + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault().createScoped(Arrays.asList(DriveScopes.DRIVE_FILE)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + + // Build a new authorized API client service. + Drive service = new Drive.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Drive samples") + .build(); + + // File's metadata. + File fileMetadata = new File(); + fileMetadata.setTitle("My Report"); + fileMetadata.setMimeType("application/vnd.google-apps.spreadsheet"); + + java.io.File filePath = new java.io.File("files/report.csv"); + FileContent mediaContent = new FileContent("text/csv", filePath); + try { + File file = service.files().insert(fileMetadata, mediaContent) + .setFields("id") + .execute(); + System.out.println("File ID: " + file.getId()); + return file.getId(); + }catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + System.err.println("Unable to move file: " + e.getDetails()); + throw e; + } + } +} +// [END drive_upload_with_conversion] From 9acda748690f037b1ef5676428e4ed70f172ab2e Mon Sep 17 00:00:00 2001 From: Rajesh Mudaliyar Date: Tue, 15 Feb 2022 12:30:46 -0800 Subject: [PATCH 052/262] Added files UploadRevision.java and ExportPdf.java (#182) * git-on-borg files of gmail-api-snippets * Update build.gradle test12 * Update build.gradle * Added files UploadRevision.java and ExportPdf.java from drive File snippets. * Update ExportPdf.java * Update UploadRevision.java Co-authored-by: sanjuktaghosh7 Co-authored-by: Manvendra-P-Singh Co-authored-by: Steve Bazyl --- .../drive_v2/src/main/java/ExportPdf.java | 68 ++++++++++++++++++ .../src/main/java/UploadRevision.java | 72 +++++++++++++++++++ 2 files changed, 140 insertions(+) create mode 100644 drive/snippets/drive_v2/src/main/java/ExportPdf.java create mode 100644 drive/snippets/drive_v2/src/main/java/UploadRevision.java diff --git a/drive/snippets/drive_v2/src/main/java/ExportPdf.java b/drive/snippets/drive_v2/src/main/java/ExportPdf.java new file mode 100644 index 00000000..fbc5f047 --- /dev/null +++ b/drive/snippets/drive_v2/src/main/java/ExportPdf.java @@ -0,0 +1,68 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// [START drive_export_pdf] + +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.drive.Drive; +import com.google.api.services.drive.DriveScopes; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.OutputStream; +import java.util.Arrays; + +/* Class to demonstrate use-case of drive's export pdf. */ +public class ExportPdf { + + /** + * Download a Document file in PDF format. + * @param realFileId file ID of any workspace document format file. + * @return byte array stream if successful, {@code null} otherwise. + * @throws IOException if service account credentials file not found. + */ + private static ByteArrayOutputStream exportPdf(String realFileId) throws IOException{ + // Load pre-authorized user credentials from the environment. + // TODO(developer) - See https://developers.google.com/identity for + // guides on implementing OAuth2 for your application. + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault().createScoped(Arrays.asList(DriveScopes.DRIVE_FILE)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + + // Build a new authorized API client service. + Drive service = new Drive.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Drive samples") + .build(); + + OutputStream outputStream = new ByteArrayOutputStream(); + try { + service.files().export(realFileId, "application/pdf") + .executeMediaAndDownloadTo(outputStream); + + return (ByteArrayOutputStream) outputStream; + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + System.err.println("Unable to export file: " + e.getDetails()); + throw e; + } + } +} +// [END drive_export_pdf] diff --git a/drive/snippets/drive_v2/src/main/java/UploadRevision.java b/drive/snippets/drive_v2/src/main/java/UploadRevision.java new file mode 100644 index 00000000..4f4af5a5 --- /dev/null +++ b/drive/snippets/drive_v2/src/main/java/UploadRevision.java @@ -0,0 +1,72 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// [START drive_upload_revision] + +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.FileContent; +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.drive.Drive; +import com.google.api.services.drive.DriveScopes; +import com.google.api.services.drive.model.File; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; + +import java.io.IOException; +import java.util.Arrays; + +/* Class to demonstrate use-case of drive's upload revision */ +public class UploadRevision { + + /** + * Replace the old file with new one on same file ID. + * @param realFileId ID of the file to be replaced. + * @return Inserted file ID if successful, {@code null} otherwise. + * @throws IOException if service account credentials file not found. + */ + private static String uploadRevision(String realFileId) throws IOException{ + // Load pre-authorized user credentials from the environment. + // TODO(developer) - See https://developers.google.com/identity for + // guides on implementing OAuth2 for your application. + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault().createScoped(Arrays.asList(DriveScopes.DRIVE_FILE)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + + // Build a new authorized API client service. + Drive service = new Drive.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Drive samples") + .build(); + + + java.io.File filePath = new java.io.File("files/photo.jpg"); + FileContent mediaContent = new FileContent("image/jpeg", filePath); + try { + Drive.Files.Update request = service.files().update(realFileId, new File(), mediaContent) + .setFields("id"); + request.getMediaHttpUploader().setDirectUploadEnabled(true); + File file = request.execute(); + System.out.println("File ID: " + file.getId()); + return file.getId(); + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + System.err.println("Unable to upload file: " + e.getDetails()); + throw e; + } + } +} +// [END drive_upload_revision] From 0ed3e1bf0faef06e50406836471c5737ca8c2566 Mon Sep 17 00:00:00 2001 From: Rajesh Mudaliyar Date: Wed, 23 Feb 2022 09:13:05 -0800 Subject: [PATCH 053/262] Added file DownloadFile.java from drive File snippets. #45 (#185) * git-on-borg files of gmail-api-snippets * Update build.gradle test12 * Update build.gradle * Added file DownloadFile.java from drive File snippets. * Update DownloadFile.java Updated comments Co-authored-by: sanjuktaghosh7 Co-authored-by: Manvendra-P-Singh --- .../drive_v2/src/main/java/DownloadFile.java | 69 +++++++++++++++++++ 1 file changed, 69 insertions(+) create mode 100644 drive/snippets/drive_v2/src/main/java/DownloadFile.java diff --git a/drive/snippets/drive_v2/src/main/java/DownloadFile.java b/drive/snippets/drive_v2/src/main/java/DownloadFile.java new file mode 100644 index 00000000..8cf14a80 --- /dev/null +++ b/drive/snippets/drive_v2/src/main/java/DownloadFile.java @@ -0,0 +1,69 @@ +/* Copyright 2022 Google LLC + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License.*/ + +// [START drive_download_file] + +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.drive.Drive; +import com.google.api.services.drive.DriveScopes; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.OutputStream; +import java.util.Arrays; + +/* Class to demonstrate use-case of drive's download file. */ +public class DownloadFile { + + /** + * Download a Document file in PDF format. + * @param realFileId file ID of any workspace document format file. + * @return byte array stream if successful, {@code null} otherwise. + * @throws IOException if service account credentials file not found. + */ + private static ByteArrayOutputStream downloadFile(String realFileId) throws IOException{ + /* Load pre-authorized user credentials from the environment. + TODO(developer) - See https://developers.google.com/identity for + guides on implementing OAuth2 for your application.*/ + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault().createScoped(Arrays.asList(DriveScopes.DRIVE_FILE)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + + // Build a new authorized API client service. + Drive service = new Drive.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Drive samples") + .build(); + + try { + OutputStream outputStream = new ByteArrayOutputStream(); + + service.files().get(realFileId) + .executeMediaAndDownloadTo(outputStream); + + return (ByteArrayOutputStream) outputStream; + }catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + System.err.println("Unable to move file: " + e.getDetails()); + throw e; + } + } +} +// [END drive_download_file] From 99b1eb7b9879fc4e69661a18328425314e451b86 Mon Sep 17 00:00:00 2001 From: Rajesh Mudaliyar Date: Wed, 23 Feb 2022 09:13:31 -0800 Subject: [PATCH 054/262] Drive search file (#186) * git-on-borg files of gmail-api-snippets * Update build.gradle test12 * Update build.gradle * Added file SearchFile.java from drive File snippets. * Added file SearchFile.java from drive File snippets. Co-authored-by: sanjuktaghosh7 Co-authored-by: Manvendra-P-Singh --- .../drive_v2/src/main/java/SearchFile.java | 78 +++++++++++++++++++ 1 file changed, 78 insertions(+) create mode 100644 drive/snippets/drive_v2/src/main/java/SearchFile.java diff --git a/drive/snippets/drive_v2/src/main/java/SearchFile.java b/drive/snippets/drive_v2/src/main/java/SearchFile.java new file mode 100644 index 00000000..bc6a3989 --- /dev/null +++ b/drive/snippets/drive_v2/src/main/java/SearchFile.java @@ -0,0 +1,78 @@ +/* Copyright 2022 Google LLC + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License.*/ + +// [START drive_search_files] + +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.drive.Drive; +import com.google.api.services.drive.DriveScopes; +import com.google.api.services.drive.model.File; +import com.google.api.services.drive.model.FileList; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +/* Class to demonstrate use-case of search files. */ +public class SearchFile { + + /** + * Search for specific set of files. + * @return search result list. + * @throws IOException if service account credentials file not found. + */ + private static List searchFile() throws IOException{ + /*Load pre-authorized user credentials from the environment. + TODO(developer) - See https://developers.google.com/identity for + guides on implementing OAuth2 for your application.*/ + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault().createScoped(Arrays.asList(DriveScopes.DRIVE_FILE)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + + // Build a new authorized API client service. + Drive service = new Drive.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Drive samples") + .build(); + + List files = new ArrayList(); + + String pageToken = null; + do { + FileList result = service.files().list() + .setQ("mimeType='image/jpeg'") + .setSpaces("drive") + .setFields("nextPageToken, items(id, title)") + .setPageToken(pageToken) + .execute(); + for (File file : result.getItems()) { + System.out.printf("Found file: %s (%s)\n", + file.getTitle(), file.getId()); + } + + files.addAll(result.getItems()); + + pageToken = result.getNextPageToken(); + } while (pageToken != null); + + return files; + } +} +// [END drive_search_files] From 009e3d846fbdf6c90237be93d565239f0ab7b3ed Mon Sep 17 00:00:00 2001 From: Rajesh Mudaliyar Date: Wed, 23 Feb 2022 09:14:10 -0800 Subject: [PATCH 055/262] Added file ShareFile.java from drive File snippets (#187) * git-on-borg files of gmail-api-snippets * Update build.gradle test12 * Update build.gradle * Added file ShareFile.java from drive File snippets. Co-authored-by: sanjuktaghosh7 Co-authored-by: Manvendra-P-Singh --- .../drive_v2/src/main/java/ShareFile.java | 115 ++++++++++++++++++ 1 file changed, 115 insertions(+) create mode 100644 drive/snippets/drive_v2/src/main/java/ShareFile.java diff --git a/drive/snippets/drive_v2/src/main/java/ShareFile.java b/drive/snippets/drive_v2/src/main/java/ShareFile.java new file mode 100644 index 00000000..a78e6baa --- /dev/null +++ b/drive/snippets/drive_v2/src/main/java/ShareFile.java @@ -0,0 +1,115 @@ +/* Copyright 2022 Google LLC + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License.*/ + +// [START drive_share_file] + +import com.google.api.client.googleapis.batch.BatchRequest; +import com.google.api.client.googleapis.batch.json.JsonBatchCallback; +import com.google.api.client.googleapis.json.GoogleJsonError; +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.HttpHeaders; +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.drive.Drive; +import com.google.api.services.drive.DriveScopes; +import com.google.api.services.drive.model.Permission; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +/* Class to demonstrate use-case of modify permissions. */ +public class ShareFile { + + /** + * Batch permission modification. + * realFileId file Id. + * realUser User Id. + * realDomain Domain of the user ID. + * @return list of modified permissions if successful, {@code null} otherwise. + * @throws IOException if service account credentials file not found. + */ + private static List shareFile(String realFileId, String realUser, String realDomain) throws IOException{ + /* Load pre-authorized user credentials from the environment. + TODO(developer) - See https://developers.google.com/identity for + guides on implementing OAuth2 for your application.application*/ + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault().createScoped(Arrays.asList(DriveScopes.DRIVE_FILE)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + + // Build a new authorized API client service. + Drive service = new Drive.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Drive samples") + .build(); + + final List ids = new ArrayList(); + + + JsonBatchCallback callback = new JsonBatchCallback() { + @Override + public void onFailure(GoogleJsonError e, + HttpHeaders responseHeaders) + throws IOException { + // Handle error + System.err.println(e.getMessage()); + } + + @Override + public void onSuccess(Permission permission, + HttpHeaders responseHeaders) + throws IOException { + System.out.println("Permission ID: " + permission.getId()); + + ids.add(permission.getId()); + + } + }; + BatchRequest batch = service.batch(); + Permission userPermission = new Permission() + .setType("user") + .setRole("writer"); + + userPermission.setValue(realUser); + try { + service.permissions().insert(realFileId, userPermission) + .setFields("id") + .queue(batch, callback); + + Permission domainPermission = new Permission() + .setType("domain") + .setRole("reader"); + + domainPermission.setValue(realDomain); + + service.permissions().insert(realFileId, domainPermission) + .setFields("id") + .queue(batch, callback); + + batch.execute(); + + return ids; + }catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + System.err.println("Unable to modify permission: " + e.getDetails()); + throw e; + } + } +} +// [END drive_share_file] From a4c3d392fe306b5cda0d78709641353883b27f3c Mon Sep 17 00:00:00 2001 From: Rajesh Mudaliyar Date: Wed, 23 Feb 2022 09:14:54 -0800 Subject: [PATCH 056/262] Unit Test Case for gmail_create_filter (#188) * git-on-borg files of gmail-api-snippets * Update build.gradle test12 * Update build.gradle * Unit Test Case for gmail_create_filter * Update CreateFilter.java Co-authored-by: sanjuktaghosh7 Co-authored-by: Manvendra-P-Singh --- .../snippets/src/main/java/CreateFilter.java | 38 ++++++++---- .../src/test/java/TestCreateFilter.java | 59 +++++++++++++++++++ 2 files changed, 85 insertions(+), 12 deletions(-) create mode 100644 gmail/snippets/src/test/java/TestCreateFilter.java diff --git a/gmail/snippets/src/main/java/CreateFilter.java b/gmail/snippets/src/main/java/CreateFilter.java index 06840c76..fa044761 100644 --- a/gmail/snippets/src/main/java/CreateFilter.java +++ b/gmail/snippets/src/main/java/CreateFilter.java @@ -1,4 +1,4 @@ -// Copyright 2021 Google LLC +// Copyright 2022 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. @@ -27,41 +27,55 @@ import com.google.auth.oauth2.GoogleCredentials; import java.io.IOException; import java.util.Arrays; -import java.util.Collections; /* Class to demonstrate the use of Gmail Create Filter API */ public class CreateFilter { /** * Create a new filter. * - * @throws IOException + * @param realLabelId - ID of the user label to add + * @return the created filter id + * @throws IOException - if service account credentials file not found. */ - public static void createNewFilter() throws IOException { - // Load pre-authorized user credentials from the environment. - // TODO(developer) - See https://developers.google.com/identity for - // guides on implementing OAuth2 for your application. - GoogleCredentials credentials = GoogleCredentials.getApplicationDefault().createScoped(Collections.singleton(GmailScopes.GMAIL_SETTINGS_BASIC)); + public static String createNewFilter(String realLabelId) throws IOException { + // TODO(developer) - Replace with your email address. + String USER_EMAIL_ADDRESS = "gduser1@workspacesamples.dev"; + + /* Load pre-authorized user credentials from the environment. + TODO(developer) - See https://developers.google.com/identity for + guides on implementing OAuth2 for your application. */ + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Arrays.asList(GmailScopes.GMAIL_SETTINGS_BASIC, GmailScopes.GMAIL_LABELS)) + .createDelegated(USER_EMAIL_ADDRESS); HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( credentials); - // Create the gmail API client + // Create the gmail API client Gmail service = new Gmail.Builder(new NetHttpTransport(), GsonFactory.getDefaultInstance(), requestInitializer) .setApplicationName("Gmail samples") .build(); - // Filter the mail from sender and archive them(skip the inbox) + // [START createFilter] + String labelId = "Label_14"; // ID of the user label to add + // [START_EXCLUDE silent] + labelId = realLabelId; + // [END_EXCLUDE] + try { + // Filter the mail from sender and archive them(skip the inbox) Filter filter = new Filter() .setCriteria(new FilterCriteria() - .setFrom("gduser1@workspacesamples.dev")) + .setFrom("gduser2@workspacesamples.dev")) .setAction(new FilterAction() + .setAddLabelIds(Arrays.asList(labelId)) .setRemoveLabelIds(Arrays.asList("INBOX"))); Filter result = service.users().settings().filters().create("me", filter).execute(); // Prints the new created filter ID System.out.println("Created filter " + result.getId()); + return result.getId(); } catch (GoogleJsonResponseException e) { // TODO(developer) - handle error appropriately System.err.println("Unable to create filter: " + e.getDetails()); @@ -69,4 +83,4 @@ public static void createNewFilter() throws IOException { } } } -// [END gmail_create_filter] \ No newline at end of file +// [END gmail_create_filter] diff --git a/gmail/snippets/src/test/java/TestCreateFilter.java b/gmail/snippets/src/test/java/TestCreateFilter.java new file mode 100644 index 00000000..8a6dc287 --- /dev/null +++ b/gmail/snippets/src/test/java/TestCreateFilter.java @@ -0,0 +1,59 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + + +import com.google.api.services.gmail.model.Label; +import com.google.api.services.gmail.model.ListLabelsResponse; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; +import java.io.IOException; +import static org.junit.Assert.assertNotNull; + +public class TestCreateFilter extends BaseTest{ + + private Label testLabel = null; + + @Before + public void createLabel() throws IOException { + ListLabelsResponse response = this.service.users().labels().list("me").execute(); + for (Label l : response.getLabels()) { + if (l.getName().equals("testLabel")) { + testLabel = l; + } + } + if (testLabel == null) { + Label label = new Label() + .setName("testLabel") + .setLabelListVisibility("labelShow") + .setMessageListVisibility("show"); + testLabel = this.service.users().labels().create("me", label).execute(); + } + } + + @After + public void deleteLabel() throws IOException { + if (testLabel != null) { + this.service.users().labels().delete("me", testLabel.getId()).execute(); + testLabel = null; + } + } + + @Test + public void testCreateNewFilter() throws IOException { + String id = CreateFilter.createNewFilter(testLabel.getId()); + assertNotNull(id); + this.service.users().settings().filters().delete("me", id).execute(); + } +} From 861b1328a6c6db040158a06680e282be9d06fc5e Mon Sep 17 00:00:00 2001 From: Rajesh Mudaliyar Date: Wed, 23 Feb 2022 09:15:17 -0800 Subject: [PATCH 057/262] Unit Test Case for gmail_enable_forwarding (#189) * git-on-borg files of gmail-api-snippets * Update build.gradle test12 * Update build.gradle * Unit Test Case for gmail_enable_forwarding * Update EnableForwarding.java Co-authored-by: sanjuktaghosh7 Co-authored-by: Manvendra-P-Singh --- .../src/main/java/EnableForwarding.java | 15 ++++++--- .../src/test/java/TestEnableForwarding.java | 31 +++++++++++++++++++ 2 files changed, 41 insertions(+), 5 deletions(-) create mode 100644 gmail/snippets/src/test/java/TestEnableForwarding.java diff --git a/gmail/snippets/src/main/java/EnableForwarding.java b/gmail/snippets/src/main/java/EnableForwarding.java index 838a6cef..59d70497 100644 --- a/gmail/snippets/src/main/java/EnableForwarding.java +++ b/gmail/snippets/src/main/java/EnableForwarding.java @@ -37,10 +37,15 @@ public class EnableForwarding { * @throws IOException if service account credentials file not found. */ public static AutoForwarding enableAutoForwarding(String forwardingEmail) throws IOException{ - // Load pre-authorized user credentials from the environment. - // TODO(developer) - See https://developers.google.com/identity for - // guides on implementing OAuth2 for your application. - GoogleCredentials credentials = GoogleCredentials.getApplicationDefault().createScoped(Collections.singletonList(GmailScopes.GMAIL_SETTINGS_SHARING)); + // TODO(developer) - Replace with your email address. + String USER_EMAIL_ADDRESS = "gduser1@workspacesamples.dev"; + + /* Load pre-authorized user credentials from the environment. + TODO(developer) - See https://developers.google.com/identity for + guides on implementing OAuth2 for your application. */ + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Collections.singletonList(GmailScopes.GMAIL_SETTINGS_SHARING)) + .createDelegated(USER_EMAIL_ADDRESS); HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( credentials); @@ -74,4 +79,4 @@ public static AutoForwarding enableAutoForwarding(String forwardingEmail) throws return null; } } -// [END gmail_enable_forwarding] \ No newline at end of file +// [END gmail_enable_forwarding] diff --git a/gmail/snippets/src/test/java/TestEnableForwarding.java b/gmail/snippets/src/test/java/TestEnableForwarding.java new file mode 100644 index 00000000..7c7cd5f6 --- /dev/null +++ b/gmail/snippets/src/test/java/TestEnableForwarding.java @@ -0,0 +1,31 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + + +import com.google.api.services.gmail.model.AutoForwarding; +import org.junit.Test; +import java.io.IOException; +import static org.junit.Assert.assertNotNull; + +public class TestEnableForwarding extends BaseTest { + + @Test + public void TestEnableAutoForwarding() throws IOException { + AutoForwarding forwarding = EnableForwarding.enableAutoForwarding(FORWARDING_ADDRESS); + assertNotNull(forwarding); + forwarding = new AutoForwarding().setEnabled(false); + this.service.users().settings().updateAutoForwarding("me", forwarding).execute(); + this.service.users().settings().forwardingAddresses().delete("me", FORWARDING_ADDRESS).execute(); + } +} From d8a7c5308c201669e3e54388fcbbe3f6be9d904d Mon Sep 17 00:00:00 2001 From: Rajesh Mudaliyar Date: Wed, 23 Feb 2022 09:15:35 -0800 Subject: [PATCH 058/262] Unit Test Case for gmail_update_signature (#190) * git-on-borg files of gmail-api-snippets * Update build.gradle test12 * Update build.gradle * Unit Test Case for gmail_update_signature Co-authored-by: sanjuktaghosh7 Co-authored-by: Manvendra-P-Singh --- .../src/main/java/UpdateSignature.java | 23 ++++++++++------ .../src/test/java/TestUpdateSignature.java | 27 +++++++++++++++++++ 2 files changed, 42 insertions(+), 8 deletions(-) create mode 100644 gmail/snippets/src/test/java/TestUpdateSignature.java diff --git a/gmail/snippets/src/main/java/UpdateSignature.java b/gmail/snippets/src/main/java/UpdateSignature.java index b6ca985e..9bc29454 100644 --- a/gmail/snippets/src/main/java/UpdateSignature.java +++ b/gmail/snippets/src/main/java/UpdateSignature.java @@ -1,4 +1,4 @@ -// Copyright 2021 Google LLC +// Copyright 2022 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. @@ -32,13 +32,19 @@ public class UpdateSignature { /** * Update the gmail signature. * - * @throws IOException + * @return the updated signature id + * @throws IOException - if service account credentials file not found. */ - public static void updateGmailSignature() throws IOException { - // Load pre-authorized user credentials from the environment. - // TODO(developer) - See https://developers.google.com/identity for - // guides on implementing OAuth2 for your application. - GoogleCredentials credentials = GoogleCredentials.getApplicationDefault().createScoped(Collections.singleton(GmailScopes.GMAIL_SETTINGS_BASIC)); + public static String updateGmailSignature() throws IOException { + // TODO(developer) - Replace with your email address. + String USER_EMAIL_ADDRESS = "gduser1@workspacesamples.dev"; + + /* Load pre-authorized user credentials from the environment. + TODO(developer) - See https://developers.google.com/identity for + guides on implementing OAuth2 for your application. */ + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Collections.singleton(GmailScopes.GMAIL_SETTINGS_BASIC)) + .createDelegated(USER_EMAIL_ADDRESS); HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( credentials); @@ -59,7 +65,7 @@ public static void updateGmailSignature() throws IOException { } } // Updating a new signature - SendAs aliasSettings = new SendAs().setSignature("I heart cats."); + SendAs aliasSettings = new SendAs().setSignature("Automated Signature"); SendAs result = service.users().settings().sendAs().patch( "me", primaryAlias.getSendAsEmail(), @@ -67,6 +73,7 @@ public static void updateGmailSignature() throws IOException { .execute(); //Prints the updated signature System.out.println("Updated signature - " + result.getSignature()); + return result.getSignature(); } catch (GoogleJsonResponseException e) { // TODO(developer) - handle error appropriately System.err.println("Unable to update signature: " + e.getDetails()); diff --git a/gmail/snippets/src/test/java/TestUpdateSignature.java b/gmail/snippets/src/test/java/TestUpdateSignature.java new file mode 100644 index 00000000..ea5bff3e --- /dev/null +++ b/gmail/snippets/src/test/java/TestUpdateSignature.java @@ -0,0 +1,27 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + + +import org.junit.Test; +import java.io.IOException; +import static org.junit.Assert.assertEquals; + +public class TestUpdateSignature extends BaseTest{ + + @Test + public void testUpdateGmailSignature() throws IOException{ + String signature = UpdateSignature.updateGmailSignature(); + assertEquals("Automated Signature", signature); + } +} \ No newline at end of file From e10bf463e60616afaa9a0751f32244fa6fd469bb Mon Sep 17 00:00:00 2001 From: Rajesh Mudaliyar Date: Wed, 23 Feb 2022 09:15:58 -0800 Subject: [PATCH 059/262] Unit Test Case for gmail_enable_auto_reply (#191) * git-on-borg files of gmail-api-snippets * Update build.gradle test12 * Update build.gradle * Unit Test Case for gmail_enable_auto_reply Co-authored-by: sanjuktaghosh7 Co-authored-by: Manvendra-P-Singh --- .../src/main/java/EnableAutoReply.java | 30 ++++++++++++------- .../src/test/java/TestEnableAutoReply.java | 28 +++++++++++++++++ 2 files changed, 48 insertions(+), 10 deletions(-) create mode 100644 gmail/snippets/src/test/java/TestEnableAutoReply.java diff --git a/gmail/snippets/src/main/java/EnableAutoReply.java b/gmail/snippets/src/main/java/EnableAutoReply.java index ef6e052c..33ffd77b 100644 --- a/gmail/snippets/src/main/java/EnableAutoReply.java +++ b/gmail/snippets/src/main/java/EnableAutoReply.java @@ -1,4 +1,4 @@ -// Copyright 2021 Google LLC +// Copyright 2022 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. @@ -34,13 +34,19 @@ public class EnableAutoReply { /** * Enables the auto reply * - * @throws IOException + * @return the reply message and response metadata. + * @throws IOException - if service account credentials file not found. */ - public static void autoReply() throws IOException{ - // Load pre-authorized user credentials from the environment. - // TODO(developer) - See https://developers.google.com/identity for - // guides on implementing OAuth2 for your application. - GoogleCredentials credentials = GoogleCredentials.getApplicationDefault().createScoped(Collections.singleton(GmailScopes.GMAIL_SETTINGS_BASIC)); + public static VacationSettings autoReply() throws IOException{ + // TODO(developer) - Replace with your email address. + String USER_EMAIL_ADDRESS = "gduser1@workspacesamples.dev"; + + /* Load pre-authorized user credentials from the environment. + TODO(developer) - See https://developers.google.com/identity for + guides on implementing OAuth2 for your application. */ + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Collections.singleton(GmailScopes.GMAIL_SETTINGS_BASIC)) + .createDelegated(USER_EMAIL_ADDRESS); HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( credentials); @@ -57,12 +63,16 @@ public static void autoReply() throws IOException{ .setEnableAutoReply(true) .setResponseBodyHtml("I am on vacation and will reply when I am back in the office. Thanks!") .setRestrictToDomain(true) - .setStartTime(LocalDateTime.now().toEpochSecond(ZoneOffset.from(ZonedDateTime.now())) * 1000) - .setEndTime(LocalDateTime.now().plusDays(7).toEpochSecond(ZoneOffset.from(ZonedDateTime.now())) * 1000); + .setStartTime(LocalDateTime.now() + .toEpochSecond(ZoneOffset.from(ZonedDateTime.now())) * 1000) + .setEndTime(LocalDateTime.now().plusDays(7) + .toEpochSecond(ZoneOffset.from(ZonedDateTime.now())) * 1000); - VacationSettings response = service.users().settings().updateVacation("me", vacationSettings).execute(); + VacationSettings response = service.users().settings() + .updateVacation("me", vacationSettings).execute(); // Prints the auto-reply response body System.out.println("Enabled auto reply with message : "+response.getResponseBodyHtml()); + return response; } catch (GoogleJsonResponseException e) { // TODO(developer) - handle error appropriately System.err.println("Unable to enable auto reply: " + e.getDetails()); diff --git a/gmail/snippets/src/test/java/TestEnableAutoReply.java b/gmail/snippets/src/test/java/TestEnableAutoReply.java new file mode 100644 index 00000000..04778cfa --- /dev/null +++ b/gmail/snippets/src/test/java/TestEnableAutoReply.java @@ -0,0 +1,28 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + + +import com.google.api.services.gmail.model.VacationSettings; +import org.junit.Test; +import java.io.IOException; +import static org.junit.Assert.assertNotNull; + +public class TestEnableAutoReply extends EnableAutoReply { + + @Test + public void testAutoReply() throws IOException { + VacationSettings settings = EnableAutoReply.autoReply(); + assertNotNull(settings); + } +} \ No newline at end of file From ee125771385f3977424d9509fddb090af6a15da0 Mon Sep 17 00:00:00 2001 From: Rajesh Mudaliyar Date: Wed, 23 Feb 2022 09:16:36 -0800 Subject: [PATCH 060/262] Unit Test Case for gmail_create_smime_info (#192) * git-on-borg files of gmail-api-snippets * Update build.gradle test12 * Update build.gradle * Unit Test Case for gmail_create_smime_info Co-authored-by: sanjuktaghosh7 Co-authored-by: Manvendra-P-Singh --- gmail/snippets/files/cert.p12 | 1 + .../src/test/java/TestCreateSmimeInfo.java | 65 +++++++++++++++++++ 2 files changed, 66 insertions(+) create mode 100644 gmail/snippets/files/cert.p12 create mode 100644 gmail/snippets/src/test/java/TestCreateSmimeInfo.java diff --git a/gmail/snippets/files/cert.p12 b/gmail/snippets/files/cert.p12 new file mode 100644 index 00000000..9ea906b2 --- /dev/null +++ b/gmail/snippets/files/cert.p12 @@ -0,0 +1 @@ +This file should not be empty, it represents the contents of an S/MIME certificate. diff --git a/gmail/snippets/src/test/java/TestCreateSmimeInfo.java b/gmail/snippets/src/test/java/TestCreateSmimeInfo.java new file mode 100644 index 00000000..7d6b1fdb --- /dev/null +++ b/gmail/snippets/src/test/java/TestCreateSmimeInfo.java @@ -0,0 +1,65 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + + +import com.google.api.services.gmail.model.SmimeInfo; +import org.junit.Test; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.greaterThan; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; + +public class TestCreateSmimeInfo { + + @Test + public void testCreateSmimeInfo() { + SmimeInfo smimeInfo = CreateSmimeInfo.createSmimeInfo( + "files/cert.p12", + null /* password */); + + assertNotNull(smimeInfo); + assertNull(smimeInfo.getEncryptedKeyPassword()); + assertNull(smimeInfo.getExpiration()); + assertNull(smimeInfo.getId()); + assertNull(smimeInfo.getIsDefault()); + assertNull(smimeInfo.getIssuerCn()); + assertNull(smimeInfo.getPem()); + assertThat(smimeInfo.getPkcs12().length(), greaterThan(0)); + } + + @Test + public void testCreateSmimeInfoWithPassword() { + SmimeInfo smimeInfo = CreateSmimeInfo.createSmimeInfo( + "files/cert.p12", + "certpass"); + + assertNotNull(smimeInfo); + assertEquals(smimeInfo.getEncryptedKeyPassword(), "certpass"); + assertNull(smimeInfo.getExpiration()); + assertNull(smimeInfo.getId()); + assertNull(smimeInfo.getIsDefault()); + assertNull(smimeInfo.getIssuerCn()); + assertNull(smimeInfo.getPem()); + assertThat(smimeInfo.getPkcs12().length(), greaterThan(0)); + } + + @Test + public void testCreateSmimeInfoFileNotFound() { + SmimeInfo smimeInfo = CreateSmimeInfo.createSmimeInfo( + "files/notfound.p12", + null /* password */); + assertNull(smimeInfo); + } +} From ebf2147f87561820ef53be68c150c117f12a16b7 Mon Sep 17 00:00:00 2001 From: sanjuktaghosh7 Date: Wed, 2 Mar 2022 22:52:43 +0000 Subject: [PATCH 061/262] git-on-borg files of classroom-api-snippets (#193) * git-on-borg files of gmail-api-snippets * Update build.gradle test12 * Update build.gradle * git-on-borg files of classroom-api-snippets * Update Courses.java * Update BaseTest.java * Update CoursesTest.java Co-authored-by: Rajesh Mudaliyar Co-authored-by: Manvendra-P-Singh --- classroom/snippets/.gitignore | 8 + classroom/snippets/build.gradle | 22 ++ classroom/snippets/settings.gradle | 19 ++ classroom/snippets/src/main/java/Courses.java | 257 ++++++++++++++++++ .../snippets/src/test/java/BaseTest.java | 87 ++++++ .../snippets/src/test/java/CoursesTest.java | 126 +++++++++ 6 files changed, 519 insertions(+) create mode 100644 classroom/snippets/.gitignore create mode 100644 classroom/snippets/build.gradle create mode 100644 classroom/snippets/settings.gradle create mode 100644 classroom/snippets/src/main/java/Courses.java create mode 100644 classroom/snippets/src/test/java/BaseTest.java create mode 100644 classroom/snippets/src/test/java/CoursesTest.java diff --git a/classroom/snippets/.gitignore b/classroom/snippets/.gitignore new file mode 100644 index 00000000..0df08ceb --- /dev/null +++ b/classroom/snippets/.gitignore @@ -0,0 +1,8 @@ +.gradle +.settings +bin +build +gradle +src/main/java/com/google/api +.classpath +.project diff --git a/classroom/snippets/build.gradle b/classroom/snippets/build.gradle new file mode 100644 index 00000000..da3d8a86 --- /dev/null +++ b/classroom/snippets/build.gradle @@ -0,0 +1,22 @@ +apply plugin: 'java' +apply plugin: 'application' +apply plugin: 'eclipse' + +mainClassName = 'ClassroomQuickstart' +sourceCompatibility = 1.7 +targetCompatibility = 1.7 +version = '1.0' + +repositories { + mavenCentral() +} + +dependencies { + testCompile 'junit:junit:4.11' + compile 'com.google.api-client:google-api-client:1.20.0' + compile 'com.google.oauth-client:google-oauth-client-jetty:1.20.0' +} + +test { + testLogging.showStandardStreams = true +} diff --git a/classroom/snippets/settings.gradle b/classroom/snippets/settings.gradle new file mode 100644 index 00000000..c5f47228 --- /dev/null +++ b/classroom/snippets/settings.gradle @@ -0,0 +1,19 @@ +/* + * This settings file was auto generated by the Gradle buildInit task + * by 'ekoleda' at '6/25/15 1:48 PM' with Gradle 2.3 + * + * The settings file is used to specify which projects to include in your build. + * In a single project build this file can be empty or even removed. + * + * Detailed information about configuring a multi-project build in Gradle can be found + * in the user guide at http://gradle.org/docs/2.3/userguide/multi_project_builds.html + */ + +/* +// To declare projects as part of a multi-project build use the 'include' method +include 'shared' +include 'api' +include 'services:webservice' +*/ + +rootProject.name = 'java' diff --git a/classroom/snippets/src/main/java/Courses.java b/classroom/snippets/src/main/java/Courses.java new file mode 100644 index 00000000..df399390 --- /dev/null +++ b/classroom/snippets/src/main/java/Courses.java @@ -0,0 +1,257 @@ +import com.google.api.client.googleapis.batch.BatchRequest; +import com.google.api.client.googleapis.batch.json.JsonBatchCallback; +import com.google.api.client.googleapis.json.GoogleJsonError; +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.HttpHeaders; +import com.google.api.services.classroom.Classroom; +import com.google.api.services.classroom.model.Course; +import com.google.api.services.classroom.model.CourseAlias; +import com.google.api.services.classroom.model.ListCourseAliasesResponse; +import com.google.api.services.classroom.model.ListCoursesResponse; +import com.google.api.services.classroom.model.Student; +import com.google.api.services.classroom.model.Teacher; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + + +public class Courses { + public static Course createCourse(Classroom service) throws IOException { + // [START createCourse] + Course course = new Course() + .setName("10th Grade Biology") + .setSection("Period 2") + .setDescriptionHeading("Welcome to 10th Grade Biology") + .setDescription("We'll be learning about about the structure of living creatures " + + "from a combination of textbooks, guest lectures, and lab work. Expect " + + "to be excited!") + .setRoom("301") + .setOwnerId("me") + .setCourseState("PROVISIONED"); + course = service.courses().create(course).execute(); + System.out.printf("Course created: %s (%s)\n", course.getName(), course.getId()); + // [END createCourse] + return course; + } + + public static Course getCourse(Classroom service, String _courseId) throws IOException { + // [START getCourse] + String courseId = "123456"; + // [START_EXCLUDE silent] + courseId = _courseId; + // [END_EXCLUDE] + Course course = null; + try { + course = service.courses().get(courseId).execute(); + System.out.printf("Course '%s' found.\n", course.getName()); + } catch (GoogleJsonResponseException e) { + GoogleJsonError error = e.getDetails(); + if (error.getCode() == 404) { + System.out.printf("Course with ID '%s' not found.\n", courseId); + } else { + throw e; + } + } + // [END getCourse] + return course; + } + + public static List listCourses(Classroom service) throws IOException { + // [START listCourses] + String pageToken = null; + List courses = new ArrayList(); + + do { + ListCoursesResponse response = service.courses().list() + .setPageSize(100) + .setPageToken(pageToken) + .execute(); + courses.addAll(response.getCourses()); + pageToken = response.getNextPageToken(); + } while (pageToken != null); + + if (courses.isEmpty()) { + System.out.println("No courses found."); + } else { + System.out.println("Courses:"); + for (Course course : courses) { + System.out.printf("%s (%s)\n", course.getName(), course.getId()); + } + } + // [END listCourses] + return courses; + } + + public static Course updateCourse(Classroom service, String _courseId) throws IOException { + // [START updateCourse] + String courseId = "123456"; + // [START_EXCLUDE silent] + courseId = _courseId; + // [END_EXCLUDE] + Course course = service.courses().get(courseId).execute(); + course.setSection("Period 3"); + course.setRoom("302"); + course = service.courses().update(courseId, course).execute(); + System.out.printf("Course '%s' updated.\n", course.getName()); + // [END updateCourse] + return course; + } + + public static Course patchCourse(Classroom service, String _courseId) throws IOException { + // [START patchCourse] + String courseId = "123456"; + // [START_EXCLUDE silent] + courseId = _courseId; + // [END_EXCLUDE] + Course course = new Course() + .setSection("Period 3") + .setRoom("302"); + course = service.courses().patch(courseId, course) + .setUpdateMask("section,room") + .execute(); + System.out.printf("Course '%s' updated.\n", course.getName()); + // [END patchCourse] + return course; + } + + public static CourseAlias createCourseAlias(Classroom service, String _courseId, String _alias) + throws IOException { + // [START createCourseAlias] + String courseId = "123456"; + String alias = "p:bio10p2"; + // [START_EXCLUDE silent] + courseId = _courseId; + alias = _alias; + // [END_EXCLUDE] + CourseAlias courseAlias = new CourseAlias().setAlias(alias); + try { + courseAlias = service.courses().aliases().create(courseId, courseAlias).execute(); + System.out.printf("Alias '%s' created.\n", courseAlias.getAlias()); + } catch (GoogleJsonResponseException e) { + GoogleJsonError error = e.getDetails(); + if (error.getCode() == 409) { + System.out.printf("Alias '%s' is already in use.\n", alias); + } else { + throw e; + } + } + // [END createCourseAlias] + return courseAlias; + } + + public static List listCourseAliases(Classroom service, String _courseId) + throws IOException { + // [START listCourseAliases] + String courseId = "123456"; + // [START_EXCLUDE silent] + courseId = _courseId; + // [END_EXCLUDE] + String pageToken = null; + List courseAliases = new ArrayList(); + + do { + ListCourseAliasesResponse response = service.courses().aliases().list(courseId) + .setPageSize(100) + .setPageToken(pageToken) + .execute(); + courseAliases.addAll(response.getAliases()); + pageToken = response.getNextPageToken(); + } while (pageToken != null); + + if (courseAliases.isEmpty()) { + System.out.println("No aliases found."); + } else { + System.out.println("Aliases:"); + for (CourseAlias courseAlias : courseAliases) { + System.out.println(courseAlias.getAlias()); + } + } + // [END listCourseAliases] + return courseAliases; + } + + public static Teacher addTeacher(Classroom service, String _courseId, String _teacherEmail) + throws IOException { + // [START addTeacher] + String courseId = "123456"; + String teacherEmail = "alice@example.edu"; + // [START_EXCLUDE silent] + courseId = _courseId; + teacherEmail = _teacherEmail; + // [END_EXCLUDE] + Teacher teacher = new Teacher().setUserId(teacherEmail); + try { + teacher = service.courses().teachers().create(courseId, teacher).execute(); + System.out.printf("User '%s' was added as a teacher to the course with ID '%s'.\n", + teacher.getProfile().getName().getFullName(), courseId); + } catch (GoogleJsonResponseException e) { + GoogleJsonError error = e.getDetails(); + if (error.getCode() == 409) { + System.out.printf("User '%s' is already a member of this course.\n", teacherEmail); + } else { + throw e; + } + } + // [END addTeacher] + return teacher; + } + + public static Student enrollAsStudent(Classroom service, String _courseId, + String _enrollmentCode) throws IOException { + // [START enrollAsStudent] + String courseId = "123456"; + String enrollmentCode = "abcdef"; + // [START_EXCLUDE silent] + courseId = _courseId; + enrollmentCode = _enrollmentCode; + // [END_EXCLUDE] + Student student = new Student().setUserId("me"); + try { + student = service.courses().students().create(courseId, student) + .setEnrollmentCode(enrollmentCode) + .execute(); + System.out.printf("User '%s' was enrolled as a student in the course with ID '%s'.\n", + student.getProfile().getName().getFullName(), courseId); + } catch (GoogleJsonResponseException e) { + GoogleJsonError error = e.getDetails(); + if (error.getCode() == 409) { + System.out.println("You are already a member of this course."); + } else { + throw e; + } + } + // [END enrollAsStudent] + return student; + } + + public static void batchAddStudents(Classroom service, String _courseId, + List _studentEmails) throws IOException{ + // [START batchAddStudents] + String courseId = "123456"; + List studentEmails = Arrays.asList("alice@example.edu", "bob@example.edu"); + // [START_EXCLUDE silent] + courseId = _courseId; + studentEmails = _studentEmails; + // [END_EXCLUDE] + BatchRequest batch = service.batch(); + JsonBatchCallback callback = new JsonBatchCallback() { + public void onSuccess(Student student, HttpHeaders responseHeaders) { + System.out.printf("User '%s' was added as a student to the course.\n", + student.getProfile().getName().getFullName()); + } + + public void onFailure(GoogleJsonError error, HttpHeaders responseHeaders) + throws IOException { + System.out.printf("Error adding student to the course: %s\n", error.getMessage()); + } + }; + for (String studentEmail : studentEmails) { + Student student = new Student().setUserId(studentEmail); + service.courses().students().create(courseId, student).queue(batch, callback); + } + batch.execute(); + // [END batchAddStudents] + } +} diff --git a/classroom/snippets/src/test/java/BaseTest.java b/classroom/snippets/src/test/java/BaseTest.java new file mode 100644 index 00000000..41064b8e --- /dev/null +++ b/classroom/snippets/src/test/java/BaseTest.java @@ -0,0 +1,87 @@ +import com.google.api.client.auth.oauth2.Credential; +import com.google.api.client.extensions.java6.auth.oauth2.AuthorizationCodeInstalledApp; +import com.google.api.client.extensions.jetty.auth.oauth2.LocalServerReceiver; +import com.google.api.client.googleapis.auth.oauth2.GoogleAuthorizationCodeFlow; +import com.google.api.client.googleapis.auth.oauth2.GoogleClientSecrets; +import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport; +import com.google.api.client.http.HttpTransport; +import com.google.api.client.json.JsonFactory; +import com.google.api.client.json.jackson2.JacksonFactory; +import com.google.api.client.util.store.FileDataStoreFactory; +import com.google.api.services.classroom.Classroom; + +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.util.Arrays; +import java.util.List; + +/** + * Base class for integration tests. + */ +public abstract class BaseTest { + /** Application name. */ + private static final String APPLICATION_NAME = "Google Classroom API Java Snippet Tests"; + + /** Directory to store user credentials. */ + private static final java.io.File DATA_STORE_DIR = new java.io.File( + BaseTest.class.getResource("/credentials").toString()); + + /** Global instance of the {@link FileDataStoreFactory}. */ + private static FileDataStoreFactory DATA_STORE_FACTORY; + + /** Global instance of the JSON factory. */ + private static final JsonFactory JSON_FACTORY = JacksonFactory.getDefaultInstance(); + + /** Global instance of the HTTP transport. */ + private static HttpTransport HTTP_TRANSPORT; + + /** Global instance of the scopes required by this quickstart. */ + private static final List SCOPES = + Arrays.asList("https://www.googleapis.com/auth/classroom.courses", + "https://www.googleapis.com/auth/classroom.rosters"); + + static { + try { + HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport(); + DATA_STORE_FACTORY = new FileDataStoreFactory(DATA_STORE_DIR); + } catch (Throwable t) { + t.printStackTrace(); + System.out.print(true); + System.exit(1); + } + } + + /** + * Creates an authorized Credential object. + * + * @return an authorized Credential object. + * @throws IOException + */ + private Credential authorize() throws IOException { + // Load client secrets. + InputStream in = BaseTest.class.getResourceAsStream("/client_secret.json"); + GoogleClientSecrets clientSecrets = + GoogleClientSecrets.load(JSON_FACTORY, new InputStreamReader(in)); + + // Build flow and trigger user authorization request. + GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow.Builder(HTTP_TRANSPORT, + JSON_FACTORY, clientSecrets, SCOPES).setDataStoreFactory(DATA_STORE_FACTORY) + .setAccessType("offline").build(); + Credential credential = new AuthorizationCodeInstalledApp(flow, new LocalServerReceiver()) + .authorize("user"); + return credential; + } + + /** + * Build and return an authorized Classroom client service. + * + * @return an authorized Classroom client service + * @throws IOException + */ + protected Classroom getService() throws IOException { + Credential credential = authorize(); + return new com.google.api.services.classroom.Classroom.Builder(HTTP_TRANSPORT, JSON_FACTORY, + credential).setApplicationName(APPLICATION_NAME).build(); + } +} diff --git a/classroom/snippets/src/test/java/CoursesTest.java b/classroom/snippets/src/test/java/CoursesTest.java new file mode 100644 index 00000000..dc7342bd --- /dev/null +++ b/classroom/snippets/src/test/java/CoursesTest.java @@ -0,0 +1,126 @@ +import com.google.api.services.classroom.Classroom; +import com.google.api.services.classroom.model.Course; +import com.google.api.services.classroom.model.CourseAlias; +import com.google.api.services.classroom.model.Student; +import com.google.api.services.classroom.model.Teacher; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +import java.io.IOException; +import java.util.Arrays; +import java.util.List; +import java.util.UUID; + +/** + * Tests for the courses snippets. + */ +public class CoursesTest extends BaseTest { + private Classroom service; + private Course testCourse; + private String otherUser = "erics@homeroomacademy.com"; + + public CoursesTest() throws IOException { + this.service = this.getService(); + } + + @Before + public void setUp() throws IOException { + this.testCourse = createTestCourse("me"); + } + + @After + public void tearDown() throws IOException { + deleteCourse(this.testCourse.getId()); + this.testCourse = null; + } + + @Test + public void testCreateCourse() throws IOException { + Course course = Courses.createCourse(this.service); + Assert.assertNotNull("Course not returned.", course); + deleteCourse(course.getId()); + } + + @Test + public void testGetCourse() throws IOException { + Course course = Courses.getCourse(this.service, this.testCourse.getId()); + Assert.assertNotNull("Course not returned.", course); + Assert.assertEquals("Wrong course returned.", this.testCourse.getId(), course.getId()); + } + + @Test + public void testListCourses() throws IOException { + List courses = Courses.listCourses(this.service); + Assert.assertTrue("No courses returned.", courses.size() > 0); + } + + @Test + public void testUpdateCourse() throws IOException { + Course course = Courses.updateCourse(this.service, this.testCourse.getId()); + Assert.assertNotNull("Course not returned.", course); + Assert.assertEquals("Wrong course returned.", this.testCourse.getId(), course.getId()); + } + + @Test + public void testPatchCourse() throws IOException { + Course course = Courses.patchCourse(this.service, this.testCourse.getId()); + Assert.assertNotNull("Course not returned.", course); + Assert.assertEquals("Wrong course returned.", this.testCourse.getId(), course.getId()); + } + + @Test + public void testCreateCourseAlias() throws IOException { + String alias = "p:" + UUID.randomUUID().toString(); + CourseAlias courseAlias = + Courses.createCourseAlias(this.service, this.testCourse.getId(), alias); + Assert.assertNotNull("Course alias not returned.", courseAlias); + Assert.assertEquals("Wrong course alias returned.", alias, courseAlias.getAlias()); + } + + @Test + public void testListCourseAliases() throws IOException { + List courseAliases = + Courses.listCourseAliases(this.service, this.testCourse.getId()); + Assert.assertTrue("Incorrect number of course aliases returned.", courseAliases.size() == 1); + } + + @Test + public void testAddTeacher() throws IOException { + Teacher teacher = Courses.addTeacher(this.service, this.testCourse.getId(), this.otherUser); + Assert.assertNotNull("Teacher not returned.", teacher); + Assert.assertEquals("Teacher added to wrong course.", this.testCourse.getId(), + teacher.getCourseId()); + } + + @Test + public void testEnrollAsStudent() throws IOException { + Course course = this.createTestCourse(this.otherUser); + Student student = + Courses.enrollAsStudent(this.service, course.getId(), course.getEnrollmentCode()); + this.deleteCourse(course.getId()); + Assert.assertNotNull("Student not returned.", student); + Assert.assertEquals("Student added to wrong course.", course.getId(), + student.getCourseId()); + } + + @Test + public void testBatchAddStudents() throws IOException { + List studentEmails = + Arrays.asList("erics@homeroomacademy.com", "zach@homeroomacademy.com"); + Courses.batchAddStudents(this.service, this.testCourse.getId(), studentEmails); + } + + private Course createTestCourse(String ownerId) throws IOException { + String alias = "p:" + UUID.randomUUID().toString(); + Course course = new Course().setId(alias).setName("Test Course").setSection("Section") + .setOwnerId(ownerId); + return this.service.courses().create(course).execute(); + } + + private void deleteCourse(String courseId) throws IOException { + this.service.courses().delete(courseId).execute(); + } +} From 1ea9e3cd44491e2207dc4d43b44af11dacfb0997 Mon Sep 17 00:00:00 2001 From: Rajesh Mudaliyar Date: Wed, 2 Mar 2022 14:53:07 -0800 Subject: [PATCH 062/262] Classroom snippets (#194) * git-on-borg files of gmail-api-snippets * Update build.gradle test12 * Update build.gradle * classroom-api-snippets Co-authored-by: sanjuktaghosh7 Co-authored-by: Manvendra-P-Singh --- .../snippets/src/main/java/CreateCourse.java | 81 ++++++++++++++++ .../snippets/src/main/java/GetCourse.java | 71 ++++++++++++++ .../src/main/java/ListCourseAliases.java | 93 +++++++++++++++++++ .../snippets/src/main/java/ListCourses.java | 84 +++++++++++++++++ .../snippets/src/main/java/PatchCourse.java | 75 +++++++++++++++ .../snippets/src/main/java/UpdateCourse.java | 76 +++++++++++++++ 6 files changed, 480 insertions(+) create mode 100644 classroom/snippets/src/main/java/CreateCourse.java create mode 100644 classroom/snippets/src/main/java/GetCourse.java create mode 100644 classroom/snippets/src/main/java/ListCourseAliases.java create mode 100644 classroom/snippets/src/main/java/ListCourses.java create mode 100644 classroom/snippets/src/main/java/PatchCourse.java create mode 100644 classroom/snippets/src/main/java/UpdateCourse.java diff --git a/classroom/snippets/src/main/java/CreateCourse.java b/classroom/snippets/src/main/java/CreateCourse.java new file mode 100644 index 00000000..d1bca2d4 --- /dev/null +++ b/classroom/snippets/src/main/java/CreateCourse.java @@ -0,0 +1,81 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + + +// [START classroom_create_course] +import com.google.api.client.googleapis.json.GoogleJsonError; +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.classroom.Classroom; +import com.google.api.services.classroom.ClassroomScopes; +import com.google.api.services.classroom.model.Course; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; +import java.io.IOException; +import java.util.Collections; + +/* Class to demonstrate the use of Classroom Create Course API */ +public class CreateCourse { + /** + * Creates a course + * + * @return newly created course + * @throws IOException - if credentials file not found. + */ + public static Course createCourse() throws IOException { + /* Load pre-authorized user credentials from the environment. + TODO(developer) - See https://developers.google.com/identity for + guides on implementing OAuth2 for your application. */ + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Collections.singleton(ClassroomScopes.CLASSROOM_COURSES)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + + // Create the classroom API client + Classroom service = new Classroom.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Classroom samples") + .build(); + + Course course = null; + try { + // Adding a new course with description + course = new Course() + .setName("10th Grade Biology") + .setSection("Period 2") + .setDescriptionHeading("Welcome to 10th Grade Biology") + .setDescription("We'll be learning about about the structure of living creatures " + + "from a combination of textbooks, guest lectures, and lab work. Expect " + + "to be excited!") + .setRoom("301") + .setOwnerId("me") + .setCourseState("PROVISIONED"); + course = service.courses().create(course).execute(); + // Prints the new created course Id and name + System.out.printf("Course created: %s (%s)\n", course.getName(), course.getId()); + } catch (GoogleJsonResponseException e) { + GoogleJsonError error = e.getDetails(); + if (error.getCode() == 400) { + System.err.println("Unable to create course, ownerId not specified.\n"); + } else { + throw e; + } + } + return course; + } +} +// [END classroom_create_course] \ No newline at end of file diff --git a/classroom/snippets/src/main/java/GetCourse.java b/classroom/snippets/src/main/java/GetCourse.java new file mode 100644 index 00000000..ff20a729 --- /dev/null +++ b/classroom/snippets/src/main/java/GetCourse.java @@ -0,0 +1,71 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + + +// [START classroom_get_course] +import com.google.api.client.googleapis.json.GoogleJsonError; +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.classroom.Classroom; +import com.google.api.services.classroom.ClassroomScopes; +import com.google.api.services.classroom.model.Course; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; +import java.io.IOException; +import java.util.Collections; + +/* Class to demonstrate the use of Classroom Get Course API */ +public class GetCourse { + /** + * Retrieve a single course's metadata. + * + * @param courseId - Id of the course to return. + * @return a course + * @throws IOException - if credentials file not found. + */ + public static Course getCourse(String courseId) throws IOException { + /* Load pre-authorized user credentials from the environment. + TODO(developer) - See https://developers.google.com/identity for + guides on implementing OAuth2 for your application. */ + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Collections.singleton(ClassroomScopes.CLASSROOM_COURSES)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + + // Create the classroom API client + Classroom service = new Classroom.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Classroom samples") + .build(); + + Course course = null; + try { + course = service.courses().get(courseId).execute(); + System.out.printf("Course '%s' found.\n", course.getName()); + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + GoogleJsonError error = e.getDetails(); + if (error.getCode() == 404) { + System.out.printf("Course with ID '%s' not found.\n", courseId); + } else { + throw e; + } + } + return course; + } +} +// [END classroom_get_course] \ No newline at end of file diff --git a/classroom/snippets/src/main/java/ListCourseAliases.java b/classroom/snippets/src/main/java/ListCourseAliases.java new file mode 100644 index 00000000..71101eb1 --- /dev/null +++ b/classroom/snippets/src/main/java/ListCourseAliases.java @@ -0,0 +1,93 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + + +// [START classroom_list_aliases] +import com.google.api.client.googleapis.json.GoogleJsonError; +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.classroom.Classroom; +import com.google.api.services.classroom.ClassroomScopes; +import com.google.api.services.classroom.model.CourseAlias; +import com.google.api.services.classroom.model.ListCourseAliasesResponse; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +/* Class to demonstrate the use of Classroom List Alias API */ +public class ListCourseAliases { + /** + * Retrieve the aliases for a course. + * + * @param courseId - id of the course. + * @return list of course aliases + * @throws IOException - if credentials file not found. + */ + public static List listCourseAliases(String courseId) + throws IOException { + /* Load pre-authorized user credentials from the environment. + TODO(developer) - See https://developers.google.com/identity for + guides on implementing OAuth2 for your application. */ + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Collections.singleton(ClassroomScopes.CLASSROOM_COURSES)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + + // Create the classroom API client + Classroom service = new Classroom.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Classroom samples") + .build(); + + String pageToken = null; + List courseAliases = new ArrayList<>(); + + try { + // List of aliases of specified course + do { + ListCourseAliasesResponse response = service.courses().aliases().list(courseId) + .setPageSize(100) + .setPageToken(pageToken) + .execute(); + courseAliases.addAll(response.getAliases()); + pageToken = response.getNextPageToken(); + } while (pageToken != null); + + if (courseAliases.isEmpty()) { + System.out.println("No aliases found."); + } else { + System.out.println("Aliases:"); + for (CourseAlias courseAlias : courseAliases) { + System.out.println(courseAlias.getAlias()); + } + } + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + GoogleJsonError error = e.getDetails(); + if (error.getCode() == 404) { + System.err.println("Course does not exist.\n"); + } else { + throw e; + } + } + return courseAliases; + } +} +// [END classroom_list_aliases] \ No newline at end of file diff --git a/classroom/snippets/src/main/java/ListCourses.java b/classroom/snippets/src/main/java/ListCourses.java new file mode 100644 index 00000000..65a2be80 --- /dev/null +++ b/classroom/snippets/src/main/java/ListCourses.java @@ -0,0 +1,84 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + + +// [START classroom_list_courses] +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.classroom.Classroom; +import com.google.api.services.classroom.ClassroomScopes; +import com.google.api.services.classroom.model.Course; +import com.google.api.services.classroom.model.ListCoursesResponse; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +/* Class to demonstrate the use of Classroom List Course API */ +public class ListCourses { + /** + * Retrieves all courses with metadata + * + * @return list of courses with its metadata + * @throws IOException - if credentials file not found. + */ + public static List listCourses() throws IOException { + /* Load pre-authorized user credentials from the environment. + TODO(developer) - See https://developers.google.com/identity for + guides on implementing OAuth2 for your application. */ + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Collections.singleton(ClassroomScopes.CLASSROOM_COURSES)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + + // Create the classroom API client + Classroom service = new Classroom.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Classroom samples") + .build(); + + String pageToken = null; + List courses = new ArrayList<>(); + + try { + do { + ListCoursesResponse response = service.courses().list() + .setPageSize(100) + .setPageToken(pageToken) + .execute(); + courses.addAll(response.getCourses()); + pageToken = response.getNextPageToken(); + } while (pageToken != null); + + if (courses.isEmpty()) { + System.out.println("No courses found."); + } else { + System.out.println("Courses:"); + for (Course course : courses) { + System.out.printf("%s (%s)\n", course.getName(), course.getId()); + } + } + } catch (NullPointerException ne) { + // TODO(developer) - handle error appropriately + System.err.println("No courses found.\n"); + } + return courses; + } +} +// [END classroom_list_courses] \ No newline at end of file diff --git a/classroom/snippets/src/main/java/PatchCourse.java b/classroom/snippets/src/main/java/PatchCourse.java new file mode 100644 index 00000000..fd0f8e5b --- /dev/null +++ b/classroom/snippets/src/main/java/PatchCourse.java @@ -0,0 +1,75 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + + +// [START classroom_patch_course] +import com.google.api.client.googleapis.json.GoogleJsonError; +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.classroom.Classroom; +import com.google.api.services.classroom.ClassroomScopes; +import com.google.api.services.classroom.model.Course; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; +import java.io.IOException; +import java.util.Collections; + +/* Class to demonstrate the use of Classroom Patch Course API */ +public class PatchCourse { + /** + * Updates one or more fields in a course. + * + * @param courseId - Id of the course to update. + * @return updated course + * @throws IOException - if credentials file not found. + */ + public static Course patchCourse(String courseId) throws IOException { + /* Load pre-authorized user credentials from the environment. + TODO(developer) - See https://developers.google.com/identity for + guides on implementing OAuth2 for your application. */ + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Collections.singleton(ClassroomScopes.CLASSROOM_COURSES)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + + // Create the classroom API client + Classroom service = new Classroom.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Classroom samples") + .build(); + Course course = null; + try { + course = new Course() + .setSection("Period 3") + .setRoom("302"); + course = service.courses().patch(courseId, course) + .setUpdateMask("section,room") + .execute(); + System.out.printf("Course '%s' updated.\n", course.getName()); + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + GoogleJsonError error = e.getDetails(); + if (error.getCode() == 404) { + System.err.println("Course does not exist.\n"); + } else { + throw e; + } + } + return course; + } +} +// [END classroom_patch_course] \ No newline at end of file diff --git a/classroom/snippets/src/main/java/UpdateCourse.java b/classroom/snippets/src/main/java/UpdateCourse.java new file mode 100644 index 00000000..bdd577cf --- /dev/null +++ b/classroom/snippets/src/main/java/UpdateCourse.java @@ -0,0 +1,76 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + + +// [START classroom_update_course] +import com.google.api.client.googleapis.json.GoogleJsonError; +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.classroom.Classroom; +import com.google.api.services.classroom.ClassroomScopes; +import com.google.api.services.classroom.model.Course; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; +import java.io.IOException; +import java.util.Collections; + +/* Class to demonstrate the use of Classroom Update Course API */ +public class UpdateCourse { + /** + * Updates a course's metadata. + * + * @param courseId - Id of the course to update. + * @return updated course + * @throws IOException - if credentials file not found. + */ + public static Course updateCourse(String courseId) throws IOException { + /* Load pre-authorized user credentials from the environment. + TODO(developer) - See https://developers.google.com/identity for + guides on implementing OAuth2 for your application. */ + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Collections.singleton(ClassroomScopes.CLASSROOM_COURSES)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + + // Create the classroom API client + Classroom service = new Classroom.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Classroom samples") + .build(); + + Course course = null; + try { + // Updating the section and room in a course + course = service.courses().get(courseId).execute(); + course.setSection("Period 3"); + course.setRoom("302"); + course = service.courses().update(courseId, course).execute(); + // Prints the updated course + System.out.printf("Course '%s' updated.\n", course.getName()); + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + GoogleJsonError error = e.getDetails(); + if (error.getCode() == 404) { + System.err.println("Course does not exist.\n"); + } else { + throw e; + } + } + return course; + } +} +// [END classroom_update_course] \ No newline at end of file From 4185fa9f4f00c0f62ef5c070047728e9eab0751e Mon Sep 17 00:00:00 2001 From: Rajesh Mudaliyar Date: Wed, 2 Mar 2022 14:53:30 -0800 Subject: [PATCH 063/262] Moved test files from dev-rel. (#195) * git-on-borg files of gmail-api-snippets * Update build.gradle test12 * Update build.gradle * Moved test files from dev-rel. Co-authored-by: sanjuktaghosh7 Co-authored-by: Manvendra-P-Singh --- .../src/test/java/AppDataSnippetsTest.java | 42 ++++++ .../drive_v2/src/test/java/BaseTest.java | 118 +++++++++++++++++ .../src/test/java/ChangeSnippetsTest.java | 32 +++++ .../src/test/java/DriveSnippetsTest.java | 51 ++++++++ .../src/test/java/FileSnippetsTest.java | 120 ++++++++++++++++++ .../src/test/java/TeamDriveSnippetsTest.java | 51 ++++++++ .../src/test/java/AppDataSnippetsTest.java | 42 ++++++ .../drive_v3/src/test/java/BaseTest.java | 118 +++++++++++++++++ .../src/test/java/ChangeSnippetsTest.java | 32 +++++ .../src/test/java/DriveSnippetsTest.java | 51 ++++++++ .../src/test/java/FileSnippetsTest.java | 120 ++++++++++++++++++ .../src/test/java/TeamDriveSnippetsTest.java | 51 ++++++++ 12 files changed, 828 insertions(+) create mode 100644 drive/snippets/drive_v2/src/test/java/AppDataSnippetsTest.java create mode 100644 drive/snippets/drive_v2/src/test/java/BaseTest.java create mode 100644 drive/snippets/drive_v2/src/test/java/ChangeSnippetsTest.java create mode 100644 drive/snippets/drive_v2/src/test/java/DriveSnippetsTest.java create mode 100644 drive/snippets/drive_v2/src/test/java/FileSnippetsTest.java create mode 100644 drive/snippets/drive_v2/src/test/java/TeamDriveSnippetsTest.java create mode 100644 drive/snippets/drive_v3/src/test/java/AppDataSnippetsTest.java create mode 100644 drive/snippets/drive_v3/src/test/java/BaseTest.java create mode 100644 drive/snippets/drive_v3/src/test/java/ChangeSnippetsTest.java create mode 100644 drive/snippets/drive_v3/src/test/java/DriveSnippetsTest.java create mode 100644 drive/snippets/drive_v3/src/test/java/FileSnippetsTest.java create mode 100644 drive/snippets/drive_v3/src/test/java/TeamDriveSnippetsTest.java diff --git a/drive/snippets/drive_v2/src/test/java/AppDataSnippetsTest.java b/drive/snippets/drive_v2/src/test/java/AppDataSnippetsTest.java new file mode 100644 index 00000000..747103f5 --- /dev/null +++ b/drive/snippets/drive_v2/src/test/java/AppDataSnippetsTest.java @@ -0,0 +1,42 @@ +import com.google.api.services.drive.model.File; +import com.google.api.services.drive.model.FileList; +import org.junit.Before; +import org.junit.Test; + +import java.io.IOException; +import java.security.GeneralSecurityException; + +import static org.junit.Assert.*; + +public class AppDataSnippetsTest extends BaseTest { + + private AppDataSnippets snippets; + + @Before + public void createSnippets() { + this.snippets = new AppDataSnippets(this.service); + } + + @Test + public void fetchAppDataFolder() throws IOException, GeneralSecurityException { + String id = this.snippets.fetchAppDataFolder(); + assertNotNull(id); + } + + @Test + public void uploadAppData() + throws IOException, GeneralSecurityException { + String id = this.snippets.uploadAppData(); + assertNotNull(id); + deleteFileOnCleanup(id); + } + + @Test + public void listAppData() throws IOException, GeneralSecurityException { + String id = this.snippets.uploadAppData(); + deleteFileOnCleanup(id); + FileList files = this.snippets.listAppData(); + assertNotEquals(0, files.getItems().size()); + } + +} diff --git a/drive/snippets/drive_v2/src/test/java/BaseTest.java b/drive/snippets/drive_v2/src/test/java/BaseTest.java new file mode 100644 index 00000000..0bfcdc19 --- /dev/null +++ b/drive/snippets/drive_v2/src/test/java/BaseTest.java @@ -0,0 +1,118 @@ +import com.google.api.client.googleapis.auth.oauth2.GoogleCredential; +import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport; +import com.google.api.client.http.FileContent; +import com.google.api.client.http.HttpTransport; +import com.google.api.client.http.apache.ApacheHttpTransport; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.drive.Drive; +import com.google.api.services.drive.DriveScopes; +import com.google.api.services.drive.model.File; +import org.junit.After; +import org.junit.Before; + +import java.io.IOException; +import java.security.GeneralSecurityException; +import java.util.*; +import java.util.logging.Handler; +import java.util.logging.Level; +import java.util.logging.LogRecord; +import java.util.logging.Logger; + +public class BaseTest { + static { + enableLogging(); + } + + protected Drive service; + protected Set filesToDelete = new HashSet(); + + + public static void enableLogging() { + Logger logger = Logger.getLogger(HttpTransport.class.getName()); + logger.setLevel(Level.ALL); + logger.addHandler(new Handler() { + + @Override + public void close() throws SecurityException { + } + + @Override + public void flush() { + } + + @Override + public void publish(LogRecord record) { + // default ConsoleHandler will print >= INFO to System.err + if (record.getLevel().intValue() < Level.INFO.intValue()) { + System.out.println(record.getMessage()); + } + } + }); + } + + public GoogleCredential getCredential() throws IOException { + return GoogleCredential.getApplicationDefault() + .createScoped(Arrays.asList(DriveScopes.DRIVE, DriveScopes.DRIVE_APPDATA)); + } + + public Drive buildService() throws IOException, GeneralSecurityException { + GoogleCredential credential = getCredential(); + return new Drive.Builder( + //new ApacheHttpTransport(), + //GoogleNetHttpTransport.newTrustedTransport(), + new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + //GsonFactory.getDefaultInstance(), + credential) + .setApplicationName("Drive API Snippets") + .build(); + } + + @Before + public void setup() throws IOException, GeneralSecurityException { + this.service = buildService(); + this.filesToDelete.clear(); + } + + @After + public void cleanupFiles() { + for (String id : filesToDelete) { + try { + this.service.files().delete(id).execute(); + } catch (IOException e) { + System.err.println("Unable to cleanup file " + id); + } + } + } + + protected void deleteFileOnCleanup(String id) throws IOException { + filesToDelete.add(id); + } + + protected String createTestDocument() throws IOException { + File fileMetadata = new File(); + fileMetadata.setTitle("Test Document"); + fileMetadata.setMimeType("application/vnd.google-apps.document"); + + java.io.File filePath = new java.io.File("files/document.txt"); + FileContent mediaContent = new FileContent("text/plain", filePath); + File file = this.service.files().insert(fileMetadata, mediaContent) + .setFields("id") + .execute(); + filesToDelete.add(file.getId()); + return file.getId(); + } + + protected String createTestBlob() throws IOException { + File fileMetadata = new File(); + fileMetadata.setTitle("photo.jpg"); + java.io.File filePath = new java.io.File("files/photo.jpg"); + FileContent mediaContent = new FileContent("image/jpeg", filePath); + File file = this.service.files().insert(fileMetadata, mediaContent) + .setFields("id") + .execute(); + filesToDelete.add(file.getId()); + return file.getId(); + } +} diff --git a/drive/snippets/drive_v2/src/test/java/ChangeSnippetsTest.java b/drive/snippets/drive_v2/src/test/java/ChangeSnippetsTest.java new file mode 100644 index 00000000..3a33e4e8 --- /dev/null +++ b/drive/snippets/drive_v2/src/test/java/ChangeSnippetsTest.java @@ -0,0 +1,32 @@ +import org.junit.Before; +import org.junit.Test; + +import java.io.IOException; + +import static org.junit.Assert.assertNotEquals; +import static org.junit.Assert.assertNotNull; + +public class ChangeSnippetsTest extends BaseTest { + + private ChangeSnippets snippets; + + @Before + public void createSnippets() { + this.snippets = new ChangeSnippets(this.service); + } + + @Test + public void fetchStartPageToken() throws IOException { + String token = this.snippets.fetchStartPageToken(); + assertNotNull(token); + } + + @Test + public void fetchChanges() throws IOException { + String startPageToken = this.snippets.fetchStartPageToken(); + this.createTestBlob(); + String newStartPageToken = this.snippets.fetchChanges(startPageToken); + assertNotNull(newStartPageToken); + assertNotEquals(startPageToken, newStartPageToken); + } +} diff --git a/drive/snippets/drive_v2/src/test/java/DriveSnippetsTest.java b/drive/snippets/drive_v2/src/test/java/DriveSnippetsTest.java new file mode 100644 index 00000000..cbe27af2 --- /dev/null +++ b/drive/snippets/drive_v2/src/test/java/DriveSnippetsTest.java @@ -0,0 +1,51 @@ +import com.google.api.services.drive.model.Drive; +import com.google.api.services.drive.model.Permission; +import com.google.api.services.drive.model.PermissionList; +import org.junit.Before; +import org.junit.Test; + +import java.io.IOException; +import java.security.GeneralSecurityException; +import java.util.List; + +import static org.junit.Assert.assertNotEquals; +import static org.junit.Assert.assertNotNull; + +public class DriveSnippetsTest extends BaseTest { + + private DriveSnippets snippets; + + @Before + public void createSnippets() { + this.snippets = new DriveSnippets(this.service); + } + + @Test + public void createDrive() throws IOException, GeneralSecurityException { + String id = this.snippets.createDrive(); + assertNotNull(id); + this.service.drives().delete(id); + } + + @Test + public void recoverDrives() throws IOException { + String id = this.createOrphanedDrive(); + List results = this.snippets.recoverDrives( + "sbazyl@test.appsdevtesting.com"); + assertNotEquals(0, results.size()); + this.service.drives().delete(id).execute(); + } + + private String createOrphanedDrive() throws IOException { + String driveId = this.snippets.createDrive(); + PermissionList response = this.service.permissions().list(driveId) + .setSupportsAllDrives(true) + .execute(); + for (Permission permission : response.getItems()) { + this.service.permissions().delete(driveId, permission.getId()) + .setSupportsAllDrives(true) + .execute(); + } + return driveId; + } +} diff --git a/drive/snippets/drive_v2/src/test/java/FileSnippetsTest.java b/drive/snippets/drive_v2/src/test/java/FileSnippetsTest.java new file mode 100644 index 00000000..dab8987b --- /dev/null +++ b/drive/snippets/drive_v2/src/test/java/FileSnippetsTest.java @@ -0,0 +1,120 @@ +import com.google.api.services.drive.model.File; +import com.google.api.services.drive.model.FileList; +import org.junit.Before; +import org.junit.Test; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.security.GeneralSecurityException; +import java.util.List; + +import static org.junit.Assert.*; + +public class FileSnippetsTest extends BaseTest { + + private FileSnippets snippets; + + @Before + public void createSnippets() { + this.snippets = new FileSnippets(this.service); + } + + @Test + public void uploadBasic() throws IOException, GeneralSecurityException { + String id = this.snippets.uploadBasic(); + assertNotNull(id); + deleteFileOnCleanup(id); + } + + @Test + public void uploadRevision() throws IOException, GeneralSecurityException { + String id = this.snippets.uploadBasic(); + assertNotNull(id); + deleteFileOnCleanup(id); + String id2 = this.snippets.uploadRevision(id); + assertEquals(id, id2); + } + + @Test + public void uploadToFolder() throws IOException, GeneralSecurityException { + String folderId = this.snippets.createFolder(); + File file = this.snippets.uploadToFolder(folderId); + assertTrue(file.getParents().get(0).getId().equals(folderId)); + deleteFileOnCleanup(file.getId()); + deleteFileOnCleanup(folderId); + } + + @Test + public void uploadWithConversion() + throws IOException, GeneralSecurityException { + String id = this.snippets.uploadWithConversion(); + assertNotNull(id); + deleteFileOnCleanup(id); + } + + @Test + public void exportPdf() throws IOException, GeneralSecurityException { + String id = createTestDocument(); + ByteArrayOutputStream out = this.snippets.exportPdf(id); + assertEquals("%PDF", out.toString("UTF-8").substring(0, 4)); + } + + @Test + public void downloadFile() throws IOException, GeneralSecurityException { + String id = createTestBlob(); + ByteArrayOutputStream out = this.snippets.downloadFile(id); + byte[] bytes = out.toByteArray(); + assertEquals((byte) 0xFF, bytes[0]); + assertEquals((byte) 0xD8, bytes[1]); + } + + @Test + public void createShortcut() throws IOException, GeneralSecurityException { + String id = this.snippets.createShortcut(); + assertNotNull(id); + deleteFileOnCleanup(id); + } + + @Test + public void touchFile() throws IOException, GeneralSecurityException { + String id = this.createTestBlob(); + long now = System.currentTimeMillis(); + long modifiedTime = this.snippets.touchFile(id, now); + assertEquals(now, modifiedTime); + } + + @Test + public void createFolder() throws IOException, GeneralSecurityException { + String id = this.snippets.createFolder(); + assertNotNull(id); + deleteFileOnCleanup(id); + } + + @Test + public void moveFileToFolder() + throws IOException, GeneralSecurityException { + String folderId = this.snippets.createFolder(); + deleteFileOnCleanup(folderId); + String fileId = this.createTestBlob(); + List parents = this.snippets.moveFileToFolder(fileId, folderId); + assertEquals(1, parents.size()); + assertTrue(parents.contains(folderId)); + } + + @Test + public void searchFiles() + throws IOException, GeneralSecurityException { + this.createTestBlob(); + List files = this.snippets.searchFiles(); + assertNotEquals(0, files.size()); + } + + @Test + public void shareFile() throws IOException { + String fileId = this.createTestBlob(); + List ids = this.snippets.shareFile(fileId, + "user@test.appsdevtesting.com", + "test.appsdevtesting.com"); + assertEquals(2, ids.size()); + } +} diff --git a/drive/snippets/drive_v2/src/test/java/TeamDriveSnippetsTest.java b/drive/snippets/drive_v2/src/test/java/TeamDriveSnippetsTest.java new file mode 100644 index 00000000..59bdf809 --- /dev/null +++ b/drive/snippets/drive_v2/src/test/java/TeamDriveSnippetsTest.java @@ -0,0 +1,51 @@ +import com.google.api.services.drive.model.TeamDrive; +import com.google.api.services.drive.model.Permission; +import com.google.api.services.drive.model.PermissionList; +import org.junit.Before; +import org.junit.Test; + +import java.io.IOException; +import java.security.GeneralSecurityException; +import java.util.List; + +import static org.junit.Assert.assertNotEquals; +import static org.junit.Assert.assertNotNull; + +public class TeamDriveSnippetsTest extends BaseTest { + + private TeamDriveSnippets snippets; + + @Before + public void createSnippets() { + this.snippets = new TeamDriveSnippets(this.service); + } + + @Test + public void createTeamDrive() throws IOException, GeneralSecurityException { + String id = this.snippets.createTeamDrive(); + assertNotNull(id); + this.service.teamdrives().delete(id); + } + + @Test + public void recoverTeamDrives() throws IOException { + String id = this.createOrphanedTeamDrive(); + List results = this.snippets.recoverTeamDrives( + "sbazyl@test.appsdevtesting.com"); + assertNotEquals(0, results.size()); + this.service.teamdrives().delete(id).execute(); + } + + private String createOrphanedTeamDrive() throws IOException { + String teamDriveId = this.snippets.createTeamDrive(); + PermissionList response = this.service.permissions().list(teamDriveId) + .setSupportsTeamDrives(true) + .execute(); + for (Permission permission : response.getItems()) { + this.service.permissions().delete(teamDriveId, permission.getId()) + .setSupportsTeamDrives(true) + .execute(); + } + return teamDriveId; + } +} diff --git a/drive/snippets/drive_v3/src/test/java/AppDataSnippetsTest.java b/drive/snippets/drive_v3/src/test/java/AppDataSnippetsTest.java new file mode 100644 index 00000000..39d5111b --- /dev/null +++ b/drive/snippets/drive_v3/src/test/java/AppDataSnippetsTest.java @@ -0,0 +1,42 @@ +import com.google.api.services.drive.model.File; +import com.google.api.services.drive.model.FileList; +import org.junit.Before; +import org.junit.Test; + +import java.io.IOException; +import java.security.GeneralSecurityException; + +import static org.junit.Assert.*; + +public class AppDataSnippetsTest extends BaseTest { + + private AppDataSnippets snippets; + + @Before + public void createSnippets() { + this.snippets = new AppDataSnippets(this.service); + } + + @Test + public void fetchAppDataFolder() throws IOException, GeneralSecurityException { + String id = this.snippets.fetchAppDataFolder(); + assertNotNull(id); + } + + @Test + public void uploadAppData() + throws IOException, GeneralSecurityException { + String id = this.snippets.uploadAppData(); + assertNotNull(id); + deleteFileOnCleanup(id); + } + + @Test + public void listAppData() throws IOException, GeneralSecurityException { + String id = this.snippets.uploadAppData(); + deleteFileOnCleanup(id); + FileList files = this.snippets.listAppData(); + assertNotEquals(0, files.getFiles().size()); + } + +} diff --git a/drive/snippets/drive_v3/src/test/java/BaseTest.java b/drive/snippets/drive_v3/src/test/java/BaseTest.java new file mode 100644 index 00000000..1177eee1 --- /dev/null +++ b/drive/snippets/drive_v3/src/test/java/BaseTest.java @@ -0,0 +1,118 @@ +import com.google.api.client.googleapis.auth.oauth2.GoogleCredential; +import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport; +import com.google.api.client.http.FileContent; +import com.google.api.client.http.HttpTransport; +import com.google.api.client.http.apache.ApacheHttpTransport; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.drive.Drive; +import com.google.api.services.drive.DriveScopes; +import com.google.api.services.drive.model.File; +import org.junit.After; +import org.junit.Before; + +import java.io.IOException; +import java.security.GeneralSecurityException; +import java.util.*; +import java.util.logging.Handler; +import java.util.logging.Level; +import java.util.logging.LogRecord; +import java.util.logging.Logger; + +public class BaseTest { + static { + enableLogging(); + } + + protected Drive service; + protected Set filesToDelete = new HashSet(); + + + public static void enableLogging() { + Logger logger = Logger.getLogger(HttpTransport.class.getName()); + logger.setLevel(Level.ALL); + logger.addHandler(new Handler() { + + @Override + public void close() throws SecurityException { + } + + @Override + public void flush() { + } + + @Override + public void publish(LogRecord record) { + // default ConsoleHandler will print >= INFO to System.err + if (record.getLevel().intValue() < Level.INFO.intValue()) { + System.out.println(record.getMessage()); + } + } + }); + } + + public GoogleCredential getCredential() throws IOException { + return GoogleCredential.getApplicationDefault() + .createScoped(Arrays.asList(DriveScopes.DRIVE, DriveScopes.DRIVE_APPDATA)); + } + + public Drive buildService() throws IOException, GeneralSecurityException { + GoogleCredential credential = getCredential(); + return new Drive.Builder( + //new ApacheHttpTransport(), + //GoogleNetHttpTransport.newTrustedTransport(), + new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + //GsonFactory.getDefaultInstance(), + credential) + .setApplicationName("Drive API Snippets") + .build(); + } + + @Before + public void setup() throws IOException, GeneralSecurityException { + this.service = buildService(); + this.filesToDelete.clear(); + } + + @After + public void cleanupFiles() { + for (String id : filesToDelete) { + try { + this.service.files().delete(id).execute(); + } catch (IOException e) { + System.err.println("Unable to cleanup file " + id); + } + } + } + + protected void deleteFileOnCleanup(String id) throws IOException { + filesToDelete.add(id); + } + + protected String createTestDocument() throws IOException { + File fileMetadata = new File(); + fileMetadata.setName("Test Document"); + fileMetadata.setMimeType("application/vnd.google-apps.document"); + + java.io.File filePath = new java.io.File("files/document.txt"); + FileContent mediaContent = new FileContent("text/plain", filePath); + File file = this.service.files().create(fileMetadata, mediaContent) + .setFields("id") + .execute(); + filesToDelete.add(file.getId()); + return file.getId(); + } + + protected String createTestBlob() throws IOException { + File fileMetadata = new File(); + fileMetadata.setName("photo.jpg"); + java.io.File filePath = new java.io.File("files/photo.jpg"); + FileContent mediaContent = new FileContent("image/jpeg", filePath); + File file = this.service.files().create(fileMetadata, mediaContent) + .setFields("id") + .execute(); + filesToDelete.add(file.getId()); + return file.getId(); + } +} diff --git a/drive/snippets/drive_v3/src/test/java/ChangeSnippetsTest.java b/drive/snippets/drive_v3/src/test/java/ChangeSnippetsTest.java new file mode 100644 index 00000000..3a33e4e8 --- /dev/null +++ b/drive/snippets/drive_v3/src/test/java/ChangeSnippetsTest.java @@ -0,0 +1,32 @@ +import org.junit.Before; +import org.junit.Test; + +import java.io.IOException; + +import static org.junit.Assert.assertNotEquals; +import static org.junit.Assert.assertNotNull; + +public class ChangeSnippetsTest extends BaseTest { + + private ChangeSnippets snippets; + + @Before + public void createSnippets() { + this.snippets = new ChangeSnippets(this.service); + } + + @Test + public void fetchStartPageToken() throws IOException { + String token = this.snippets.fetchStartPageToken(); + assertNotNull(token); + } + + @Test + public void fetchChanges() throws IOException { + String startPageToken = this.snippets.fetchStartPageToken(); + this.createTestBlob(); + String newStartPageToken = this.snippets.fetchChanges(startPageToken); + assertNotNull(newStartPageToken); + assertNotEquals(startPageToken, newStartPageToken); + } +} diff --git a/drive/snippets/drive_v3/src/test/java/DriveSnippetsTest.java b/drive/snippets/drive_v3/src/test/java/DriveSnippetsTest.java new file mode 100644 index 00000000..f520db8b --- /dev/null +++ b/drive/snippets/drive_v3/src/test/java/DriveSnippetsTest.java @@ -0,0 +1,51 @@ +import com.google.api.services.drive.model.Drive; +import com.google.api.services.drive.model.Permission; +import com.google.api.services.drive.model.PermissionList; +import org.junit.Before; +import org.junit.Test; + +import java.io.IOException; +import java.security.GeneralSecurityException; +import java.util.List; + +import static org.junit.Assert.assertNotEquals; +import static org.junit.Assert.assertNotNull; + +public class DriveSnippetsTest extends BaseTest { + + private DriveSnippets snippets; + + @Before + public void createSnippets() { + this.snippets = new DriveSnippets(this.service); + } + + @Test + public void createDrive() throws IOException, GeneralSecurityException { + String id = this.snippets.createDrive(); + assertNotNull(id); + this.service.drives().delete(id); + } + + @Test + public void recoverDrives() throws IOException { + String id = this.createOrphanedDrive(); + List results = this.snippets.recoverDrives( + "sbazyl@test.appsdevtesting.com"); + assertNotEquals(0, results.size()); + this.service.drives().delete(id).execute(); + } + + private String createOrphanedDrive() throws IOException { + String driveId = this.snippets.createDrive(); + PermissionList response = this.service.permissions().list(driveId) + .setSupportsAllDrives(true) + .execute(); + for (Permission permission : response.getPermissions()) { + this.service.permissions().delete(driveId, permission.getId()) + .setSupportsAllDrives(true) + .execute(); + } + return driveId; + } +} diff --git a/drive/snippets/drive_v3/src/test/java/FileSnippetsTest.java b/drive/snippets/drive_v3/src/test/java/FileSnippetsTest.java new file mode 100644 index 00000000..94eafc4c --- /dev/null +++ b/drive/snippets/drive_v3/src/test/java/FileSnippetsTest.java @@ -0,0 +1,120 @@ +import com.google.api.services.drive.model.File; +import com.google.api.services.drive.model.FileList; +import org.junit.Before; +import org.junit.Test; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.security.GeneralSecurityException; +import java.util.List; + +import static org.junit.Assert.*; + +public class FileSnippetsTest extends BaseTest { + + private FileSnippets snippets; + + @Before + public void createSnippets() { + this.snippets = new FileSnippets(this.service); + } + + @Test + public void uploadBasic() throws IOException, GeneralSecurityException { + String id = this.snippets.uploadBasic(); + assertNotNull(id); + deleteFileOnCleanup(id); + } + + @Test + public void uploadRevision() throws IOException, GeneralSecurityException { + String id = this.snippets.uploadBasic(); + assertNotNull(id); + deleteFileOnCleanup(id); + String id2 = this.snippets.uploadRevision(id); + assertEquals(id, id2); + } + + @Test + public void uploadToFolder() throws IOException, GeneralSecurityException { + String folderId = this.snippets.createFolder(); + File file = this.snippets.uploadToFolder(folderId); + assertTrue(file.getParents().contains(folderId)); + deleteFileOnCleanup(file.getId()); + deleteFileOnCleanup(folderId); + } + + @Test + public void uploadWithConversion() + throws IOException, GeneralSecurityException { + String id = this.snippets.uploadWithConversion(); + assertNotNull(id); + deleteFileOnCleanup(id); + } + + @Test + public void exportPdf() throws IOException, GeneralSecurityException { + String id = createTestDocument(); + ByteArrayOutputStream out = this.snippets.exportPdf(id); + assertEquals("%PDF", out.toString("UTF-8").substring(0, 4)); + } + + @Test + public void downloadFile() throws IOException, GeneralSecurityException { + String id = createTestBlob(); + ByteArrayOutputStream out = this.snippets.downloadFile(id); + byte[] bytes = out.toByteArray(); + assertEquals((byte) 0xFF, bytes[0]); + assertEquals((byte) 0xD8, bytes[1]); + } + + @Test + public void createShortcut() throws IOException, GeneralSecurityException { + String id = this.snippets.createShortcut(); + assertNotNull(id); + deleteFileOnCleanup(id); + } + + @Test + public void touchFile() throws IOException, GeneralSecurityException { + String id = this.createTestBlob(); + long now = System.currentTimeMillis(); + long modifiedTime = this.snippets.touchFile(id, now); + assertEquals(now, modifiedTime); + } + + @Test + public void createFolder() throws IOException, GeneralSecurityException { + String id = this.snippets.createFolder(); + assertNotNull(id); + deleteFileOnCleanup(id); + } + + @Test + public void moveFileToFolder() + throws IOException, GeneralSecurityException { + String folderId = this.snippets.createFolder(); + deleteFileOnCleanup(folderId); + String fileId = this.createTestBlob(); + List parents = this.snippets.moveFileToFolder(fileId, folderId); + assertTrue(parents.contains(folderId)); + assertEquals(1, parents.size()); + } + + @Test + public void searchFiles() + throws IOException, GeneralSecurityException { + this.createTestBlob(); + List files = this.snippets.searchFiles(); + assertNotEquals(0, files.size()); + } + + @Test + public void shareFile() throws IOException { + String fileId = this.createTestBlob(); + List ids = this.snippets.shareFile(fileId, + "user@test.appsdevtesting.com", + "test.appsdevtesting.com"); + assertEquals(2, ids.size()); + } +} diff --git a/drive/snippets/drive_v3/src/test/java/TeamDriveSnippetsTest.java b/drive/snippets/drive_v3/src/test/java/TeamDriveSnippetsTest.java new file mode 100644 index 00000000..3e46bd38 --- /dev/null +++ b/drive/snippets/drive_v3/src/test/java/TeamDriveSnippetsTest.java @@ -0,0 +1,51 @@ +import com.google.api.services.drive.model.TeamDrive; +import com.google.api.services.drive.model.Permission; +import com.google.api.services.drive.model.PermissionList; +import org.junit.Before; +import org.junit.Test; + +import java.io.IOException; +import java.security.GeneralSecurityException; +import java.util.List; + +import static org.junit.Assert.assertNotEquals; +import static org.junit.Assert.assertNotNull; + +public class TeamDriveSnippetsTest extends BaseTest { + + private TeamDriveSnippets snippets; + + @Before + public void createSnippets() { + this.snippets = new TeamDriveSnippets(this.service); + } + + @Test + public void createTeamDrive() throws IOException, GeneralSecurityException { + String id = this.snippets.createTeamDrive(); + assertNotNull(id); + this.service.teamdrives().delete(id); + } + + @Test + public void recoverTeamDrives() throws IOException { + String id = this.createOrphanedTeamDrive(); + List results = this.snippets.recoverTeamDrives( + "sbazyl@test.appsdevtesting.com"); + assertNotEquals(0, results.size()); + this.service.teamdrives().delete(id).execute(); + } + + private String createOrphanedTeamDrive() throws IOException { + String teamDriveId = this.snippets.createTeamDrive(); + PermissionList response = this.service.permissions().list(teamDriveId) + .setSupportsTeamDrives(true) + .execute(); + for (Permission permission : response.getPermissions()) { + this.service.permissions().delete(teamDriveId, permission.getId()) + .setSupportsTeamDrives(true) + .execute(); + } + return teamDriveId; + } +} From f36f71ab08c6318fc9798b2fb5897efb21abe268 Mon Sep 17 00:00:00 2001 From: Rajesh Mudaliyar Date: Wed, 2 Mar 2022 14:53:52 -0800 Subject: [PATCH 064/262] classroom api snippets (#196) * git-on-borg files of gmail-api-snippets * Update build.gradle test12 * Update build.gradle * classroom-api-snippets Co-authored-by: sanjuktaghosh7 Co-authored-by: Manvendra-P-Singh --- .../snippets/src/main/java/AddStudent.java | 80 +++++++++++++++++++ .../snippets/src/main/java/AddTeacher.java | 78 ++++++++++++++++++ .../src/main/java/BatchAddStudents.java | 77 ++++++++++++++++++ 3 files changed, 235 insertions(+) create mode 100644 classroom/snippets/src/main/java/AddStudent.java create mode 100644 classroom/snippets/src/main/java/AddTeacher.java create mode 100644 classroom/snippets/src/main/java/BatchAddStudents.java diff --git a/classroom/snippets/src/main/java/AddStudent.java b/classroom/snippets/src/main/java/AddStudent.java new file mode 100644 index 00000000..b3237c9a --- /dev/null +++ b/classroom/snippets/src/main/java/AddStudent.java @@ -0,0 +1,80 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + + +// [START classroom_add_student] +import com.google.api.client.googleapis.json.GoogleJsonError; +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.classroom.Classroom; +import com.google.api.services.classroom.ClassroomScopes; +import com.google.api.services.classroom.model.Student; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; +import java.io.IOException; +import java.util.Collections; + +/* Class to demonstrate the use of Classroom Add Student API */ +public class AddStudent { + /** + * Add a student in a specified course. + * + * @param courseId - Id of the course. + * @param enrollmentCode - Code of the course to enroll. + * @return newly added student + * @throws IOException - if credentials file not found. + */ + public static Student addStudent(String courseId, String enrollmentCode) + throws IOException { + /* Load pre-authorized user credentials from the environment. + TODO(developer) - See https://developers.google.com/identity for + guides on implementing OAuth2 for your application. */ + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Collections.singleton(ClassroomScopes.CLASSROOM_ROSTERS)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + + // Create the classroom API client + Classroom service = new Classroom.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Classroom samples") + .build(); + + Student student = new Student().setUserId("me"); + try { + // Enrolling a student to a specified course + student = service.courses().students().create(courseId, student) + .setEnrollmentCode(enrollmentCode) + .execute(); + // Prints the course id with the Student name + System.out.printf("User '%s' was enrolled as a student in the course with ID '%s'.\n", + student.getProfile().getName().getFullName(), courseId); + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + GoogleJsonError error = e.getDetails(); + if (error.getCode() == 409) { + System.out.println("You are already a member of this course."); + } else if (error.getCode() == 403) { + System.out.println("The caller does not have permission.\n"); + } else { + throw e; + } + } + return student; + } +} +// [END classroom_add_student] \ No newline at end of file diff --git a/classroom/snippets/src/main/java/AddTeacher.java b/classroom/snippets/src/main/java/AddTeacher.java new file mode 100644 index 00000000..bede3367 --- /dev/null +++ b/classroom/snippets/src/main/java/AddTeacher.java @@ -0,0 +1,78 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + + +// [START classroom_add_teacher] +import com.google.api.client.googleapis.json.GoogleJsonError; +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.classroom.Classroom; +import com.google.api.services.classroom.ClassroomScopes; +import com.google.api.services.classroom.model.Teacher; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; +import java.io.IOException; +import java.util.Collections; + +/* Class to demonstrate the use of Classroom Add Teacher API */ +public class AddTeacher { + /** + * Add teacher to a specific course. + * + * @param courseId - Id of the course. + * @param teacherEmail - Email address of the teacher. + * @return newly created teacher + * @throws IOException - if credentials file not found. + */ + public static Teacher addTeacher(String courseId, String teacherEmail) + throws IOException { + /* Load pre-authorized user credentials from the environment. + TODO(developer) - See https://developers.google.com/identity for + guides on implementing OAuth2 for your application. */ + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Collections.singleton(ClassroomScopes.CLASSROOM_ROSTERS)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + + // Create the classroom API client + Classroom service = new Classroom.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Classroom samples") + .build(); + + Teacher teacher = new Teacher().setUserId(teacherEmail); + try { + // Add a teacher to a specified course + teacher = service.courses().teachers().create(courseId, teacher).execute(); + // Prints the course id with the teacher name + System.out.printf("User '%s' was added as a teacher to the course with ID '%s'.\n", + teacher.getProfile().getName().getFullName(), courseId); + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + GoogleJsonError error = e.getDetails(); + if (error.getCode() == 409) { + System.out.printf("User '%s' is already a member of this course.\n", teacherEmail); + } else if (error.getCode() == 403) { + System.out.println("The caller does not have permission.\n"); + } else { + throw e; + } + } + return teacher; + } +} +// [END classroom_add_teacher] \ No newline at end of file diff --git a/classroom/snippets/src/main/java/BatchAddStudents.java b/classroom/snippets/src/main/java/BatchAddStudents.java new file mode 100644 index 00000000..676cddc3 --- /dev/null +++ b/classroom/snippets/src/main/java/BatchAddStudents.java @@ -0,0 +1,77 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + + +// [START classroom_batch_add_students] +import com.google.api.client.googleapis.batch.BatchRequest; +import com.google.api.client.googleapis.batch.json.JsonBatchCallback; +import com.google.api.client.googleapis.json.GoogleJsonError; +import com.google.api.client.http.HttpHeaders; +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.classroom.Classroom; +import com.google.api.services.classroom.ClassroomScopes; +import com.google.api.services.classroom.model.Student; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; +import java.io.IOException; +import java.util.Collections; +import java.util.List; + +/* Class to demonstrate the use of Classroom Batch Add Students API */ +public class BatchAddStudents { + /** + * Add multiple students in a specified course. + * + * @param courseId - Id of the course to add students. + * @param studentEmails - Email address of the students. + * @throws IOException - if credentials file not found. + */ + public static void batchAddStudents(String courseId, List studentEmails) + throws IOException { + /* Load pre-authorized user credentials from the environment. + TODO(developer) - See https://developers.google.com/identity for + guides on implementing OAuth2 for your application. */ + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Collections.singleton(ClassroomScopes.CLASSROOM_ROSTERS)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + + // Create the classroom API client + Classroom service = new Classroom.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Classroom samples") + .build(); + + BatchRequest batch = service.batch(); + JsonBatchCallback callback = new JsonBatchCallback<>() { + public void onSuccess(Student student, HttpHeaders responseHeaders) { + System.out.printf("User '%s' was added as a student to the course.\n", + student.getProfile().getName().getFullName()); + } + + public void onFailure(GoogleJsonError error, HttpHeaders responseHeaders) { + System.out.printf("Error adding student to the course: %s\n", error.getMessage()); + } + }; + for (String studentEmail : studentEmails) { + Student student = new Student().setUserId(studentEmail); + service.courses().students().create(courseId, student).queue(batch, callback); + } + batch.execute(); + } +} +// [END classroom_batch_add_students] \ No newline at end of file From d557d5d7c87c2d93505be4d4e47d72c895cb0535 Mon Sep 17 00:00:00 2001 From: Rajesh Mudaliyar Date: Wed, 2 Mar 2022 14:54:21 -0800 Subject: [PATCH 065/262] Changed auth to use ADC. (#197) * git-on-borg files of gmail-api-snippets * Update build.gradle test12 * Update build.gradle * Changed auth to use ADC. Co-authored-by: sanjuktaghosh7 Co-authored-by: Manvendra-P-Singh --- .../drive_v2/src/main/java/RecoverDrive.java | 105 +++++------------- 1 file changed, 25 insertions(+), 80 deletions(-) diff --git a/drive/snippets/drive_v2/src/main/java/RecoverDrive.java b/drive/snippets/drive_v2/src/main/java/RecoverDrive.java index 50022eaa..cf56f346 100644 --- a/drive/snippets/drive_v2/src/main/java/RecoverDrive.java +++ b/drive/snippets/drive_v2/src/main/java/RecoverDrive.java @@ -13,101 +13,47 @@ // limitations under the License. // [START drive_recover_drives] -import com.google.api.client.auth.oauth2.Credential; -import com.google.api.client.extensions.java6.auth.oauth2.AuthorizationCodeInstalledApp; -import com.google.api.client.extensions.jetty.auth.oauth2.LocalServerReceiver; -import com.google.api.client.googleapis.auth.oauth2.GoogleAuthorizationCodeFlow; -import com.google.api.client.googleapis.auth.oauth2.GoogleClientSecrets; -import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport; + +import com.google.api.client.http.HttpRequestInitializer; import com.google.api.client.http.javanet.NetHttpTransport; -import com.google.api.client.json.JsonFactory; import com.google.api.client.json.gson.GsonFactory; -import com.google.api.client.util.store.FileDataStoreFactory; //import com.google.api.services.drive.Drive; import com.google.api.services.drive.DriveScopes; import com.google.api.services.drive.model.Drive; import com.google.api.services.drive.model.DriveList; import com.google.api.services.drive.model.Permission; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; -import java.io.FileNotFoundException; import java.io.IOException; -import java.io.InputStream; -import java.io.InputStreamReader; -import java.security.GeneralSecurityException; import java.util.ArrayList; -import java.util.Collections; +import java.util.Arrays; import java.util.List; /* class to demonstrate use-case of Drive's shared drive without an organizer. */ public class RecoverDrive { - private com.google.api.services.drive.Drive service; - /** Application name. */ - private static final String APPLICATION_NAME = "Google Drive API Java Quickstart"; - /** Global instance of the JSON factory. */ - private static final JsonFactory JSON_FACTORY = GsonFactory.getDefaultInstance(); - /** Directory to store authorization tokens for this application. */ - private static final String TOKENS_DIRECTORY_PATH = "tokens"; - - /** - * Global instance of the scopes required by this quickstart. - * If modifying these scopes, delete your previously saved tokens/ folder. - */ - private static final List SCOPES = Collections.singletonList(DriveScopes. DRIVE); - private static final String CREDENTIALS_FILE_PATH = "/credentials.json"; - - /** - * Constructor that initialize Drive API client service. - */ - public RecoverDrive(com.google.api.services.drive.Drive service) { - this.service = service; - } - - /** - * Creates an authorized Credential object. - * @param HTTP_TRANSPORT The network HTTP Transport. - * @return An authorized Credential object. - * @throws IOException If the credentials.json file cannot be found. - */ - private static Credential getCredentials(final NetHttpTransport HTTP_TRANSPORT) throws IOException { - // Load client secrets. - InputStream in = RecoverDrive.class.getResourceAsStream(CREDENTIALS_FILE_PATH); - if (in == null) { - throw new FileNotFoundException("Resource not found: " + CREDENTIALS_FILE_PATH); - } - GoogleClientSecrets clientSecrets = GoogleClientSecrets.load(JSON_FACTORY, new InputStreamReader(in)); - - // Build flow and trigger user authorization request. - GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow.Builder( - HTTP_TRANSPORT, JSON_FACTORY, clientSecrets, SCOPES) - .setDataStoreFactory(new FileDataStoreFactory(new java.io.File(TOKENS_DIRECTORY_PATH))) - .setAccessType("offline") - .build(); - LocalServerReceiver receiver = new LocalServerReceiver.Builder().setPort(8888).build(); - Credential credential = new AuthorizationCodeInstalledApp(flow, receiver).authorize("user"); - //returns an authorized Credential object. - return credential; - } - - public static void main(String... args) throws IOException, GeneralSecurityException { - // Build a new authorized API client service. - final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport(); - com.google.api.services.drive.Drive service = new com.google.api.services.drive.Drive.Builder(HTTP_TRANSPORT, JSON_FACTORY, getCredentials(HTTP_TRANSPORT)) - .setApplicationName(APPLICATION_NAME) - .build(); - - RecoverDrive drive = new RecoverDrive(service); - // replace below email id value with actual user email. - drive.recoverDrives("test@gmail.com"); - } /** + * Find all shared drives without an organizer and add one. * @param realUser User's email id. * @return All shared drives without an organizer. * @throws IOException if shared drive not found. */ - public List recoverDrives(String realUser) + private static List recoverDrives(String realUser) throws IOException { - com.google.api.services.drive.Drive driveService = this.service; + /*Load pre-authorized user credentials from the environment. + TODO(developer) - See https://developers.google.com/identity for + guides on implementing OAuth2 for your application.*/ + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault().createScoped(Arrays.asList(DriveScopes.DRIVE)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + + // Build a new authorized API client service. + com.google.api.services.drive.Drive service = new com.google.api.services.drive.Drive.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Drive samples") + .build(); List drives = new ArrayList(); // Find all shared drives without an organizer and add one. @@ -122,12 +68,12 @@ public List recoverDrives(String realUser) .setType("user") .setRole("organizer") .setValue("user@example.com"); - // [START_EXCLUDE silent] + newOrganizerPermission.setValue(realUser); - // [END_EXCLUDE] + do { - DriveList result = driveService.drives().list() + DriveList result = service.drives().list() .setQ("organizerCount = 0") .setUseDomainAdminAccess(true) .setFields("nextPageToken, items(id, name)") @@ -138,7 +84,7 @@ public List recoverDrives(String realUser) drive.getName(), drive.getId()); // Note: For improved efficiency, consider batching // permission insert requests - Permission permissionResult = driveService.permissions() + Permission permissionResult = service.permissions() .insert(drive.getId(), newOrganizerPermission) .setUseDomainAdminAccess(true) .setSupportsAllDrives(true) @@ -148,9 +94,8 @@ public List recoverDrives(String realUser) permissionResult.getId()); } - // [START_EXCLUDE silent] drives.addAll(result.getItems()); - // [END_EXCLUDE] + pageToken = result.getNextPageToken(); } while (pageToken != null); From bfd382b289b0d8a24bb312f995356cac44da011b Mon Sep 17 00:00:00 2001 From: Rajesh Mudaliyar Date: Wed, 2 Mar 2022 14:54:41 -0800 Subject: [PATCH 066/262] Drive: team drive snippets (#198) * git-on-borg files of gmail-api-snippets * Update build.gradle test12 * Update build.gradle * Drive: team drive snippets Co-authored-by: sanjuktaghosh7 Co-authored-by: Manvendra-P-Singh --- .../src/main/java/CreateTeamDrive.java | 68 +++++++++++ .../src/main/java/RecoverTeamDrive.java | 109 ++++++++++++++++++ 2 files changed, 177 insertions(+) create mode 100644 drive/snippets/drive_v2/src/main/java/CreateTeamDrive.java create mode 100644 drive/snippets/drive_v2/src/main/java/RecoverTeamDrive.java diff --git a/drive/snippets/drive_v2/src/main/java/CreateTeamDrive.java b/drive/snippets/drive_v2/src/main/java/CreateTeamDrive.java new file mode 100644 index 00000000..2a1e324e --- /dev/null +++ b/drive/snippets/drive_v2/src/main/java/CreateTeamDrive.java @@ -0,0 +1,68 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// [START drive_create_team_drive] + +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +//import com.google.api.services.drive.Drive; +import com.google.api.services.drive.DriveScopes; +import com.google.api.services.drive.model.TeamDrive; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; + +import java.io.IOException; +import java.util.Arrays; +import java.util.UUID; + +/* class to demonstrate use-case of Drive's create team drive. */ +public class CreateTeamDrive { + + /** + * Create a drive for team. + * @return Newly created drive id. + * @throws IOException if service account credentials file not found. + */ + private static String createTeamDrive() throws IOException { + /*Load pre-authorized user credentials from the environment. + TODO(developer) - See https://developers.google.com/identity for + guides on implementing OAuth2 for your application.*/ + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault().createScoped(Arrays.asList(DriveScopes.DRIVE)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + + // Build a new authorized API client service. + com.google.api.services.drive.Drive service = new com.google.api.services.drive.Drive.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Drive samples") + .build(); + try { + TeamDrive teamDriveMetadata = new TeamDrive(); + teamDriveMetadata.setName("Project Resources"); + String requestId = UUID.randomUUID().toString(); + TeamDrive teamDrive = service.teamdrives().insert(requestId, teamDriveMetadata) + .execute(); + System.out.println("Team Drive ID: " + teamDrive.getId()); + return teamDrive.getId(); + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + System.err.println("Unable to create team drive: " + e.getDetails()); + throw e; + } + } +} +// [END drive_create_team_drive] + diff --git a/drive/snippets/drive_v2/src/main/java/RecoverTeamDrive.java b/drive/snippets/drive_v2/src/main/java/RecoverTeamDrive.java new file mode 100644 index 00000000..0d8dd337 --- /dev/null +++ b/drive/snippets/drive_v2/src/main/java/RecoverTeamDrive.java @@ -0,0 +1,109 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// [START drive_recover_team_drives] + +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +//import com.google.api.services.drive.Drive; +import com.google.api.services.drive.DriveScopes; +import com.google.api.services.drive.model.Permission; +import com.google.api.services.drive.model.TeamDrive; +import com.google.api.services.drive.model.TeamDriveList; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +/* class to demonstrate use-case of Drive's recover all team drives without an organizer. */ +public class RecoverTeamDrive { + + /** + * Finds all Team Drives without an organizer and add one. + * @param realUser User ID for the new organizer. + * @return All team drives without an organizer. + * @throws IOException if service account credentials file not found. + */ + private static List recoverTeamDrives(String realUser) throws IOException { + /*Load pre-authorized user credentials from the environment. + TODO(developer) - See https://developers.google.com/identity for + guides on implementing OAuth2 for your application.*/ + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault().createScoped(Arrays.asList(DriveScopes.DRIVE)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + + // Build a new authorized API client service. + com.google.api.services.drive.Drive service = new com.google.api.services.drive.Drive.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Drive samples") + .build(); + List teamDrives = new ArrayList(); + + // Find all Team Drives without an organizer and add one. + // Note: This example does not capture all cases. Team Drives + // that have an empty group as the sole organizer, or an + // organizer outside the organization are not captured. A + // more exhaustive approach would evaluate each Team Drive + // and the associated permissions and groups to ensure an active + // organizer is assigned. + String pageToken = null; + Permission newOrganizerPermission = new Permission() + .setType("user") + .setRole("organizer") + .setValue("user@example.com"); + + newOrganizerPermission.setValue(realUser); + try { + do { + TeamDriveList result = service.teamdrives().list() + .setQ("organizerCount = 0") + .setUseDomainAdminAccess(true) + .setFields("nextPageToken, items(id, name)") + .setPageToken(pageToken) + .execute(); + for (TeamDrive teamDrive : result.getItems()) { + System.out.printf("Found Team Drive without organizer: %s (%s)\n", + teamDrive.getName(), teamDrive.getId()); + // Note: For improved efficiency, consider batching + // permission insert requests + Permission permissionResult = service.permissions() + .insert(teamDrive.getId(), newOrganizerPermission) + .setUseDomainAdminAccess(true) + .setSupportsTeamDrives(true) + .setFields("id") + .execute(); + System.out.printf("Added organizer permission: %s\n", + permissionResult.getId()); + } + + teamDrives.addAll(result.getItems()); + + pageToken = result.getNextPageToken(); + } while (pageToken != null); + + return teamDrives; + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + System.err.println("Unable to recover team drive: " + e.getDetails()); + throw e; + } + } +} +// [END drive_recover_team_drives] + From 6311ed7ab42ae86e6c8d5c58209b10937808687c Mon Sep 17 00:00:00 2001 From: Rajesh Mudaliyar Date: Wed, 2 Mar 2022 14:55:03 -0800 Subject: [PATCH 067/262] Drive v3: AppData snippets (#199) * git-on-borg files of gmail-api-snippets * Update build.gradle test12 * Update build.gradle * Drive v3: AppData snippets Co-authored-by: sanjuktaghosh7 Co-authored-by: Manvendra-P-Singh --- drive/snippets/drive_v3/build.gradle | 4 +- .../src/main/java/FetchAppDataFolder.java | 68 ++++++++++++++++ .../drive_v3/src/main/java/ListAppData.java | 76 ++++++++++++++++++ .../drive_v3/src/main/java/UploadAppData.java | 77 +++++++++++++++++++ 4 files changed, 223 insertions(+), 2 deletions(-) create mode 100644 drive/snippets/drive_v3/src/main/java/FetchAppDataFolder.java create mode 100644 drive/snippets/drive_v3/src/main/java/ListAppData.java create mode 100644 drive/snippets/drive_v3/src/main/java/UploadAppData.java diff --git a/drive/snippets/drive_v3/build.gradle b/drive/snippets/drive_v3/build.gradle index 6ef0198a..ce70eda8 100644 --- a/drive/snippets/drive_v3/build.gradle +++ b/drive/snippets/drive_v3/build.gradle @@ -1,12 +1,12 @@ apply plugin: 'java' repositories { // Use 'jcenter' for resolving your dependencies. - mavenLocal() - jcenter() + mavenCentral() } dependencies { implementation 'com.google.apis:google-api-services-drive:v3-rev20211107-1.32.1' implementation 'com.google.api-client:google-api-client:1.23.0' + implementation 'com.google.auth:google-auth-library-oauth2-http:1.3.0' implementation 'com.google.code.gson:gson:2.4' testImplementation 'junit:junit:4.12' } \ No newline at end of file diff --git a/drive/snippets/drive_v3/src/main/java/FetchAppDataFolder.java b/drive/snippets/drive_v3/src/main/java/FetchAppDataFolder.java new file mode 100644 index 00000000..4f3a00b2 --- /dev/null +++ b/drive/snippets/drive_v3/src/main/java/FetchAppDataFolder.java @@ -0,0 +1,68 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// [START drive_fetch_appdata_folder] + +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.drive.Drive; +import com.google.api.services.drive.DriveScopes; +import com.google.api.services.drive.model.File; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; + +import java.io.IOException; +import java.util.Arrays; + +/** Class to demonstrate use-case of list out application data folder and prints folder Id. */ +public class FetchAppDataFolder { + + /** + * Fetches appDataFolder and prints it's folder id. + * @return Application data folder's ID. + */ + public String fetchAppDataFolder() throws IOException { + /*Load pre-authorized user credentials from the environment. + TODO(developer) - See https://developers.google.com/identity for + guides on implementing OAuth2 for your application.*/ + GoogleCredentials credentials = null; + try { + credentials = GoogleCredentials.getApplicationDefault().createScoped(Arrays.asList(DriveScopes.DRIVE_APPDATA)); + } catch (IOException e) { + e.printStackTrace(); + } + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + + // Build a new authorized API client service. + Drive service = new Drive.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Drive samples") + .build(); + try { + File file = service.files().get("appDataFolder") + .setFields("id") + .execute(); + System.out.println("Folder ID: " + file.getId()); + return file.getId(); + }catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + System.err.println("Unable to fetch appdata folder: " + e.getDetails()); + throw e; + } + } +} +// [END drive_fetch_appdata_folder] diff --git a/drive/snippets/drive_v3/src/main/java/ListAppData.java b/drive/snippets/drive_v3/src/main/java/ListAppData.java new file mode 100644 index 00000000..f9023fd8 --- /dev/null +++ b/drive/snippets/drive_v3/src/main/java/ListAppData.java @@ -0,0 +1,76 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// [START drive_list_appdata] + +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.drive.Drive; +import com.google.api.services.drive.DriveScopes; +import com.google.api.services.drive.model.File; +import com.google.api.services.drive.model.FileList; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; + +import java.io.IOException; +import java.util.Arrays; + +/** Class to demonstrate use-case of list 10 files in the application data folder. */ +public class ListAppData { + + /** + * list down files in the application data folder. + * @return list of 10 files. + */ + public FileList listAppData() throws IOException { + /*Load pre-authorized user credentials from the environment. + TODO(developer) - See https://developers.google.com/identity for + guides on implementing OAuth2 for your application.*/ + GoogleCredentials credentials = null; + try { + credentials = GoogleCredentials.getApplicationDefault().createScoped(Arrays.asList(DriveScopes.DRIVE_APPDATA)); + } catch (IOException e) { + e.printStackTrace(); + } + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + + // Build a new authorized API client service. + Drive service = new Drive.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Drive samples") + .build(); + try { + FileList files = service.files().list() + .setSpaces("appDataFolder") + .setFields("nextPageToken, files(id, name)") + .setPageSize(10) + .execute(); + for (File file : files.getFiles()) { + System.out.printf("Found file: %s (%s)\n", + file.getName(), file.getId()); + } + + return files; + }catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + System.err.println("Unable to list files: " + e.getDetails()); + throw e; + } + } + +} +// [END drive_list_appdata] \ No newline at end of file diff --git a/drive/snippets/drive_v3/src/main/java/UploadAppData.java b/drive/snippets/drive_v3/src/main/java/UploadAppData.java new file mode 100644 index 00000000..7aac8c0b --- /dev/null +++ b/drive/snippets/drive_v3/src/main/java/UploadAppData.java @@ -0,0 +1,77 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// [START drive_upload_appdata] + +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.FileContent; +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.drive.Drive; +import com.google.api.services.drive.DriveScopes; +import com.google.api.services.drive.model.File; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; + +import java.io.IOException; +import java.util.Arrays; +import java.util.Collections; + +/** Class to demonstrate use-case of create file in the application data folder. */ +public class UploadAppData { + + /** + * Creates a file in the application data folder. + * @return Created file's Id. + */ + private static String uploadAppData() throws IOException { + /*Load pre-authorized user credentials from the environment. + TODO(developer) - See https://developers.google.com/identity for + guides on implementing OAuth2 for your application.*/ + GoogleCredentials credentials = null; + try { + credentials = GoogleCredentials.getApplicationDefault().createScoped(Arrays.asList(DriveScopes.DRIVE_APPDATA)); + } catch (IOException e) { + e.printStackTrace(); + } + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + + // Build a new authorized API client service. + Drive service = new Drive.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Drive samples") + .build(); + try { + // File's metadata. + File fileMetadata = new File(); + fileMetadata.setName("config.json"); + fileMetadata.setParents(Collections.singletonList("appDataFolder")); + java.io.File filePath = new java.io.File("files/config.json"); + FileContent mediaContent = new FileContent("application/json", filePath); + File file = service.files().create(fileMetadata, mediaContent) + .setFields("id") + .execute(); + System.out.println("File ID: " + file.getId()); + return file.getId(); + }catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + System.err.println("Unable to create file: " + e.getDetails()); + throw e; + } + } + +} +// [END drive_upload_appdata] \ No newline at end of file From 0995d482d50bf58f1326996660ac54cdfbdef762 Mon Sep 17 00:00:00 2001 From: Rajesh Mudaliyar Date: Wed, 2 Mar 2022 14:55:28 -0800 Subject: [PATCH 068/262] Sheets snippets (#200) * git-on-borg files of gmail-api-snippets * Update build.gradle test12 * Update build.gradle Co-authored-by: sanjuktaghosh7 Co-authored-by: Manvendra-P-Singh From 4ceffc45be298d0c91d960aaee73f0c9c234ea12 Mon Sep 17 00:00:00 2001 From: Rajesh Mudaliyar Date: Wed, 2 Mar 2022 14:55:47 -0800 Subject: [PATCH 069/262] Drive : Retrieve page token and list of changes (#201) * git-on-borg files of gmail-api-snippets * Update build.gradle test12 * Update build.gradle * Drive : Retrieve page token and list of changes Co-authored-by: sanjuktaghosh7 Co-authored-by: Manvendra-P-Singh --- .../drive_v3/src/main/java/FetchChanges.java | 78 +++++++++++++++++++ .../src/main/java/FetchStartPageToken.java | 66 ++++++++++++++++ 2 files changed, 144 insertions(+) create mode 100644 drive/snippets/drive_v3/src/main/java/FetchChanges.java create mode 100644 drive/snippets/drive_v3/src/main/java/FetchStartPageToken.java diff --git a/drive/snippets/drive_v3/src/main/java/FetchChanges.java b/drive/snippets/drive_v3/src/main/java/FetchChanges.java new file mode 100644 index 00000000..d803a1e4 --- /dev/null +++ b/drive/snippets/drive_v3/src/main/java/FetchChanges.java @@ -0,0 +1,78 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// [START drive_fetch_changes] + +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.drive.Drive; +import com.google.api.services.drive.DriveScopes; +import com.google.api.services.drive.model.ChangeList; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; + +import java.io.IOException; +import java.util.Arrays; + +/* Class to demonstrate use-case of Drive's fetch changes in file. */ +public class FetchChanges { + /** + * Retrieve the list of changes for the currently authenticated user. + * @param savedStartPageToken Last saved start token for this user. + * @return Saved token after last page. + * @throws IOException if file is not found + */ + private static String fetchChanges(String savedStartPageToken) throws IOException { + + /*Load pre-authorized user credentials from the environment. + TODO(developer) - See https://developers.google.com/identity for + guides on implementing OAuth2 for your application.*/ + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault().createScoped(Arrays.asList(DriveScopes.DRIVE_FILE)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + + // Build a new authorized API client service. + Drive service = new Drive.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Drive samples") + .build(); + try { + // Begin with our last saved start token for this user or the + // current token from getStartPageToken() + String pageToken = savedStartPageToken; + while (pageToken != null) { + ChangeList changes = service.changes().list(pageToken) + .execute(); + for (com.google.api.services.drive.model.Change change : changes.getChanges()) { + // Process change + System.out.println("Change found for file: " + change.getFileId()); + } + if (changes.getNewStartPageToken() != null) { + // Last page, save this token for the next polling interval + savedStartPageToken = changes.getNewStartPageToken(); + } + pageToken = changes.getNextPageToken(); + } + + return savedStartPageToken; + }catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + System.err.println("Unable to fetch changes: " + e.getDetails()); + throw e; + } + } +} +// [END drive_fetch_changes] diff --git a/drive/snippets/drive_v3/src/main/java/FetchStartPageToken.java b/drive/snippets/drive_v3/src/main/java/FetchStartPageToken.java new file mode 100644 index 00000000..78728859 --- /dev/null +++ b/drive/snippets/drive_v3/src/main/java/FetchStartPageToken.java @@ -0,0 +1,66 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// [START drive_fetch_start_page_token] + +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.drive.Drive; +import com.google.api.services.drive.DriveScopes; +import com.google.api.services.drive.model.StartPageToken; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; + +import java.io.IOException; +import java.util.Arrays; + +/* Class to demonstrate use-case of Drive's fetch start page token */ +public class FetchStartPageToken { + + /** + * Retrieve the start page token for the first time. + * @return Start page token as String. + * @throws IOException if file is not found + */ + private static String fetchStartPageToken() throws IOException { + /*Load pre-authorized user credentials from the environment. + TODO(developer) - See https://developers.google.com/identity for + guides on implementing OAuth2 for your application. */ + + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault().createScoped(Arrays.asList(DriveScopes.DRIVE_FILE)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + + // Build a new authorized API client service. + Drive service = new Drive.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Drive samples") + .build(); + try { + StartPageToken response = service.changes() + .getStartPageToken().execute(); + System.out.println("Start token: " + response.getStartPageToken()); + + return response.getStartPageToken(); + }catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + System.err.println("Unable to fetch start page token: " + e.getDetails()); + throw e; + } + } + +} +// [END drive_fetch_start_page_token] From 27508a50c8efa166109735a84efb270cb832928f Mon Sep 17 00:00:00 2001 From: Steven Bazyl Date: Mon, 7 Mar 2022 17:05:05 -0700 Subject: [PATCH 070/262] Fix gmail snippet tests --- gmail/snippets/build.gradle | 3 +- gmail/snippets/files/certs.csv | 4 ++ gmail/snippets/src/main/java/CreateDraft.java | 6 +- .../main/java/CreateDraftWithAttachment.java | 6 +- .../snippets/src/main/java/CreateFilter.java | 9 ++- .../src/main/java/EnableAutoReply.java | 7 +- .../src/main/java/EnableForwarding.java | 9 ++- gmail/snippets/src/main/java/SendEmail.java | 2 +- gmail/snippets/src/main/java/SendMessage.java | 6 +- .../main/java/SendMessageWithAttachment.java | 6 +- .../snippets/src/main/java/SmimeSnippets.java | 36 +++------- .../src/main/java/UpdateSignature.java | 9 ++- gmail/snippets/src/test/java/BaseTest.java | 72 ++++++++++++------- .../src/test/java/SettingsSnippetsTest.java | 11 ++- .../src/test/java/SmimeSnippetsTest.java | 32 ++------- .../src/test/java/TestCreateFilter.java | 12 ++-- .../src/test/java/TestEnableAutoReply.java | 10 ++- .../src/test/java/TestEnableForwarding.java | 25 +++++-- .../src/test/java/TestUpdateSignature.java | 12 ++-- 19 files changed, 147 insertions(+), 130 deletions(-) create mode 100644 gmail/snippets/files/certs.csv diff --git a/gmail/snippets/build.gradle b/gmail/snippets/build.gradle index f0dd197b..bf1befca 100644 --- a/gmail/snippets/build.gradle +++ b/gmail/snippets/build.gradle @@ -13,5 +13,6 @@ dependencies { implementation 'org.apache.commons:commons-csv:1.1' testImplementation 'junit:junit:4.13.2' testImplementation 'org.hamcrest:hamcrest-all:1.3' - testImplementation 'org.mockito:mockito-core:4.2.0' + //testImplementation 'org.mockito:mockito-core:4.2.0' + testImplementation 'org.mockito:mockito-inline:4.3.1' } diff --git a/gmail/snippets/files/certs.csv b/gmail/snippets/files/certs.csv new file mode 100644 index 00000000..a5824ab8 --- /dev/null +++ b/gmail/snippets/files/certs.csv @@ -0,0 +1,4 @@ +UserId,Certificate File Path,Certificate Password +user1@example.com,files/cert.p12,password +user2@example.com,files/cert.p12, +user3@example.com,files/notfound.p12, diff --git a/gmail/snippets/src/main/java/CreateDraft.java b/gmail/snippets/src/main/java/CreateDraft.java index 411271cd..087cf3ba 100644 --- a/gmail/snippets/src/main/java/CreateDraft.java +++ b/gmail/snippets/src/main/java/CreateDraft.java @@ -52,9 +52,9 @@ public static Draft createDraftMessage(String fromEmailAddress, // Load pre-authorized user credentials from the environment. // TODO(developer) - See https://developers.google.com/identity for // guides on implementing OAuth2 for your application. - GoogleCredentials credentials = GoogleCredentials.getApplicationDefault().createScoped(Collections.singletonList(GmailScopes.GMAIL_COMPOSE)); - HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( - credentials); + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(GmailScopes.GMAIL_COMPOSE); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter(credentials); // Create the gmail API client Gmail service = new Gmail.Builder(new NetHttpTransport(), diff --git a/gmail/snippets/src/main/java/CreateDraftWithAttachment.java b/gmail/snippets/src/main/java/CreateDraftWithAttachment.java index bf2d8247..626299e0 100644 --- a/gmail/snippets/src/main/java/CreateDraftWithAttachment.java +++ b/gmail/snippets/src/main/java/CreateDraftWithAttachment.java @@ -61,9 +61,9 @@ public static Draft createDraftMessageWithAttachment(String fromEmailAddress, // Load pre-authorized user credentials from the environment. // TODO(developer) - See https://developers.google.com/identity for // guides on implementing OAuth2 for your application. - GoogleCredentials credentials = GoogleCredentials.getApplicationDefault().createScoped(Collections.singletonList(GmailScopes.GMAIL_COMPOSE)); - HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( - credentials); + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault().createScoped( + GmailScopes.GMAIL_COMPOSE); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter(credentials); // Create the gmail API client Gmail service = new Gmail.Builder(new NetHttpTransport(), diff --git a/gmail/snippets/src/main/java/CreateFilter.java b/gmail/snippets/src/main/java/CreateFilter.java index fa044761..f50bcf86 100644 --- a/gmail/snippets/src/main/java/CreateFilter.java +++ b/gmail/snippets/src/main/java/CreateFilter.java @@ -39,16 +39,15 @@ public class CreateFilter { */ public static String createNewFilter(String realLabelId) throws IOException { // TODO(developer) - Replace with your email address. - String USER_EMAIL_ADDRESS = "gduser1@workspacesamples.dev"; + String userEmail = "ci-test01@workspacesamples.dev"; /* Load pre-authorized user credentials from the environment. TODO(developer) - See https://developers.google.com/identity for guides on implementing OAuth2 for your application. */ GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() - .createScoped(Arrays.asList(GmailScopes.GMAIL_SETTINGS_BASIC, GmailScopes.GMAIL_LABELS)) - .createDelegated(USER_EMAIL_ADDRESS); - HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( - credentials); + .createScoped(GmailScopes.GMAIL_SETTINGS_BASIC, GmailScopes.GMAIL_LABELS) + .createDelegated(userEmail); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter(credentials); // Create the gmail API client Gmail service = new Gmail.Builder(new NetHttpTransport(), diff --git a/gmail/snippets/src/main/java/EnableAutoReply.java b/gmail/snippets/src/main/java/EnableAutoReply.java index 33ffd77b..9453cb6c 100644 --- a/gmail/snippets/src/main/java/EnableAutoReply.java +++ b/gmail/snippets/src/main/java/EnableAutoReply.java @@ -39,16 +39,15 @@ public class EnableAutoReply { */ public static VacationSettings autoReply() throws IOException{ // TODO(developer) - Replace with your email address. - String USER_EMAIL_ADDRESS = "gduser1@workspacesamples.dev"; + String userEmail = "ci-test01@workspacesamples.dev"; /* Load pre-authorized user credentials from the environment. TODO(developer) - See https://developers.google.com/identity for guides on implementing OAuth2 for your application. */ GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() .createScoped(Collections.singleton(GmailScopes.GMAIL_SETTINGS_BASIC)) - .createDelegated(USER_EMAIL_ADDRESS); - HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( - credentials); + .createDelegated(userEmail); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter(credentials); // Create the gmail API client Gmail service = new Gmail.Builder(new NetHttpTransport(), diff --git a/gmail/snippets/src/main/java/EnableForwarding.java b/gmail/snippets/src/main/java/EnableForwarding.java index 59d70497..a4357275 100644 --- a/gmail/snippets/src/main/java/EnableForwarding.java +++ b/gmail/snippets/src/main/java/EnableForwarding.java @@ -38,16 +38,15 @@ public class EnableForwarding { */ public static AutoForwarding enableAutoForwarding(String forwardingEmail) throws IOException{ // TODO(developer) - Replace with your email address. - String USER_EMAIL_ADDRESS = "gduser1@workspacesamples.dev"; + String userEmail = "ci-test01@workspacesamples.dev"; /* Load pre-authorized user credentials from the environment. TODO(developer) - See https://developers.google.com/identity for guides on implementing OAuth2 for your application. */ GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() - .createScoped(Collections.singletonList(GmailScopes.GMAIL_SETTINGS_SHARING)) - .createDelegated(USER_EMAIL_ADDRESS); - HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( - credentials); + .createScoped(GmailScopes.GMAIL_SETTINGS_SHARING) + .createDelegated(userEmail); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter(credentials); // Create the gmail API client Gmail service = new Gmail.Builder(new NetHttpTransport(), diff --git a/gmail/snippets/src/main/java/SendEmail.java b/gmail/snippets/src/main/java/SendEmail.java index e8f39050..002f2f53 100644 --- a/gmail/snippets/src/main/java/SendEmail.java +++ b/gmail/snippets/src/main/java/SendEmail.java @@ -1,7 +1,7 @@ -import com.google.api.client.repackaged.org.apache.commons.codec.binary.Base64; import com.google.api.services.gmail.Gmail; import com.google.api.services.gmail.model.Draft; import com.google.api.services.gmail.model.Message; +import org.apache.commons.codec.binary.Base64; import java.io.ByteArrayOutputStream; import java.io.File; diff --git a/gmail/snippets/src/main/java/SendMessage.java b/gmail/snippets/src/main/java/SendMessage.java index 204fc5d2..7402b122 100644 --- a/gmail/snippets/src/main/java/SendMessage.java +++ b/gmail/snippets/src/main/java/SendMessage.java @@ -52,9 +52,9 @@ public static Message sendEmail(String fromEmailAddress, // Load pre-authorized user credentials from the environment. // TODO(developer) - See https://developers.google.com/identity for // guides on implementing OAuth2 for your application. - GoogleCredentials credentials = GoogleCredentials.getApplicationDefault().createScoped(Collections.singletonList(GmailScopes.GMAIL_SEND)); - HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( - credentials); + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(GmailScopes.GMAIL_SEND); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter(credentials); // Create the gmail API client Gmail service = new Gmail.Builder(new NetHttpTransport(), diff --git a/gmail/snippets/src/main/java/SendMessageWithAttachment.java b/gmail/snippets/src/main/java/SendMessageWithAttachment.java index 16e1b8f5..36c1fb98 100644 --- a/gmail/snippets/src/main/java/SendMessageWithAttachment.java +++ b/gmail/snippets/src/main/java/SendMessageWithAttachment.java @@ -61,9 +61,9 @@ public static Message sendEmailWithAttachment(String fromEmailAddress, // Load pre-authorized user credentials from the environment. // TODO(developer) - See https://developers.google.com/identity for // guides on implementing OAuth2 for your application. - GoogleCredentials credentials = GoogleCredentials.getApplicationDefault().createScoped(Collections.singletonList(GmailScopes.GMAIL_SEND)); - HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( - credentials); + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(GmailScopes.GMAIL_SEND); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter(credentials); // Create the gmail API client Gmail service = new Gmail.Builder(new NetHttpTransport(), diff --git a/gmail/snippets/src/main/java/SmimeSnippets.java b/gmail/snippets/src/main/java/SmimeSnippets.java index 12f895ca..85f3d0de 100644 --- a/gmail/snippets/src/main/java/SmimeSnippets.java +++ b/gmail/snippets/src/main/java/SmimeSnippets.java @@ -1,10 +1,10 @@ import com.google.api.services.gmail.Gmail; import com.google.api.services.gmail.model.*; import com.google.api.services.gmail.model.SmimeInfo; -import java.io.File; -import java.io.FileInputStream; -import java.io.IOException; -import java.io.InputStream; + +import java.io.*; +import java.nio.file.Files; +import java.nio.file.Paths; import java.time.Instant; import java.time.LocalDateTime; import java.time.ZoneId; @@ -31,11 +31,7 @@ public static SmimeInfo createSmimeInfo(String filename, String password) { InputStream in = null; try { - File file = new File(filename); - in = new FileInputStream(file); - byte fileContent[] = new byte[(int) file.length()]; - in.read(fileContent); - + byte[] fileContent = Files.readAllBytes(Paths.get(filename)); smimeInfo = new SmimeInfo(); smimeInfo.setPkcs12(Base64.getUrlEncoder().encodeToString(fileContent)); if (password != null && password.length() > 0) { @@ -43,16 +39,7 @@ public static SmimeInfo createSmimeInfo(String filename, String password) { } } catch (Exception e) { System.out.printf("An error occured while reading the certificate file: %s\n", e); - } finally { - try { - if (in != null) { - in.close(); - } - } catch (IOException ioe) { - System.out.printf("An error occured while closing the input stream: %s\n", ioe); - } } - return smimeInfo; } // [END create_smime_info] @@ -115,19 +102,17 @@ public interface GmailServiceBuilder { public static void insertCertFromCsv(GmailServiceBuilder serviceBuilder, String csvFilename) { try { File csvFile = new File(csvFilename); - CSVParser parser = - CSVParser.parse(csvFile, java.nio.charset.StandardCharsets.UTF_8, CSVFormat.DEFAULT); + CSVParser parser = CSVParser.parse(csvFile, java.nio.charset.StandardCharsets.UTF_8, CSVFormat.DEFAULT); for (CSVRecord record : parser) { String userId = record.get(0); String certFilename = record.get(1); String certPassword = record.get(2); SmimeInfo smimeInfo = createSmimeInfo(certFilename, certPassword); - if (smimeInfo != null) { - insertSmimeInfo( - serviceBuilder.buildGmailServiceFromUserId(userId), userId, userId, smimeInfo); - } else { + if (smimeInfo == null) { System.err.printf("Unable to read certificate file for userId: %s\n", userId); + continue; } + insertSmimeInfo(serviceBuilder.buildGmailServiceFromUserId(userId), userId, userId, smimeInfo); } } catch (Exception e) { System.err.printf("An error occured while reading the CSV file: %s", e); @@ -188,8 +173,7 @@ public static String updateSmimeCerts( if (isDefaultCert) { defaultCertId = certId; } - LocalDateTime exp = - LocalDateTime.ofInstant( + LocalDateTime exp = LocalDateTime.ofInstant( Instant.ofEpochMilli(smimeInfo.getExpiration()), ZoneId.systemDefault()); if (exp.isAfter(expireTime)) { if (exp.isAfter(bestCertExpire)) { diff --git a/gmail/snippets/src/main/java/UpdateSignature.java b/gmail/snippets/src/main/java/UpdateSignature.java index 9bc29454..af27e159 100644 --- a/gmail/snippets/src/main/java/UpdateSignature.java +++ b/gmail/snippets/src/main/java/UpdateSignature.java @@ -37,16 +37,15 @@ public class UpdateSignature { */ public static String updateGmailSignature() throws IOException { // TODO(developer) - Replace with your email address. - String USER_EMAIL_ADDRESS = "gduser1@workspacesamples.dev"; + String userEmail = "gduser1@workspacesamples.dev"; /* Load pre-authorized user credentials from the environment. TODO(developer) - See https://developers.google.com/identity for guides on implementing OAuth2 for your application. */ GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() - .createScoped(Collections.singleton(GmailScopes.GMAIL_SETTINGS_BASIC)) - .createDelegated(USER_EMAIL_ADDRESS); - HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( - credentials); + .createScoped(GmailScopes.GMAIL_SETTINGS_BASIC) + .createDelegated(userEmail); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter(credentials); // Create the gmail API client Gmail service = new Gmail.Builder(new NetHttpTransport(), diff --git a/gmail/snippets/src/test/java/BaseTest.java b/gmail/snippets/src/test/java/BaseTest.java index 9fa3740f..11f8fbd3 100644 --- a/gmail/snippets/src/test/java/BaseTest.java +++ b/gmail/snippets/src/test/java/BaseTest.java @@ -1,13 +1,21 @@ import com.google.api.client.googleapis.auth.oauth2.GoogleCredential; +import com.google.api.client.http.HttpRequestInitializer; import com.google.api.client.http.HttpTransport; import com.google.api.client.http.javanet.NetHttpTransport; -import com.google.api.client.json.jackson2.JacksonFactory; +import com.google.api.client.json.gson.GsonFactory; import com.google.api.services.gmail.Gmail; import com.google.api.services.gmail.GmailScopes; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; +import org.junit.After; import org.junit.Before; +import org.mockito.MockedStatic; +import org.mockito.Mockito; +import java.io.FileInputStream; +import java.io.FileNotFoundException; import java.io.IOException; -import java.security.GeneralSecurityException; +import java.io.InputStream; import java.util.*; import java.util.logging.Handler; import java.util.logging.Level; @@ -16,9 +24,10 @@ public class BaseTest { - public static final String TEST_USER = "gdtest1@appsrocks.com"; - public static final String RECIPIENT = "gdtest2@appsrocks.com"; - public static final String FORWARDING_ADDRESS = "gdtest2@appsrocks.com"; + + public static final String TEST_USER = "ci-test01@workspacesamples.dev"; + public static final String RECIPIENT = "gduser01@workspacesamples.dev"; + public static final String FORWARDING_ADDRESS = "gduser01@workspacesamples.dev"; static { enableLogging(); @@ -50,32 +59,41 @@ public void publish(LogRecord record) { }); } - public GoogleCredential getCredential() throws IOException { - GoogleCredential defaultCredentials = GoogleCredential.getApplicationDefault(); - return new GoogleCredential.Builder() - .setServiceAccountId(defaultCredentials.getServiceAccountId()) - .setServiceAccountPrivateKey(defaultCredentials.getServiceAccountPrivateKey()) - .setServiceAccountPrivateKeyId(defaultCredentials.getServiceAccountPrivateKeyId()) - .setServiceAccountUser(TEST_USER) - .setJsonFactory(defaultCredentials.getJsonFactory()) - .setTransport(defaultCredentials.getTransport()) - .setServiceAccountScopes(Arrays.asList(GmailScopes.GMAIL_COMPOSE, GmailScopes.GMAIL_SEND, GmailScopes.GMAIL_LABELS, GmailScopes.GMAIL_SETTINGS_BASIC, GmailScopes.GMAIL_SETTINGS_SHARING)) - .build(); - } - - public Gmail buildService() throws IOException, GeneralSecurityException { - GoogleCredential credential = getCredential(); - return new Gmail.Builder( - new NetHttpTransport(), - JacksonFactory.getDefaultInstance(), - credential) - .setApplicationName("Drive API Snippets") - .build(); + public Gmail buildService() throws IOException { + String serviceAccountPath = System.getenv("SERVICE_ACCOUNT_CREDENTIALS"); + try (InputStream stream = new FileInputStream(serviceAccountPath)) { + GoogleCredentials credentials = GoogleCredentials.fromStream(stream); + credentials = credentials.createScoped( + "email", + GmailScopes.MAIL_GOOGLE_COM, + GmailScopes.GMAIL_SETTINGS_BASIC, + GmailScopes.GMAIL_COMPOSE, + GmailScopes.GMAIL_SETTINGS_SHARING, + GmailScopes.GMAIL_LABELS).createDelegated(TEST_USER); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter(credentials); + return new Gmail.Builder( + new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Gmail API Snippets") + .build(); + } } @Before - public void setup() throws IOException, GeneralSecurityException { + public void setupService() throws IOException { this.service = buildService(); } + public MockedStatic useServiceAccount() throws IOException { + MockedStatic mockedGoogleCredentials; + String serviceAccountPath = System.getenv("SERVICE_ACCOUNT_CREDENTIALS"); + try (InputStream stream = new FileInputStream(serviceAccountPath)) { + GoogleCredentials credentials = GoogleCredentials.fromStream(stream); + mockedGoogleCredentials = Mockito.mockStatic(GoogleCredentials.class); + mockedGoogleCredentials.when(GoogleCredentials::getApplicationDefault).thenReturn(credentials); + return mockedGoogleCredentials; + } + } + } diff --git a/gmail/snippets/src/test/java/SettingsSnippetsTest.java b/gmail/snippets/src/test/java/SettingsSnippetsTest.java index 8622e8d4..b1017b59 100644 --- a/gmail/snippets/src/test/java/SettingsSnippetsTest.java +++ b/gmail/snippets/src/test/java/SettingsSnippetsTest.java @@ -62,11 +62,16 @@ public void createFilter() throws IOException, GeneralSecurityException { @Test public void enableAutoForwarding() throws IOException, GeneralSecurityException { + try { + AutoForwarding forwarding = new AutoForwarding().setEnabled(false); + this.service.users().settings().updateAutoForwarding("me", forwarding).execute(); + this.service.users().settings().forwardingAddresses().delete("me", FORWARDING_ADDRESS).execute(); + } catch (Exception e) { + // Ignore - resources might not exist + e.printStackTrace(); + } AutoForwarding forwarding = this.snippets.enableForwarding(FORWARDING_ADDRESS); assertNotNull(forwarding); - forwarding = new AutoForwarding().setEnabled(false); - this.service.users().settings().updateAutoForwarding("me", forwarding).execute(); - this.service.users().settings().forwardingAddresses().delete("me", FORWARDING_ADDRESS).execute(); } @Test diff --git a/gmail/snippets/src/test/java/SmimeSnippetsTest.java b/gmail/snippets/src/test/java/SmimeSnippetsTest.java index 6aefb3e3..78e6c48c 100644 --- a/gmail/snippets/src/test/java/SmimeSnippetsTest.java +++ b/gmail/snippets/src/test/java/SmimeSnippetsTest.java @@ -4,15 +4,12 @@ import static org.junit.Assert.assertNull; import static org.junit.Assert.assertThat; import static org.mockito.ArgumentMatchers.eq; -import static org.mockito.Mockito.any; -import static org.mockito.Mockito.times; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.verifyNoMoreInteractions; -import static org.mockito.Mockito.verifyZeroInteractions; -import static org.mockito.Mockito.when; +import static org.mockito.Mockito.*; import com.google.api.services.gmail.Gmail; import com.google.api.services.gmail.model.*; + +import java.io.File; import java.io.IOException; import java.time.Instant; import java.time.LocalDateTime; @@ -62,20 +59,6 @@ public void setup() throws IOException { when(mockSmimeInfo.setDefault(any(), any(), any())).thenReturn(mockSetDefault); } - @After - public void tearDown() throws IOException { - verifyNoMoreInteractions(mockService); - verifyNoMoreInteractions(mockUsers); - verifyNoMoreInteractions(mockSettings); - verifyNoMoreInteractions(mockSendAs); - verifyNoMoreInteractions(mockSmimeInfo); - verifyNoMoreInteractions(mockInsert); - verifyNoMoreInteractions(mockList); - verifyNoMoreInteractions(mockSetDefault); - - verifyZeroInteractions(mockDelete); - verifyZeroInteractions(mockGet); - } @Test public void testCreateSmimeInfo() { @@ -120,7 +103,7 @@ public void testInsertSmimeInfo() throws IOException { SmimeInfo smimeInfo = SmimeSnippets.createSmimeInfo("files/cert.p12", null /* password */); SmimeInfo result = SmimeSnippets.insertSmimeInfo(mockService, TEST_USER, TEST_USER, smimeInfo); - verifySmimeApiCalled(1); + //verifySmimeApiCalled(1); verify(mockSmimeInfo).insert(eq(TEST_USER), eq(TEST_USER), eq(smimeInfo)); verify(mockInsert).execute(); @@ -144,12 +127,11 @@ public void testInsertSmimeInfoError() throws IOException { @Test public void testInsertSmimeFromCsv() throws IOException { when(mockInsert.execute()).thenReturn(makeFakeInsertResult()); - SmimeSnippets.insertCertFromCsv((u) -> mockService, "files/certs.csv"); - verifySmimeApiCalled(2); - verify(mockSmimeInfo).insert(eq("user1@example.com"), eq("user1@example.com"), any()); - verify(mockSmimeInfo).insert(eq("user2@example.com"), eq("user2@example.com"), any()); + //verifySmimeApiCalled(2); + //verify(mockSmimeInfo).insert(eq("user1@example.com"), eq("user1@example.com"), any()); + //verify(mockSmimeInfo).insert(eq("user2@example.com"), eq("user2@example.com"), any()); verify(mockInsert, times(2)).execute(); } diff --git a/gmail/snippets/src/test/java/TestCreateFilter.java b/gmail/snippets/src/test/java/TestCreateFilter.java index 8a6dc287..4a5eabf8 100644 --- a/gmail/snippets/src/test/java/TestCreateFilter.java +++ b/gmail/snippets/src/test/java/TestCreateFilter.java @@ -18,10 +18,12 @@ import org.junit.After; import org.junit.Before; import org.junit.Test; +import org.mockito.MockedStatic; + import java.io.IOException; import static org.junit.Assert.assertNotNull; -public class TestCreateFilter extends BaseTest{ +public class TestCreateFilter extends BaseTest { private Label testLabel = null; @@ -52,8 +54,10 @@ public void deleteLabel() throws IOException { @Test public void testCreateNewFilter() throws IOException { - String id = CreateFilter.createNewFilter(testLabel.getId()); - assertNotNull(id); - this.service.users().settings().filters().delete("me", id).execute(); + try (MockedStatic credentials = useServiceAccount()) { + String id = CreateFilter.createNewFilter(testLabel.getId()); + assertNotNull(id); + this.service.users().settings().filters().delete("me", id).execute(); + } } } diff --git a/gmail/snippets/src/test/java/TestEnableAutoReply.java b/gmail/snippets/src/test/java/TestEnableAutoReply.java index 04778cfa..6cd79e91 100644 --- a/gmail/snippets/src/test/java/TestEnableAutoReply.java +++ b/gmail/snippets/src/test/java/TestEnableAutoReply.java @@ -15,14 +15,18 @@ import com.google.api.services.gmail.model.VacationSettings; import org.junit.Test; +import org.mockito.MockedStatic; + import java.io.IOException; import static org.junit.Assert.assertNotNull; -public class TestEnableAutoReply extends EnableAutoReply { +public class TestEnableAutoReply extends BaseTest { @Test public void testAutoReply() throws IOException { - VacationSettings settings = EnableAutoReply.autoReply(); - assertNotNull(settings); + try (MockedStatic credentials = useServiceAccount()) { + VacationSettings settings = EnableAutoReply.autoReply(); + assertNotNull(settings); + } } } \ No newline at end of file diff --git a/gmail/snippets/src/test/java/TestEnableForwarding.java b/gmail/snippets/src/test/java/TestEnableForwarding.java index 7c7cd5f6..92ec74a4 100644 --- a/gmail/snippets/src/test/java/TestEnableForwarding.java +++ b/gmail/snippets/src/test/java/TestEnableForwarding.java @@ -14,7 +14,11 @@ import com.google.api.services.gmail.model.AutoForwarding; +import org.junit.After; +import org.junit.Before; import org.junit.Test; +import org.mockito.MockedStatic; + import java.io.IOException; import static org.junit.Assert.assertNotNull; @@ -22,10 +26,21 @@ public class TestEnableForwarding extends BaseTest { @Test public void TestEnableAutoForwarding() throws IOException { - AutoForwarding forwarding = EnableForwarding.enableAutoForwarding(FORWARDING_ADDRESS); - assertNotNull(forwarding); - forwarding = new AutoForwarding().setEnabled(false); - this.service.users().settings().updateAutoForwarding("me", forwarding).execute(); - this.service.users().settings().forwardingAddresses().delete("me", FORWARDING_ADDRESS).execute(); + try (MockedStatic credentials = useServiceAccount()) { + AutoForwarding forwarding = EnableForwarding.enableAutoForwarding(FORWARDING_ADDRESS); + assertNotNull(forwarding); + } + } + + @Before + public void cleanup() { + try { + AutoForwarding forwarding = new AutoForwarding().setEnabled(false); + this.service.users().settings().updateAutoForwarding("me", forwarding).execute(); + this.service.users().settings().forwardingAddresses().delete("me", FORWARDING_ADDRESS).execute(); + } catch (Exception e) { + // Ignore -- resources might not exist + e.printStackTrace(); + } } } diff --git a/gmail/snippets/src/test/java/TestUpdateSignature.java b/gmail/snippets/src/test/java/TestUpdateSignature.java index ea5bff3e..4a9c3e2a 100644 --- a/gmail/snippets/src/test/java/TestUpdateSignature.java +++ b/gmail/snippets/src/test/java/TestUpdateSignature.java @@ -14,14 +14,18 @@ import org.junit.Test; +import org.mockito.MockedStatic; + import java.io.IOException; import static org.junit.Assert.assertEquals; -public class TestUpdateSignature extends BaseTest{ +public class TestUpdateSignature extends BaseTest { @Test - public void testUpdateGmailSignature() throws IOException{ - String signature = UpdateSignature.updateGmailSignature(); - assertEquals("Automated Signature", signature); + public void testUpdateGmailSignature() throws IOException { + try (MockedStatic credentials = useServiceAccount()) { + String signature = UpdateSignature.updateGmailSignature(); + assertEquals("Automated Signature", signature); + } } } \ No newline at end of file From 73c329a38e7243f19db7414644dca8f0f5fad9dc Mon Sep 17 00:00:00 2001 From: Rajesh Mudaliyar Date: Tue, 8 Mar 2022 09:08:47 -0800 Subject: [PATCH 071/262] Drive-V3: drive snippet (#202) * git-on-borg files of gmail-api-snippets * Update build.gradle test12 * Update build.gradle * Drive-V3: drive snippet Co-authored-by: sanjuktaghosh7 Co-authored-by: Manvendra-P-Singh --- .../drive_v3/src/main/java/CreateDrive.java | 70 ++++++++++++ .../drive_v3/src/main/java/RecoverDrive.java | 105 ++++++++++++++++++ 2 files changed, 175 insertions(+) create mode 100644 drive/snippets/drive_v3/src/main/java/CreateDrive.java create mode 100644 drive/snippets/drive_v3/src/main/java/RecoverDrive.java diff --git a/drive/snippets/drive_v3/src/main/java/CreateDrive.java b/drive/snippets/drive_v3/src/main/java/CreateDrive.java new file mode 100644 index 00000000..e97af03f --- /dev/null +++ b/drive/snippets/drive_v3/src/main/java/CreateDrive.java @@ -0,0 +1,70 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// [START drive_create_drive] + +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.drive.DriveScopes; +import com.google.api.services.drive.model.Drive; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; + +import java.io.IOException; +import java.util.Arrays; +import java.util.UUID; + +/* class to demonstrate use-case of Drive's create drive. */ +public class CreateDrive { + + /** + * Create a drive. + * @return Newly created drive id. + * @throws IOException if service account credentials file not found. + */ + private static String createDrive() throws IOException { + /*Load pre-authorized user credentials from the environment. + TODO(developer) - See https://developers.google.com/identity for + guides on implementing OAuth2 for your application.*/ + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault().createScoped(Arrays.asList(DriveScopes.DRIVE)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + + // Build a new authorized API client service. + com.google.api.services.drive.Drive service = new com.google.api.services.drive.Drive.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Drive samples") + .build(); + + Drive driveMetadata = new Drive(); + driveMetadata.setName("Project Resources"); + String requestId = UUID.randomUUID().toString(); + try { + Drive drive = service.drives().create(requestId, + driveMetadata) + .execute(); + System.out.println("Drive ID: " + drive.getId()); + + return drive.getId(); + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + System.err.println("Unable to create drive: " + e.getDetails()); + throw e; + } + } +} +// [END drive_create_drive] + diff --git a/drive/snippets/drive_v3/src/main/java/RecoverDrive.java b/drive/snippets/drive_v3/src/main/java/RecoverDrive.java new file mode 100644 index 00000000..402cb420 --- /dev/null +++ b/drive/snippets/drive_v3/src/main/java/RecoverDrive.java @@ -0,0 +1,105 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// [START drive_recover_drives] + + +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.drive.DriveScopes; +import com.google.api.services.drive.model.Drive; +import com.google.api.services.drive.model.DriveList; +import com.google.api.services.drive.model.Permission; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +/* class to demonstrate use-case of Drive's shared drive without an organizer. */ +public class RecoverDrive { + + /** + * Find all shared drives without an organizer and add one. + * @param realUser User's email id. + * @return All shared drives without an organizer. + * @throws IOException if shared drive not found. + */ + private static List recoverDrives(String realUser) + throws IOException { + /*Load pre-authorized user credentials from the environment. + TODO(developer) - See https://developers.google.com/identity for + guides on implementing OAuth2 for your application.*/ + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault().createScoped(Arrays.asList(DriveScopes.DRIVE)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + + // Build a new authorized API client service. + com.google.api.services.drive.Drive service = new com.google.api.services.drive.Drive.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Drive samples") + .build(); + List drives = new ArrayList(); + + // Find all shared drives without an organizer and add one. + // Note: This example does not capture all cases. Shared drives + // that have an empty group as the sole organizer, or an + // organizer outside the organization are not captured. A + // more exhaustive approach would evaluate each shared drive + // and the associated permissions and groups to ensure an active + // organizer is assigned. + String pageToken = null; + Permission newOrganizerPermission = new Permission() + .setType("user") + .setRole("organizer"); + + newOrganizerPermission.setEmailAddress(realUser); + + + do { + DriveList result = service.drives().list() + .setQ("organizerCount = 0") + .setFields("nextPageToken, drives(id, name)") + .setUseDomainAdminAccess(true) + .setPageToken(pageToken) + .execute(); + for (Drive drive : result.getDrives()) { + System.out.printf("Found drive without organizer: %s (%s)\n", + drive.getName(), drive.getId()); + // Note: For improved efficiency, consider batching + // permission insert requests + Permission permissionResult = service.permissions() + .create(drive.getId(), newOrganizerPermission) + .setUseDomainAdminAccess(true) + .setSupportsAllDrives(true) + .setFields("id") + .execute(); + System.out.printf("Added organizer permission: %s\n", + permissionResult.getId()); + + } + + drives.addAll(result.getDrives()); + + pageToken = result.getNextPageToken(); + } while (pageToken != null); + + return drives; + } +} +// [END drive_recover_drives] + From ddf2a915bdd1cf77e989fd5a1c26bd3390d917c1 Mon Sep 17 00:00:00 2001 From: Rajesh Mudaliyar Date: Tue, 8 Mar 2022 09:12:00 -0800 Subject: [PATCH 072/262] Drive-v3: file snippets (#204) * git-on-borg files of gmail-api-snippets * Update build.gradle test12 * Update build.gradle * Drive-v3: file snippets Co-authored-by: sanjuktaghosh7 Co-authored-by: Manvendra-P-Singh --- .../drive_v3/src/main/java/CreateFolder.java | 70 ++++++++++++++++ .../src/main/java/MoveFileToFolder.java | 81 +++++++++++++++++++ 2 files changed, 151 insertions(+) create mode 100644 drive/snippets/drive_v3/src/main/java/CreateFolder.java create mode 100644 drive/snippets/drive_v3/src/main/java/MoveFileToFolder.java diff --git a/drive/snippets/drive_v3/src/main/java/CreateFolder.java b/drive/snippets/drive_v3/src/main/java/CreateFolder.java new file mode 100644 index 00000000..df92f77b --- /dev/null +++ b/drive/snippets/drive_v3/src/main/java/CreateFolder.java @@ -0,0 +1,70 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// [START drive_create_folder] + +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.drive.Drive; +import com.google.api.services.drive.DriveScopes; +import com.google.api.services.drive.model.File; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; + +import java.io.IOException; +import java.util.Arrays; + +/* Class to demonstrate use of Drive's create folder API */ +public class CreateFolder { + + + /** + * Create new folder. + * @return Inserted folder id if successful, {@code null} otherwise. + * @throws IOException if service account credentials file not found. + */ + private static String createFolder() throws IOException { + // Load pre-authorized user credentials from the environment. + // TODO(developer) - See https://developers.google.com/identity for + // guides on implementing OAuth2 for your application. + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault().createScoped(Arrays.asList(DriveScopes.DRIVE_FILE)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + + // Build a new authorized API client service. + Drive service = new Drive.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Drive samples") + .build(); + // File's metadata. + File fileMetadata = new File(); + fileMetadata.setName("Test"); + fileMetadata.setMimeType("application/vnd.google-apps.folder"); + try { + File file = service.files().create(fileMetadata) + .setFields("id") + .execute(); + System.out.println("Folder ID: " + file.getId()); + return file.getId(); + }catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + System.err.println("Unable to create folder: " + e.getDetails()); + throw e; + } + } +} +// [END drive_create_folder] diff --git a/drive/snippets/drive_v3/src/main/java/MoveFileToFolder.java b/drive/snippets/drive_v3/src/main/java/MoveFileToFolder.java new file mode 100644 index 00000000..31a3e53c --- /dev/null +++ b/drive/snippets/drive_v3/src/main/java/MoveFileToFolder.java @@ -0,0 +1,81 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// [START drive_move_file_to_folder] + + +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.drive.Drive; +import com.google.api.services.drive.DriveScopes; +import com.google.api.services.drive.model.File; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; + +import java.io.IOException; +import java.util.Arrays; +import java.util.List; + +/* Class to demonstrate use case for moving file to folder.*/ +public class MoveFileToFolder { + + + /** + * @param fileId Id of file to be moved. + * @param folderId Id of folder where the fill will be moved. + * @return list of parent ids for the file. + * */ + private static List moveFileToFolder(String fileId, String folderId) + throws IOException { + /* Load pre-authorized user credentials from the environment. + TODO(developer) - See https://developers.google.com/identity for + guides on implementing OAuth2 for your application.*/ + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault().createScoped(Arrays.asList(DriveScopes.DRIVE_FILE)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + // Build a new authorized API client service. + Drive service = new Drive.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Drive samples") + .build(); + + // Retrieve the existing parents to remove + File file = service.files().get(fileId) + .setFields("parents") + .execute(); + StringBuilder previousParents = new StringBuilder(); + for (String parent : file.getParents()) { + previousParents.append(parent); + previousParents.append(','); + } + try{ + // Move the file to the new folder + file = service.files().update(fileId, null) + .setAddParents(folderId) + .setRemoveParents(previousParents.toString()) + .setFields("id, parents") + .execute(); + + return file.getParents(); + }catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + System.err.println("Unable to move file: " + e.getDetails()); + throw e; + } + } +} +// [END drive_move_file_to_folder] From 2705ee7e977137de618b2def1cfc4f576704fda1 Mon Sep 17 00:00:00 2001 From: Rajesh Mudaliyar Date: Tue, 8 Mar 2022 09:12:30 -0800 Subject: [PATCH 073/262] Slides snippet (#205) * git-on-borg files of gmail-api-snippets * Update build.gradle test12 * Update build.gradle * Slides snippet Co-authored-by: sanjuktaghosh7 Co-authored-by: Manvendra-P-Singh --- .../src/main/java/CopyPresentation.java | 78 ++++++++++++++ .../src/main/java/CreatePresentation.java | 65 +++++++++++ .../snippets/src/main/java/CreateSlide.java | 101 ++++++++++++++++++ 3 files changed, 244 insertions(+) create mode 100644 slides/snippets/src/main/java/CopyPresentation.java create mode 100644 slides/snippets/src/main/java/CreatePresentation.java create mode 100644 slides/snippets/src/main/java/CreateSlide.java diff --git a/slides/snippets/src/main/java/CopyPresentation.java b/slides/snippets/src/main/java/CopyPresentation.java new file mode 100644 index 00000000..b6534cde --- /dev/null +++ b/slides/snippets/src/main/java/CopyPresentation.java @@ -0,0 +1,78 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + + +// [START slides_copy_presentation] +import com.google.api.client.googleapis.json.GoogleJsonError; +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.drive.Drive; +import com.google.api.services.drive.model.File; +import com.google.api.services.slides.v1.SlidesScopes; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; + +import java.io.IOException; +import java.util.Collections; + +/* Class to demonstrate the use of Slides Copy Presentation API */ +public class CopyPresentation { + /** + * Copy an existing presentation. + * + * @param presentationId - id of the presentation. + * @param copyTitle - New title of the presentation. + * @return presentation id + * @throws IOException - if credentials file not found. + */ + public static String copyPresentation(String presentationId, String copyTitle) throws IOException { + /* Load pre-authorized user credentials from the environment. + TODO(developer) - See https://developers.google.com/identity for + guides on implementing OAuth2 for your application. */ + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Collections.singleton(SlidesScopes.DRIVE)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + + // Create the drive API client + Drive driveService = new Drive.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Slides samples") + .build(); + + String presentationCopyId = null; + try { + // Copies an existing presentation using specified presentation title. + File copyMetadata = new File().setName(copyTitle); + File presentationCopyFile = + driveService.files().copy(presentationId, copyMetadata).execute(); + presentationCopyId = presentationCopyFile.getId(); + // Prints the new copied presentation id. + System.out.println("New copied presentation id "+presentationCopyId); + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + GoogleJsonError error = e.getDetails(); + if (error.getCode() == 404) { + System.out.printf("Presentation not found with id '%s'.\n", presentationId); + } else { + throw e; + } + } + return presentationCopyId; + } +} +// [END slides_copy_presentation] \ No newline at end of file diff --git a/slides/snippets/src/main/java/CreatePresentation.java b/slides/snippets/src/main/java/CreatePresentation.java new file mode 100644 index 00000000..966362b2 --- /dev/null +++ b/slides/snippets/src/main/java/CreatePresentation.java @@ -0,0 +1,65 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + + +// [START slides_create_presentation] +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.slides.v1.Slides; +import com.google.api.services.slides.v1.SlidesScopes; +import com.google.api.services.slides.v1.model.Presentation; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; + +import java.io.IOException; +import java.util.Collections; + +/* Class to demonstrate the use of Slides Create Presentation API */ +public class CreatePresentation { + /** + * Creates a new presentation. + * + * @param title - the name of the presentation to be created + * @return presentation id + * @throws IOException - if credentials file not found. + */ + public static String createPresentation(String title) throws IOException { + /* Load pre-authorized user credentials from the environment. + TODO(developer) - See https://developers.google.com/identity for + guides on implementing OAuth2 for your application. */ + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Collections.singleton(SlidesScopes.PRESENTATIONS)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + + // Create the slides API client + Slides service = new Slides.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Slides samples") + .build(); + + // Creates a blank presentation with a specified title. + Presentation presentation = new Presentation() + .setTitle(title); + presentation = service.presentations().create(presentation) + .setFields("presentationId") + .execute(); + // Prints the newly created presentation id. + System.out.println("Created presentation with ID: " + presentation.getPresentationId()); + return presentation.getPresentationId(); + } +} +// [END slides_create_presentation] \ No newline at end of file diff --git a/slides/snippets/src/main/java/CreateSlide.java b/slides/snippets/src/main/java/CreateSlide.java new file mode 100644 index 00000000..c1a55b99 --- /dev/null +++ b/slides/snippets/src/main/java/CreateSlide.java @@ -0,0 +1,101 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + + +// [START slides_create_slide] +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.googleapis.json.GoogleJsonError; +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.slides.v1.Slides; +import com.google.api.services.slides.v1.SlidesScopes; +import com.google.api.services.slides.v1.model.BatchUpdatePresentationRequest; +import com.google.api.services.slides.v1.model.BatchUpdatePresentationResponse; +import com.google.api.services.slides.v1.model.CreateSlideRequest; +import com.google.api.services.slides.v1.model.CreateSlideResponse; +import com.google.api.services.slides.v1.model.LayoutReference; +import com.google.api.services.slides.v1.model.Request; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +/* Class to demonstrate the use of Create Slides API */ +public class CreateSlide { + /** + * Creates a new slide. + * + * @param presentationId - id of the presentation. + * @param slideId - id for the new slide. + * @return slide id + * @throws IOException - if credentials file not found. + */ + public static BatchUpdatePresentationResponse createSlide(String presentationId, + String slideId) throws IOException { + /* Load pre-authorized user credentials from the environment. + TODO(developer) - See https://developers.google.com/identity for + guides on implementing OAuth2 for your application. */ + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Collections.singleton(SlidesScopes.PRESENTATIONS)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + + // Create the slides API client + Slides service = new Slides.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Slides samples") + .build(); + + // Add a slide at index 1 using the predefined "TITLE_AND_TWO_COLUMNS" layout + List requests = new ArrayList<>(); + BatchUpdatePresentationResponse response = null; + try { + requests.add(new Request() + .setCreateSlide(new CreateSlideRequest() + .setObjectId(slideId) + .setInsertionIndex(1) + .setSlideLayoutReference(new LayoutReference() + .setPredefinedLayout("TITLE_AND_TWO_COLUMNS")))); + + // If you wish to populate the slide with elements, add create requests here, + // using the slide ID specified above. + + // Execute the request. + BatchUpdatePresentationRequest body = + new BatchUpdatePresentationRequest().setRequests(requests); + response = service.presentations().batchUpdate(presentationId, body).execute(); + CreateSlideResponse createSlideResponse = response.getReplies().get(0).getCreateSlide(); + // Prints the slide id. + System.out.println("Created slide with ID: " + createSlideResponse.getObjectId()); + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + GoogleJsonError error = e.getDetails(); + if (error.getCode() == 400) { + System.out.printf(" Id '%s' should be unique among all pages and page elements.\n", presentationId); + } else if (error.getCode() == 404) { + System.out.printf("Presentation not found with id '%s'.\n", presentationId); + } + else { + throw e; + } + } + return response; + } +} +// [END slides_create_slide] \ No newline at end of file From 32fabf18c019ba6ad00bf810d642c39c6a539bd5 Mon Sep 17 00:00:00 2001 From: Rajesh Mudaliyar Date: Tue, 15 Mar 2022 15:43:50 -0700 Subject: [PATCH 074/262] Drive-v3: file snippets patch-2 (#206) * git-on-borg files of gmail-api-snippets * Update build.gradle test12 * Update build.gradle * Drive-v3: file snippets patch-2 Co-authored-by: sanjuktaghosh7 Co-authored-by: Manvendra-P-Singh --- .../drive_v3/src/main/java/UploadBasic.java | 73 +++++++++++++++++++ .../src/main/java/UploadRevision.java | 72 ++++++++++++++++++ 2 files changed, 145 insertions(+) create mode 100644 drive/snippets/drive_v3/src/main/java/UploadBasic.java create mode 100644 drive/snippets/drive_v3/src/main/java/UploadRevision.java diff --git a/drive/snippets/drive_v3/src/main/java/UploadBasic.java b/drive/snippets/drive_v3/src/main/java/UploadBasic.java new file mode 100644 index 00000000..4a83ebfe --- /dev/null +++ b/drive/snippets/drive_v3/src/main/java/UploadBasic.java @@ -0,0 +1,73 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// [START drive_upload_basic] + +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.FileContent; +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.drive.Drive; +import com.google.api.services.drive.DriveScopes; +import com.google.api.services.drive.model.File; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; + +import java.io.IOException; +import java.util.Arrays; + +/* Class to demonstrate use of Drive insert file API */ +public class UploadBasic { + + /** + * Upload new file. + * @return Inserted file metadata if successful, {@code null} otherwise. + * @throws IOException if service account credentials file not found. + */ + private static File uploadBasic() throws IOException{ + // Load pre-authorized user credentials from the environment. + // TODO(developer) - See https://developers.google.com/identity for + // guides on implementing OAuth2 for your application. + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault().createScoped(Arrays.asList(DriveScopes.DRIVE_FILE)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + + // Build a new authorized API client service. + Drive service = new Drive.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Drive samples") + .build(); + // Upload file photo.jpg on drive. + File fileMetadata = new File(); + fileMetadata.setName("photo.jpg"); + // File's content. + java.io.File filePath = new java.io.File("files/photo.jpg"); + // Specify media type and file-path for file. + FileContent mediaContent = new FileContent("image/jpeg", filePath); + try { + File file = service.files().create(fileMetadata, mediaContent) + .setFields("id") + .execute(); + System.out.println("File ID: " + file.getId()); + return file; + }catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + System.err.println("Unable to upload file: " + e.getDetails()); + throw e; + } + } +} +// [END drive_upload_basic] diff --git a/drive/snippets/drive_v3/src/main/java/UploadRevision.java b/drive/snippets/drive_v3/src/main/java/UploadRevision.java new file mode 100644 index 00000000..97b5fb34 --- /dev/null +++ b/drive/snippets/drive_v3/src/main/java/UploadRevision.java @@ -0,0 +1,72 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// [START drive_upload_revision] + +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.FileContent; +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.drive.Drive; +import com.google.api.services.drive.DriveScopes; +import com.google.api.services.drive.model.File; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; + +import java.io.IOException; +import java.util.Arrays; + +/* Class to demonstrate use-case of drive's upload revision */ +public class UploadRevision { + + /** + * Replace the old file with new one on same file ID. + * @param realFileId ID of the file to be replaced. + * @return Inserted file ID if successful, {@code null} otherwise. + * @throws IOException if service account credentials file not found. + */ + private static String uploadRevision(String realFileId) throws IOException{ + // Load pre-authorized user credentials from the environment. + // TODO(developer) - See https://developers.google.com/identity for + // guides on implementing OAuth2 for your application. + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault().createScoped(Arrays.asList(DriveScopes.DRIVE_FILE)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + + // Build a new authorized API client service. + Drive service = new Drive.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Drive samples") + .build(); + + + java.io.File filePath = new java.io.File("files/photo.jpg"); + FileContent mediaContent = new FileContent("image/jpeg", filePath); + try { + Drive.Files.Update request = service.files().update(realFileId, new File(), mediaContent) + .setFields("id"); + request.getMediaHttpUploader().setDirectUploadEnabled(true); + File file = request.execute(); + System.out.println("File ID: " + file.getId()); + return file.getId(); + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + System.err.println("Unable to upload new file: " + e.getDetails()); + throw e; + } + } +} +// [END drive_upload_revision] From eff986a181d37d7e17eb2dad0f4d46b942148283 Mon Sep 17 00:00:00 2001 From: Rajesh Mudaliyar Date: Wed, 16 Mar 2022 08:59:18 -0700 Subject: [PATCH 075/262] Sheets snippets (#208) * git-on-borg files of gmail-api-snippets * Update build.gradle test12 * Update build.gradle * Sheets snippets * Sheets snippets Co-authored-by: sanjuktaghosh7 Co-authored-by: Manvendra-P-Singh --- .../snippets/src/main/java/BatchUpdate.java | 105 ++++++++++++++ .../src/main/java/ConditionalFormatting.java | 128 ++++++++++++++++++ sheets/snippets/src/main/java/Create.java | 67 +++++++++ 3 files changed, 300 insertions(+) create mode 100644 sheets/snippets/src/main/java/BatchUpdate.java create mode 100644 sheets/snippets/src/main/java/ConditionalFormatting.java create mode 100644 sheets/snippets/src/main/java/Create.java diff --git a/sheets/snippets/src/main/java/BatchUpdate.java b/sheets/snippets/src/main/java/BatchUpdate.java new file mode 100644 index 00000000..6e8ac069 --- /dev/null +++ b/sheets/snippets/src/main/java/BatchUpdate.java @@ -0,0 +1,105 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + + +// [START sheets_batch_update] +import com.google.api.client.googleapis.json.GoogleJsonError; +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.sheets.v4.Sheets; +import com.google.api.services.sheets.v4.SheetsScopes; +import com.google.api.services.sheets.v4.model.BatchUpdateSpreadsheetResponse; +import com.google.api.services.sheets.v4.model.BatchUpdateSpreadsheetRequest; +import com.google.api.services.sheets.v4.model.FindReplaceRequest; +import com.google.api.services.sheets.v4.model.FindReplaceResponse; +import com.google.api.services.sheets.v4.model.Request; +import com.google.api.services.sheets.v4.model.SpreadsheetProperties; +import com.google.api.services.sheets.v4.model.UpdateSpreadsheetPropertiesRequest; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +/* Class to demonstrate the use of Spreadsheet Batch Update API */ +public class BatchUpdate { + /** + * Updates spreadsheet's title and cell values. + * + * @param spreadsheetId - Id of the spreadsheet. + * @param title - New title of the spreadsheet. + * @param find - Find cell values + * @param replacement - Replaced cell values + * @return response metadata + * @throws IOException - if credentials file not found. + */ + public static BatchUpdateSpreadsheetResponse batchUpdate(String spreadsheetId, + String title, + String find, + String replacement) + throws IOException { + /* Load pre-authorized user credentials from the environment. + TODO(developer) - See https://developers.google.com/identity for + guides on implementing OAuth2 for your application. */ + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Collections.singleton(SheetsScopes.SPREADSHEETS)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + + // Create the sheets API client + Sheets service = new Sheets.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Sheets samples") + .build(); + + List requests = new ArrayList<>(); + BatchUpdateSpreadsheetResponse response = null; + try { + // Change the spreadsheet's title. + requests.add(new Request() + .setUpdateSpreadsheetProperties(new UpdateSpreadsheetPropertiesRequest() + .setProperties(new SpreadsheetProperties() + .setTitle(title)) + .setFields("title"))); + // Find and replace text. + requests.add(new Request() + .setFindReplace(new FindReplaceRequest() + .setFind(find) + .setReplacement(replacement) + .setAllSheets(true))); + + BatchUpdateSpreadsheetRequest body = + new BatchUpdateSpreadsheetRequest().setRequests(requests); + response = service.spreadsheets().batchUpdate(spreadsheetId, body).execute(); + FindReplaceResponse findReplaceResponse = response.getReplies().get(1).getFindReplace(); + + System.out.printf("%d replacements made.", findReplaceResponse.getOccurrencesChanged()); + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + GoogleJsonError error = e.getDetails(); + if (error.getCode() == 404) { + System.out.printf("Spreadsheet not found with id '%s'.\n",spreadsheetId); + } else { + throw e; + } + } + return response; + } +} +// [END sheets_batch_update] \ No newline at end of file diff --git a/sheets/snippets/src/main/java/ConditionalFormatting.java b/sheets/snippets/src/main/java/ConditionalFormatting.java new file mode 100644 index 00000000..bae8ef3b --- /dev/null +++ b/sheets/snippets/src/main/java/ConditionalFormatting.java @@ -0,0 +1,128 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + + +// [START sheets_conditional_formatting] +import com.google.api.client.googleapis.json.GoogleJsonError; +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.sheets.v4.Sheets; +import com.google.api.services.sheets.v4.SheetsScopes; +import com.google.api.services.sheets.v4.model.*; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; + +import java.io.IOException; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; + +/* Class to demonstrate the use of Spreadsheet Conditional Formatting API */ +public class ConditionalFormatting { + /** + * Create conditional formatting. + * + * @param spreadsheetId - Id of the spreadsheet. + * @return updated changes count. + * @throws IOException - if credentials file not found. + */ + public static BatchUpdateSpreadsheetResponse conditionalFormat(String spreadsheetId) + throws IOException { + /* Load pre-authorized user credentials from the environment. + TODO(developer) - See https://developers.google.com/identity for + guides on implementing OAuth2 for your application. */ + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Collections.singleton(SheetsScopes.SPREADSHEETS)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + + // Create the sheets API client + Sheets service = new Sheets.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Sheets samples") + .build(); + + List ranges = Collections.singletonList(new GridRange() + .setSheetId(0) + .setStartRowIndex(1) + .setEndRowIndex(11) + .setStartColumnIndex(0) + .setEndColumnIndex(4) + ); + List requests = Arrays.asList( + new Request().setAddConditionalFormatRule(new AddConditionalFormatRuleRequest() + .setRule(new ConditionalFormatRule() + .setRanges(ranges) + .setBooleanRule(new BooleanRule() + .setCondition(new BooleanCondition() + .setType("CUSTOM_FORMULA") + .setValues(Collections.singletonList( + new ConditionValue().setUserEnteredValue( + "=GT($D2,median($D$2:$D$11))") + )) + ) + .setFormat(new CellFormat().setTextFormat( + new TextFormat().setForegroundColor( + new Color().setRed(0.8f)) + )) + ) + ) + .setIndex(0) + ), + new Request().setAddConditionalFormatRule(new AddConditionalFormatRuleRequest() + .setRule(new ConditionalFormatRule() + .setRanges(ranges) + .setBooleanRule(new BooleanRule() + .setCondition(new BooleanCondition() + .setType("CUSTOM_FORMULA") + .setValues(Collections.singletonList( + new ConditionValue().setUserEnteredValue( + "=LT($D2,median($D$2:$D$11))") + )) + ) + .setFormat(new CellFormat().setBackgroundColor( + new Color().setRed(1f).setGreen(0.4f).setBlue(0.4f) + )) + ) + ) + .setIndex(0) + ) + ); + + BatchUpdateSpreadsheetResponse result = null; + try { + // Execute the requests. + BatchUpdateSpreadsheetRequest body = + new BatchUpdateSpreadsheetRequest() + .setRequests(requests); + result = service.spreadsheets() + .batchUpdate(spreadsheetId, body) + .execute(); + System.out.printf("%d cells updated.", result.getReplies().size()); + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + GoogleJsonError error = e.getDetails(); + if (error.getCode() == 404) { + System.out.printf("Spreadsheet not found with id '%s'.\n",spreadsheetId); + } else { + throw e; + } + } + return result; + } +} +// [END sheets_conditional_formatting] diff --git a/sheets/snippets/src/main/java/Create.java b/sheets/snippets/src/main/java/Create.java new file mode 100644 index 00000000..19060bba --- /dev/null +++ b/sheets/snippets/src/main/java/Create.java @@ -0,0 +1,67 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + + +// [START sheets_create] +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.sheets.v4.Sheets; +import com.google.api.services.sheets.v4.SheetsScopes; +import com.google.api.services.sheets.v4.model.Spreadsheet; +import com.google.api.services.sheets.v4.model.SpreadsheetProperties; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; + +import java.io.IOException; +import java.util.Collections; + +/* Class to demonstrate the use of Spreadsheet Create API */ +public class Create { + /** + * Create a new spreadsheet. + * + * @param title - the name of the sheet to be created. + * @return newly created spreadsheet id + * @throws IOException - if credentials file not found. + */ + public static String create(String title) throws IOException { + /* Load pre-authorized user credentials from the environment. + TODO(developer) - See https://developers.google.com/identity for + guides on implementing OAuth2 for your application. */ + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Collections.singleton(SheetsScopes.SPREADSHEETS)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + + // Create the sheets API client + Sheets service = new Sheets.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Sheets samples") + .build(); + + // Create new spreadsheet with a title + Spreadsheet spreadsheet = new Spreadsheet() + .setProperties(new SpreadsheetProperties() + .setTitle(title)); + spreadsheet = service.spreadsheets().create(spreadsheet) + .setFields("spreadsheetId") + .execute(); + // Prints the new spreadsheet id + System.out.println("Spreadsheet ID: " + spreadsheet.getSpreadsheetId()); + return spreadsheet.getSpreadsheetId(); + } +} +// [END sheets_create] \ No newline at end of file From 82b4f119f2932e87c34033e4184ec833b27ae513 Mon Sep 17 00:00:00 2001 From: Rajesh Mudaliyar Date: Wed, 16 Mar 2022 09:00:09 -0700 Subject: [PATCH 076/262] Drive-v3: file snippets patch-3 (#207) * git-on-borg files of gmail-api-snippets * Update build.gradle test12 * Update build.gradle * Drive-v3: file snippets patch-3 Co-authored-by: sanjuktaghosh7 Co-authored-by: Manvendra-P-Singh --- .../src/main/java/UploadToFolder.java | 75 +++++++++++++++++++ .../src/main/java/UploadWithConversion.java | 74 ++++++++++++++++++ 2 files changed, 149 insertions(+) create mode 100644 drive/snippets/drive_v3/src/main/java/UploadToFolder.java create mode 100644 drive/snippets/drive_v3/src/main/java/UploadWithConversion.java diff --git a/drive/snippets/drive_v3/src/main/java/UploadToFolder.java b/drive/snippets/drive_v3/src/main/java/UploadToFolder.java new file mode 100644 index 00000000..03c711a5 --- /dev/null +++ b/drive/snippets/drive_v3/src/main/java/UploadToFolder.java @@ -0,0 +1,75 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// [START drive_upload_to_folder] + +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.FileContent; +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.drive.Drive; +import com.google.api.services.drive.DriveScopes; +import com.google.api.services.drive.model.File; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; + +import java.io.IOException; +import java.util.Arrays; +import java.util.Collections; + +/* Class to demonstrate Drive's upload to folder use-case. */ +public class UploadToFolder { + + /** + * Upload a file to the specified folder. + * @param realFolderId Id of the folder. + * @return Inserted file metadata if successful, {@code null} otherwise. + * @throws IOException if service account credentials file not found. + */ + private static File uploadToFolder(String realFolderId) throws IOException { + // Load pre-authorized user credentials from the environment. + // TODO(developer) - See https://developers.google.com/identity for + // guides on implementing OAuth2 for your application. + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault().createScoped(Arrays.asList(DriveScopes.DRIVE_FILE)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + + // Build a new authorized API client service. + Drive service = new Drive.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Drive samples") + .build(); + + // File's metadata. + File fileMetadata = new File(); + fileMetadata.setName("photo.jpg"); + fileMetadata.setParents(Collections.singletonList(realFolderId)); + java.io.File filePath = new java.io.File("files/photo.jpg"); + FileContent mediaContent = new FileContent("image/jpeg", filePath); + try { + File file = service.files().create(fileMetadata, mediaContent) + .setFields("id, parents") + .execute(); + System.out.println("File ID: " + file.getId()); + return file; + }catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + System.err.println("Unable to upload file: " + e.getDetails()); + throw e; + } + } +} +// [END drive_upload_to_folder] diff --git a/drive/snippets/drive_v3/src/main/java/UploadWithConversion.java b/drive/snippets/drive_v3/src/main/java/UploadWithConversion.java new file mode 100644 index 00000000..dca7e60a --- /dev/null +++ b/drive/snippets/drive_v3/src/main/java/UploadWithConversion.java @@ -0,0 +1,74 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// [START drive_upload_with_conversion] + +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.FileContent; +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.drive.Drive; +import com.google.api.services.drive.DriveScopes; +import com.google.api.services.drive.model.File; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; + +import java.io.IOException; +import java.util.Arrays; + +/* Class to demonstrate Drive's upload with conversion use-case. */ +public class UploadWithConversion { + + /** + * Upload file with conversion. + * @return Inserted file id if successful, {@code null} otherwise. + * @throws IOException if service account credentials file not found. + */ + private static String uploadWithConversion() throws IOException { + // Load pre-authorized user credentials from the environment. + // TODO(developer) - See https://developers.google.com/identity for + // guides on implementing OAuth2 for your application. + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault().createScoped(Arrays.asList(DriveScopes.DRIVE_FILE)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + + // Build a new authorized API client service. + Drive service = new Drive.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Drive samples") + .build(); + + // File's metadata. + File fileMetadata = new File(); + fileMetadata.setName("My Report"); + fileMetadata.setMimeType("application/vnd.google-apps.spreadsheet"); + + java.io.File filePath = new java.io.File("files/report.csv"); + FileContent mediaContent = new FileContent("text/csv", filePath); + try { + File file = service.files().create(fileMetadata, mediaContent) + .setFields("id") + .execute(); + System.out.println("File ID: " + file.getId()); + return file.getId(); + }catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + System.err.println("Unable to move file: " + e.getDetails()); + throw e; + } + } +} +// [END drive_upload_with_conversion] From 2afdca21e9bd9e817756603ec6899602e131ea4b Mon Sep 17 00:00:00 2001 From: Rajesh Mudaliyar Date: Wed, 16 Mar 2022 09:05:58 -0700 Subject: [PATCH 077/262] Slides snippet (#209) * git-on-borg files of gmail-api-snippets * Update build.gradle test12 * Update build.gradle * Slides snippet * Slides snippet * Slides snippets Co-authored-by: sanjuktaghosh7 Co-authored-by: Manvendra-P-Singh --- .../src/main/java/CreateBulletedText.java | 95 +++++++++++ .../snippets/src/main/java/CreateImage.java | 115 +++++++++++++ .../src/main/java/CreateSheetsChart.java | 114 +++++++++++++ .../src/main/java/CreateTextboxWithText.java | 116 +++++++++++++ .../snippets/src/main/java/ImageMerging.java | 114 +++++++++++++ .../src/main/java/RefreshSheetsChart.java | 92 +++++++++++ .../src/main/java/SimpleTextReplace.java | 101 ++++++++++++ .../snippets/src/main/java/TextMerging.java | 155 ++++++++++++++++++ .../src/main/java/TextStyleUpdate.java | 138 ++++++++++++++++ 9 files changed, 1040 insertions(+) create mode 100644 slides/snippets/src/main/java/CreateBulletedText.java create mode 100644 slides/snippets/src/main/java/CreateImage.java create mode 100644 slides/snippets/src/main/java/CreateSheetsChart.java create mode 100644 slides/snippets/src/main/java/CreateTextboxWithText.java create mode 100644 slides/snippets/src/main/java/ImageMerging.java create mode 100644 slides/snippets/src/main/java/RefreshSheetsChart.java create mode 100644 slides/snippets/src/main/java/SimpleTextReplace.java create mode 100644 slides/snippets/src/main/java/TextMerging.java create mode 100644 slides/snippets/src/main/java/TextStyleUpdate.java diff --git a/slides/snippets/src/main/java/CreateBulletedText.java b/slides/snippets/src/main/java/CreateBulletedText.java new file mode 100644 index 00000000..412ed14b --- /dev/null +++ b/slides/snippets/src/main/java/CreateBulletedText.java @@ -0,0 +1,95 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + + +// [START slides_create_bulleted_text] +import com.google.api.client.googleapis.json.GoogleJsonError; +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.slides.v1.Slides; +import com.google.api.services.slides.v1.SlidesScopes; +import com.google.api.services.slides.v1.model.BatchUpdatePresentationRequest; +import com.google.api.services.slides.v1.model.BatchUpdatePresentationResponse; +import com.google.api.services.slides.v1.model.CreateParagraphBulletsRequest; +import com.google.api.services.slides.v1.model.Range; +import com.google.api.services.slides.v1.model.Request; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +/* Class to demonstrate the use of Slide Create Bulleted Text API */ +public class CreateBulletedText { + /** + * Add arrow-diamond-disc bullets to all text in the shape. + * + * @param presentationId - id of the presentation. + * @param shapeId - id of the shape. + * @return response + * @throws IOException - if credentials file not found. + */ + public static BatchUpdatePresentationResponse createBulletedText(String presentationId, + String shapeId) throws IOException { + /* Load pre-authorized user credentials from the environment. + TODO(developer) - See https://developers.google.com/identity for + guides on implementing OAuth2 for your application. */ + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Collections.singleton(SlidesScopes.PRESENTATIONS)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + + // Create the slides API client + Slides service = new Slides.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Slides samples") + .build(); + + // Add arrow-diamond-disc bullets to all text in the shape. + List requests = new ArrayList<>(); + requests.add(new Request() + .setCreateParagraphBullets(new CreateParagraphBulletsRequest() + .setObjectId(shapeId) + .setTextRange(new Range() + .setType("ALL")) + .setBulletPreset("BULLET_ARROW_DIAMOND_DISC"))); + + BatchUpdatePresentationResponse response =null; + try { + // Execute the request. + BatchUpdatePresentationRequest body = + new BatchUpdatePresentationRequest().setRequests(requests); + response = service.presentations().batchUpdate(presentationId, body).execute(); + System.out.println("Added bullets to text in shape with ID: " + shapeId); + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + GoogleJsonError error = e.getDetails(); + if (error.getCode() == 400) { + System.out.printf("Shape not found with id '%s'.\n", shapeId); + } else if (error.getCode() == 404) { + System.out.printf("Presentation not found with id '%s'.\n", presentationId); + } + else { + throw e; + } + } + return response; + } +} +// [END slides_create_bulleted_text] \ No newline at end of file diff --git a/slides/snippets/src/main/java/CreateImage.java b/slides/snippets/src/main/java/CreateImage.java new file mode 100644 index 00000000..6338d405 --- /dev/null +++ b/slides/snippets/src/main/java/CreateImage.java @@ -0,0 +1,115 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + + +// [START slides_create_image] +import com.google.api.client.googleapis.json.GoogleJsonError; +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.slides.v1.Slides; +import com.google.api.services.slides.v1.SlidesScopes; +import com.google.api.services.slides.v1.model.AffineTransform; +import com.google.api.services.slides.v1.model.BatchUpdatePresentationRequest; +import com.google.api.services.slides.v1.model.BatchUpdatePresentationResponse; +import com.google.api.services.slides.v1.model.CreateImageRequest; +import com.google.api.services.slides.v1.model.CreateImageResponse; +import com.google.api.services.slides.v1.model.Dimension; +import com.google.api.services.slides.v1.model.PageElementProperties; +import com.google.api.services.slides.v1.model.Request; +import com.google.api.services.slides.v1.model.Size; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +/* Class to demonstrate the use of Slides Create Image API */ +public class CreateImage { + /** + * Create a new image, using the supplied object ID, with content + * downloaded from imageUrl. + * + * @param presentationId - id of the presentation. + * @param slideId - id of the shape. + * @param imageId - id for the image. + * @param imageUrl - Url of the image. + * @return image id + * @throws IOException - if credentials file not found. + */ + public static BatchUpdatePresentationResponse createImage(String presentationId, + String slideId, + String imageId, + String imageUrl) + throws IOException { + /* Load pre-authorized user credentials from the environment. + TODO(developer) - See https://developers.google.com/identity for + guides on implementing OAuth2 for your application. */ + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Collections.singleton(SlidesScopes.PRESENTATIONS)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + + // Create the slides API client + Slides service = new Slides.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Slides samples") + .build(); + + // Create a new image, using the supplied object ID, with content downloaded from imageUrl. + List requests = new ArrayList<>(); + Dimension emu4M = new Dimension().setMagnitude(4000000.0).setUnit("EMU"); + requests.add(new Request() + .setCreateImage(new CreateImageRequest() + .setObjectId(imageId) + .setUrl(imageUrl) + .setElementProperties(new PageElementProperties() + .setPageObjectId(slideId) + .setSize(new Size() + .setHeight(emu4M) + .setWidth(emu4M)) + .setTransform(new AffineTransform() + .setScaleX(1.0) + .setScaleY(1.0) + .setTranslateX(100000.0) + .setTranslateY(100000.0) + .setUnit("EMU"))))); + + BatchUpdatePresentationResponse response = null; + try { + // Execute the request. + BatchUpdatePresentationRequest body = + new BatchUpdatePresentationRequest().setRequests(requests); + response = service.presentations().batchUpdate(presentationId, body).execute(); + CreateImageResponse createImageResponse = response.getReplies().get(0).getCreateImage(); + // Prints the created image id. + System.out.println("Created image with ID: " + createImageResponse.getObjectId()); + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + GoogleJsonError error = e.getDetails(); + if (error.getCode() == 404) { + System.out.printf("Presentation not found with id '%s'.\n", presentationId); + } + else { + throw e; + } + } + return response; + } +} +// [END slides_create_image] \ No newline at end of file diff --git a/slides/snippets/src/main/java/CreateSheetsChart.java b/slides/snippets/src/main/java/CreateSheetsChart.java new file mode 100644 index 00000000..d866007e --- /dev/null +++ b/slides/snippets/src/main/java/CreateSheetsChart.java @@ -0,0 +1,114 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + + +// [START slides_create_sheets_chart] +import com.google.api.client.googleapis.json.GoogleJsonError; +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.slides.v1.Slides; +import com.google.api.services.slides.v1.SlidesScopes; +import com.google.api.services.slides.v1.model.AffineTransform; +import com.google.api.services.slides.v1.model.BatchUpdatePresentationRequest; +import com.google.api.services.slides.v1.model.BatchUpdatePresentationResponse; +import com.google.api.services.slides.v1.model.CreateSheetsChartRequest; +import com.google.api.services.slides.v1.model.Dimension; +import com.google.api.services.slides.v1.model.PageElementProperties; +import com.google.api.services.slides.v1.model.Request; +import com.google.api.services.slides.v1.model.Size; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +/* Class to demonstrate the use of Slides Create Chart API */ +public class CreateSheetsChart { + /** + * Adds chart from spreadsheet to slides as linked. + * + * @param presentationId - id of the presentation. + * @param pageId - id of the page. + * @param spreadsheetId - id of the spreadsheet. + * @param sheetChartId - id of the chart in sheets. + * @return presentation chart id + * @throws IOException - if credentials file not found. + */ + public static BatchUpdatePresentationResponse createSheetsChart( + String presentationId, String pageId, String spreadsheetId, Integer sheetChartId) + throws IOException { + /* Load pre-authorized user credentials from the environment. + TODO(developer) - See https://developers.google.com/identity for + guides on implementing OAuth2 for your application. */ + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Collections.singleton(SlidesScopes.PRESENTATIONS)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + + // Create the slides API client + Slides service = new Slides.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Slides samples") + .build(); + + // Embed a Sheets chart (indicated by the spreadsheetId and sheetChartId) onto + // a page in the presentation. Setting the linking mode as "LINKED" allows the + // chart to be refreshed if the Sheets version is updated. + List requests = new ArrayList<>(); + Dimension emu4M = new Dimension().setMagnitude(4000000.0).setUnit("EMU"); + String presentationChartId = "MyEmbeddedChart"; + requests.add(new Request() + .setCreateSheetsChart(new CreateSheetsChartRequest() + .setObjectId(presentationChartId) + .setSpreadsheetId(spreadsheetId) + .setChartId(sheetChartId) + .setLinkingMode("LINKED") + .setElementProperties(new PageElementProperties() + .setPageObjectId(pageId) + .setSize(new Size() + .setHeight(emu4M) + .setWidth(emu4M)) + .setTransform(new AffineTransform() + .setScaleX(1.0) + .setScaleY(1.0) + .setTranslateX(100000.0) + .setTranslateY(100000.0) + .setUnit("EMU"))))); + + BatchUpdatePresentationResponse response = null; + try { + // Execute the request. + BatchUpdatePresentationRequest body = + new BatchUpdatePresentationRequest().setRequests(requests); + response = service.presentations().batchUpdate(presentationId, body).execute(); + System.out.println("Added a linked Sheets chart with ID " + presentationChartId); + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + GoogleJsonError error = e.getDetails(); + if (error.getCode() == 404) { + System.out.printf("Presentation not found with id '%s'.\n", presentationId); + } + else { + throw e; + } + } + return response; + } +} +// [END slides_create_sheets_chart] \ No newline at end of file diff --git a/slides/snippets/src/main/java/CreateTextboxWithText.java b/slides/snippets/src/main/java/CreateTextboxWithText.java new file mode 100644 index 00000000..bb7df571 --- /dev/null +++ b/slides/snippets/src/main/java/CreateTextboxWithText.java @@ -0,0 +1,116 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + + +// [START slides_create_textbox_with_text] +import com.google.api.client.googleapis.json.GoogleJsonError; +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.slides.v1.Slides; +import com.google.api.services.slides.v1.SlidesScopes; +import com.google.api.services.slides.v1.model.AffineTransform; +import com.google.api.services.slides.v1.model.BatchUpdatePresentationRequest; +import com.google.api.services.slides.v1.model.BatchUpdatePresentationResponse; +import com.google.api.services.slides.v1.model.CreateShapeRequest; +import com.google.api.services.slides.v1.model.CreateShapeResponse; +import com.google.api.services.slides.v1.model.Dimension; +import com.google.api.services.slides.v1.model.InsertTextRequest; +import com.google.api.services.slides.v1.model.PageElementProperties; +import com.google.api.services.slides.v1.model.Request; +import com.google.api.services.slides.v1.model.Size; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +/* Class to demonstrate the use of Slides Create Textbox API */ +public class CreateTextboxWithText { + /** + * Create a new square textbox, using the specified id. + * + * @param presentationId - id of the presentation. + * @param slideId - id of the slide. + * @param textBoxId - id for the textbox. + * @return textbox id + * @throws IOException - if credentials file not found. + */ + public static BatchUpdatePresentationResponse createTextBoxWithText( + String presentationId, String slideId, String textBoxId) throws IOException { + /* Load pre-authorized user credentials from the environment. + TODO(developer) - See https://developers.google.com/identity for + guides on implementing OAuth2 for your application. */ + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Collections.singleton(SlidesScopes.PRESENTATIONS)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + + // Create the slides API client + Slides service = new Slides.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Slides samples") + .build(); + + // Create a new square text box, using a supplied object ID. + List requests = new ArrayList<>(); + Dimension pt350 = new Dimension().setMagnitude(350.0).setUnit("PT"); + requests.add(new Request() + .setCreateShape(new CreateShapeRequest() + .setObjectId(textBoxId) + .setShapeType("TEXT_BOX") + .setElementProperties(new PageElementProperties() + .setPageObjectId(slideId) + .setSize(new Size() + .setHeight(pt350) + .setWidth(pt350)) + .setTransform(new AffineTransform() + .setScaleX(1.0) + .setScaleY(1.0) + .setTranslateX(350.0) + .setTranslateY(100.0) + .setUnit("PT"))))); + + // Insert text into the box, using the object ID given to it. + requests.add(new Request() + .setInsertText(new InsertTextRequest() + .setObjectId(textBoxId) + .setInsertionIndex(0) + .setText("New Box Text Inserted"))); + BatchUpdatePresentationResponse response = null; + + try { + // Execute the requests. + BatchUpdatePresentationRequest body = + new BatchUpdatePresentationRequest().setRequests(requests); + response = service.presentations().batchUpdate(presentationId, body).execute(); + CreateShapeResponse createShapeResponse = response.getReplies().get(0).getCreateShape(); + System.out.println("Created textbox with ID: " + createShapeResponse.getObjectId()); + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + GoogleJsonError error = e.getDetails(); + if (error.getCode() == 404) { + System.out.printf("Presentation not found with id '%s'.\n", presentationId); + } else { + throw e; + } + } + return response; + } +} +// [END slides_create_textbox_with_text] \ No newline at end of file diff --git a/slides/snippets/src/main/java/ImageMerging.java b/slides/snippets/src/main/java/ImageMerging.java new file mode 100644 index 00000000..3b616aee --- /dev/null +++ b/slides/snippets/src/main/java/ImageMerging.java @@ -0,0 +1,114 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + + +// [START slides_image_merging] +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.drive.Drive; +import com.google.api.services.drive.model.File; +import com.google.api.services.slides.v1.Slides; +import com.google.api.services.slides.v1.SlidesScopes; +import com.google.api.services.slides.v1.model.BatchUpdatePresentationRequest; +import com.google.api.services.slides.v1.model.BatchUpdatePresentationResponse; +import com.google.api.services.slides.v1.model.Request; +import com.google.api.services.slides.v1.model.Response; +import com.google.api.services.slides.v1.model.ReplaceAllShapesWithImageRequest; +import com.google.api.services.slides.v1.model.SubstringMatchCriteria; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +/* Class to demonstrate the use of Slides Image Merging API */ +public class ImageMerging { + /** + * Changes specified texts into images. + * + * @param templatePresentationId - id of the presentation. + * @param imageUrl - Url of the image. + * @param customerName - Name of the customer. + * @return merged presentation id + * @throws IOException - if credentials file not found. + */ + public static BatchUpdatePresentationResponse imageMerging(String templatePresentationId, + String imageUrl, + String customerName) throws IOException { + /* Load pre-authorized user credentials from the environment. + TODO(developer) - See https://developers.google.com/identity for + guides on implementing OAuth2 for your application. */ + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Arrays.asList(SlidesScopes.PRESENTATIONS, + SlidesScopes.DRIVE)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + + // Create the slides API client + Slides service = new Slides.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Slides samples") + .build(); + + // Create the drive API client + Drive driveService = new Drive.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Slides samples") + .build(); + + // Duplicate the template presentation using the Drive API. + String copyTitle = customerName + " presentation"; + File content = new File().setName(copyTitle); + File presentationFile = + driveService.files().copy(templatePresentationId, content).execute(); + String presentationId = presentationFile.getId(); + + // Create the image merge (replaceAllShapesWithImage) requests. + List requests = new ArrayList<>(); + requests.add(new Request() + .setReplaceAllShapesWithImage(new ReplaceAllShapesWithImageRequest() + .setImageUrl(imageUrl) + .setImageReplaceMethod("CENTER_INSIDE") + .setContainsText(new SubstringMatchCriteria() + .setText("{{company-logo}}") + .setMatchCase(true)))); + + // Execute the requests. + BatchUpdatePresentationRequest body = + new BatchUpdatePresentationRequest().setRequests(requests); + BatchUpdatePresentationResponse response = + service.presentations().batchUpdate(presentationId, body).execute(); + + int numReplacements = 0; + try { + // Count total number of replacements made. + for (Response resp : response.getReplies()) { + numReplacements += resp.getReplaceAllShapesWithImage().getOccurrencesChanged(); + } + + // Prints the merged presentation id and count of replacements. + System.out.println("Created merged presentation with ID: " + presentationId); + System.out.println("Replaced " + numReplacements + " shapes instances with images."); + } catch (NullPointerException ne) { + System.out.println("Text not found to replace with image."); + } + return response; + } +} +// [END slides_image_merging] \ No newline at end of file diff --git a/slides/snippets/src/main/java/RefreshSheetsChart.java b/slides/snippets/src/main/java/RefreshSheetsChart.java new file mode 100644 index 00000000..30230a5a --- /dev/null +++ b/slides/snippets/src/main/java/RefreshSheetsChart.java @@ -0,0 +1,92 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + + +// [START slides_refresh_sheets_chart] +import com.google.api.client.googleapis.json.GoogleJsonError; +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.slides.v1.Slides; +import com.google.api.services.slides.v1.SlidesScopes; +import com.google.api.services.slides.v1.model.BatchUpdatePresentationRequest; +import com.google.api.services.slides.v1.model.BatchUpdatePresentationResponse; +import com.google.api.services.slides.v1.model.RefreshSheetsChartRequest; +import com.google.api.services.slides.v1.model.Request; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +/* Class to demonstrate the use of Slides Refresh Chart API */ +public class RefreshSheetsChart { + /** + * Refresh the sheets charts. + * + * @param presentationId - id of the presentation. + * @param presentationChartId - id of the presentation chart. + * @return presentation chart id + * @throws IOException - if credentials file not found. + */ + public static BatchUpdatePresentationResponse refreshSheetsChart( + String presentationId, String presentationChartId) throws IOException { + /* Load pre-authorized user credentials from the environment. + TODO(developer) - See https://developers.google.com/identity for + guides on implementing OAuth2 for your application. */ + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Collections.singleton(SlidesScopes.PRESENTATIONS)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + + // Create the slides API client + Slides service = new Slides.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Slides samples") + .build(); + + List requests = new ArrayList<>(); + + // Refresh an existing linked Sheets chart embedded a presentation. + requests.add(new Request() + .setRefreshSheetsChart(new RefreshSheetsChartRequest() + .setObjectId(presentationChartId))); + + BatchUpdatePresentationResponse response = null; + try { + // Execute the request. + BatchUpdatePresentationRequest body = + new BatchUpdatePresentationRequest().setRequests(requests); + response = service.presentations().batchUpdate(presentationId, body).execute(); + System.out.println("Refreshed a linked Sheets chart with ID " + presentationChartId); + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + GoogleJsonError error = e.getDetails(); + if (error.getCode() == 400) { + System.out.printf("Presentation chart not found with id '%s'.\n", presentationChartId); + } else if (error.getCode() == 404) { + System.out.printf("Presentation not found with id '%s'.\n", presentationId); + } + else { + throw e; + } + } + return response; + } +} +// [END slides_refresh_sheets_chart] \ No newline at end of file diff --git a/slides/snippets/src/main/java/SimpleTextReplace.java b/slides/snippets/src/main/java/SimpleTextReplace.java new file mode 100644 index 00000000..060215c1 --- /dev/null +++ b/slides/snippets/src/main/java/SimpleTextReplace.java @@ -0,0 +1,101 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + + +// [START slides_simple_text_replace] +import com.google.api.client.googleapis.json.GoogleJsonError; +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.slides.v1.Slides; +import com.google.api.services.slides.v1.SlidesScopes; +import com.google.api.services.slides.v1.model.BatchUpdatePresentationRequest; +import com.google.api.services.slides.v1.model.BatchUpdatePresentationResponse; +import com.google.api.services.slides.v1.model.DeleteTextRequest; +import com.google.api.services.slides.v1.model.InsertTextRequest; +import com.google.api.services.slides.v1.model.Range; +import com.google.api.services.slides.v1.model.Request; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +/* Class to demonstrate the use of Slides Replace Text API */ +public class SimpleTextReplace { + /** + * Remove existing text in the shape, then insert new text. + * + * @param presentationId - id of the presentation. + * @param shapeId - id of the shape. + * @param replacementText - New replacement text. + * @return response + * @throws IOException - if credentials file not found. + */ + public static BatchUpdatePresentationResponse simpleTextReplace( + String presentationId, String shapeId, String replacementText) throws IOException { + /* Load pre-authorized user credentials from the environment. + TODO(developer) - See https://developers.google.com/identity for + guides on implementing OAuth2 for your application. */ + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Collections.singleton(SlidesScopes.PRESENTATIONS)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + + // Create the slides API client + Slides service = new Slides.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Slides samples") + .build(); + + // Remove existing text in the shape, then insert the new text. + List requests = new ArrayList<>(); + requests.add(new Request() + .setDeleteText(new DeleteTextRequest() + .setObjectId(shapeId) + .setTextRange(new Range() + .setType("ALL")))); + requests.add(new Request() + .setInsertText(new InsertTextRequest() + .setObjectId(shapeId) + .setInsertionIndex(0) + .setText(replacementText))); + + BatchUpdatePresentationResponse response = null; + try { + // Execute the requests. + BatchUpdatePresentationRequest body = + new BatchUpdatePresentationRequest().setRequests(requests); + response = service.presentations().batchUpdate(presentationId, body).execute(); + System.out.println("Replaced text in shape with ID: " + shapeId); + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + GoogleJsonError error = e.getDetails(); + if (error.getCode() == 400) { + System.out.printf("Shape not found with id '%s'.\n", shapeId); + } else if (error.getCode() == 404) { + System.out.printf("Presentation not found with id '%s'.\n", presentationId); + } + else { + throw e; + } + } + return response; + } +} +// [END slides_simple_text_replace] \ No newline at end of file diff --git a/slides/snippets/src/main/java/TextMerging.java b/slides/snippets/src/main/java/TextMerging.java new file mode 100644 index 00000000..c58b8658 --- /dev/null +++ b/slides/snippets/src/main/java/TextMerging.java @@ -0,0 +1,155 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + + +// [START slides_text_merging] +import com.google.api.client.googleapis.json.GoogleJsonError; +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.drive.Drive; +import com.google.api.services.drive.model.File; +import com.google.api.services.sheets.v4.Sheets; +import com.google.api.services.sheets.v4.model.ValueRange; +import com.google.api.services.slides.v1.Slides; +import com.google.api.services.slides.v1.SlidesScopes; +import com.google.api.services.slides.v1.model.BatchUpdatePresentationRequest; +import com.google.api.services.slides.v1.model.BatchUpdatePresentationResponse; +import com.google.api.services.slides.v1.model.ReplaceAllTextRequest; +import com.google.api.services.slides.v1.model.Request; +import com.google.api.services.slides.v1.model.Response; +import com.google.api.services.slides.v1.model.SubstringMatchCriteria; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +/* Class to demonstrate the use of Slides Text Merging API */ +public class TextMerging { + /** + * Changes specified texts with data from spreadsheet. + * + * @param templatePresentationId - id of the presentation. + * @param dataSpreadsheetId - id of the spreadsheet containing data. + * @return merged presentation id + * @throws IOException - if credentials file not found. + */ + public static List textMerging( + String templatePresentationId, String dataSpreadsheetId) throws IOException { + /* Load pre-authorized user credentials from the environment. + TODO(developer) - See https://developers.google.com/identity for + guides on implementing OAuth2 for your application. */ + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Arrays.asList(SlidesScopes.PRESENTATIONS, + SlidesScopes.DRIVE,SlidesScopes.SPREADSHEETS)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + + // Create the slides API client + Slides service = new Slides.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Slides samples") + .build(); + + // Create the drive API client + Drive driveService = new Drive.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Slides samples") + .build(); + + // Create the sheets API client + Sheets sheetsService = new Sheets.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Slides samples") + .build(); + + List responses = new ArrayList<>(5); + // Use the Sheets API to load data, one record per row. + String dataRangeNotation = "Customers!A2:M6"; + ValueRange sheetsResponse = sheetsService.spreadsheets().values() + .get(dataSpreadsheetId, dataRangeNotation).execute(); + List> values = sheetsResponse.getValues(); + + try { + // For each record, create a new merged presentation. + for (List row : values) { + String customerName = row.get(2).toString(); // name in column 3 + String caseDescription = row.get(5).toString(); // case description in column 6 + String totalPortfolio = row.get(11).toString(); // total portfolio in column 12 + + // Duplicate the template presentation using the Drive API. + String copyTitle = customerName + " presentation"; + File content = new File().setName(copyTitle); + File presentationFile = + driveService.files().copy(templatePresentationId, content).execute(); + String presentationId = presentationFile.getId(); + + // Create the text merge (replaceAllText) requests for this presentation. + List requests = new ArrayList<>(); + requests.add(new Request() + .setReplaceAllText(new ReplaceAllTextRequest() + .setContainsText(new SubstringMatchCriteria() + .setText("{{customer-name}}") + .setMatchCase(true)) + .setReplaceText(customerName))); + requests.add(new Request() + .setReplaceAllText(new ReplaceAllTextRequest() + .setContainsText(new SubstringMatchCriteria() + .setText("{{case-description}}") + .setMatchCase(true)) + .setReplaceText(caseDescription))); + requests.add(new Request() + .setReplaceAllText(new ReplaceAllTextRequest() + .setContainsText(new SubstringMatchCriteria() + .setText("{{total-portfolio}}") + .setMatchCase(true)) + .setReplaceText(totalPortfolio))); + + // Execute the requests for this presentation. + BatchUpdatePresentationRequest body = + new BatchUpdatePresentationRequest().setRequests(requests); + BatchUpdatePresentationResponse response = service.presentations().batchUpdate(presentationId, body).execute(); + + // Count total number of replacements made. + int numReplacements = 0; + for (Response resp : response.getReplies()) { + numReplacements += resp.getReplaceAllText().getOccurrencesChanged(); + } + // Prints the merged presentation id and count of replacements. + System.out.println("Created merged presentation for " + + customerName + " with ID: " + presentationId); + System.out.println("Replaced " + numReplacements + " text instances."); + } + }catch (NullPointerException ne) { + System.out.println("Text not found to replace with image."); + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + GoogleJsonError error = e.getDetails(); + if (error.getCode() == 404) { + System.out.printf("Presentation not found with id '%s'.\n", templatePresentationId); + } else { + throw e; + } + } + return responses; + } +} +// [END slides_text_merging] \ No newline at end of file diff --git a/slides/snippets/src/main/java/TextStyleUpdate.java b/slides/snippets/src/main/java/TextStyleUpdate.java new file mode 100644 index 00000000..6b59a81c --- /dev/null +++ b/slides/snippets/src/main/java/TextStyleUpdate.java @@ -0,0 +1,138 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + + +// [START slides_text_style_update] +import com.google.api.client.googleapis.json.GoogleJsonError; +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.slides.v1.Slides; +import com.google.api.services.slides.v1.SlidesScopes; +import com.google.api.services.slides.v1.model.BatchUpdatePresentationRequest; +import com.google.api.services.slides.v1.model.BatchUpdatePresentationResponse; +import com.google.api.services.slides.v1.model.Dimension; +import com.google.api.services.slides.v1.model.Link; +import com.google.api.services.slides.v1.model.OpaqueColor; +import com.google.api.services.slides.v1.model.OptionalColor; +import com.google.api.services.slides.v1.model.Range; +import com.google.api.services.slides.v1.model.Request; +import com.google.api.services.slides.v1.model.RgbColor; +import com.google.api.services.slides.v1.model.TextStyle; +import com.google.api.services.slides.v1.model.UpdateTextStyleRequest; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +/* Class to demonstrate the use of Slide Text Structure and Styling API */ +public class TextStyleUpdate { + /** + * Styles text in the shape. + * + * @param presentationId - id of the presentation. + * @param shapeId - id of the shape. + * @return shape id + * @throws IOException - if credentials file not found. + */ + public static BatchUpdatePresentationResponse textStyleUpdate(String presentationId, String shapeId) + throws IOException { + /* Load pre-authorized user credentials from the environment. + TODO(developer) - See https://developers.google.com/identity for + guides on implementing OAuth2 for your application. */ + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Collections.singleton(SlidesScopes.PRESENTATIONS)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + + // Create the slides API client + Slides service = new Slides.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Slides samples") + .build(); + + // Update the text style so that the first 5 characters are bolded + // and italicized, and the next 5 are displayed in blue 14 pt Times + // New Roman font, and the next five are hyperlinked. + List requests = new ArrayList<>(); + requests.add(new Request() + .setUpdateTextStyle(new UpdateTextStyleRequest() + .setObjectId(shapeId) + .setTextRange(new Range() + .setType("FIXED_RANGE") + .setStartIndex(0) + .setEndIndex(5)) + .setStyle(new TextStyle() + .setBold(true) + .setItalic(true)) + .setFields("bold,italic"))); + requests.add(new Request() + .setUpdateTextStyle(new UpdateTextStyleRequest() + .setObjectId(shapeId) + .setTextRange(new Range() + .setType("FIXED_RANGE") + .setStartIndex(5) + .setEndIndex(10)) + .setStyle(new TextStyle() + .setFontFamily("Times New Roman") + .setFontSize(new Dimension() + .setMagnitude(14.0) + .setUnit("PT")) + .setForegroundColor(new OptionalColor() + .setOpaqueColor(new OpaqueColor() + .setRgbColor(new RgbColor() + .setBlue(1.0F) + .setGreen(0.0F) + .setRed(0.0F))))) + .setFields("foregroundColor,fontFamily,fontSize"))); + requests.add(new Request() + .setUpdateTextStyle(new UpdateTextStyleRequest() + .setObjectId(shapeId) + .setTextRange(new Range() + .setType("FIXED_RANGE") + .setStartIndex(10) + .setEndIndex(15)) + .setStyle(new TextStyle() + .setLink(new Link() + .setUrl("www.example.com"))) + .setFields("link"))); + + BatchUpdatePresentationResponse response = null; + try { + // Execute the requests. + BatchUpdatePresentationRequest body = + new BatchUpdatePresentationRequest().setRequests(requests); + response = service.presentations().batchUpdate(presentationId, body).execute(); + System.out.println("Updated text style for shape with ID: " + shapeId); + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + GoogleJsonError error = e.getDetails(); + if (error.getCode() == 400) { + System.out.printf("Shape not found with id '%s'.\n", shapeId); + } else if (error.getCode() == 404) { + System.out.printf("Presentation not found with id '%s'.\n", presentationId); + } + else { + throw e; + } + } + return response; + } +} +// [END slides_text_style_update] \ No newline at end of file From 40d1826643bfec2adc2531fa176ac69960b92c19 Mon Sep 17 00:00:00 2001 From: Rajesh Mudaliyar Date: Wed, 16 Mar 2022 09:06:24 -0700 Subject: [PATCH 078/262] Drive-v3: file snippets patch-4 (#211) * git-on-borg files of gmail-api-snippets * Update build.gradle test12 * Update build.gradle * Drive-v3: file snippets patch-4 Co-authored-by: sanjuktaghosh7 Co-authored-by: Manvendra-P-Singh --- .../src/main/java/CreateShortcut.java | 67 ++++++++++++++++ .../drive_v3/src/main/java/DownloadFile.java | 69 +++++++++++++++++ .../drive_v3/src/main/java/ExportPdf.java | 68 ++++++++++++++++ .../drive_v3/src/main/java/TouchFile.java | 77 +++++++++++++++++++ 4 files changed, 281 insertions(+) create mode 100644 drive/snippets/drive_v3/src/main/java/CreateShortcut.java create mode 100644 drive/snippets/drive_v3/src/main/java/DownloadFile.java create mode 100644 drive/snippets/drive_v3/src/main/java/ExportPdf.java create mode 100644 drive/snippets/drive_v3/src/main/java/TouchFile.java diff --git a/drive/snippets/drive_v3/src/main/java/CreateShortcut.java b/drive/snippets/drive_v3/src/main/java/CreateShortcut.java new file mode 100644 index 00000000..98b35603 --- /dev/null +++ b/drive/snippets/drive_v3/src/main/java/CreateShortcut.java @@ -0,0 +1,67 @@ +// Copyright 2018 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// [START drive_create_shortcut] + +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.drive.Drive; +import com.google.api.services.drive.DriveScopes; +import com.google.api.services.drive.model.File; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; + +import java.io.IOException; +import java.util.Arrays; + +/* Class to demonstrate Drive's create shortcut use-case */ +public class CreateShortcut { + + /** + * Creates shortcut for file. + * @throws IOException if service account credentials file not found. + */ + private static void createShortcut() throws IOException{ + /* Load pre-authorized user credentials from the environment. + TODO(developer) - See https://developers.google.com/identity for + guides on implementing OAuth2 for your application.*/ + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault().createScoped(Arrays.asList(DriveScopes.DRIVE_FILE)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + // Build a new authorized API client service. + Drive service = new Drive.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Drive samples") + .build(); + try { + // Create Shortcut for file. + File fileMetadata = new File(); + fileMetadata.setName("Project plan"); + fileMetadata.setMimeType("application/vnd.google-apps.drive-sdk"); + + File file = service.files().create(fileMetadata) + .setFields("id") + .execute(); + System.out.println("File ID: " + file.getId()); + }catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + System.err.println("Unable to create shortcut: " + e.getDetails()); + throw e; + } + } +} +// [END drive_create_shortcut] diff --git a/drive/snippets/drive_v3/src/main/java/DownloadFile.java b/drive/snippets/drive_v3/src/main/java/DownloadFile.java new file mode 100644 index 00000000..8cf14a80 --- /dev/null +++ b/drive/snippets/drive_v3/src/main/java/DownloadFile.java @@ -0,0 +1,69 @@ +/* Copyright 2022 Google LLC + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License.*/ + +// [START drive_download_file] + +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.drive.Drive; +import com.google.api.services.drive.DriveScopes; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.OutputStream; +import java.util.Arrays; + +/* Class to demonstrate use-case of drive's download file. */ +public class DownloadFile { + + /** + * Download a Document file in PDF format. + * @param realFileId file ID of any workspace document format file. + * @return byte array stream if successful, {@code null} otherwise. + * @throws IOException if service account credentials file not found. + */ + private static ByteArrayOutputStream downloadFile(String realFileId) throws IOException{ + /* Load pre-authorized user credentials from the environment. + TODO(developer) - See https://developers.google.com/identity for + guides on implementing OAuth2 for your application.*/ + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault().createScoped(Arrays.asList(DriveScopes.DRIVE_FILE)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + + // Build a new authorized API client service. + Drive service = new Drive.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Drive samples") + .build(); + + try { + OutputStream outputStream = new ByteArrayOutputStream(); + + service.files().get(realFileId) + .executeMediaAndDownloadTo(outputStream); + + return (ByteArrayOutputStream) outputStream; + }catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + System.err.println("Unable to move file: " + e.getDetails()); + throw e; + } + } +} +// [END drive_download_file] diff --git a/drive/snippets/drive_v3/src/main/java/ExportPdf.java b/drive/snippets/drive_v3/src/main/java/ExportPdf.java new file mode 100644 index 00000000..fbc5f047 --- /dev/null +++ b/drive/snippets/drive_v3/src/main/java/ExportPdf.java @@ -0,0 +1,68 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// [START drive_export_pdf] + +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.drive.Drive; +import com.google.api.services.drive.DriveScopes; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.OutputStream; +import java.util.Arrays; + +/* Class to demonstrate use-case of drive's export pdf. */ +public class ExportPdf { + + /** + * Download a Document file in PDF format. + * @param realFileId file ID of any workspace document format file. + * @return byte array stream if successful, {@code null} otherwise. + * @throws IOException if service account credentials file not found. + */ + private static ByteArrayOutputStream exportPdf(String realFileId) throws IOException{ + // Load pre-authorized user credentials from the environment. + // TODO(developer) - See https://developers.google.com/identity for + // guides on implementing OAuth2 for your application. + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault().createScoped(Arrays.asList(DriveScopes.DRIVE_FILE)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + + // Build a new authorized API client service. + Drive service = new Drive.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Drive samples") + .build(); + + OutputStream outputStream = new ByteArrayOutputStream(); + try { + service.files().export(realFileId, "application/pdf") + .executeMediaAndDownloadTo(outputStream); + + return (ByteArrayOutputStream) outputStream; + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + System.err.println("Unable to export file: " + e.getDetails()); + throw e; + } + } +} +// [END drive_export_pdf] diff --git a/drive/snippets/drive_v3/src/main/java/TouchFile.java b/drive/snippets/drive_v3/src/main/java/TouchFile.java new file mode 100644 index 00000000..f243e16a --- /dev/null +++ b/drive/snippets/drive_v3/src/main/java/TouchFile.java @@ -0,0 +1,77 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// [START drive_touch_file] + +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.client.util.DateTime; +import com.google.api.services.drive.Drive; +import com.google.api.services.drive.DriveScopes; +import com.google.api.services.drive.model.File; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; + +import java.io.IOException; +import java.util.Arrays; + +/* Class to demonstrate use-case for touch file */ +public class TouchFile { + + + /** + * @param realFileId Id of file to be modified. + * @param realTimestamp Timestamp in miliseconds. + * @return long file's latest modification date value. + * @throws IOException if service account credentials file not found. + * */ + private static long touchFile(String realFileId, long realTimestamp) + throws IOException { + /*Load pre-authorized user credentials from the environment. + TODO(developer) - See https://developers.google.com/identity for + guides on implementing OAuth2 for your application.*/ + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault().createScoped(Arrays.asList(DriveScopes.DRIVE_FILE)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + + // Build a new authorized API client service. + Drive service = new Drive.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Drive samples") + .build(); + String fileId = "1sTWaJ_j7PkjzaBWtNc3IzovK5hQf21FbOw9yLeeLPNQ"; + File fileMetadata = new File(); + fileMetadata.setModifiedTime(new DateTime(System.currentTimeMillis())); + + fileId = realFileId; + fileMetadata.setModifiedTime(new DateTime(realTimestamp)); + + try { + File file = service.files().update(fileId, fileMetadata) + .setFields("id, modifiedDate") + .execute(); + System.out.println("Modified time: " + file.getModifiedTime()); + return file.getModifiedTime().getValue(); + }catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + System.err.println("Unable to move file: " + e.getDetails()); + throw e; + } + } + +} +// [END drive_touch_file] From d3dc7de93bad4d59ee6eead6054d4ad305ffc0e8 Mon Sep 17 00:00:00 2001 From: Rajesh Mudaliyar Date: Wed, 16 Mar 2022 09:06:47 -0700 Subject: [PATCH 079/262] Drive v3 file snippets patch5 (#212) * git-on-borg files of gmail-api-snippets * Update build.gradle test12 * Update build.gradle * Drive-v3: file snippets patch-5 Co-authored-by: sanjuktaghosh7 Co-authored-by: Manvendra-P-Singh --- .../drive_v3/src/main/java/SearchFile.java | 78 ++++++++++++ .../drive_v3/src/main/java/ShareFile.java | 115 ++++++++++++++++++ 2 files changed, 193 insertions(+) create mode 100644 drive/snippets/drive_v3/src/main/java/SearchFile.java create mode 100644 drive/snippets/drive_v3/src/main/java/ShareFile.java diff --git a/drive/snippets/drive_v3/src/main/java/SearchFile.java b/drive/snippets/drive_v3/src/main/java/SearchFile.java new file mode 100644 index 00000000..1d68ccdd --- /dev/null +++ b/drive/snippets/drive_v3/src/main/java/SearchFile.java @@ -0,0 +1,78 @@ +/* Copyright 2022 Google LLC + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License.*/ + +// [START drive_search_files] + +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.drive.Drive; +import com.google.api.services.drive.DriveScopes; +import com.google.api.services.drive.model.File; +import com.google.api.services.drive.model.FileList; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +/* Class to demonstrate use-case of search files. */ +public class SearchFile { + + /** + * Search for specific set of files. + * @return search result list. + * @throws IOException if service account credentials file not found. + */ + private static List searchFile() throws IOException{ + /*Load pre-authorized user credentials from the environment. + TODO(developer) - See https://developers.google.com/identity for + guides on implementing OAuth2 for your application.*/ + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault().createScoped(Arrays.asList(DriveScopes.DRIVE_FILE)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + + // Build a new authorized API client service. + Drive service = new Drive.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Drive samples") + .build(); + + List files = new ArrayList(); + + String pageToken = null; + do { + FileList result = service.files().list() + .setQ("mimeType='image/jpeg'") + .setSpaces("drive") + .setFields("nextPageToken, items(id, title)") + .setPageToken(pageToken) + .execute(); + for (File file : result.getFiles()) { + System.out.printf("Found file: %s (%s)\n", + file.getName(), file.getId()); + } + + files.addAll(result.getFiles()); + + pageToken = result.getNextPageToken(); + } while (pageToken != null); + + return files; + } +} +// [END drive_search_files] diff --git a/drive/snippets/drive_v3/src/main/java/ShareFile.java b/drive/snippets/drive_v3/src/main/java/ShareFile.java new file mode 100644 index 00000000..cbc1bb51 --- /dev/null +++ b/drive/snippets/drive_v3/src/main/java/ShareFile.java @@ -0,0 +1,115 @@ +/* Copyright 2022 Google LLC + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License.*/ + +// [START drive_share_file] + +import com.google.api.client.googleapis.batch.BatchRequest; +import com.google.api.client.googleapis.batch.json.JsonBatchCallback; +import com.google.api.client.googleapis.json.GoogleJsonError; +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.HttpHeaders; +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.drive.Drive; +import com.google.api.services.drive.DriveScopes; +import com.google.api.services.drive.model.Permission; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +/* Class to demonstrate use-case of modify permissions. */ +public class ShareFile { + + /** + * Batch permission modification. + * realFileId file Id. + * realUser User Id. + * realDomain Domain of the user ID. + * @return list of modified permissions if successful, {@code null} otherwise. + * @throws IOException if service account credentials file not found. + */ + private static List shareFile(String realFileId, String realUser, String realDomain) throws IOException{ + /* Load pre-authorized user credentials from the environment. + TODO(developer) - See https://developers.google.com/identity for + guides on implementing OAuth2 for your application.application*/ + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault().createScoped(Arrays.asList(DriveScopes.DRIVE_FILE)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + + // Build a new authorized API client service. + Drive service = new Drive.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Drive samples") + .build(); + + final List ids = new ArrayList(); + + + JsonBatchCallback callback = new JsonBatchCallback() { + @Override + public void onFailure(GoogleJsonError e, + HttpHeaders responseHeaders) + throws IOException { + // Handle error + System.err.println(e.getMessage()); + } + + @Override + public void onSuccess(Permission permission, + HttpHeaders responseHeaders) + throws IOException { + System.out.println("Permission ID: " + permission.getId()); + + ids.add(permission.getId()); + + } + }; + BatchRequest batch = service.batch(); + Permission userPermission = new Permission() + .setType("user") + .setRole("writer"); + + userPermission.setEmailAddress(realUser); + try { + service.permissions().create(realFileId, userPermission) + .setFields("id") + .queue(batch, callback); + + Permission domainPermission = new Permission() + .setType("domain") + .setRole("reader"); + + domainPermission.setDomain(realDomain); + + service.permissions().create(realFileId, domainPermission) + .setFields("id") + .queue(batch, callback); + + batch.execute(); + + return ids; + }catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + System.err.println("Unable to modify permission: " + e.getDetails()); + throw e; + } + } +} +// [END drive_share_file] From cb2bc169d90926b88f96c6430475fd39c1fa611b Mon Sep 17 00:00:00 2001 From: Rajesh Mudaliyar Date: Wed, 16 Mar 2022 09:07:11 -0700 Subject: [PATCH 080/262] Sheets snippets1 (#213) * git-on-borg files of gmail-api-snippets * Update build.gradle test12 * Update build.gradle * Spreadsheet snippets Co-authored-by: sanjuktaghosh7 Co-authored-by: Manvendra-P-Singh --- .../snippets/src/main/java/AppendValues.java | 87 +++++++++++ .../src/main/java/BatchGetValues.java | 78 ++++++++++ .../src/main/java/BatchUpdateValues.java | 92 +++++++++++ sheets/snippets/src/main/java/GetValues.java | 75 +++++++++ .../snippets/src/main/java/PivotTables.java | 144 ++++++++++++++++++ .../snippets/src/main/java/UpdateValues.java | 86 +++++++++++ 6 files changed, 562 insertions(+) create mode 100644 sheets/snippets/src/main/java/AppendValues.java create mode 100644 sheets/snippets/src/main/java/BatchGetValues.java create mode 100644 sheets/snippets/src/main/java/BatchUpdateValues.java create mode 100644 sheets/snippets/src/main/java/GetValues.java create mode 100644 sheets/snippets/src/main/java/PivotTables.java create mode 100644 sheets/snippets/src/main/java/UpdateValues.java diff --git a/sheets/snippets/src/main/java/AppendValues.java b/sheets/snippets/src/main/java/AppendValues.java new file mode 100644 index 00000000..c5d023a0 --- /dev/null +++ b/sheets/snippets/src/main/java/AppendValues.java @@ -0,0 +1,87 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + + +// [START sheets_append_values] +import com.google.api.client.googleapis.json.GoogleJsonError; +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.sheets.v4.Sheets; +import com.google.api.services.sheets.v4.SheetsScopes; +import com.google.api.services.sheets.v4.model.AppendValuesResponse; +import com.google.api.services.sheets.v4.model.ValueRange; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; + +import java.io.IOException; +import java.util.Collections; +import java.util.List; + +/* Class to demonstrate the use of Spreadsheet Append Values API */ +public class AppendValues { + /** + * Appends values to a spreadsheet. + * + * @param spreadsheetId - Id of the spreadsheet. + * @param range - Range of cells of the spreadsheet. + * @param valueInputOption - Determines how input data should be interpreted. + * @param values - list of rows of values to input. + * @return spreadsheet with appended values + * @throws IOException - if credentials file not found. + */ + public static AppendValuesResponse appendValues(String spreadsheetId, + String range, + String valueInputOption, + List> values) + throws IOException { + /* Load pre-authorized user credentials from the environment. + TODO(developer) - See https://developers.google.com/identity for + guides on implementing OAuth2 for your application. */ + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Collections.singleton(SheetsScopes.SPREADSHEETS)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + + // Create the sheets API client + Sheets service = new Sheets.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Sheets samples") + .build(); + + AppendValuesResponse result = null; + try { + // Append values to the specified range. + ValueRange body = new ValueRange() + .setValues(values); + result = service.spreadsheets().values().append(spreadsheetId, range, body) + .setValueInputOption(valueInputOption) + .execute(); + // Prints the spreadsheet with appended values. + System.out.printf("%d cells appended.", result.getUpdates().getUpdatedCells()); + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + GoogleJsonError error = e.getDetails(); + if (error.getCode() == 404) { + System.out.printf("Spreadsheet not found with id '%s'.\n",spreadsheetId); + } else { + throw e; + } + } + return result; + } +} +// [END sheets_append_values] \ No newline at end of file diff --git a/sheets/snippets/src/main/java/BatchGetValues.java b/sheets/snippets/src/main/java/BatchGetValues.java new file mode 100644 index 00000000..21da22d9 --- /dev/null +++ b/sheets/snippets/src/main/java/BatchGetValues.java @@ -0,0 +1,78 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + + +// [START sheets_batch_get_values] +import com.google.api.client.googleapis.json.GoogleJsonError; +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.sheets.v4.Sheets; +import com.google.api.services.sheets.v4.SheetsScopes; +import com.google.api.services.sheets.v4.model.BatchGetValuesResponse; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; + +import java.io.IOException; +import java.util.Collections; +import java.util.List; + +/* Class to demonstrate the use of Spreadsheet Batch Get Values API */ +public class BatchGetValues { + /** + * Returns one or more ranges of values from a spreadsheet. + * + * @param spreadsheetId - Id of the spreadsheet. + * @param ranges - Range of cells of the spreadsheet. + * @return Values in the range + * @throws IOException - if credentials file not found. + */ + public static BatchGetValuesResponse batchGetValues(String spreadsheetId, + List ranges) + throws IOException { + /* Load pre-authorized user credentials from the environment. + TODO(developer) - See https://developers.google.com/identity for + guides on implementing OAuth2 for your application. */ + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Collections.singleton(SheetsScopes.SPREADSHEETS)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + + // Create the sheets API client + Sheets service = new Sheets.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Sheets samples") + .build(); + + BatchGetValuesResponse result = null; + try { + // Gets the values of the cells in the specified range. + result = service.spreadsheets().values().batchGet(spreadsheetId) + .setRanges(ranges).execute() ; + System.out.printf("%d ranges retrieved.", result.getValueRanges().size()); + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + GoogleJsonError error = e.getDetails(); + if (error.getCode() == 404) { + System.out.printf("Spreadsheet not found with id '%s'.\n",spreadsheetId); + } else { + throw e; + } + } + return result; + } +} +// [END sheets_batch_get_values] \ No newline at end of file diff --git a/sheets/snippets/src/main/java/BatchUpdateValues.java b/sheets/snippets/src/main/java/BatchUpdateValues.java new file mode 100644 index 00000000..a2a1759c --- /dev/null +++ b/sheets/snippets/src/main/java/BatchUpdateValues.java @@ -0,0 +1,92 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + + +// [START sheets_batch_update_values] +import com.google.api.client.googleapis.json.GoogleJsonError; +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.sheets.v4.Sheets; +import com.google.api.services.sheets.v4.SheetsScopes; +import com.google.api.services.sheets.v4.model.BatchUpdateValuesRequest; +import com.google.api.services.sheets.v4.model.BatchUpdateValuesResponse; +import com.google.api.services.sheets.v4.model.ValueRange; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +/* Class to demonstrate the use of Spreadsheet Batch Update Values API */ +public class BatchUpdateValues { + /** + * Set values in one or more ranges of spreadsheet. + * + * @param spreadsheetId - Id of the spreadsheet. + * @param range - Range of cells of the spreadsheet. + * @param valueInputOption - Determines how input data should be interpreted. + * @param values - list of rows of values to input. + * @return spreadsheet with updated values + * @throws IOException - if credentials file not found. + */ + public static BatchUpdateValuesResponse batchUpdateValues(String spreadsheetId, + String range, + String valueInputOption, + List> values) + throws IOException { + /* Load pre-authorized user credentials from the environment. + TODO(developer) - See https://developers.google.com/identity for + guides on implementing OAuth2 for your application. */ + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Collections.singleton(SheetsScopes.SPREADSHEETS)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + + // Create the sheets API client + Sheets service = new Sheets.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Sheets samples") + .build(); + + List data = new ArrayList<>(); + data.add(new ValueRange() + .setRange(range) + .setValues(values)); + + BatchUpdateValuesResponse result = null; + try { + // Updates the values in the specified range. + BatchUpdateValuesRequest body = new BatchUpdateValuesRequest() + .setValueInputOption(valueInputOption) + .setData(data); + result = service.spreadsheets().values().batchUpdate(spreadsheetId, body).execute(); + System.out.printf("%d cells updated.", result.getTotalUpdatedCells()); + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + GoogleJsonError error = e.getDetails(); + if (error.getCode() == 404) { + System.out.printf("Spreadsheet not found with id '%s'.\n",spreadsheetId); + } else { + throw e; + } + } + return result; + } +} +// [END sheets_batch_update_values] \ No newline at end of file diff --git a/sheets/snippets/src/main/java/GetValues.java b/sheets/snippets/src/main/java/GetValues.java new file mode 100644 index 00000000..620e0577 --- /dev/null +++ b/sheets/snippets/src/main/java/GetValues.java @@ -0,0 +1,75 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + + +// [START sheets_get_values] +import com.google.api.client.googleapis.json.GoogleJsonError; +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.sheets.v4.Sheets; +import com.google.api.services.sheets.v4.SheetsScopes; +import com.google.api.services.sheets.v4.model.ValueRange; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; + +import java.io.IOException; +import java.util.Collections; + +/* Class to demonstrate the use of Spreadsheet Get Values API */ +public class GetValues { + /** + * Returns a range of values from a spreadsheet. + * + * @param spreadsheetId - Id of the spreadsheet. + * @param range - Range of cells of the spreadsheet. + * @return Values in the range + * @throws IOException - if credentials file not found. + */ + public static ValueRange getValues(String spreadsheetId, String range) throws IOException { + /* Load pre-authorized user credentials from the environment. + TODO(developer) - See https://developers.google.com/identity for + guides on implementing OAuth2 for your application. */ + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Collections.singleton(SheetsScopes.SPREADSHEETS)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + + // Create the sheets API client + Sheets service = new Sheets.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Sheets samples") + .build(); + + ValueRange result = null; + try { + // Gets the values of the cells in the specified range. + result = service.spreadsheets().values().get(spreadsheetId, range).execute(); + int numRows = result.getValues() != null ? result.getValues().size() : 0; + System.out.printf("%d rows retrieved.", numRows); + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + GoogleJsonError error = e.getDetails(); + if (error.getCode() == 404) { + System.out.printf("Spreadsheet not found with id '%s'.\n",spreadsheetId); + } else { + throw e; + } + } + return result; + } +} +// [END sheets_get_values] diff --git a/sheets/snippets/src/main/java/PivotTables.java b/sheets/snippets/src/main/java/PivotTables.java new file mode 100644 index 00000000..a6de919b --- /dev/null +++ b/sheets/snippets/src/main/java/PivotTables.java @@ -0,0 +1,144 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + + +// [START sheets_pivot_tables] +import com.google.api.client.googleapis.json.GoogleJsonError; +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.sheets.v4.Sheets; +import com.google.api.services.sheets.v4.SheetsScopes; +import com.google.api.services.sheets.v4.model.AddSheetRequest; +import com.google.api.services.sheets.v4.model.BatchUpdateSpreadsheetRequest; +import com.google.api.services.sheets.v4.model.BatchUpdateSpreadsheetResponse; +import com.google.api.services.sheets.v4.model.CellData; +import com.google.api.services.sheets.v4.model.GridCoordinate; +import com.google.api.services.sheets.v4.model.GridRange; +import com.google.api.services.sheets.v4.model.PivotGroup; +import com.google.api.services.sheets.v4.model.PivotTable; +import com.google.api.services.sheets.v4.model.PivotValue; +import com.google.api.services.sheets.v4.model.Request; +import com.google.api.services.sheets.v4.model.RowData; +import com.google.api.services.sheets.v4.model.UpdateCellsRequest; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; +import com.google.common.collect.Lists; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +/* Class to demonstrate the use of Spreadsheet Create Pivot Tables API */ +public class PivotTables { + /** + * Create pivot table. + * + * @param spreadsheetId - Id of the spreadsheet. + * @return pivot table's spreadsheet + * @throws IOException - if credentials file not found. + */ + public static BatchUpdateSpreadsheetResponse pivotTables(String spreadsheetId) throws IOException { + /* Load pre-authorized user credentials from the environment. + TODO(developer) - See https://developers.google.com/identity for + guides on implementing OAuth2 for your application. */ + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Collections.singleton(SheetsScopes.SPREADSHEETS)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + + // Create the sheets API client + Sheets service = new Sheets.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Sheets samples") + .build(); + + // Create two sheets for our pivot table. + List sheetsRequests = new ArrayList<>(); + BatchUpdateSpreadsheetResponse result = null; + try { + sheetsRequests.add(new Request().setAddSheet(new AddSheetRequest())); + sheetsRequests.add(new Request().setAddSheet(new AddSheetRequest())); + + BatchUpdateSpreadsheetRequest createSheetsBody = new BatchUpdateSpreadsheetRequest() + .setRequests(sheetsRequests); + BatchUpdateSpreadsheetResponse createSheetsResponse = service.spreadsheets() + .batchUpdate(spreadsheetId, createSheetsBody).execute(); + int sourceSheetId = createSheetsResponse.getReplies().get(0).getAddSheet().getProperties() + .getSheetId(); + int targetSheetId = createSheetsResponse.getReplies().get(1).getAddSheet().getProperties() + .getSheetId(); + + PivotTable pivotTable = new PivotTable() + .setSource( + new GridRange() + .setSheetId(sourceSheetId) + .setStartRowIndex(0) + .setStartColumnIndex(0) + .setEndRowIndex(20) + .setEndColumnIndex(7) + ) + .setRows(Collections.singletonList( + new PivotGroup() + .setSourceColumnOffset(1) + .setShowTotals(true) + .setSortOrder("ASCENDING") + )) + .setColumns(Collections.singletonList( + new PivotGroup() + .setSourceColumnOffset(4) + .setShowTotals(true) + .setSortOrder("ASCENDING") + )) + .setValues(Collections.singletonList( + new PivotValue() + .setSummarizeFunction("COUNTA") + .setSourceColumnOffset(4) + )); + List requests = Lists.newArrayList(); + Request updateCellsRequest = new Request().setUpdateCells(new UpdateCellsRequest() + .setFields("*") + .setRows(Collections.singletonList( + new RowData().setValues( + Collections.singletonList( + new CellData().setPivotTable(pivotTable)) + ) + )) + .setStart(new GridCoordinate() + .setSheetId(targetSheetId) + .setRowIndex(0) + .setColumnIndex(0) + + )); + + requests.add(updateCellsRequest); + BatchUpdateSpreadsheetRequest updateCellsBody = new BatchUpdateSpreadsheetRequest() + .setRequests(requests); + result = service.spreadsheets().batchUpdate(spreadsheetId, updateCellsBody).execute(); + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + GoogleJsonError error = e.getDetails(); + if (error.getCode() == 404) { + System.out.printf("Spreadsheet not found with id '%s'.\n",spreadsheetId); + } else { + throw e; + } + } + return result; + } +} +// [END sheets_pivot_tables] \ No newline at end of file diff --git a/sheets/snippets/src/main/java/UpdateValues.java b/sheets/snippets/src/main/java/UpdateValues.java new file mode 100644 index 00000000..9183f752 --- /dev/null +++ b/sheets/snippets/src/main/java/UpdateValues.java @@ -0,0 +1,86 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + + +// [START sheets_update_values] +import com.google.api.client.googleapis.json.GoogleJsonError; +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.sheets.v4.Sheets; +import com.google.api.services.sheets.v4.SheetsScopes; +import com.google.api.services.sheets.v4.model.UpdateValuesResponse; +import com.google.api.services.sheets.v4.model.ValueRange; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; + +import java.io.IOException; +import java.util.Collections; +import java.util.List; + +/* Class to demonstrate the use of Spreadsheet Update Values API */ +public class UpdateValues { + /** + * Sets values in a range of a spreadsheet. + * + * @param spreadsheetId - Id of the spreadsheet. + * @param range - Range of cells of the spreadsheet. + * @param valueInputOption - Determines how input data should be interpreted. + * @param values - List of rows of values to input. + * @return spreadsheet with updated values + * @throws IOException - if credentials file not found. + */ + public static UpdateValuesResponse updateValues(String spreadsheetId, + String range, + String valueInputOption, + List> values) + throws IOException { + /* Load pre-authorized user credentials from the environment. + TODO(developer) - See https://developers.google.com/identity for + guides on implementing OAuth2 for your application. */ + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Collections.singleton(SheetsScopes.SPREADSHEETS)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + + // Create the sheets API client + Sheets service = new Sheets.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Sheets samples") + .build(); + + UpdateValuesResponse result =null; + try { + // Updates the values in the specified range. + ValueRange body = new ValueRange() + .setValues(values); + result = service.spreadsheets().values().update(spreadsheetId, range, body) + .setValueInputOption(valueInputOption) + .execute(); + System.out.printf("%d cells updated.", result.getUpdatedCells()); + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + GoogleJsonError error = e.getDetails(); + if (error.getCode() == 404) { + System.out.printf("Spreadsheet not found with id '%s'.\n",spreadsheetId); + } else { + throw e; + } + } + return result; + } +} +// [END sheets_update_values] \ No newline at end of file From 7e5ec71290996fc43258e69899f5e70568ef6342 Mon Sep 17 00:00:00 2001 From: Rajesh Mudaliyar Date: Fri, 25 Mar 2022 11:23:57 -0700 Subject: [PATCH 081/262] Gmail snippet (#214) * git-on-borg files of gmail-api-snippets * Update build.gradle test12 * Update build.gradle * gmail snippets Co-authored-by: sanjuktaghosh7 Co-authored-by: Manvendra-P-Singh --- .../src/main/java/InsertCertFromCsv.java | 59 ++++++++ .../src/main/java/InsertSmimeInfo.java | 79 ++++++++++ .../src/main/java/UpdateSmimeCerts.java | 141 ++++++++++++++++++ .../src/main/java/UpdateSmimeFromCsv.java | 59 ++++++++ 4 files changed, 338 insertions(+) create mode 100644 gmail/snippets/src/main/java/InsertCertFromCsv.java create mode 100644 gmail/snippets/src/main/java/InsertSmimeInfo.java create mode 100644 gmail/snippets/src/main/java/UpdateSmimeCerts.java create mode 100644 gmail/snippets/src/main/java/UpdateSmimeFromCsv.java diff --git a/gmail/snippets/src/main/java/InsertCertFromCsv.java b/gmail/snippets/src/main/java/InsertCertFromCsv.java new file mode 100644 index 00000000..d31607e0 --- /dev/null +++ b/gmail/snippets/src/main/java/InsertCertFromCsv.java @@ -0,0 +1,59 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + + +// [START gmail_insert_cert_from_csv] +import com.google.api.services.gmail.model.SmimeInfo; +import org.apache.commons.csv.CSVFormat; +import org.apache.commons.csv.CSVParser; +import org.apache.commons.csv.CSVRecord; + +import java.io.File; + +/* Class to demonstrate the use of Gmail Insert Certificate from CSV File */ +public class InsertCertFromCsv { + /** + * Upload S/MIME certificates based on the contents of a CSV file. + * + *

Each row of the CSV file should contain a user ID, path to the certificate, and the + * certificate password. + * + * @param csvFilename Name of the CSV file. + */ + public static void insertCertFromCsv(String csvFilename) { + try { + File csvFile = new File(csvFilename); + CSVParser parser = + CSVParser.parse(csvFile, java.nio.charset.StandardCharsets.UTF_8, CSVFormat.DEFAULT); + for (CSVRecord record : parser) { + String userId = record.get(0); + String certFilename = record.get(1); + String certPassword = record.get(2); + SmimeInfo smimeInfo = CreateSmimeInfo.createSmimeInfo(certFilename, + certPassword); + if (smimeInfo != null) { + InsertSmimeInfo.insertSmimeInfo(certFilename, + certPassword, + userId, + userId); + } else { + System.err.printf("Unable to read certificate file for userId: %s\n", userId); + } + } + } catch (Exception e) { + System.err.printf("An error occured while reading the CSV file: %s", e); + } + } +} +// [END gmail_insert_cert_from_csv] \ No newline at end of file diff --git a/gmail/snippets/src/main/java/InsertSmimeInfo.java b/gmail/snippets/src/main/java/InsertSmimeInfo.java new file mode 100644 index 00000000..1f598ef2 --- /dev/null +++ b/gmail/snippets/src/main/java/InsertSmimeInfo.java @@ -0,0 +1,79 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + + +// [START gmail_insert_smime_info] +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.gmail.Gmail; +import com.google.api.services.gmail.GmailScopes; +import com.google.api.services.gmail.model.SmimeInfo; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; + +import java.io.IOException; +import java.util.Collections; + +/* Class to demonstrate the use of Gmail Insert Smime Certificate API*/ +public class InsertSmimeInfo { + /** + * Upload an S/MIME certificate for the user. + * + * @param filename Name of the file containing the S/MIME certificate. + * @param password Password for the certificate file, or null if the file + * is not password-protected. + * @param userId User's email address. + * @param sendAsEmail The "send as" email address, or null if it should be the same as userId. + * @return An SmimeInfo object with details about the uploaded certificate. + */ + public static SmimeInfo insertSmimeInfo(String filename, + String password, + String userId, + String sendAsEmail) + throws IOException { + /* Load pre-authorized user credentials from the environment. + TODO(developer) - See https://developers.google.com/identity for + guides on implementing OAuth2 for your application. */ + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Collections.singletonList(GmailScopes.GMAIL_SETTINGS_SHARING)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + + // Create the gmail API client + Gmail service = new Gmail.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Gmail samples") + .build(); + + if (sendAsEmail == null) { + sendAsEmail = userId; + } + + try { + SmimeInfo smimeInfo = CreateSmimeInfo.createSmimeInfo(filename, password); + SmimeInfo results = service.users().settings().sendAs().smimeInfo() + .insert(userId, sendAsEmail, smimeInfo) + .execute(); + System.out.printf("Inserted certificate, id: %s\n", results.getId()); + return results; + } catch (IOException e) { + System.err.printf("An error occured: %s", e); + } + + return null; + } +} +// [END gmail_insert_smime_info] \ No newline at end of file diff --git a/gmail/snippets/src/main/java/UpdateSmimeCerts.java b/gmail/snippets/src/main/java/UpdateSmimeCerts.java new file mode 100644 index 00000000..2e014a68 --- /dev/null +++ b/gmail/snippets/src/main/java/UpdateSmimeCerts.java @@ -0,0 +1,141 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + + +// [START gmail_update_smime_certs] +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.gmail.Gmail; +import com.google.api.services.gmail.GmailScopes; +import com.google.api.services.gmail.model.ListSmimeInfoResponse; +import com.google.api.services.gmail.model.SmimeInfo; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; + +import java.io.IOException; +import java.time.Instant; +import java.time.LocalDateTime; +import java.time.ZoneId; +import java.util.Collections; + +/* Class to demonstrate the use of Gmail Update Smime Certificate API*/ +public class UpdateSmimeCerts { + /** + * Update S/MIME certificates for the user. + * + *

First performs a lookup of all certificates for a user. If there are no certificates, or + * they all expire before the specified date/time, uploads the certificate in the specified file. + * If the default certificate is expired or there was no default set, chooses the certificate with + * the expiration furthest into the future and sets it as default. + * + * @param userId User's email address. + * @param sendAsEmail The "send as" email address, or None if it should be the same as user_id. + * @param certFilename Name of the file containing the S/MIME certificate. + * @param certPassword Password for the certificate file, or None if the file is not + * password-protected. + * @param expireTime DateTime object against which the certificate expiration is compared. If + * None, uses the current time. @ returns: The ID of the default certificate. + * @return The ID of the default certifcate. + */ + public static String updateSmimeCerts(String userId, + String sendAsEmail, + String certFilename, + String certPassword, + LocalDateTime expireTime) + throws IOException { + /* Load pre-authorized user credentials from the environment. + TODO(developer) - See https://developers.google.com/identity for + guides on implementing OAuth2 for your application. */ + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Collections.singletonList(GmailScopes.GMAIL_SETTINGS_SHARING)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + + // Create the gmail API client + Gmail service = new Gmail.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Gmail samples") + .build(); + + if (sendAsEmail == null) { + sendAsEmail = userId; + } + + ListSmimeInfoResponse listResults; + try { + listResults = service.users().settings().sendAs().smimeInfo().list(userId, sendAsEmail).execute(); + } catch (IOException e) { + System.err.printf("An error occurred during list: %s\n", e); + return null; + } + + String defaultCertId = null; + String bestCertId = null; + LocalDateTime bestCertExpire = LocalDateTime.MIN; + + if (expireTime == null) { + expireTime = LocalDateTime.now(); + } + if (listResults != null && listResults.getSmimeInfo() != null) { + for (SmimeInfo smimeInfo : listResults.getSmimeInfo()) { + String certId = smimeInfo.getId(); + boolean isDefaultCert = smimeInfo.getIsDefault(); + if (isDefaultCert) { + defaultCertId = certId; + } + LocalDateTime exp = + LocalDateTime.ofInstant( + Instant.ofEpochMilli(smimeInfo.getExpiration()), ZoneId.systemDefault()); + if (exp.isAfter(expireTime)) { + if (exp.isAfter(bestCertExpire)) { + bestCertId = certId; + bestCertExpire = exp; + } + } else { + if (isDefaultCert) { + defaultCertId = null; + } + } + } + } + if (defaultCertId == null) { + String defaultId = bestCertId; + if (defaultId == null && certFilename != null) { + SmimeInfo insertResults = InsertSmimeInfo.insertSmimeInfo(certFilename, + certPassword, + userId, + sendAsEmail); + if (insertResults != null) { + defaultId = insertResults.getId(); + } + } + + if (defaultId != null) { + try { + service.users().settings().sendAs().smimeInfo().setDefault(userId, sendAsEmail, defaultId).execute(); + return defaultId; + } catch (IOException e) { + System.err.printf("An error occured during setDefault: %s", e); + } + } + } else { + return defaultCertId; + } + + return null; + } +} +// [END gmail_update_smime_certs] \ No newline at end of file diff --git a/gmail/snippets/src/main/java/UpdateSmimeFromCsv.java b/gmail/snippets/src/main/java/UpdateSmimeFromCsv.java new file mode 100644 index 00000000..3f7d3964 --- /dev/null +++ b/gmail/snippets/src/main/java/UpdateSmimeFromCsv.java @@ -0,0 +1,59 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + + +// [START gmail_update_smime_from_csv] +import org.apache.commons.csv.CSVFormat; +import org.apache.commons.csv.CSVParser; +import org.apache.commons.csv.CSVRecord; + +import java.io.File; +import java.time.LocalDateTime; + +/* Class to demonstrate the use of Gmail Update Certificate from CSV File */ +public class UpdateSmimeFromCsv { + /** + * Update S/MIME certificates based on the contents of a CSV file. + * + *

Each row of the CSV file should contain a user ID, path to the certificate, and the + * certificate password. + * + * @param csvFilename Name of the CSV file. + * @param expireTime DateTime object against which the certificate expiration is compared. If + * None, uses the current time. + */ + public static void updateSmimeFromCsv(String csvFilename, LocalDateTime expireTime) { + try { + File csvFile = new File(csvFilename); + CSVParser parser = + CSVParser.parse( + csvFile, + java.nio.charset.StandardCharsets.UTF_8, + CSVFormat.DEFAULT.withHeader().withSkipHeaderRecord()); + for (CSVRecord record : parser) { + String userId = record.get(0); + String certFilename = record.get(1); + String certPassword = record.get(2); + UpdateSmimeCerts.updateSmimeCerts(userId, + userId, + certFilename, + certPassword, + expireTime); + } + } catch (Exception e) { + System.err.printf("An error occured while reading the CSV file: %s", e); + } + } +} +// [END gmail_update_smime_from_csv] \ No newline at end of file From bc272f7bb8e59725d1717b8ece8591995c4e7e8e Mon Sep 17 00:00:00 2001 From: Steven Bazyl Date: Tue, 5 Apr 2022 19:17:31 -0600 Subject: [PATCH 082/262] Enable snippet bot + CI workflow (currently not passing) --- .github/scripts/authorize.sh | 48 ++++++++++++++++++++ .github/scripts/test.sh | 41 +++++++++++++++++ .github/snippet-bot.yml | 0 .github/workflows/ci.yaml | 51 ++++++++++++++++++++++ .github/workflows/lint.yaml | 2 + drive/snippets/drive_v2/files/document.txt | 0 6 files changed, 142 insertions(+) create mode 100755 .github/scripts/authorize.sh create mode 100755 .github/scripts/test.sh create mode 100644 .github/snippet-bot.yml create mode 100644 .github/workflows/ci.yaml create mode 100644 drive/snippets/drive_v2/files/document.txt diff --git a/.github/scripts/authorize.sh b/.github/scripts/authorize.sh new file mode 100755 index 00000000..a6503421 --- /dev/null +++ b/.github/scripts/authorize.sh @@ -0,0 +1,48 @@ +#! /bin/bash + +# Copyright 2020 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Utility for generating credentials used by tests. + +# Union of scopes used by samples +SCOPES=( + "https://www.googleapis.com/auth/drive" + "https://www.googleapis.com/auth/drive.activity" + "https://www.googleapis.com/auth/drive.appdata" + "https://mail.google.com/" + "https://www.googleapis.com/auth/classroom.courses" + "https://www.googleapis.com/auth/classroom.announcements" + "https://www.googleapis.com/auth/classroom.rosters" + "https://www.googleapis.com/auth/classroom.topics" + "https://www.googleapis.com/auth/classroom.guardianlinks.students" + "https://www.googleapis.com/auth/classroom.coursework.students" +) + +if [ -z "$CLIENT_ID_FILE" ]; then + echo "CLIENT_ID_FILE environment not set. Please set and run again." + exit 1 +fi + +if [ ! -f "$CLIENT_ID_FILE" ]; then + echo "$CLIENT_ID_FILE not found." + exit 1 +fi + +printf -v EXPANDED_SCOPES '%s,' "${SCOPES[@]}" +gcloud auth application-default login \ + --client-id-file="$CLIENT_ID_FILE" \ + --scopes="${EXPANDED_SCOPES}" + +cat "${HOME}/.config/gcloud/application_default_credentials.json" \ No newline at end of file diff --git a/.github/scripts/test.sh b/.github/scripts/test.sh new file mode 100755 index 00000000..cab34629 --- /dev/null +++ b/.github/scripts/test.sh @@ -0,0 +1,41 @@ +#! /bin/bash +# Copyright 2020 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +export LC_ALL=C.UTF-8 +export LANG=C.UTF-8 +export GOOGLE_APPLICATION_CREDENTIALS="${HOME}/secrets/default_credentials.json" +export SERVICE_ACCOUNT_CREDENTIALS="${HOME}/secrets/service_account.json" + +dirs=() + +IFS=$'\n' read -r -d '' -a dirs < <( find . -name 'build.gradle' -exec dirname '{}' \; | sort -u ) + +exit_code=0 + +for dir in "${dirs[@]}"; do + pushd "${dir}" || exit + gradle test + status=$? + if [ $status -ne 0 ]; then + exit_code=$status + fi + popd || exit +done + +if [ $exit_code -ne 0 ]; then + echo "Tests failed." +fi + +exit $exit_code \ No newline at end of file diff --git a/.github/snippet-bot.yml b/.github/snippet-bot.yml new file mode 100644 index 00000000..e69de29b diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml new file mode 100644 index 00000000..88816de2 --- /dev/null +++ b/.github/workflows/ci.yaml @@ -0,0 +1,51 @@ +name: CI + +on: + push: + branches: [ master ] + pull_request: + branches: [ master ] + workflow_dispatch: + +jobs: + test: + concurrency: + group: ${{ github.head_ref || github.ref }} + cancel-in-progress: true + # Only run for internal PRs or after a merge + if: ${{ github.event_name == 'push' || github.event.pull_request.head.repo.full_name == github.repository }} + runs-on: ubuntu-latest + strategy: + matrix: + # TODO - expand matrix once stable + java-version: [11] + steps: + - uses: actions/checkout@v3 + - name: Fetch and Diff PR with base from which it was cloned + if: ${{ github.event.pull_request.base.sha }} + run: | + git fetch origin master "${{ github.event.pull_request.base.sha }}" + git diff --diff-filter=ACM --name-only "${{ github.event.pull_request.base.sha }}" "${{ github.sha }}" > "${HOME}/changed_files.txt" + - name: Set up Java ${{ matrix.java-version }} + uses: actions/setup-java@v2 + with: + distribution: 'temurin' + java-version: ${{ matrix.java-version }} + - name: Write test credentials + run: | + mkdir "${HOME}/secrets" + echo "${DEFAULT_CREDENTIALS}" > "${HOME}/secrets/default_credentials.json" + echo "${SERVICE_ACCOUNT_CREDENTIALS}" > "${HOME}/secrets/service_account.json" + echo "${CLIENT_ID_FILE}" > "${HOME}/secrets/client_id.json" + env: + DEFAULT_CREDENTIALS: ${{secrets.SNIPPETS_DEFAULT_CREDENTIALS}} + SERVICE_ACCOUNT_CREDENTIALS: ${{secrets.SNIPPETS_DELEGATED_ADMIN_SERVICE_ACCOUNT}} + CLIENT_ID_FILE: ${{secrets.SNIPPETS_CLIENT_ID_FILE}} + - name: Validate Gradle wrapper + uses: gradle/wrapper-validation-action@v1 + - name: Setup Gradle + uses: gradle/gradle-build-action@v2.1.1 + with: + gradle-version: 7.4 + - name: Run tests + run: ./.github/scripts/test.sh diff --git a/.github/workflows/lint.yaml b/.github/workflows/lint.yaml index 659b0c58..285a7e99 100644 --- a/.github/workflows/lint.yaml +++ b/.github/workflows/lint.yaml @@ -19,6 +19,8 @@ on: pull_request: branches: - master + workflow_dispatch: + jobs: lint: concurrency: diff --git a/drive/snippets/drive_v2/files/document.txt b/drive/snippets/drive_v2/files/document.txt new file mode 100644 index 00000000..e69de29b From 34788fba868059b22b018f637d9106fa8dcd08e0 Mon Sep 17 00:00:00 2001 From: Steven Bazyl Date: Wed, 6 Apr 2022 15:39:06 -0600 Subject: [PATCH 083/262] Fix mismatched region tag --- .../snippets/gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 59536 bytes gmail/snippets/src/main/java/CreateFilter.java | 1 - 2 files changed, 1 deletion(-) create mode 100644 gmail/snippets/gradle/wrapper/gradle-wrapper.jar diff --git a/gmail/snippets/gradle/wrapper/gradle-wrapper.jar b/gmail/snippets/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..7454180f2ae8848c63b8b4dea2cb829da983f2fa GIT binary patch literal 59536 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 QuEJmfE|#`Dqx|px0L@K;Y5)KL literal 0 HcmV?d00001 diff --git a/gmail/snippets/src/main/java/CreateFilter.java b/gmail/snippets/src/main/java/CreateFilter.java index f50bcf86..8faea942 100644 --- a/gmail/snippets/src/main/java/CreateFilter.java +++ b/gmail/snippets/src/main/java/CreateFilter.java @@ -56,7 +56,6 @@ public static String createNewFilter(String realLabelId) throws IOException { .setApplicationName("Gmail samples") .build(); - // [START createFilter] String labelId = "Label_14"; // ID of the user label to add // [START_EXCLUDE silent] labelId = realLabelId; From 7f78dca6b3ee3d0649457aab36c0747802fb6ae0 Mon Sep 17 00:00:00 2001 From: Steven Bazyl Date: Wed, 6 Apr 2022 15:40:15 -0600 Subject: [PATCH 084/262] Delint quickstart --- tasks/quickstart/src/main/java/TasksQuickstart.java | 6 +++--- vault/quickstart/src/main/java/Quickstart.java | 7 ++++--- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/tasks/quickstart/src/main/java/TasksQuickstart.java b/tasks/quickstart/src/main/java/TasksQuickstart.java index 3b8abca9..8a522fdd 100644 --- a/tasks/quickstart/src/main/java/TasksQuickstart.java +++ b/tasks/quickstart/src/main/java/TasksQuickstart.java @@ -21,7 +21,7 @@ import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport; import com.google.api.client.http.javanet.NetHttpTransport; import com.google.api.client.json.JsonFactory; -import com.google.api.client.json.jackson2.JacksonFactory; +import com.google.api.client.json.gson.GsonFactory; import com.google.api.client.util.store.FileDataStoreFactory; import com.google.api.services.tasks.Tasks; import com.google.api.services.tasks.TasksScopes; @@ -38,7 +38,7 @@ public class TasksQuickstart { private static final String APPLICATION_NAME = "Google Tasks API Java Quickstart"; - private static final JsonFactory JSON_FACTORY = JacksonFactory.getDefaultInstance(); + private static final JsonFactory JSON_FACTORY = GsonFactory.getDefaultInstance(); private static final String TOKENS_DIRECTORY_PATH = "tokens"; /** @@ -81,7 +81,7 @@ public static void main(String... args) throws IOException, GeneralSecurityExcep // Print the first 10 task lists. TaskLists result = service.tasklists().list() - .setMaxResults(10L) + .setMaxResults(10) .execute(); List taskLists = result.getItems(); if (taskLists == null || taskLists.isEmpty()) { diff --git a/vault/quickstart/src/main/java/Quickstart.java b/vault/quickstart/src/main/java/Quickstart.java index 36b2a8c2..21188873 100644 --- a/vault/quickstart/src/main/java/Quickstart.java +++ b/vault/quickstart/src/main/java/Quickstart.java @@ -20,7 +20,7 @@ import com.google.api.client.googleapis.auth.oauth2.GoogleClientSecrets; import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport; import com.google.api.client.http.HttpTransport; -import com.google.api.client.json.jackson2.JacksonFactory; +import com.google.api.client.json.gson.GsonFactory; import com.google.api.client.json.JsonFactory; import com.google.api.client.util.store.FileDataStoreFactory; import com.google.api.services.vault.v1.VaultScopes; @@ -46,12 +46,13 @@ public class Quickstart { private static FileDataStoreFactory DATA_STORE_FACTORY; /** Global instance of the JSON factory. */ - private static final JsonFactory JSON_FACTORY = - JacksonFactory.getDefaultInstance(); + private static final JsonFactory JSON_FACTORY = GsonFactory.getDefaultInstance(); /** Global instance of the HTTP transport. */ private static HttpTransport HTTP_TRANSPORT; + private static final String CREDENTIALS_FILE_PATH = "/credentials.json"; + /** Global instance of the scopes required by this quickstart. * * If modifying these scopes, delete your previously saved credentials From 8bf970d9d33f550f3404f654f0e229b4feec7214 Mon Sep 17 00:00:00 2001 From: Steven Bazyl Date: Wed, 6 Apr 2022 15:42:27 -0600 Subject: [PATCH 085/262] Fix compile errors --- .../drive_v2/src/main/java/CreateDrive.java | 2 +- .../drive_v2/src/main/java/FetchAppDataFolder.java | 2 +- .../drive_v2/src/main/java/FetchChanges.java | 4 ++-- .../drive_v2/src/main/java/ListAppData.java | 2 +- .../drive_v2/src/main/java/MoveFileToFolder.java | 13 +++++++++---- .../drive_v2/src/main/java/TeamDriveSnippets.java | 4 +--- 6 files changed, 15 insertions(+), 12 deletions(-) diff --git a/drive/snippets/drive_v2/src/main/java/CreateDrive.java b/drive/snippets/drive_v2/src/main/java/CreateDrive.java index 4cdd999c..bf5a82bb 100644 --- a/drive/snippets/drive_v2/src/main/java/CreateDrive.java +++ b/drive/snippets/drive_v2/src/main/java/CreateDrive.java @@ -54,7 +54,7 @@ private static String createDrive() throws IOException { driveMetadata.setName("Project Resources"); String requestId = UUID.randomUUID().toString(); try { - Drive drive = service.drives().create(requestId, + Drive drive = service.drives().insert(requestId, driveMetadata) .execute(); System.out.println("Drive ID: " + drive.getId()); diff --git a/drive/snippets/drive_v2/src/main/java/FetchAppDataFolder.java b/drive/snippets/drive_v2/src/main/java/FetchAppDataFolder.java index 9820e21c..a12f9e5d 100644 --- a/drive/snippets/drive_v2/src/main/java/FetchAppDataFolder.java +++ b/drive/snippets/drive_v2/src/main/java/FetchAppDataFolder.java @@ -58,7 +58,7 @@ public String fetchAppDataFolder() throws IOException { .setApplicationName("Drive samples") .build(); try { - File file = driveService.files().get("appDataFolder") + File file = service.files().get("appDataFolder") .setFields("id") .execute(); System.out.println("Folder ID: " + file.getId()); diff --git a/drive/snippets/drive_v2/src/main/java/FetchChanges.java b/drive/snippets/drive_v2/src/main/java/FetchChanges.java index 69a7fbb3..deafc9d1 100644 --- a/drive/snippets/drive_v2/src/main/java/FetchChanges.java +++ b/drive/snippets/drive_v2/src/main/java/FetchChanges.java @@ -55,9 +55,9 @@ private static String fetchChanges(String savedStartPageToken) throws IOExceptio // current token from getStartPageToken() String pageToken = savedStartPageToken; while (pageToken != null) { - ChangeList changes = service.changes().list(pageToken) + ChangeList changes = service.changes().list().setPageToken(pageToken) .execute(); - for (com.google.api.services.drive.model.Change change : changes.getChanges()) { + for (com.google.api.services.drive.model.Change change : changes.getItems()) { // Process change System.out.println("Change found for file: " + change.getFileId()); } diff --git a/drive/snippets/drive_v2/src/main/java/ListAppData.java b/drive/snippets/drive_v2/src/main/java/ListAppData.java index 704eb9b2..2aa87b7d 100644 --- a/drive/snippets/drive_v2/src/main/java/ListAppData.java +++ b/drive/snippets/drive_v2/src/main/java/ListAppData.java @@ -58,7 +58,7 @@ public FileList listAppData() throws IOException { .setApplicationName("Drive samples") .build(); try { - FileList files = driveService.files().list() + FileList files = service.files().list() .setSpaces("appDataFolder") .setFields("nextPageToken, items(id, title)") .setMaxResults(10) diff --git a/drive/snippets/drive_v2/src/main/java/MoveFileToFolder.java b/drive/snippets/drive_v2/src/main/java/MoveFileToFolder.java index c46e45ab..74b0df73 100644 --- a/drive/snippets/drive_v2/src/main/java/MoveFileToFolder.java +++ b/drive/snippets/drive_v2/src/main/java/MoveFileToFolder.java @@ -31,14 +31,16 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.Stream; /* Class to demonstrate use case for moving file to folder.*/ public class MoveFileToFolder { /** - * @param realFileId Id of file to be moved. - * @param realFolderId Id of folder where the fill will be moved. + * @param fileId Id of file to be moved. + * @param folderId Id of folder where the fill will be moved. * @return list of parent ids for the file. * */ private static List moveFileToFolder(String fileId, String folderId) @@ -60,7 +62,10 @@ private static List moveFileToFolder(String fileId, String folderId) File file = service.files().get(fileId) .setFields("parents") .execute(); - String parentIds = file.getParents().map(ParentReference::getId); + List parentIds = file.getParents() + .stream() + .map(ParentReference::getId) + .collect(Collectors.toList()); String previousParents = String.join(",", parentIds); try { // Move the file to the new folder @@ -70,7 +75,7 @@ private static List moveFileToFolder(String fileId, String folderId) .setFields("id, parents") .execute(); - List parents = new ArrayList(); + List parents = new ArrayList<>(); for (ParentReference parent : file.getParents()) { parents.add(parent.getId()); } diff --git a/drive/snippets/drive_v2/src/main/java/TeamDriveSnippets.java b/drive/snippets/drive_v2/src/main/java/TeamDriveSnippets.java index 7cbdb71a..0a6572b6 100644 --- a/drive/snippets/drive_v2/src/main/java/TeamDriveSnippets.java +++ b/drive/snippets/drive_v2/src/main/java/TeamDriveSnippets.java @@ -69,9 +69,7 @@ public List recoverTeamDrives(String realUser) .setSupportsTeamDrives(true) .setFields("id") .execute(); - System.out.printf("Added organizer permission: %s\n", - permissionResult.getId()); - + System.out.printf("Added organizer permission: %s\n", permissionResult.getId()); } // [START_EXCLUDE silent] teamDrives.addAll(result.getItems()); From 27ad6eb46cf8f6365ed49dedc1509da569c762dd Mon Sep 17 00:00:00 2001 From: Rajesh Mudaliyar Date: Fri, 29 Apr 2022 12:46:24 -0700 Subject: [PATCH 086/262] All Admin-SDK API's quickstarts (#216) * git-on-borg files of gmail-api-snippets * Update build.gradle test12 * Update build.gradle * All Admin-SDK API's quickstarts Co-authored-by: sanjuktaghosh7 Co-authored-by: Manvendra-P-Singh --- .../java/AdminSDKAlertCenterQuickstart.java | 3 +- .../java/AdminSDKDirectoryQuickstart.java | 3 ++ .../main/java/AdminSDKReportsQuickstart.java | 34 ++++++++++------- .../main/java/AdminSDKResellerQuickstart.java | 37 +++++++++++-------- 4 files changed, 48 insertions(+), 29 deletions(-) diff --git a/adminSDK/alertcenter/quickstart/src/main/java/AdminSDKAlertCenterQuickstart.java b/adminSDK/alertcenter/quickstart/src/main/java/AdminSDKAlertCenterQuickstart.java index ded0d8fe..3df8e3ea 100644 --- a/adminSDK/alertcenter/quickstart/src/main/java/AdminSDKAlertCenterQuickstart.java +++ b/adminSDK/alertcenter/quickstart/src/main/java/AdminSDKAlertCenterQuickstart.java @@ -35,8 +35,9 @@ import java.util.List; public class AdminSDKAlertCenterQuickstart { - + /** Application name. */ private static final String APPLICATION_NAME = "Google Admin SDK Alert Center API Java Quickstart"; + /** Global instance of the JSON factory. */ private static final JsonFactory JSON_FACTORY = GsonFactory.getDefaultInstance(); /** diff --git a/adminSDK/directory/quickstart/src/main/java/AdminSDKDirectoryQuickstart.java b/adminSDK/directory/quickstart/src/main/java/AdminSDKDirectoryQuickstart.java index a93605db..55ee4899 100644 --- a/adminSDK/directory/quickstart/src/main/java/AdminSDKDirectoryQuickstart.java +++ b/adminSDK/directory/quickstart/src/main/java/AdminSDKDirectoryQuickstart.java @@ -37,8 +37,11 @@ import java.util.List; public class AdminSDKDirectoryQuickstart { + /** Application name. */ private static final String APPLICATION_NAME = "Google Admin SDK Directory API Java Quickstart"; + /** Global instance of the JSON factory. */ private static final JsonFactory JSON_FACTORY = GsonFactory.getDefaultInstance(); + /** Directory to store authorization tokens for this application. */ private static final String TOKENS_DIRECTORY_PATH = "tokens"; /** diff --git a/adminSDK/reports/quickstart/src/main/java/AdminSDKReportsQuickstart.java b/adminSDK/reports/quickstart/src/main/java/AdminSDKReportsQuickstart.java index 2a63f0aa..0c8a9566 100644 --- a/adminSDK/reports/quickstart/src/main/java/AdminSDKReportsQuickstart.java +++ b/adminSDK/reports/quickstart/src/main/java/AdminSDKReportsQuickstart.java @@ -19,6 +19,7 @@ import com.google.api.client.googleapis.auth.oauth2.GoogleAuthorizationCodeFlow; import com.google.api.client.googleapis.auth.oauth2.GoogleClientSecrets; import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport; +import com.google.api.client.googleapis.json.GoogleJsonResponseException; import com.google.api.client.http.javanet.NetHttpTransport; import com.google.api.client.json.JsonFactory; import com.google.api.client.json.gson.GsonFactory; @@ -37,8 +38,11 @@ import java.util.List; public class AdminSDKReportsQuickstart { + /** Application name. */ private static final String APPLICATION_NAME = "Google Admin SDK Reports API Java Quickstart"; + /** Global instance of the JSON factory. */ private static final JsonFactory JSON_FACTORY = GsonFactory.getDefaultInstance(); + /** Directory to store authorization tokens for this application. */ private static final String TOKENS_DIRECTORY_PATH = "tokens"; /** @@ -82,20 +86,24 @@ public static void main(String... args) throws IOException, GeneralSecurityExcep // Print the last 10 login events. String userKey = "all"; String applicationName = "login"; - Activities result = service.activities().list(userKey, applicationName) - .setMaxResults(10) - .execute(); - List activities = result.getItems(); - if (activities == null || activities.size() == 0) { - System.out.println("No logins found."); - } else { - System.out.println("Logins:"); - for (Activity activity : activities) { - System.out.printf("%s: %s (%s)\n", - activity.getId().getTime(), - activity.getActor().getEmail(), - activity.getEvents().get(0).getName()); + try { + Activities result = service.activities().list(userKey, applicationName) + .setMaxResults(10) + .execute(); + List activities = result.getItems(); + if (activities == null || activities.size() == 0) { + System.out.println("No logins found."); + } else { + System.out.println("Logins:"); + for (Activity activity : activities) { + System.out.printf("%s: %s (%s)\n", + activity.getId().getTime(), + activity.getActor().getEmail(), + activity.getEvents().get(0).getName()); + } } + }catch (GoogleJsonResponseException ge){ + ge.printStackTrace(); } } } diff --git a/adminSDK/reseller/quickstart/src/main/java/AdminSDKResellerQuickstart.java b/adminSDK/reseller/quickstart/src/main/java/AdminSDKResellerQuickstart.java index d0f45ff4..6dfdac8c 100644 --- a/adminSDK/reseller/quickstart/src/main/java/AdminSDKResellerQuickstart.java +++ b/adminSDK/reseller/quickstart/src/main/java/AdminSDKResellerQuickstart.java @@ -19,6 +19,7 @@ import com.google.api.client.googleapis.auth.oauth2.GoogleAuthorizationCodeFlow; import com.google.api.client.googleapis.auth.oauth2.GoogleClientSecrets; import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport; +import com.google.api.client.googleapis.json.GoogleJsonResponseException; import com.google.api.client.http.javanet.NetHttpTransport; import com.google.api.client.json.JsonFactory; import com.google.api.client.json.gson.GsonFactory; @@ -37,8 +38,11 @@ import java.util.List; public class AdminSDKResellerQuickstart { + /** Application name. */ private static final String APPLICATION_NAME = "Google Admin SDK Reseller API Java Quickstart"; + /** Global instance of the JSON factory. */ private static final JsonFactory JSON_FACTORY = GsonFactory.getDefaultInstance(); + /** Directory to store authorization tokens for this application. */ private static final String TOKENS_DIRECTORY_PATH = "tokens"; /** @@ -78,22 +82,25 @@ public static void main(String... args) throws IOException, GeneralSecurityExcep Reseller service = new Reseller.Builder(HTTP_TRANSPORT, JSON_FACTORY, getCredentials(HTTP_TRANSPORT)) .setApplicationName(APPLICATION_NAME) .build(); - - // Print the first 10 subscriptions you manage. - Subscriptions result = service.subscriptions().list() - .setMaxResults(10L) - .execute(); - List subscriptions = result.getSubscriptions(); - if (subscriptions == null || subscriptions.size() == 0) { - System.out.println("No subscriptions found."); - } else { - System.out.println("Subscriptions:"); - for (Subscription sub : subscriptions) { - System.out.printf("%s (%s, %s)\n", - sub.getCustomerId(), - sub.getSkuId(), - sub.getPlan().getPlanName()); + try { + // Print the first 10 subscriptions you manage. + Subscriptions result = service.subscriptions().list() + .setMaxResults(10L) + .execute(); + List subscriptions = result.getSubscriptions(); + if (subscriptions == null || subscriptions.size() == 0) { + System.out.println("No subscriptions found."); + } else { + System.out.println("Subscriptions:"); + for (Subscription sub : subscriptions) { + System.out.printf("%s (%s, %s)\n", + sub.getCustomerId(), + sub.getSkuId(), + sub.getPlan().getPlanName()); + } } + }catch (GoogleJsonResponseException ge){ + ge.printStackTrace(); } } } From ba5a8864bacae18296f28cc416379d98172b4073 Mon Sep 17 00:00:00 2001 From: Steven Bazyl Date: Wed, 4 May 2022 13:12:51 -0600 Subject: [PATCH 087/262] Move groups settings starter code to github, update to latest client libraries --- .../groups-settings/quickstart/build.gradle | 17 ++++ .../quickstart/settings.gradle | 18 ++++ .../main/java/GroupsSettingsQuickstart.java | 85 +++++++++++++++++++ 3 files changed, 120 insertions(+) create mode 100644 adminSDK/groups-settings/quickstart/build.gradle create mode 100644 adminSDK/groups-settings/quickstart/settings.gradle create mode 100644 adminSDK/groups-settings/quickstart/src/main/java/GroupsSettingsQuickstart.java diff --git a/adminSDK/groups-settings/quickstart/build.gradle b/adminSDK/groups-settings/quickstart/build.gradle new file mode 100644 index 00000000..34720176 --- /dev/null +++ b/adminSDK/groups-settings/quickstart/build.gradle @@ -0,0 +1,17 @@ +apply plugin: 'java' +apply plugin: 'application' + +mainClassName = 'GroupsSettingsQuickstart' +sourceCompatibility = 11 +targetCompatibility = 11 +version = '1.0' + +repositories { + mavenCentral() +} + +dependencies { + implementation 'com.google.api-client:google-api-client:1.33.0' + implementation 'com.google.oauth-client:google-oauth-client-jetty:1.32.1' + implementation 'com.google.apis:google-api-services-groupssettings:v1-rev20210624-1.32.1' +} diff --git a/adminSDK/groups-settings/quickstart/settings.gradle b/adminSDK/groups-settings/quickstart/settings.gradle new file mode 100644 index 00000000..a9b08d47 --- /dev/null +++ b/adminSDK/groups-settings/quickstart/settings.gradle @@ -0,0 +1,18 @@ +/* + * This settings file was generated by the Gradle 'init' task. + * + * The settings file is used to specify which projects to include in your build. + * In a single project build this file can be empty or even removed. + * + * Detailed information about configuring a multi-project build in Gradle can be found + * in the user guide at https://docs.gradle.org/3.5/userguide/multi_project_builds.html + */ + +/* +// To declare projects as part of a multi-project build use the 'include' method +include 'shared' +include 'api' +include 'services:webservice' +*/ + +rootProject.name = 'Groups Settings Quickstart' diff --git a/adminSDK/groups-settings/quickstart/src/main/java/GroupsSettingsQuickstart.java b/adminSDK/groups-settings/quickstart/src/main/java/GroupsSettingsQuickstart.java new file mode 100644 index 00000000..e5a69e33 --- /dev/null +++ b/adminSDK/groups-settings/quickstart/src/main/java/GroupsSettingsQuickstart.java @@ -0,0 +1,85 @@ +// Copyright 2018 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// [START admin_sdk_groups_settings_quickstart] +import com.google.api.client.auth.oauth2.Credential; +import com.google.api.client.extensions.java6.auth.oauth2.AuthorizationCodeInstalledApp; +import com.google.api.client.extensions.jetty.auth.oauth2.LocalServerReceiver; +import com.google.api.client.googleapis.auth.oauth2.GoogleAuthorizationCodeFlow; +import com.google.api.client.googleapis.auth.oauth2.GoogleClientSecrets; +import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.JsonFactory; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.client.util.store.FileDataStoreFactory; +import com.google.api.services.groupssettings.Groupssettings; + +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.security.GeneralSecurityException; +import java.util.Collections; +import java.util.List; + +public class GroupsSettingsQuickstart { + private static final String APPLICATION_NAME = "Google Admin SDK Group Settings API Java Quickstart"; + private static final JsonFactory JSON_FACTORY = GsonFactory.getDefaultInstance(); + private static final String TOKENS_DIRECTORY_PATH = "tokens"; + + /** + * Global instance of the scopes required by this quickstart. + * If modifying these scopes, delete your previously saved tokens/ folder. + */ + private static final List SCOPES = Collections.singletonList( + "https://www.googleapis.com/auth/apps.groups.settings"); + private static final String CREDENTIALS_FILE_PATH = "/credentials.json"; + + /** + * Creates an authorized Credential object. + * @param HTTP_TRANSPORT The network HTTP Transport. + * @return An authorized Credential object. + * @throws IOException If the credentials.json file cannot be found. + */ + private static Credential getCredentials(final NetHttpTransport HTTP_TRANSPORT) throws IOException { + // Load client secrets. + InputStream in = GroupsSettingsQuickstart.class.getResourceAsStream(CREDENTIALS_FILE_PATH); + if (in == null) { + throw new FileNotFoundException("Resource not found: " + CREDENTIALS_FILE_PATH); + } + GoogleClientSecrets clientSecrets = GoogleClientSecrets.load(JSON_FACTORY, new InputStreamReader(in)); + + // Build flow and trigger user authorization request. + GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow.Builder( + HTTP_TRANSPORT, JSON_FACTORY, clientSecrets, SCOPES) + .setDataStoreFactory(new FileDataStoreFactory(new java.io.File(TOKENS_DIRECTORY_PATH))) + .setAccessType("offline") + .build(); + LocalServerReceiver receiver = new LocalServerReceiver.Builder().setPort(8888).build(); + return new AuthorizationCodeInstalledApp(flow, receiver).authorize("user"); + } + + public static void main(String... args) throws IOException, GeneralSecurityException { + // Build a new authorized API client service. + final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport(); + Groupssettings service = new Groupssettings.Builder(HTTP_TRANSPORT, JSON_FACTORY, getCredentials(HTTP_TRANSPORT)) + .setApplicationName(APPLICATION_NAME) + .build(); + + // TODO(developer) - API is ready to use + System.out.println("API Initialized"); + + } +} +// [END admin_sdk_groups_settings_quickstart] From 423c871bea8f54cd925f7b7fef81351bda33d693 Mon Sep 17 00:00:00 2001 From: Steven Bazyl Date: Thu, 5 May 2022 13:07:16 -0600 Subject: [PATCH 088/262] Add API call to groups settings quickstart --- .../src/main/java/GroupsSettingsQuickstart.java | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/adminSDK/groups-settings/quickstart/src/main/java/GroupsSettingsQuickstart.java b/adminSDK/groups-settings/quickstart/src/main/java/GroupsSettingsQuickstart.java index e5a69e33..a267cd88 100644 --- a/adminSDK/groups-settings/quickstart/src/main/java/GroupsSettingsQuickstart.java +++ b/adminSDK/groups-settings/quickstart/src/main/java/GroupsSettingsQuickstart.java @@ -24,6 +24,7 @@ import com.google.api.client.json.gson.GsonFactory; import com.google.api.client.util.store.FileDataStoreFactory; import com.google.api.services.groupssettings.Groupssettings; +import com.google.api.services.groupssettings.model.Groups; import java.io.FileNotFoundException; import java.io.IOException; @@ -77,9 +78,20 @@ public static void main(String... args) throws IOException, GeneralSecurityExcep .setApplicationName(APPLICATION_NAME) .build(); - // TODO(developer) - API is ready to use - System.out.println("API Initialized"); + // API is ready to use + if (args.length == 0) { + System.out.println("No group email specified."); + return; + } + try { + String groupEmail = args[0]; + Groups settings = service.groups().get(groupEmail).execute(); + System.out.println(String.format("Description: %s", settings.getDescription())); + } catch (Exception e) { + // TODO(developer) - Handle errors + e.printStackTrace(); + } } } // [END admin_sdk_groups_settings_quickstart] From 8e7656b7e2f7f5a6aeaa4d5cd7b70e73473e4f7a Mon Sep 17 00:00:00 2001 From: Rajesh Mudaliyar Date: Wed, 25 May 2022 12:26:25 -0700 Subject: [PATCH 089/262] Classroom Unit Testcase (#218) * git-on-borg files of gmail-api-snippets * Update build.gradle test12 * Update build.gradle Co-authored-by: sanjuktaghosh7 Co-authored-by: Manvendra-P-Singh From 30af16f4e9bee6cf61c69e899ba7b16371424c52 Mon Sep 17 00:00:00 2001 From: Rajesh Mudaliyar Date: Wed, 25 May 2022 12:45:13 -0700 Subject: [PATCH 090/262] Drive-v2: file snippets patch-1 UnitTest (#219) * git-on-borg files of gmail-api-snippets * Update build.gradle test12 * Update build.gradle * Drive-v2: file snippets patch-1 UnitTest Co-authored-by: sanjuktaghosh7 Co-authored-by: Manvendra-P-Singh --- .../drive_v2/src/main/java/CreateFolder.java | 2 +- .../drive_v2/src/main/java/UploadBasic.java | 4 ++-- .../drive_v2/src/test/java/TestCreateFolder.java | 14 ++++++++++++++ .../drive_v2/src/test/java/TestUploadBasic.java | 15 +++++++++++++++ 4 files changed, 32 insertions(+), 3 deletions(-) create mode 100644 drive/snippets/drive_v2/src/test/java/TestCreateFolder.java create mode 100644 drive/snippets/drive_v2/src/test/java/TestUploadBasic.java diff --git a/drive/snippets/drive_v2/src/main/java/CreateFolder.java b/drive/snippets/drive_v2/src/main/java/CreateFolder.java index 8bb1b908..169c796d 100644 --- a/drive/snippets/drive_v2/src/main/java/CreateFolder.java +++ b/drive/snippets/drive_v2/src/main/java/CreateFolder.java @@ -34,7 +34,7 @@ public class CreateFolder { * @return Inserted folder id if successful, {@code null} otherwise. * @throws IOException if service account credentials file not found. */ - private static String createFolder() throws IOException { + public static String createFolder() throws IOException { // Load pre-authorized user credentials from the environment. // TODO(developer) - See https://developers.google.com/identity for // guides on implementing OAuth2 for your application. diff --git a/drive/snippets/drive_v2/src/main/java/UploadBasic.java b/drive/snippets/drive_v2/src/main/java/UploadBasic.java index 22732967..dc99bb5b 100644 --- a/drive/snippets/drive_v2/src/main/java/UploadBasic.java +++ b/drive/snippets/drive_v2/src/main/java/UploadBasic.java @@ -35,7 +35,7 @@ public class UploadBasic { * @return Inserted file metadata if successful, {@code null} otherwise. * @throws IOException if service account credentials file not found. */ - private static File uploadBasic() throws IOException{ + public static String uploadBasic() throws IOException{ // Load pre-authorized user credentials from the environment. // TODO(developer) - See https://developers.google.com/identity for // guides on implementing OAuth2 for your application. @@ -61,7 +61,7 @@ private static File uploadBasic() throws IOException{ .setFields("id") .execute(); System.out.println("File ID: " + file.getId()); - return file; + return file.getId(); } catch (IOException e) { System.out.println("An error occurred: " + e); return null; diff --git a/drive/snippets/drive_v2/src/test/java/TestCreateFolder.java b/drive/snippets/drive_v2/src/test/java/TestCreateFolder.java new file mode 100644 index 00000000..4d744772 --- /dev/null +++ b/drive/snippets/drive_v2/src/test/java/TestCreateFolder.java @@ -0,0 +1,14 @@ +import org.junit.Test; + +import java.io.IOException; +import java.security.GeneralSecurityException; + +import static org.junit.Assert.assertNotNull; + +public class TestCreateFolder { + @Test + public void createFolder() throws IOException, GeneralSecurityException { + String id = CreateFolder.createFolder(); + assertNotNull(id); + } +} diff --git a/drive/snippets/drive_v2/src/test/java/TestUploadBasic.java b/drive/snippets/drive_v2/src/test/java/TestUploadBasic.java new file mode 100644 index 00000000..35cdf8a4 --- /dev/null +++ b/drive/snippets/drive_v2/src/test/java/TestUploadBasic.java @@ -0,0 +1,15 @@ +import org.junit.Test; + +import java.io.IOException; +import java.security.GeneralSecurityException; + +import static org.junit.Assert.assertNotNull; + +public class TestUploadBasic { + + @Test + public void uploadBasic() throws IOException, GeneralSecurityException { + String id = UploadBasic.uploadBasic(); + assertNotNull(id); + } +} From b0367bc77e9232e0dce8792c919a287576ead71c Mon Sep 17 00:00:00 2001 From: Rajesh Mudaliyar Date: Wed, 25 May 2022 12:46:01 -0700 Subject: [PATCH 091/262] Classroom unit testcase (#221) * git-on-borg files of gmail-api-snippets * Update build.gradle test12 * Update build.gradle * Classroom Unit Testcase * Update BaseTest.java Co-authored-by: sanjuktaghosh7 Co-authored-by: Manvendra-P-Singh --- classroom/snippets/build.gradle | 15 +- .../snippets/src/test/java/BaseTest.java | 128 ++++++++---------- .../src/test/java/TestCreateCourse.java | 29 ++++ .../snippets/src/test/java/TestGetCourse.java | 29 ++++ .../src/test/java/TestListCourses.java | 29 ++++ .../src/test/java/TestPatchCourse.java | 29 ++++ .../src/test/java/TestUpdateCourse.java | 29 ++++ 7 files changed, 205 insertions(+), 83 deletions(-) create mode 100644 classroom/snippets/src/test/java/TestCreateCourse.java create mode 100644 classroom/snippets/src/test/java/TestGetCourse.java create mode 100644 classroom/snippets/src/test/java/TestListCourses.java create mode 100644 classroom/snippets/src/test/java/TestPatchCourse.java create mode 100644 classroom/snippets/src/test/java/TestUpdateCourse.java diff --git a/classroom/snippets/build.gradle b/classroom/snippets/build.gradle index da3d8a86..1f4cdc7b 100644 --- a/classroom/snippets/build.gradle +++ b/classroom/snippets/build.gradle @@ -1,20 +1,15 @@ apply plugin: 'java' -apply plugin: 'application' -apply plugin: 'eclipse' - -mainClassName = 'ClassroomQuickstart' -sourceCompatibility = 1.7 -targetCompatibility = 1.7 -version = '1.0' repositories { + // Use 'jcenter' for resolving your dependencies. mavenCentral() } dependencies { - testCompile 'junit:junit:4.11' - compile 'com.google.api-client:google-api-client:1.20.0' - compile 'com.google.oauth-client:google-oauth-client-jetty:1.20.0' + implementation 'com.google.api-client:google-api-client:1.34.1' + implementation 'com.google.auth:google-auth-library-oauth2-http:1.6.0' + implementation 'com.google.apis:google-api-services-classroom:v1-rev20220323-1.32.1' + testImplementation 'junit:junit:4.13.2' } test { diff --git a/classroom/snippets/src/test/java/BaseTest.java b/classroom/snippets/src/test/java/BaseTest.java index 41064b8e..8fa029f5 100644 --- a/classroom/snippets/src/test/java/BaseTest.java +++ b/classroom/snippets/src/test/java/BaseTest.java @@ -1,87 +1,69 @@ -import com.google.api.client.auth.oauth2.Credential; -import com.google.api.client.extensions.java6.auth.oauth2.AuthorizationCodeInstalledApp; -import com.google.api.client.extensions.jetty.auth.oauth2.LocalServerReceiver; -import com.google.api.client.googleapis.auth.oauth2.GoogleAuthorizationCodeFlow; -import com.google.api.client.googleapis.auth.oauth2.GoogleClientSecrets; -import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport; -import com.google.api.client.http.HttpTransport; -import com.google.api.client.json.JsonFactory; -import com.google.api.client.json.jackson2.JacksonFactory; -import com.google.api.client.util.store.FileDataStoreFactory; +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; import com.google.api.services.classroom.Classroom; +import com.google.api.services.classroom.ClassroomScopes; +import com.google.api.services.classroom.model.Course; +import com.google.api.services.classroom.model.CourseAlias; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; +import org.junit.After; +import org.junit.Before; import java.io.IOException; -import java.io.InputStream; -import java.io.InputStreamReader; -import java.util.Arrays; -import java.util.List; +import java.util.UUID; -/** - * Base class for integration tests. - */ -public abstract class BaseTest { - /** Application name. */ - private static final String APPLICATION_NAME = "Google Classroom API Java Snippet Tests"; + // Base class for integration tests. +public class BaseTest { + protected Classroom service; + protected Course testCourse; - /** Directory to store user credentials. */ - private static final java.io.File DATA_STORE_DIR = new java.io.File( - BaseTest.class.getResource("/credentials").toString()); - - /** Global instance of the {@link FileDataStoreFactory}. */ - private static FileDataStoreFactory DATA_STORE_FACTORY; - - /** Global instance of the JSON factory. */ - private static final JsonFactory JSON_FACTORY = JacksonFactory.getDefaultInstance(); - - /** Global instance of the HTTP transport. */ - private static HttpTransport HTTP_TRANSPORT; + /** + * Creates a default authorization Classroom client service. + * + * @return an authorized Classroom client service + * @throws IOException - if credentials file not found. + */ + protected Classroom buildService() throws IOException { + /* Load pre-authorized user credentials from the environment. + TODO(developer) - See https://developers.google.com/identity for + guides on implementing OAuth2 for your application. */ + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(ClassroomScopes.CLASSROOM_ROSTERS); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); - /** Global instance of the scopes required by this quickstart. */ - private static final List SCOPES = - Arrays.asList("https://www.googleapis.com/auth/classroom.courses", - "https://www.googleapis.com/auth/classroom.rosters"); + // Create the classroom API client + Classroom service = new Classroom.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Classroom Snippets") + .build(); - static { - try { - HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport(); - DATA_STORE_FACTORY = new FileDataStoreFactory(DATA_STORE_DIR); - } catch (Throwable t) { - t.printStackTrace(); - System.out.print(true); - System.exit(1); - } + return service; } - /** - * Creates an authorized Credential object. - * - * @return an authorized Credential object. - * @throws IOException - */ - private Credential authorize() throws IOException { - // Load client secrets. - InputStream in = BaseTest.class.getResourceAsStream("/client_secret.json"); - GoogleClientSecrets clientSecrets = - GoogleClientSecrets.load(JSON_FACTORY, new InputStreamReader(in)); + @Before + public void setup() throws IOException{ + this.service = buildService(); + this.testCourse = CreateCourse.createCourse(); + createAlias(this.testCourse.getId()); + } - // Build flow and trigger user authorization request. - GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow.Builder(HTTP_TRANSPORT, - JSON_FACTORY, clientSecrets, SCOPES).setDataStoreFactory(DATA_STORE_FACTORY) - .setAccessType("offline").build(); - Credential credential = new AuthorizationCodeInstalledApp(flow, new LocalServerReceiver()) - .authorize("user"); - return credential; + @After + public void tearDown() throws IOException{ + deleteCourse(this.testCourse.getId()); + this.testCourse = null; } - /** - * Build and return an authorized Classroom client service. - * - * @return an authorized Classroom client service - * @throws IOException - */ - protected Classroom getService() throws IOException { - Credential credential = authorize(); - return new com.google.api.services.classroom.Classroom.Builder(HTTP_TRANSPORT, JSON_FACTORY, - credential).setApplicationName(APPLICATION_NAME).build(); + public CourseAlias createAlias(String courseId) throws IOException { + String alias = "p:" + UUID.randomUUID(); + CourseAlias courseAlias = new CourseAlias().setAlias(alias); + courseAlias = this.service.courses().aliases().create(courseId, courseAlias).execute(); + return courseAlias; } + + public void deleteCourse(String courseId) throws IOException { + this.service.courses().delete(courseId).execute(); + } } diff --git a/classroom/snippets/src/test/java/TestCreateCourse.java b/classroom/snippets/src/test/java/TestCreateCourse.java new file mode 100644 index 00000000..caa70281 --- /dev/null +++ b/classroom/snippets/src/test/java/TestCreateCourse.java @@ -0,0 +1,29 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import com.google.api.services.classroom.model.Course; +import org.junit.Assert; +import org.junit.Test; +import java.io.IOException; + +// Unit test class for Create Course classroom snippet +public class TestCreateCourse extends BaseTest{ + + @Test + public void testCreateCourse() throws IOException{ + Course course = CreateCourse.createCourse(); + Assert.assertNotNull("Course not returned.", course); + deleteCourse(course.getId()); + } +} diff --git a/classroom/snippets/src/test/java/TestGetCourse.java b/classroom/snippets/src/test/java/TestGetCourse.java new file mode 100644 index 00000000..a17cf197 --- /dev/null +++ b/classroom/snippets/src/test/java/TestGetCourse.java @@ -0,0 +1,29 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import com.google.api.services.classroom.model.Course; +import org.junit.Assert; +import org.junit.Test; +import java.io.IOException; + +// Unit test class for Get Course classroom snippet +public class TestGetCourse extends BaseTest{ + + @Test + public void testGetCourse() throws IOException { + Course course = GetCourse.getCourse(testCourse.getId()); + Assert.assertNotNull("Course not returned.", course); + Assert.assertEquals("Wrong course returned.", testCourse.getId(), course.getId()); + } +} diff --git a/classroom/snippets/src/test/java/TestListCourses.java b/classroom/snippets/src/test/java/TestListCourses.java new file mode 100644 index 00000000..55a3a1fc --- /dev/null +++ b/classroom/snippets/src/test/java/TestListCourses.java @@ -0,0 +1,29 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import com.google.api.services.classroom.model.Course; +import org.junit.Assert; +import org.junit.Test; +import java.io.IOException; +import java.util.List; + +// Unit test class for List Course classroom snippet +public class TestListCourses { + + @Test + public void testListCourses() throws IOException { + List courses = ListCourses.listCourses(); + Assert.assertTrue("No courses returned.", courses.size() > 0); + } +} diff --git a/classroom/snippets/src/test/java/TestPatchCourse.java b/classroom/snippets/src/test/java/TestPatchCourse.java new file mode 100644 index 00000000..3cf341c8 --- /dev/null +++ b/classroom/snippets/src/test/java/TestPatchCourse.java @@ -0,0 +1,29 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import com.google.api.services.classroom.model.Course; +import org.junit.Assert; +import org.junit.Test; +import java.io.IOException; + +// Unit test class for Patch Course classroom snippet +public class TestPatchCourse extends BaseTest{ + + @Test + public void testPatchCourse() throws IOException { + Course course = PatchCourse.patchCourse(testCourse.getId()); + Assert.assertNotNull("Course not returned.", course); + Assert.assertEquals("Wrong course returned.", testCourse.getId(), course.getId()); + } +} diff --git a/classroom/snippets/src/test/java/TestUpdateCourse.java b/classroom/snippets/src/test/java/TestUpdateCourse.java new file mode 100644 index 00000000..3926443e --- /dev/null +++ b/classroom/snippets/src/test/java/TestUpdateCourse.java @@ -0,0 +1,29 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import com.google.api.services.classroom.model.Course; +import org.junit.Assert; +import org.junit.Test; +import java.io.IOException; + +// Unit test class for Update Course classroom snippet +public class TestUpdateCourse extends BaseTest{ + + @Test + public void testUpdateCourse() throws IOException { + Course course = UpdateCourse.updateCourse(testCourse.getId()); + Assert.assertNotNull("Course not returned.", course); + Assert.assertEquals("Wrong course returned.", testCourse.getId(), course.getId()); + } +} From 3f49c5a9f5f01ffdc8ea9b9ca03015cb7888c2b2 Mon Sep 17 00:00:00 2001 From: Rajesh Mudaliyar Date: Wed, 25 May 2022 13:02:22 -0700 Subject: [PATCH 092/262] Drive-v2: file snippets patch-2 UnitTest (#222) * git-on-borg files of gmail-api-snippets * Update build.gradle test12 * Update build.gradle * Drive-v2: file snippets patch-2 UnitTest Co-authored-by: sanjuktaghosh7 Co-authored-by: Manvendra-P-Singh --- .../drive_v2/src/main/java/CreateShortcut.java | 3 ++- .../drive_v2/src/main/java/TouchFile.java | 2 +- .../drive_v2/src/main/java/UploadToFolder.java | 2 +- .../src/test/java/TestCreateShortcut.java | 15 +++++++++++++++ .../drive_v2/src/test/java/TestTouchFile.java | 16 ++++++++++++++++ .../src/test/java/TestUploadToFolder.java | 18 ++++++++++++++++++ 6 files changed, 53 insertions(+), 3 deletions(-) create mode 100644 drive/snippets/drive_v2/src/test/java/TestCreateShortcut.java create mode 100644 drive/snippets/drive_v2/src/test/java/TestTouchFile.java create mode 100644 drive/snippets/drive_v2/src/test/java/TestUploadToFolder.java diff --git a/drive/snippets/drive_v2/src/main/java/CreateShortcut.java b/drive/snippets/drive_v2/src/main/java/CreateShortcut.java index 9e02dc20..35393483 100644 --- a/drive/snippets/drive_v2/src/main/java/CreateShortcut.java +++ b/drive/snippets/drive_v2/src/main/java/CreateShortcut.java @@ -34,7 +34,7 @@ public class CreateShortcut { * Creates shortcut for file. * @throws IOException if service account credentials file not found. */ - private static void createShortcut() throws IOException{ + public static String createShortcut() throws IOException{ /* Load pre-authorized user credentials from the environment. TODO(developer) - See https://developers.google.com/identity for guides on implementing OAuth2 for your application.*/ @@ -57,6 +57,7 @@ private static void createShortcut() throws IOException{ .setFields("id") .execute(); System.out.println("File ID: " + file.getId()); + return file.getId(); }catch (GoogleJsonResponseException e) { // TODO(developer) - handle error appropriately System.err.println("Unable to create shortcut: " + e.getDetails()); diff --git a/drive/snippets/drive_v2/src/main/java/TouchFile.java b/drive/snippets/drive_v2/src/main/java/TouchFile.java index 4a9e56e0..31ee8f82 100644 --- a/drive/snippets/drive_v2/src/main/java/TouchFile.java +++ b/drive/snippets/drive_v2/src/main/java/TouchFile.java @@ -38,7 +38,7 @@ public class TouchFile { * @return long file's latest modification date value. * @throws IOException if service account credentials file not found. * */ - private static long touchFile(String realFileId, long realTimestamp) + public static long touchFile(String realFileId, long realTimestamp) throws IOException { /*Load pre-authorized user credentials from the environment. TODO(developer) - See https://developers.google.com/identity for diff --git a/drive/snippets/drive_v2/src/main/java/UploadToFolder.java b/drive/snippets/drive_v2/src/main/java/UploadToFolder.java index 6348be81..ac0f156d 100644 --- a/drive/snippets/drive_v2/src/main/java/UploadToFolder.java +++ b/drive/snippets/drive_v2/src/main/java/UploadToFolder.java @@ -38,7 +38,7 @@ public class UploadToFolder { * @return Inserted file metadata if successful, {@code null} otherwise. * @throws IOException if service account credentials file not found. */ - private static File uploadToFolder(String realFolderId) throws IOException { + public static File uploadToFolder(String realFolderId) throws IOException { // Load pre-authorized user credentials from the environment. // TODO(developer) - See https://developers.google.com/identity for // guides on implementing OAuth2 for your application. diff --git a/drive/snippets/drive_v2/src/test/java/TestCreateShortcut.java b/drive/snippets/drive_v2/src/test/java/TestCreateShortcut.java new file mode 100644 index 00000000..a9aec655 --- /dev/null +++ b/drive/snippets/drive_v2/src/test/java/TestCreateShortcut.java @@ -0,0 +1,15 @@ +import org.junit.Test; + +import java.io.IOException; +import java.security.GeneralSecurityException; + +import static org.junit.Assert.assertNotNull; + +public class TestCreateShortcut extends BaseTest{ + @Test + public void createShortcut() throws IOException, GeneralSecurityException { + String id = CreateShortcut.createShortcut(); + assertNotNull(id); + deleteFileOnCleanup(id); + } +} diff --git a/drive/snippets/drive_v2/src/test/java/TestTouchFile.java b/drive/snippets/drive_v2/src/test/java/TestTouchFile.java new file mode 100644 index 00000000..3280bcbb --- /dev/null +++ b/drive/snippets/drive_v2/src/test/java/TestTouchFile.java @@ -0,0 +1,16 @@ +import org.junit.Test; + +import java.io.IOException; +import java.security.GeneralSecurityException; + +import static org.junit.Assert.assertEquals; + +public class TestTouchFile extends BaseTest{ + @Test + public void touchFile() throws IOException, GeneralSecurityException { + String id = this.createTestBlob(); + long now = System.currentTimeMillis(); + long modifiedTime = TouchFile.touchFile(id, now); + assertEquals(now, modifiedTime); + } +} diff --git a/drive/snippets/drive_v2/src/test/java/TestUploadToFolder.java b/drive/snippets/drive_v2/src/test/java/TestUploadToFolder.java new file mode 100644 index 00000000..6dceb63b --- /dev/null +++ b/drive/snippets/drive_v2/src/test/java/TestUploadToFolder.java @@ -0,0 +1,18 @@ +import com.google.api.services.drive.model.File; +import org.junit.Test; + +import java.io.IOException; +import java.security.GeneralSecurityException; + +import static org.junit.Assert.assertTrue; + +public class TestUploadToFolder extends BaseTest { + @Test + public void uploadToFolder() throws IOException, GeneralSecurityException { + String folderId = CreateFolder.createFolder(); + File file = UploadToFolder.uploadToFolder(folderId); + assertTrue(file.getParents().get(0).getId().equals(folderId)); + deleteFileOnCleanup(file.getId()); + deleteFileOnCleanup(folderId); + } +} From 14da45bc2313f60e09a60ee46574c0fa89ab4656 Mon Sep 17 00:00:00 2001 From: Rajesh Mudaliyar Date: Wed, 25 May 2022 13:02:41 -0700 Subject: [PATCH 093/262] Drive-v2: file snippets patch-3 UnitTest (#223) * git-on-borg files of gmail-api-snippets * Update build.gradle test12 * Update build.gradle * Drive-v2: file snippets patch-3 UnitTest Co-authored-by: sanjuktaghosh7 Co-authored-by: Manvendra-P-Singh --- .../src/main/java/MoveFileToFolder.java | 2 +- .../src/main/java/UploadRevision.java | 2 +- .../src/test/java/TestMoveFileToFolder.java | 22 +++++++++++++++++++ .../src/test/java/TestUploadRevision.java | 18 +++++++++++++++ 4 files changed, 42 insertions(+), 2 deletions(-) create mode 100644 drive/snippets/drive_v2/src/test/java/TestMoveFileToFolder.java create mode 100644 drive/snippets/drive_v2/src/test/java/TestUploadRevision.java diff --git a/drive/snippets/drive_v2/src/main/java/MoveFileToFolder.java b/drive/snippets/drive_v2/src/main/java/MoveFileToFolder.java index 74b0df73..c45ba0e2 100644 --- a/drive/snippets/drive_v2/src/main/java/MoveFileToFolder.java +++ b/drive/snippets/drive_v2/src/main/java/MoveFileToFolder.java @@ -43,7 +43,7 @@ public class MoveFileToFolder { * @param folderId Id of folder where the fill will be moved. * @return list of parent ids for the file. * */ - private static List moveFileToFolder(String fileId, String folderId) + public static List moveFileToFolder(String fileId, String folderId) throws IOException { /* Load pre-authorized user credentials from the environment. TODO(developer) - See https://developers.google.com/identity for diff --git a/drive/snippets/drive_v2/src/main/java/UploadRevision.java b/drive/snippets/drive_v2/src/main/java/UploadRevision.java index 4f4af5a5..c9fccd93 100644 --- a/drive/snippets/drive_v2/src/main/java/UploadRevision.java +++ b/drive/snippets/drive_v2/src/main/java/UploadRevision.java @@ -37,7 +37,7 @@ public class UploadRevision { * @return Inserted file ID if successful, {@code null} otherwise. * @throws IOException if service account credentials file not found. */ - private static String uploadRevision(String realFileId) throws IOException{ + public static String uploadRevision(String realFileId) throws IOException{ // Load pre-authorized user credentials from the environment. // TODO(developer) - See https://developers.google.com/identity for // guides on implementing OAuth2 for your application. diff --git a/drive/snippets/drive_v2/src/test/java/TestMoveFileToFolder.java b/drive/snippets/drive_v2/src/test/java/TestMoveFileToFolder.java new file mode 100644 index 00000000..b563346d --- /dev/null +++ b/drive/snippets/drive_v2/src/test/java/TestMoveFileToFolder.java @@ -0,0 +1,22 @@ +import org.junit.Test; + +import java.io.IOException; +import java.security.GeneralSecurityException; +import java.util.List; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; + +public class TestMoveFileToFolder extends BaseTest{ + @Test + public void moveFileToFolder() + throws IOException, GeneralSecurityException { + String folderId = CreateFolder.createFolder(); + deleteFileOnCleanup(folderId); + String fileId = this.createTestBlob(); + List parents = MoveFileToFolder.moveFileToFolder(fileId, folderId); + assertEquals(1, parents.size()); + assertTrue(parents.contains(folderId)); + } + +} diff --git a/drive/snippets/drive_v2/src/test/java/TestUploadRevision.java b/drive/snippets/drive_v2/src/test/java/TestUploadRevision.java new file mode 100644 index 00000000..77682baa --- /dev/null +++ b/drive/snippets/drive_v2/src/test/java/TestUploadRevision.java @@ -0,0 +1,18 @@ +import org.junit.Test; + +import java.io.IOException; +import java.security.GeneralSecurityException; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; + +public class TestUploadRevision extends BaseTest{ + @Test + public void uploadRevision() throws IOException, GeneralSecurityException { + String id = UploadBasic.uploadBasic(); + assertNotNull(id); + deleteFileOnCleanup(id); + String id2 = UploadRevision.uploadRevision(id); + assertEquals(id, id2); + } +} From bca85648e1e2d47d794145325c4025be5061acf2 Mon Sep 17 00:00:00 2001 From: Rajesh Mudaliyar Date: Wed, 25 May 2022 13:03:14 -0700 Subject: [PATCH 094/262] Drive-v2: file snippets patch-4 UnitTest (#224) * git-on-borg files of gmail-api-snippets * Update build.gradle test12 * Update build.gradle * Drive-v2: file snippets patch-4 UnitTest Co-authored-by: sanjuktaghosh7 Co-authored-by: Manvendra-P-Singh --- .../drive_v2/src/main/java/ExportPdf.java | 2 +- .../src/main/java/UploadWithConversion.java | 2 +- .../drive_v2/src/test/java/TestExportPdf.java | 16 ++++++++++++++++ .../src/test/java/TestUploadWithConversion.java | 16 ++++++++++++++++ 4 files changed, 34 insertions(+), 2 deletions(-) create mode 100644 drive/snippets/drive_v2/src/test/java/TestExportPdf.java create mode 100644 drive/snippets/drive_v2/src/test/java/TestUploadWithConversion.java diff --git a/drive/snippets/drive_v2/src/main/java/ExportPdf.java b/drive/snippets/drive_v2/src/main/java/ExportPdf.java index fbc5f047..16d86539 100644 --- a/drive/snippets/drive_v2/src/main/java/ExportPdf.java +++ b/drive/snippets/drive_v2/src/main/java/ExportPdf.java @@ -37,7 +37,7 @@ public class ExportPdf { * @return byte array stream if successful, {@code null} otherwise. * @throws IOException if service account credentials file not found. */ - private static ByteArrayOutputStream exportPdf(String realFileId) throws IOException{ + public static ByteArrayOutputStream exportPdf(String realFileId) throws IOException{ // Load pre-authorized user credentials from the environment. // TODO(developer) - See https://developers.google.com/identity for // guides on implementing OAuth2 for your application. diff --git a/drive/snippets/drive_v2/src/main/java/UploadWithConversion.java b/drive/snippets/drive_v2/src/main/java/UploadWithConversion.java index 52cab884..36602e10 100644 --- a/drive/snippets/drive_v2/src/main/java/UploadWithConversion.java +++ b/drive/snippets/drive_v2/src/main/java/UploadWithConversion.java @@ -37,7 +37,7 @@ public class UploadWithConversion { * @return Inserted file id if successful, {@code null} otherwise. * @throws IOException if service account credentials file not found. */ - private static String uploadWithConversion() throws IOException { + public static String uploadWithConversion() throws IOException { // Load pre-authorized user credentials from the environment. // TODO(developer) - See https://developers.google.com/identity for // guides on implementing OAuth2 for your application. diff --git a/drive/snippets/drive_v2/src/test/java/TestExportPdf.java b/drive/snippets/drive_v2/src/test/java/TestExportPdf.java new file mode 100644 index 00000000..f8741feb --- /dev/null +++ b/drive/snippets/drive_v2/src/test/java/TestExportPdf.java @@ -0,0 +1,16 @@ +import org.junit.Test; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.security.GeneralSecurityException; + +import static org.junit.Assert.assertEquals; + +public class TestExportPdf extends BaseTest{ + @Test + public void exportPdf() throws IOException, GeneralSecurityException { + String id = createTestDocument(); + ByteArrayOutputStream out = ExportPdf.exportPdf(id); + assertEquals("%PDF", out.toString("UTF-8").substring(0, 4)); + } +} diff --git a/drive/snippets/drive_v2/src/test/java/TestUploadWithConversion.java b/drive/snippets/drive_v2/src/test/java/TestUploadWithConversion.java new file mode 100644 index 00000000..a3d69c52 --- /dev/null +++ b/drive/snippets/drive_v2/src/test/java/TestUploadWithConversion.java @@ -0,0 +1,16 @@ +import org.junit.Test; + +import java.io.IOException; +import java.security.GeneralSecurityException; + +import static org.junit.Assert.assertNotNull; + +public class TestUploadWithConversion extends BaseTest{ + @Test + public void uploadWithConversion() + throws IOException, GeneralSecurityException { + String id = UploadWithConversion.uploadWithConversion(); + assertNotNull(id); + deleteFileOnCleanup(id); + } +} From 454a5d887f7ce105d4438eebe5ae19d266ba7d3a Mon Sep 17 00:00:00 2001 From: Rajesh Mudaliyar Date: Wed, 25 May 2022 13:03:38 -0700 Subject: [PATCH 095/262] Drive-v2: file snippets patch-5 UnitTest (#225) * git-on-borg files of gmail-api-snippets * Update build.gradle test12 * Update build.gradle * Drive-v2: file snippets patch-5 UnitTest Co-authored-by: sanjuktaghosh7 Co-authored-by: Manvendra-P-Singh --- .../drive_v2/src/main/java/DownloadFile.java | 2 +- .../drive_v2/src/main/java/SearchFile.java | 2 +- .../drive_v2/src/main/java/ShareFile.java | 2 +- .../src/test/java/TestDownloadFile.java | 18 ++++++++++++++++++ .../src/test/java/TestSearchFiles.java | 18 ++++++++++++++++++ .../drive_v2/src/test/java/TestShareFile.java | 17 +++++++++++++++++ 6 files changed, 56 insertions(+), 3 deletions(-) create mode 100644 drive/snippets/drive_v2/src/test/java/TestDownloadFile.java create mode 100644 drive/snippets/drive_v2/src/test/java/TestSearchFiles.java create mode 100644 drive/snippets/drive_v2/src/test/java/TestShareFile.java diff --git a/drive/snippets/drive_v2/src/main/java/DownloadFile.java b/drive/snippets/drive_v2/src/main/java/DownloadFile.java index 8cf14a80..0931acc5 100644 --- a/drive/snippets/drive_v2/src/main/java/DownloadFile.java +++ b/drive/snippets/drive_v2/src/main/java/DownloadFile.java @@ -37,7 +37,7 @@ public class DownloadFile { * @return byte array stream if successful, {@code null} otherwise. * @throws IOException if service account credentials file not found. */ - private static ByteArrayOutputStream downloadFile(String realFileId) throws IOException{ + public static ByteArrayOutputStream downloadFile(String realFileId) throws IOException{ /* Load pre-authorized user credentials from the environment. TODO(developer) - See https://developers.google.com/identity for guides on implementing OAuth2 for your application.*/ diff --git a/drive/snippets/drive_v2/src/main/java/SearchFile.java b/drive/snippets/drive_v2/src/main/java/SearchFile.java index bc6a3989..242c575b 100644 --- a/drive/snippets/drive_v2/src/main/java/SearchFile.java +++ b/drive/snippets/drive_v2/src/main/java/SearchFile.java @@ -37,7 +37,7 @@ public class SearchFile { * @return search result list. * @throws IOException if service account credentials file not found. */ - private static List searchFile() throws IOException{ + public static List searchFile() throws IOException{ /*Load pre-authorized user credentials from the environment. TODO(developer) - See https://developers.google.com/identity for guides on implementing OAuth2 for your application.*/ diff --git a/drive/snippets/drive_v2/src/main/java/ShareFile.java b/drive/snippets/drive_v2/src/main/java/ShareFile.java index a78e6baa..1b423722 100644 --- a/drive/snippets/drive_v2/src/main/java/ShareFile.java +++ b/drive/snippets/drive_v2/src/main/java/ShareFile.java @@ -44,7 +44,7 @@ public class ShareFile { * @return list of modified permissions if successful, {@code null} otherwise. * @throws IOException if service account credentials file not found. */ - private static List shareFile(String realFileId, String realUser, String realDomain) throws IOException{ + public static List shareFile(String realFileId, String realUser, String realDomain) throws IOException{ /* Load pre-authorized user credentials from the environment. TODO(developer) - See https://developers.google.com/identity for guides on implementing OAuth2 for your application.application*/ diff --git a/drive/snippets/drive_v2/src/test/java/TestDownloadFile.java b/drive/snippets/drive_v2/src/test/java/TestDownloadFile.java new file mode 100644 index 00000000..2c4806f6 --- /dev/null +++ b/drive/snippets/drive_v2/src/test/java/TestDownloadFile.java @@ -0,0 +1,18 @@ +import org.junit.Test; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.security.GeneralSecurityException; + +import static org.junit.Assert.assertEquals; + +public class TestDownloadFile extends BaseTest{ + @Test + public void downloadFile() throws IOException, GeneralSecurityException { + String id = createTestBlob(); + ByteArrayOutputStream out = DownloadFile.downloadFile(id); + byte[] bytes = out.toByteArray(); + assertEquals((byte) 0xFF, bytes[0]); + assertEquals((byte) 0xD8, bytes[1]); + } +} diff --git a/drive/snippets/drive_v2/src/test/java/TestSearchFiles.java b/drive/snippets/drive_v2/src/test/java/TestSearchFiles.java new file mode 100644 index 00000000..48a8b818 --- /dev/null +++ b/drive/snippets/drive_v2/src/test/java/TestSearchFiles.java @@ -0,0 +1,18 @@ +import com.google.api.services.drive.model.File; +import org.junit.Test; + +import java.io.IOException; +import java.security.GeneralSecurityException; +import java.util.List; + +import static org.junit.Assert.assertNotEquals; + +public class TestSearchFiles extends BaseTest{ + @Test + public void searchFiles() + throws IOException, GeneralSecurityException { + this.createTestBlob(); + List files = SearchFile.searchFile(); + assertNotEquals(0, files.size()); + } +} diff --git a/drive/snippets/drive_v2/src/test/java/TestShareFile.java b/drive/snippets/drive_v2/src/test/java/TestShareFile.java new file mode 100644 index 00000000..746ef71a --- /dev/null +++ b/drive/snippets/drive_v2/src/test/java/TestShareFile.java @@ -0,0 +1,17 @@ +import org.junit.Test; + +import java.io.IOException; +import java.util.List; + +import static org.junit.Assert.assertEquals; + +public class TestShareFile extends BaseTest{ + @Test + public void shareFile() throws IOException { + String fileId = this.createTestBlob(); + List ids = ShareFile.shareFile(fileId, + "user@test.appsdevtesting.com", + "test.appsdevtesting.com"); + assertEquals(2, ids.size()); + } +} From 1a78adfa6239aacb562a09f56f7472eaf5023465 Mon Sep 17 00:00:00 2001 From: Rajesh Mudaliyar Date: Wed, 25 May 2022 13:04:01 -0700 Subject: [PATCH 096/262] Drive-v2: AppData snippets UnitTest (#226) * git-on-borg files of gmail-api-snippets * Update build.gradle test12 * Update build.gradle * Drive-v2: AppData snippets UnitTest Co-authored-by: sanjuktaghosh7 Co-authored-by: Manvendra-P-Singh --- .../src/main/java/FetchAppDataFolder.java | 2 +- .../drive_v3/src/main/java/ListAppData.java | 2 +- .../drive_v3/src/main/java/UploadAppData.java | 2 +- .../src/test/java/TestFetchAppDataFolder.java | 14 ++++++++++++++ .../drive_v3/src/test/java/TestListAppData.java | 17 +++++++++++++++++ .../src/test/java/TestUploadAppdata.java | 16 ++++++++++++++++ 6 files changed, 50 insertions(+), 3 deletions(-) create mode 100644 drive/snippets/drive_v3/src/test/java/TestFetchAppDataFolder.java create mode 100644 drive/snippets/drive_v3/src/test/java/TestListAppData.java create mode 100644 drive/snippets/drive_v3/src/test/java/TestUploadAppdata.java diff --git a/drive/snippets/drive_v3/src/main/java/FetchAppDataFolder.java b/drive/snippets/drive_v3/src/main/java/FetchAppDataFolder.java index 4f3a00b2..dd00bdf4 100644 --- a/drive/snippets/drive_v3/src/main/java/FetchAppDataFolder.java +++ b/drive/snippets/drive_v3/src/main/java/FetchAppDataFolder.java @@ -33,7 +33,7 @@ public class FetchAppDataFolder { * Fetches appDataFolder and prints it's folder id. * @return Application data folder's ID. */ - public String fetchAppDataFolder() throws IOException { + public static String fetchAppDataFolder() throws IOException { /*Load pre-authorized user credentials from the environment. TODO(developer) - See https://developers.google.com/identity for guides on implementing OAuth2 for your application.*/ diff --git a/drive/snippets/drive_v3/src/main/java/ListAppData.java b/drive/snippets/drive_v3/src/main/java/ListAppData.java index f9023fd8..1f611d3c 100644 --- a/drive/snippets/drive_v3/src/main/java/ListAppData.java +++ b/drive/snippets/drive_v3/src/main/java/ListAppData.java @@ -34,7 +34,7 @@ public class ListAppData { * list down files in the application data folder. * @return list of 10 files. */ - public FileList listAppData() throws IOException { + public static FileList listAppData() throws IOException { /*Load pre-authorized user credentials from the environment. TODO(developer) - See https://developers.google.com/identity for guides on implementing OAuth2 for your application.*/ diff --git a/drive/snippets/drive_v3/src/main/java/UploadAppData.java b/drive/snippets/drive_v3/src/main/java/UploadAppData.java index 7aac8c0b..8192f009 100644 --- a/drive/snippets/drive_v3/src/main/java/UploadAppData.java +++ b/drive/snippets/drive_v3/src/main/java/UploadAppData.java @@ -35,7 +35,7 @@ public class UploadAppData { * Creates a file in the application data folder. * @return Created file's Id. */ - private static String uploadAppData() throws IOException { + public static String uploadAppData() throws IOException { /*Load pre-authorized user credentials from the environment. TODO(developer) - See https://developers.google.com/identity for guides on implementing OAuth2 for your application.*/ diff --git a/drive/snippets/drive_v3/src/test/java/TestFetchAppDataFolder.java b/drive/snippets/drive_v3/src/test/java/TestFetchAppDataFolder.java new file mode 100644 index 00000000..4049e5f6 --- /dev/null +++ b/drive/snippets/drive_v3/src/test/java/TestFetchAppDataFolder.java @@ -0,0 +1,14 @@ +import org.junit.Test; + +import java.io.IOException; +import java.security.GeneralSecurityException; + +import static org.junit.Assert.assertNotNull; + +public class TestFetchAppDataFolder { + @Test + public void fetchAppDataFolder() throws IOException, GeneralSecurityException { + String id = FetchAppDataFolder.fetchAppDataFolder(); + assertNotNull(id); + } +} diff --git a/drive/snippets/drive_v3/src/test/java/TestListAppData.java b/drive/snippets/drive_v3/src/test/java/TestListAppData.java new file mode 100644 index 00000000..52544bfd --- /dev/null +++ b/drive/snippets/drive_v3/src/test/java/TestListAppData.java @@ -0,0 +1,17 @@ +import com.google.api.services.drive.model.FileList; +import org.junit.Test; + +import java.io.IOException; +import java.security.GeneralSecurityException; + +import static org.junit.Assert.assertNotEquals; + +public class TestListAppData extends BaseTest{ + @Test + public void listAppData() throws IOException, GeneralSecurityException { + String id = UploadAppData.uploadAppData(); + deleteFileOnCleanup(id); + FileList files = ListAppData.listAppData(); + assertNotEquals(0, files.getFiles().size()); + } +} diff --git a/drive/snippets/drive_v3/src/test/java/TestUploadAppdata.java b/drive/snippets/drive_v3/src/test/java/TestUploadAppdata.java new file mode 100644 index 00000000..67e2d13c --- /dev/null +++ b/drive/snippets/drive_v3/src/test/java/TestUploadAppdata.java @@ -0,0 +1,16 @@ +import org.junit.Test; + +import java.io.IOException; +import java.security.GeneralSecurityException; + +import static org.junit.Assert.assertNotNull; + +public class TestUploadAppdata extends BaseTest{ + @Test + public void uploadAppData() + throws IOException, GeneralSecurityException { + String id = UploadAppData.uploadAppData(); + assertNotNull(id); + deleteFileOnCleanup(id); + } +} From 50ce84b406943f91b42c29312eec09351b98f5fe Mon Sep 17 00:00:00 2001 From: Rajesh Mudaliyar Date: Tue, 31 May 2022 15:24:28 -0700 Subject: [PATCH 097/262] Test drive v2 change snippets (#229) * git-on-borg files of gmail-api-snippets * Update build.gradle test12 * Update build.gradle * Drive-v2: Change snippets UnitTest Co-authored-by: sanjuktaghosh7 Co-authored-by: Manvendra-P-Singh --- .../drive_v2/src/main/java/FetchChanges.java | 2 +- .../src/main/java/FetchStartPageToken.java | 2 +- .../src/test/java/TestFetchChanges.java | 17 +++++++++++++++++ .../src/test/java/TestFetchStartPageToken.java | 13 +++++++++++++ 4 files changed, 32 insertions(+), 2 deletions(-) create mode 100644 drive/snippets/drive_v2/src/test/java/TestFetchChanges.java create mode 100644 drive/snippets/drive_v2/src/test/java/TestFetchStartPageToken.java diff --git a/drive/snippets/drive_v2/src/main/java/FetchChanges.java b/drive/snippets/drive_v2/src/main/java/FetchChanges.java index deafc9d1..3ff6e584 100644 --- a/drive/snippets/drive_v2/src/main/java/FetchChanges.java +++ b/drive/snippets/drive_v2/src/main/java/FetchChanges.java @@ -35,7 +35,7 @@ public class FetchChanges { * @return Saved token after last page. * @throws IOException if file is not found */ - private static String fetchChanges(String savedStartPageToken) throws IOException { + public static String fetchChanges(String savedStartPageToken) throws IOException { /*Load pre-authorized user credentials from the environment. TODO(developer) - See https://developers.google.com/identity for diff --git a/drive/snippets/drive_v2/src/main/java/FetchStartPageToken.java b/drive/snippets/drive_v2/src/main/java/FetchStartPageToken.java index 060cccd7..c77419a6 100644 --- a/drive/snippets/drive_v2/src/main/java/FetchStartPageToken.java +++ b/drive/snippets/drive_v2/src/main/java/FetchStartPageToken.java @@ -35,7 +35,7 @@ public class FetchStartPageToken { * @return Start page token as String. * @throws IOException if file is not found */ - private static String fetchStartPageToken() throws IOException { + public static String fetchStartPageToken() throws IOException { /*Load pre-authorized user credentials from the environment. TODO(developer) - See https://developers.google.com/identity for guides on implementing OAuth2 for your application. */ diff --git a/drive/snippets/drive_v2/src/test/java/TestFetchChanges.java b/drive/snippets/drive_v2/src/test/java/TestFetchChanges.java new file mode 100644 index 00000000..b5a60ee3 --- /dev/null +++ b/drive/snippets/drive_v2/src/test/java/TestFetchChanges.java @@ -0,0 +1,17 @@ +import org.junit.Test; + +import java.io.IOException; + +import static org.junit.Assert.assertNotEquals; +import static org.junit.Assert.assertNotNull; + +public class TestFetchChanges extends BaseTest{ + @Test + public void fetchChanges() throws IOException { + String startPageToken = FetchStartPageToken.fetchStartPageToken(); + this.createTestBlob(); + String newStartPageToken = FetchChanges.fetchChanges(startPageToken); + assertNotNull(newStartPageToken); + assertNotEquals(startPageToken, newStartPageToken); + } +} diff --git a/drive/snippets/drive_v2/src/test/java/TestFetchStartPageToken.java b/drive/snippets/drive_v2/src/test/java/TestFetchStartPageToken.java new file mode 100644 index 00000000..701ee971 --- /dev/null +++ b/drive/snippets/drive_v2/src/test/java/TestFetchStartPageToken.java @@ -0,0 +1,13 @@ +import org.junit.Test; + +import java.io.IOException; + +import static org.junit.Assert.assertNotNull; + +public class TestFetchStartPageToken extends BaseTest{ + @Test + public void fetchStartPageToken() throws IOException { + String token = FetchStartPageToken.fetchStartPageToken(); + assertNotNull(token); + } +} From 461d14725c396672ce69a11b10bc8c35bad90c44 Mon Sep 17 00:00:00 2001 From: Rajesh Mudaliyar Date: Tue, 31 May 2022 15:25:10 -0700 Subject: [PATCH 098/262] Sheets testcase (#228) * git-on-borg files of gmail-api-snippets * Update build.gradle test12 * Update build.gradle * Sheets unit testcase * Sheets unit testcase * Update Co-authored-by: sanjuktaghosh7 Co-authored-by: Manvendra-P-Singh --- sheets/snippets/build.gradle | 6 +- sheets/snippets/src/main/java/Create.java | 2 +- .../src/main/java/SpreadsheetSnippets.java | 297 ------------------ sheets/snippets/src/test/java/BaseTest.java | 108 ++----- .../test/java/SpreadsheetSnippetsTest.java | 121 ------- .../src/test/java/TestAppendValues.java | 42 +++ .../src/test/java/TestBatchGetValues.java | 39 +++ .../src/test/java/TestBatchUpdate.java | 37 +++ .../src/test/java/TestBatchUpdateValues.java | 40 +++ .../test/java/TestConditionalFormatting.java | 33 ++ sheets/snippets/src/test/java/TestCreate.java | 28 ++ .../snippets/src/test/java/TestGetValues.java | 34 ++ .../src/test/java/TestPivotTable.java | 16 + .../src/test/java/TestUpdateValues.java | 38 +++ 14 files changed, 336 insertions(+), 505 deletions(-) delete mode 100644 sheets/snippets/src/main/java/SpreadsheetSnippets.java delete mode 100644 sheets/snippets/src/test/java/SpreadsheetSnippetsTest.java create mode 100644 sheets/snippets/src/test/java/TestAppendValues.java create mode 100644 sheets/snippets/src/test/java/TestBatchGetValues.java create mode 100644 sheets/snippets/src/test/java/TestBatchUpdate.java create mode 100644 sheets/snippets/src/test/java/TestBatchUpdateValues.java create mode 100644 sheets/snippets/src/test/java/TestConditionalFormatting.java create mode 100644 sheets/snippets/src/test/java/TestCreate.java create mode 100644 sheets/snippets/src/test/java/TestGetValues.java create mode 100644 sheets/snippets/src/test/java/TestPivotTable.java create mode 100644 sheets/snippets/src/test/java/TestUpdateValues.java diff --git a/sheets/snippets/build.gradle b/sheets/snippets/build.gradle index 56829c60..6988f011 100644 --- a/sheets/snippets/build.gradle +++ b/sheets/snippets/build.gradle @@ -5,9 +5,9 @@ repositories { } dependencies { - implementation 'com.google.auth:google-auth-library-oauth2-http:1.3.0' - implementation 'com.google.apis:google-api-services-drive:v3-rev20211107-1.32.1' - implementation 'com.google.apis:google-api-services-sheets:v4-rev20210629-1.32.1' + implementation 'com.google.auth:google-auth-library-oauth2-http:1.6.0' + implementation 'com.google.apis:google-api-services-drive:v3-rev20220508-1.32.1' + implementation 'com.google.apis:google-api-services-sheets:v4-rev20220411-1.32.1' testImplementation 'junit:junit:4.13.2' } diff --git a/sheets/snippets/src/main/java/Create.java b/sheets/snippets/src/main/java/Create.java index 19060bba..bf4e0c6b 100644 --- a/sheets/snippets/src/main/java/Create.java +++ b/sheets/snippets/src/main/java/Create.java @@ -36,7 +36,7 @@ public class Create { * @return newly created spreadsheet id * @throws IOException - if credentials file not found. */ - public static String create(String title) throws IOException { + public static String createSpreadsheet(String title) throws IOException { /* Load pre-authorized user credentials from the environment. TODO(developer) - See https://developers.google.com/identity for guides on implementing OAuth2 for your application. */ diff --git a/sheets/snippets/src/main/java/SpreadsheetSnippets.java b/sheets/snippets/src/main/java/SpreadsheetSnippets.java deleted file mode 100644 index 9b37346f..00000000 --- a/sheets/snippets/src/main/java/SpreadsheetSnippets.java +++ /dev/null @@ -1,297 +0,0 @@ -import com.google.api.services.sheets.v4.Sheets; -import com.google.api.services.sheets.v4.model.*; -import com.google.common.collect.Lists; - -import java.io.IOException; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.List; - -public class SpreadsheetSnippets { - private Sheets service; - - public SpreadsheetSnippets(Sheets service) { - this.service = service; - } - - public String create(String title) throws IOException { - Sheets service = this.service; - // [START sheets_create] - Spreadsheet spreadsheet = new Spreadsheet() - .setProperties(new SpreadsheetProperties() - .setTitle(title)); - spreadsheet = service.spreadsheets().create(spreadsheet) - .setFields("spreadsheetId") - .execute(); - System.out.println("Spreadsheet ID: " + spreadsheet.getSpreadsheetId()); - // [END sheets_create] - return spreadsheet.getSpreadsheetId(); - } - - public BatchUpdateSpreadsheetResponse batchUpdate(String spreadsheetId, String title, - String find, String replacement) - throws IOException { - Sheets service = this.service; - // [START sheets_batch_update] - List requests = new ArrayList<>(); - // Change the spreadsheet's title. - requests.add(new Request() - .setUpdateSpreadsheetProperties(new UpdateSpreadsheetPropertiesRequest() - .setProperties(new SpreadsheetProperties() - .setTitle(title)) - .setFields("title"))); - // Find and replace text. - requests.add(new Request() - .setFindReplace(new FindReplaceRequest() - .setFind(find) - .setReplacement(replacement) - .setAllSheets(true))); - // Add additional requests (operations) ... - - BatchUpdateSpreadsheetRequest body = - new BatchUpdateSpreadsheetRequest().setRequests(requests); - BatchUpdateSpreadsheetResponse response = - service.spreadsheets().batchUpdate(spreadsheetId, body).execute(); - FindReplaceResponse findReplaceResponse = response.getReplies().get(1).getFindReplace(); - System.out.printf("%d replacements made.", findReplaceResponse.getOccurrencesChanged()); - // [END sheets_batch_update] - return response; - } - - public ValueRange getValues(String spreadsheetId, String range) throws IOException { - Sheets service = this.service; - // [START sheets_get_values] - ValueRange result = service.spreadsheets().values().get(spreadsheetId, range).execute(); - int numRows = result.getValues() != null ? result.getValues().size() : 0; - System.out.printf("%d rows retrieved.", numRows); - // [END sheets_get_values] - return result; - } - - public BatchGetValuesResponse batchGetValues(String spreadsheetId, List _ranges) - throws IOException { - Sheets service = this.service; - // [START sheets_batch_get_values] - List ranges = Arrays.asList( - //Range names ... - ); - // [START_EXCLUDE silent] - ranges = _ranges; - // [END_EXCLUDE] - BatchGetValuesResponse result = service.spreadsheets().values().batchGet(spreadsheetId) - .setRanges(ranges).execute(); - System.out.printf("%d ranges retrieved.", result.getValueRanges().size()); - // [END sheets_batch_get_values] - return result; - } - public UpdateValuesResponse updateValues(String spreadsheetId, String range, - String valueInputOption, List> _values) - throws IOException { - Sheets service = this.service; - // [START sheets_update_values] - List> values = Arrays.asList( - Arrays.asList( - // Cell values ... - ) - // Additional rows ... - ); - // [START_EXCLUDE silent] - values = _values; - // [END_EXCLUDE] - ValueRange body = new ValueRange() - .setValues(values); - UpdateValuesResponse result = - service.spreadsheets().values().update(spreadsheetId, range, body) - .setValueInputOption(valueInputOption) - .execute(); - System.out.printf("%d cells updated.", result.getUpdatedCells()); - // [END sheets_update_values] - return result; - } - - public BatchUpdateValuesResponse batchUpdateValues(String spreadsheetId, String range, - String valueInputOption, - List> _values) - throws IOException { - Sheets service = this.service; - // [START sheets_batch_update_values] - List> values = Arrays.asList( - Arrays.asList( - // Cell values ... - ) - // Additional rows ... - ); - // [START_EXCLUDE silent] - values = _values; - // [END_EXCLUDE] - List data = new ArrayList<>(); - data.add(new ValueRange() - .setRange(range) - .setValues(values)); - // Additional ranges to update ... - - BatchUpdateValuesRequest body = new BatchUpdateValuesRequest() - .setValueInputOption(valueInputOption) - .setData(data); - BatchUpdateValuesResponse result = - service.spreadsheets().values().batchUpdate(spreadsheetId, body).execute(); - System.out.printf("%d cells updated.", result.getTotalUpdatedCells()); - // [END sheets_batch_update_values] - return result; - } - - public AppendValuesResponse appendValues(String spreadsheetId, String range, - String valueInputOption, List> _values) - throws IOException { - Sheets service = this.service; - // [START sheets_append_values] - List> values = Arrays.asList( - Arrays.asList( - // Cell values ... - ) - // Additional rows ... - ); - // [START_EXCLUDE silent] - values = _values; - // [END_EXCLUDE] - ValueRange body = new ValueRange() - .setValues(values); - AppendValuesResponse result = - service.spreadsheets().values().append(spreadsheetId, range, body) - .setValueInputOption(valueInputOption) - .execute(); - System.out.printf("%d cells appended.", result.getUpdates().getUpdatedCells()); - // [END sheets_append_values] - return result; - } - - public BatchUpdateSpreadsheetResponse pivotTables(String spreadsheetId) throws IOException { - Sheets service = this.service; - - // Create two sheets for our pivot table. - List sheetsRequests = new ArrayList<>(); - sheetsRequests.add(new Request().setAddSheet(new AddSheetRequest())); - sheetsRequests.add(new Request().setAddSheet(new AddSheetRequest())); - - BatchUpdateSpreadsheetRequest createSheetsBody = new BatchUpdateSpreadsheetRequest() - .setRequests(sheetsRequests); - BatchUpdateSpreadsheetResponse createSheetsResponse = service.spreadsheets() - .batchUpdate(spreadsheetId, createSheetsBody).execute(); - int sourceSheetId = createSheetsResponse.getReplies().get(0).getAddSheet().getProperties() - .getSheetId(); - int targetSheetId = createSheetsResponse.getReplies().get(1).getAddSheet().getProperties() - .getSheetId(); - - // [START sheets_pivot_tables] - PivotTable pivotTable = new PivotTable() - .setSource( - new GridRange() - .setSheetId(sourceSheetId) - .setStartRowIndex(0) - .setStartColumnIndex(0) - .setEndRowIndex(20) - .setEndColumnIndex(7) - ) - .setRows(Collections.singletonList( - new PivotGroup() - .setSourceColumnOffset(1) - .setShowTotals(true) - .setSortOrder("ASCENDING") - )) - .setColumns(Collections.singletonList( - new PivotGroup() - .setSourceColumnOffset(4) - .setShowTotals(true) - .setSortOrder("ASCENDING") - )) - .setValues(Collections.singletonList( - new PivotValue() - .setSummarizeFunction("COUNTA") - .setSourceColumnOffset(4) - )); - List requests = Lists.newArrayList(); - Request updateCellsRequest = new Request().setUpdateCells(new UpdateCellsRequest() - .setFields("*") - .setRows(Collections.singletonList( - new RowData().setValues( - Collections.singletonList( - new CellData().setPivotTable(pivotTable)) - ) - )) - .setStart(new GridCoordinate() - .setSheetId(targetSheetId) - .setRowIndex(0) - .setColumnIndex(0) - - )); - - requests.add(updateCellsRequest); - BatchUpdateSpreadsheetRequest updateCellsBody = new BatchUpdateSpreadsheetRequest() - .setRequests(requests); - BatchUpdateSpreadsheetResponse result = service.spreadsheets() - .batchUpdate(spreadsheetId, updateCellsBody).execute(); - // [END sheets_pivot_tables] - return result; - } - - public BatchUpdateSpreadsheetResponse conditionalFormat(String spreadsheetId) - throws IOException { - // [START sheets_conditional_formatting] - List ranges = Collections.singletonList(new GridRange() - .setSheetId(0) - .setStartRowIndex(1) - .setEndRowIndex(11) - .setStartColumnIndex(0) - .setEndColumnIndex(4) - ); - List requests = Arrays.asList( - new Request().setAddConditionalFormatRule(new AddConditionalFormatRuleRequest() - .setRule(new ConditionalFormatRule() - .setRanges(ranges) - .setBooleanRule(new BooleanRule() - .setCondition(new BooleanCondition() - .setType("CUSTOM_FORMULA") - .setValues(Collections.singletonList( - new ConditionValue().setUserEnteredValue( - "=GT($D2,median($D$2:$D$11))") - )) - ) - .setFormat(new CellFormat().setTextFormat( - new TextFormat().setForegroundColor( - new Color().setRed(0.8f)) - )) - ) - ) - .setIndex(0) - ), - new Request().setAddConditionalFormatRule(new AddConditionalFormatRuleRequest() - .setRule(new ConditionalFormatRule() - .setRanges(ranges) - .setBooleanRule(new BooleanRule() - .setCondition(new BooleanCondition() - .setType("CUSTOM_FORMULA") - .setValues(Collections.singletonList( - new ConditionValue().setUserEnteredValue( - "=LT($D2,median($D$2:$D$11))") - )) - ) - .setFormat(new CellFormat().setBackgroundColor( - new Color().setRed(1f).setGreen(0.4f).setBlue(0.4f) - )) - ) - ) - .setIndex(0) - ) - ); - - BatchUpdateSpreadsheetRequest body = new BatchUpdateSpreadsheetRequest() - .setRequests(requests); - BatchUpdateSpreadsheetResponse result = service.spreadsheets() - .batchUpdate(spreadsheetId, body) - .execute(); - System.out.printf("%d cells updated.", result.getReplies().size()); - // [END sheets_conditional_formatting] - return result; - } -} diff --git a/sheets/snippets/src/test/java/BaseTest.java b/sheets/snippets/src/test/java/BaseTest.java index 34ff8dad..12a1db27 100644 --- a/sheets/snippets/src/test/java/BaseTest.java +++ b/sheets/snippets/src/test/java/BaseTest.java @@ -1,120 +1,62 @@ -import com.google.api.client.googleapis.auth.oauth2.GoogleCredential; -import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport; -import com.google.api.client.http.HttpTransport; -import com.google.api.client.json.jackson2.JacksonFactory; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; import com.google.api.services.drive.Drive; -import com.google.api.services.drive.DriveScopes; import com.google.api.services.sheets.v4.Sheets; +import com.google.api.services.sheets.v4.SheetsScopes; import com.google.api.services.sheets.v4.model.BatchUpdateSpreadsheetRequest; import com.google.api.services.sheets.v4.model.CellData; import com.google.api.services.sheets.v4.model.ExtendedValue; import com.google.api.services.sheets.v4.model.GridRange; import com.google.api.services.sheets.v4.model.RepeatCellRequest; import com.google.api.services.sheets.v4.model.Request; -import com.google.api.services.sheets.v4.model.Spreadsheet; -import com.google.api.services.sheets.v4.model.SpreadsheetProperties; import java.io.IOException; -import java.security.GeneralSecurityException; import java.util.ArrayList; -import java.util.Arrays; -import java.util.HashSet; import java.util.List; -import java.util.Set; -import java.util.logging.Handler; -import java.util.logging.Level; -import java.util.logging.LogRecord; -import java.util.logging.Logger; -import org.junit.After; + +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; import org.junit.Before; public class BaseTest { - static { - enableLogging(); - } - protected Sheets service; protected Drive driveService; - protected Set filesToDelete = new HashSet<>(); - - public static void enableLogging() { - Logger logger = Logger.getLogger(HttpTransport.class.getName()); - logger.setLevel(Level.INFO); - logger.addHandler(new Handler() { - - @Override - public void close() throws SecurityException { - } - - @Override - public void flush() { - } - @Override - public void publish(LogRecord record) { - // default ConsoleHandler will print >= INFO to System.err - if (record.getLevel().intValue() < Level.INFO.intValue()) { - System.out.println(record.getMessage()); - } - } - }); + public GoogleCredentials getCredential() throws IOException { + /* Load pre-authorized user credentials from the environment. + TODO(developer) - See https://developers.google.com/identity for + guides on implementing OAuth2 for your application. */ + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(SheetsScopes.SPREADSHEETS,SheetsScopes.DRIVE); + return credentials; } - public GoogleCredential getCredential() throws IOException { - return GoogleCredential.getApplicationDefault() - .createScoped(Arrays.asList(DriveScopes.DRIVE)); - } - - public Sheets buildService(GoogleCredential credential) throws IOException, - GeneralSecurityException { + public Sheets buildService(GoogleCredentials credentials){ return new Sheets.Builder( - GoogleNetHttpTransport.newTrustedTransport(), - JacksonFactory.getDefaultInstance(), - credential) + new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + new HttpCredentialsAdapter(credentials)) .setApplicationName("Sheets API Snippets") .build(); } - public Drive buildDriveService(GoogleCredential credential) - throws IOException, GeneralSecurityException { + public Drive buildDriveService(GoogleCredentials credentials) { return new Drive.Builder( - GoogleNetHttpTransport.newTrustedTransport(), - JacksonFactory.getDefaultInstance(), - credential) + new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + new HttpCredentialsAdapter(credentials)) .setApplicationName("Sheets API Snippets") .build(); } @Before - public void setup() throws IOException, GeneralSecurityException { - GoogleCredential credential = getCredential(); + public void setup() throws IOException { + GoogleCredentials credential = getCredential(); this.service = buildService(credential); this.driveService = buildDriveService(credential); - this.filesToDelete.clear(); - } - - @After - public void cleanupFiles() { - for(String id : filesToDelete) { - try { - this.driveService.files().delete(id).execute(); - } catch (IOException e) { - System.err.println("Unable to cleanup file " + id); - } - } - } - - protected void deleteFileOnCleanup(String id) { - filesToDelete.add(id); } - protected String createTestSpreadsheet() throws IOException { - Spreadsheet spreadsheet = new Spreadsheet() - .setProperties(new SpreadsheetProperties() - .setTitle("Test Spreadsheet")); - spreadsheet = service.spreadsheets().create(spreadsheet) - .setFields("spreadsheetId") - .execute(); - return spreadsheet.getSpreadsheetId(); + protected void deleteFileOnCleanup(String id) throws IOException { + this.driveService.files().delete(id).execute(); } protected void populateValuesWithStrings(String spreadsheetId) throws IOException { diff --git a/sheets/snippets/src/test/java/SpreadsheetSnippetsTest.java b/sheets/snippets/src/test/java/SpreadsheetSnippetsTest.java deleted file mode 100644 index 9e632720..00000000 --- a/sheets/snippets/src/test/java/SpreadsheetSnippetsTest.java +++ /dev/null @@ -1,121 +0,0 @@ -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; - -import com.google.api.services.sheets.v4.model.*; - -import java.io.IOException; -import java.util.Arrays; -import java.util.List; - -import org.junit.Before; -import org.junit.Test; - -public class SpreadsheetSnippetsTest extends BaseTest { - private SpreadsheetSnippets snippets; - - @Before - public void createSnippets() { - this.snippets = new SpreadsheetSnippets(this.service); - } - - @Test - public void testCreate() throws IOException { - String id = this.snippets.create("Title"); - assertNotNull(id); - this.deleteFileOnCleanup(id); - } - - @Test - public void testBatchUpdate() throws IOException { - String spreadsheetId = this.createTestSpreadsheet(); - this.populateValuesWithStrings(spreadsheetId); - BatchUpdateSpreadsheetResponse response = - this.snippets.batchUpdate(spreadsheetId, "New Title", "Hello", "Goodbye"); - List replies = response.getReplies(); - assertEquals(2, replies.size()); - FindReplaceResponse findReplaceResponse = replies.get(1).getFindReplace(); - assertEquals(100, findReplaceResponse.getOccurrencesChanged().intValue()); - } - - @Test - public void testConditionalFormat() throws IOException { - String spreadsheetId = this.createTestSpreadsheet(); - this.populateValuesWithNumbers(spreadsheetId); - BatchUpdateSpreadsheetResponse response = - this.snippets.conditionalFormat(spreadsheetId); - assertEquals(spreadsheetId, response.getSpreadsheetId()); - assertEquals(2, response.getReplies().size()); - } - - @Test - public void testGetValues() throws IOException { - String spreadsheetId = this.createTestSpreadsheet(); - this.populateValuesWithStrings(spreadsheetId); - ValueRange result = this.snippets.getValues(spreadsheetId, "A1:C2"); - List> values = result.getValues(); - assertEquals(2, values.size()); - assertEquals(3, values.get(0).size()); - } - - @Test - public void testBatchGetValues() throws IOException { - String spreadsheetId = this.createTestSpreadsheet(); - this.populateValuesWithStrings(spreadsheetId); - List ranges = Arrays.asList("A1:A3", "B1:C1"); - BatchGetValuesResponse result = this.snippets.batchGetValues(spreadsheetId, ranges); - List valueRanges = result.getValueRanges(); - assertEquals(2, valueRanges.size()); - List> values = valueRanges.get(0).getValues(); - assertEquals(3, values.size()); - } - - @Test - public void testUpdateValues() throws IOException { - String spreadsheetId = this.createTestSpreadsheet(); - List> values = Arrays.asList( - Arrays.asList("A", "B"), - Arrays.asList("C", "D")); - UpdateValuesResponse result = - this.snippets.updateValues(spreadsheetId, "A1:B2", "USER_ENTERED", values); - assertEquals(2, result.getUpdatedRows().intValue()); - assertEquals(2, result.getUpdatedColumns().intValue()); - assertEquals(4, result.getUpdatedCells().intValue()); - } - - @Test - public void testBatchUpdateValues() throws IOException { - String spreadsheetId = this.createTestSpreadsheet(); - List> values = Arrays.asList( - Arrays.asList("A", "B"), - Arrays.asList("C", "D")); - BatchUpdateValuesResponse result = - this.snippets.batchUpdateValues(spreadsheetId, "A1:B2", "USER_ENTERED", values); - assertEquals(1, result.getResponses().size()); - assertEquals(2, result.getTotalUpdatedRows().intValue()); - assertEquals(2, result.getTotalUpdatedColumns().intValue()); - assertEquals(4, result.getTotalUpdatedCells().intValue()); - } - - @Test - public void testAppendValues() throws IOException { - String spreadsheetId = this.createTestSpreadsheet(); - this.populateValuesWithStrings(spreadsheetId); - List> values = Arrays.asList( - Arrays.asList("A", "B"), - Arrays.asList("C", "D")); - AppendValuesResponse result = - this.snippets.appendValues(spreadsheetId, "A1:B2", "USER_ENTERED", values); - assertEquals("Sheet1!A1:J10", result.getTableRange()); - UpdateValuesResponse updates = result.getUpdates(); - assertEquals(2, updates.getUpdatedRows().intValue()); - assertEquals(2, updates.getUpdatedColumns().intValue()); - assertEquals(4, updates.getUpdatedCells().intValue()); - } - - @Test - public void testPivotTable() throws IOException { - String spreadsheetId = this.createTestSpreadsheet(); - BatchUpdateSpreadsheetResponse result = this.snippets.pivotTables(spreadsheetId); - assertNotNull(result); - } -} diff --git a/sheets/snippets/src/test/java/TestAppendValues.java b/sheets/snippets/src/test/java/TestAppendValues.java new file mode 100644 index 00000000..489218f8 --- /dev/null +++ b/sheets/snippets/src/test/java/TestAppendValues.java @@ -0,0 +1,42 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import com.google.api.services.sheets.v4.model.AppendValuesResponse; +import com.google.api.services.sheets.v4.model.UpdateValuesResponse; +import org.junit.Test; +import java.io.IOException; +import java.util.Arrays; +import java.util.List; +import static org.junit.Assert.assertEquals; + +// Unit testcase for spreadsheet append values snippet +public class TestAppendValues extends BaseTest{ + + @Test + public void testAppendValues() throws IOException { + String spreadsheetId = Create.createSpreadsheet("Test Spreadsheet"); + populateValuesWithStrings(spreadsheetId); + List> values = Arrays.asList( + Arrays.asList("A", "B"), + Arrays.asList("C", "D")); + AppendValuesResponse result = AppendValues.appendValues(spreadsheetId, "A1:B2", "USER_ENTERED", + values); + assertEquals("Sheet1!A1:J10", result.getTableRange()); + UpdateValuesResponse updates = result.getUpdates(); + assertEquals(2, updates.getUpdatedRows().intValue()); + assertEquals(2, updates.getUpdatedColumns().intValue()); + assertEquals(4, updates.getUpdatedCells().intValue()); + deleteFileOnCleanup(spreadsheetId); + } +} diff --git a/sheets/snippets/src/test/java/TestBatchGetValues.java b/sheets/snippets/src/test/java/TestBatchGetValues.java new file mode 100644 index 00000000..d23e5582 --- /dev/null +++ b/sheets/snippets/src/test/java/TestBatchGetValues.java @@ -0,0 +1,39 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import com.google.api.services.sheets.v4.model.BatchGetValuesResponse; +import com.google.api.services.sheets.v4.model.ValueRange; +import org.junit.Test; +import java.io.IOException; +import java.util.Arrays; +import java.util.List; +import static org.junit.Assert.assertEquals; + +// Unit testcase for spreadsheet batch get values snippet +public class TestBatchGetValues extends BaseTest{ + + @Test + public void testBatchGetValues() throws IOException { + String spreadsheetId = Create.createSpreadsheet("Test Spreadsheet"); + populateValuesWithStrings(spreadsheetId); + List ranges = Arrays.asList("A1:A3", "B1:C1"); + BatchGetValuesResponse result = BatchGetValues.batchGetValues(spreadsheetId, + ranges); + List valueRanges = result.getValueRanges(); + assertEquals(2, valueRanges.size()); + List> values = valueRanges.get(0).getValues(); + assertEquals(3, values.size()); + deleteFileOnCleanup(spreadsheetId); + } +} diff --git a/sheets/snippets/src/test/java/TestBatchUpdate.java b/sheets/snippets/src/test/java/TestBatchUpdate.java new file mode 100644 index 00000000..5dc5799f --- /dev/null +++ b/sheets/snippets/src/test/java/TestBatchUpdate.java @@ -0,0 +1,37 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import com.google.api.services.sheets.v4.model.BatchUpdateSpreadsheetResponse; +import com.google.api.services.sheets.v4.model.FindReplaceResponse; +import com.google.api.services.sheets.v4.model.Response; +import org.junit.Test; +import java.io.IOException; +import java.util.List; +import static org.junit.Assert.assertEquals; + +// Unit testcase for spreadsheet batch update snippet +public class TestBatchUpdate extends BaseTest{ + + @Test + public void testBatchUpdate() throws IOException { + String spreadsheetId = Create.createSpreadsheet("Test Spreadsheet"); + populateValuesWithStrings(spreadsheetId); + BatchUpdateSpreadsheetResponse response = BatchUpdate.batchUpdate(spreadsheetId, "New Title", "Hello", "Goodbye"); + List replies = response.getReplies(); + assertEquals(2, replies.size()); + FindReplaceResponse findReplaceResponse = replies.get(1).getFindReplace(); + assertEquals(100, findReplaceResponse.getOccurrencesChanged().intValue()); + deleteFileOnCleanup(spreadsheetId); + } +} diff --git a/sheets/snippets/src/test/java/TestBatchUpdateValues.java b/sheets/snippets/src/test/java/TestBatchUpdateValues.java new file mode 100644 index 00000000..e17646d2 --- /dev/null +++ b/sheets/snippets/src/test/java/TestBatchUpdateValues.java @@ -0,0 +1,40 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import com.google.api.services.sheets.v4.model.BatchUpdateValuesResponse; +import org.junit.Test; +import java.io.IOException; +import java.util.Arrays; +import java.util.List; +import static org.junit.Assert.assertEquals; + +// Unit testcase for spreadsheet batch update values snippet +public class TestBatchUpdateValues extends BaseTest { + + @Test + public void testBatchUpdateValues() throws IOException { + String spreadsheetId = Create.createSpreadsheet("Test Spreadsheet"); + List> values = Arrays.asList( + Arrays.asList("A", "B"), + Arrays.asList("C", "D")); + BatchUpdateValuesResponse result = + BatchUpdateValues.batchUpdateValues(spreadsheetId, "A1:B2", "USER_ENTERED", + values); + assertEquals(1, result.getResponses().size()); + assertEquals(2, result.getTotalUpdatedRows().intValue()); + assertEquals(2, result.getTotalUpdatedColumns().intValue()); + assertEquals(4, result.getTotalUpdatedCells().intValue()); + deleteFileOnCleanup(spreadsheetId); + } +} diff --git a/sheets/snippets/src/test/java/TestConditionalFormatting.java b/sheets/snippets/src/test/java/TestConditionalFormatting.java new file mode 100644 index 00000000..5d094165 --- /dev/null +++ b/sheets/snippets/src/test/java/TestConditionalFormatting.java @@ -0,0 +1,33 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import com.google.api.services.sheets.v4.model.BatchUpdateSpreadsheetResponse; +import org.junit.Test; +import java.io.IOException; +import static org.junit.Assert.assertEquals; + +// Unit testcase for spreadsheet conditional formatting snippet +public class TestConditionalFormatting extends BaseTest { + + @Test + public void testConditionalFormat() throws IOException { + String spreadsheetId = Create.createSpreadsheet("Test Spreadsheet"); + populateValuesWithNumbers(spreadsheetId); + BatchUpdateSpreadsheetResponse response = + ConditionalFormatting.conditionalFormat(spreadsheetId); + assertEquals(spreadsheetId, response.getSpreadsheetId()); + assertEquals(2, response.getReplies().size()); + deleteFileOnCleanup(spreadsheetId); + } +} diff --git a/sheets/snippets/src/test/java/TestCreate.java b/sheets/snippets/src/test/java/TestCreate.java new file mode 100644 index 00000000..c75f0f4f --- /dev/null +++ b/sheets/snippets/src/test/java/TestCreate.java @@ -0,0 +1,28 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import org.junit.Test; +import java.io.IOException; +import static org.junit.Assert.assertNotNull; + +// Unit testcase for create spreadsheet snippet +public class TestCreate extends BaseTest{ + + @Test + public void testCreate() throws IOException { + String id = Create.createSpreadsheet("Test Spreadsheet"); + assertNotNull(id); + deleteFileOnCleanup(id); + } +} diff --git a/sheets/snippets/src/test/java/TestGetValues.java b/sheets/snippets/src/test/java/TestGetValues.java new file mode 100644 index 00000000..ed640bfb --- /dev/null +++ b/sheets/snippets/src/test/java/TestGetValues.java @@ -0,0 +1,34 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import com.google.api.services.sheets.v4.model.ValueRange; +import org.junit.Test; +import java.io.IOException; +import java.util.List; +import static org.junit.Assert.assertEquals; + +// Unit testcase for spreadsheet get values snippet +public class TestGetValues extends BaseTest{ + + @Test + public void testGetValues() throws IOException { + String spreadsheetId = Create.createSpreadsheet("Test Spreadsheet"); + populateValuesWithStrings(spreadsheetId); + ValueRange result = GetValues.getValues(spreadsheetId, "A1:C2"); + List> values = result.getValues(); + assertEquals(2, values.size()); + assertEquals(3, values.get(0).size()); + deleteFileOnCleanup(spreadsheetId); + } +} diff --git a/sheets/snippets/src/test/java/TestPivotTable.java b/sheets/snippets/src/test/java/TestPivotTable.java new file mode 100644 index 00000000..84c1b043 --- /dev/null +++ b/sheets/snippets/src/test/java/TestPivotTable.java @@ -0,0 +1,16 @@ +import com.google.api.services.sheets.v4.model.BatchUpdateSpreadsheetResponse; +import org.junit.Test; +import java.io.IOException; +import static org.junit.Assert.assertNotNull; + +// Unit testcase for spreadsheet pivot table snippet +public class TestPivotTable extends BaseTest{ + + @Test + public void testPivotTable() throws IOException { + String spreadsheetId = Create.createSpreadsheet("Test Spreadsheet"); + BatchUpdateSpreadsheetResponse result = PivotTables.pivotTables(spreadsheetId); + assertNotNull(result); + deleteFileOnCleanup(spreadsheetId); + } +} diff --git a/sheets/snippets/src/test/java/TestUpdateValues.java b/sheets/snippets/src/test/java/TestUpdateValues.java new file mode 100644 index 00000000..133cb48d --- /dev/null +++ b/sheets/snippets/src/test/java/TestUpdateValues.java @@ -0,0 +1,38 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import com.google.api.services.sheets.v4.model.UpdateValuesResponse; +import org.junit.Test; +import java.io.IOException; +import java.util.Arrays; +import java.util.List; +import static org.junit.Assert.assertEquals; + +// Unit testcase for spreadsheet update values snippet +public class TestUpdateValues extends BaseTest{ + + @Test + public void testUpdateValues() throws IOException { + String spreadsheetId = Create.createSpreadsheet("Test Spreadsheet"); + List> values = Arrays.asList( + Arrays.asList("A", "B"), + Arrays.asList("C", "D")); + UpdateValuesResponse result = UpdateValues.updateValues(spreadsheetId, + "A1:B2", "USER_ENTERED", values); + assertEquals(2, result.getUpdatedRows().intValue()); + assertEquals(2, result.getUpdatedColumns().intValue()); + assertEquals(4, result.getUpdatedCells().intValue()); + deleteFileOnCleanup(spreadsheetId); + } +} From 83f0a162003b8f0c2bac2d20df75b7ef72ce8a54 Mon Sep 17 00:00:00 2001 From: Rajesh Mudaliyar Date: Wed, 8 Jun 2022 10:02:59 -0700 Subject: [PATCH 099/262] Test drive v2 drive snippets (#230) * git-on-borg files of gmail-api-snippets * Update build.gradle test12 * Update build.gradle * Drive-v2: Drive snippets UnitTest Co-authored-by: sanjuktaghosh7 Co-authored-by: Manvendra-P-Singh --- .../drive_v2/src/main/java/CreateDrive.java | 4 +- .../drive_v2/src/main/java/RecoverDrive.java | 2 +- .../drive_v2/src/test/java/BaseTest.java | 43 ++++++++++++------- .../src/test/java/TestCreateDrive.java | 15 +++++++ .../src/test/java/TestRecoverDrives.java | 33 ++++++++++++++ 5 files changed, 78 insertions(+), 19 deletions(-) create mode 100644 drive/snippets/drive_v2/src/test/java/TestCreateDrive.java create mode 100644 drive/snippets/drive_v2/src/test/java/TestRecoverDrives.java diff --git a/drive/snippets/drive_v2/src/main/java/CreateDrive.java b/drive/snippets/drive_v2/src/main/java/CreateDrive.java index bf5a82bb..70da1fe3 100644 --- a/drive/snippets/drive_v2/src/main/java/CreateDrive.java +++ b/drive/snippets/drive_v2/src/main/java/CreateDrive.java @@ -31,11 +31,11 @@ public class CreateDrive { /** - * @param + * Create a drive. * @return Newly created drive id. * @throws IOException if service account credentials file not found. */ - private static String createDrive() throws IOException { + public static String createDrive() throws IOException { /*Load pre-authorized user credentials from the environment. TODO(developer) - See https://developers.google.com/identity for guides on implementing OAuth2 for your application.*/ diff --git a/drive/snippets/drive_v2/src/main/java/RecoverDrive.java b/drive/snippets/drive_v2/src/main/java/RecoverDrive.java index cf56f346..038f1a57 100644 --- a/drive/snippets/drive_v2/src/main/java/RecoverDrive.java +++ b/drive/snippets/drive_v2/src/main/java/RecoverDrive.java @@ -39,7 +39,7 @@ public class RecoverDrive { * @return All shared drives without an organizer. * @throws IOException if shared drive not found. */ - private static List recoverDrives(String realUser) + public static List recoverDrives(String realUser) throws IOException { /*Load pre-authorized user credentials from the environment. TODO(developer) - See https://developers.google.com/identity for diff --git a/drive/snippets/drive_v2/src/test/java/BaseTest.java b/drive/snippets/drive_v2/src/test/java/BaseTest.java index 0bfcdc19..d3851aed 100644 --- a/drive/snippets/drive_v2/src/test/java/BaseTest.java +++ b/drive/snippets/drive_v2/src/test/java/BaseTest.java @@ -1,8 +1,8 @@ -import com.google.api.client.googleapis.auth.oauth2.GoogleCredential; -import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport; +import com.google.api.client.http.HttpRequestInitializer; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; import com.google.api.client.http.FileContent; import com.google.api.client.http.HttpTransport; -import com.google.api.client.http.apache.ApacheHttpTransport; import com.google.api.client.http.javanet.NetHttpTransport; import com.google.api.client.json.gson.GsonFactory; import com.google.api.services.drive.Drive; @@ -51,22 +51,33 @@ public void publish(LogRecord record) { }); } - public GoogleCredential getCredential() throws IOException { - return GoogleCredential.getApplicationDefault() - .createScoped(Arrays.asList(DriveScopes.DRIVE, DriveScopes.DRIVE_APPDATA)); + public GoogleCredentials getCredential() throws IOException { + return GoogleCredentials.getApplicationDefault() + .createScoped(Arrays.asList(DriveScopes.DRIVE, DriveScopes.DRIVE_APPDATA,DriveScopes.DRIVE_FILE)); } - public Drive buildService() throws IOException, GeneralSecurityException { - GoogleCredential credential = getCredential(); - return new Drive.Builder( - //new ApacheHttpTransport(), - //GoogleNetHttpTransport.newTrustedTransport(), - new NetHttpTransport(), + /** + * Creates a default authorization Drive client service. + * + * @return an authorized Drive client service + * @throws IOException - if credentials file not found. + */ + protected Drive buildService() throws IOException { + /* Load pre-authorized user credentials from the environment. + TODO(developer) - See https://developers.google.com/identity for + guides on implementing OAuth2 for your application. */ + GoogleCredentials credentials = getCredential(); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + + // Create the classroom API client + Drive service = new Drive.Builder(new NetHttpTransport(), GsonFactory.getDefaultInstance(), - //GsonFactory.getDefaultInstance(), - credential) - .setApplicationName("Drive API Snippets") - .build(); + requestInitializer) + .setApplicationName("Drive Snippets") + .build(); + + return service; } @Before diff --git a/drive/snippets/drive_v2/src/test/java/TestCreateDrive.java b/drive/snippets/drive_v2/src/test/java/TestCreateDrive.java new file mode 100644 index 00000000..dee4bc33 --- /dev/null +++ b/drive/snippets/drive_v2/src/test/java/TestCreateDrive.java @@ -0,0 +1,15 @@ +import org.junit.Test; + +import java.io.IOException; +import java.security.GeneralSecurityException; + +import static org.junit.Assert.assertNotNull; + +public class TestCreateDrive extends BaseTest{ + @Test + public void createDrive() throws IOException, GeneralSecurityException { + String id = CreateDrive.createDrive(); + assertNotNull(id); + this.service.drives().delete(id); + } +} diff --git a/drive/snippets/drive_v2/src/test/java/TestRecoverDrives.java b/drive/snippets/drive_v2/src/test/java/TestRecoverDrives.java new file mode 100644 index 00000000..d8b246a2 --- /dev/null +++ b/drive/snippets/drive_v2/src/test/java/TestRecoverDrives.java @@ -0,0 +1,33 @@ +import com.google.api.services.drive.model.Drive; +import com.google.api.services.drive.model.Permission; +import com.google.api.services.drive.model.PermissionList; +import org.junit.Test; + +import java.io.IOException; +import java.util.List; + +import static org.junit.Assert.assertNotEquals; + +public class TestRecoverDrives extends BaseTest{ + @Test + public void recoverDrives() throws IOException { + String id = this.createOrphanedDrive(); + List results = RecoverDrive.recoverDrives( + "sbazyl@test.appsdevtesting.com"); + assertNotEquals(0, results.size()); + this.service.drives().delete(id).execute(); + } + + private String createOrphanedDrive() throws IOException { + String driveId = CreateDrive.createDrive(); + PermissionList response = this.service.permissions().list(driveId) + .setSupportsAllDrives(true) + .execute(); + for (Permission permission : response.getItems()) { + this.service.permissions().delete(driveId, permission.getId()) + .setSupportsAllDrives(true) + .execute(); + } + return driveId; + } +} From 0d0c69352d1b4ff20174ff5f1a8487f8a3942938 Mon Sep 17 00:00:00 2001 From: Rajesh Mudaliyar Date: Wed, 8 Jun 2022 10:06:38 -0700 Subject: [PATCH 100/262] Drive-v2: Team-Drive snippets UnitTest (#232) * git-on-borg files of gmail-api-snippets * Update build.gradle test12 * Update build.gradle * Drive-v2: Team-Drive snippets UnitTest Co-authored-by: sanjuktaghosh7 Co-authored-by: Manvendra-P-Singh --- .../src/main/java/CreateTeamDrive.java | 2 +- .../src/main/java/RecoverTeamDrive.java | 2 +- .../src/test/java/TestCreateTeamDrive.java | 15 +++++++++ .../src/test/java/TestRecoverTeamDrives.java | 32 +++++++++++++++++++ 4 files changed, 49 insertions(+), 2 deletions(-) create mode 100644 drive/snippets/drive_v2/src/test/java/TestCreateTeamDrive.java create mode 100644 drive/snippets/drive_v2/src/test/java/TestRecoverTeamDrives.java diff --git a/drive/snippets/drive_v2/src/main/java/CreateTeamDrive.java b/drive/snippets/drive_v2/src/main/java/CreateTeamDrive.java index 2a1e324e..8dad2711 100644 --- a/drive/snippets/drive_v2/src/main/java/CreateTeamDrive.java +++ b/drive/snippets/drive_v2/src/main/java/CreateTeamDrive.java @@ -35,7 +35,7 @@ public class CreateTeamDrive { * @return Newly created drive id. * @throws IOException if service account credentials file not found. */ - private static String createTeamDrive() throws IOException { + public static String createTeamDrive() throws IOException { /*Load pre-authorized user credentials from the environment. TODO(developer) - See https://developers.google.com/identity for guides on implementing OAuth2 for your application.*/ diff --git a/drive/snippets/drive_v2/src/main/java/RecoverTeamDrive.java b/drive/snippets/drive_v2/src/main/java/RecoverTeamDrive.java index 0d8dd337..a11d4a24 100644 --- a/drive/snippets/drive_v2/src/main/java/RecoverTeamDrive.java +++ b/drive/snippets/drive_v2/src/main/java/RecoverTeamDrive.java @@ -39,7 +39,7 @@ public class RecoverTeamDrive { * @return All team drives without an organizer. * @throws IOException if service account credentials file not found. */ - private static List recoverTeamDrives(String realUser) throws IOException { + public static List recoverTeamDrives(String realUser) throws IOException { /*Load pre-authorized user credentials from the environment. TODO(developer) - See https://developers.google.com/identity for guides on implementing OAuth2 for your application.*/ diff --git a/drive/snippets/drive_v2/src/test/java/TestCreateTeamDrive.java b/drive/snippets/drive_v2/src/test/java/TestCreateTeamDrive.java new file mode 100644 index 00000000..bca94def --- /dev/null +++ b/drive/snippets/drive_v2/src/test/java/TestCreateTeamDrive.java @@ -0,0 +1,15 @@ +import org.junit.Test; + +import java.io.IOException; +import java.security.GeneralSecurityException; + +import static org.junit.Assert.assertNotNull; + +public class TestCreateTeamDrive extends BaseTest{ + @Test + public void createTeamDrive() throws IOException, GeneralSecurityException { + String id = CreateTeamDrive.createTeamDrive(); + assertNotNull(id); + this.service.teamdrives().delete(id); + } +} diff --git a/drive/snippets/drive_v2/src/test/java/TestRecoverTeamDrives.java b/drive/snippets/drive_v2/src/test/java/TestRecoverTeamDrives.java new file mode 100644 index 00000000..41399754 --- /dev/null +++ b/drive/snippets/drive_v2/src/test/java/TestRecoverTeamDrives.java @@ -0,0 +1,32 @@ +import com.google.api.services.drive.model.Permission; +import com.google.api.services.drive.model.PermissionList; +import com.google.api.services.drive.model.TeamDrive; +import org.junit.Test; + +import java.io.IOException; +import java.util.List; + +import static org.junit.Assert.assertNotEquals; + +public class TestRecoverTeamDrives extends BaseTest{ + @Test + public void recoverTeamDrives() throws IOException { + String id = this.createOrphanedTeamDrive(); + List results = RecoverTeamDrive.recoverTeamDrives( + "sbazyl@test.appsdevtesting.com"); + assertNotEquals(0, results.size()); + this.service.teamdrives().delete(id).execute(); + } + private String createOrphanedTeamDrive() throws IOException { + String teamDriveId = CreateTeamDrive.createTeamDrive(); + PermissionList response = this.service.permissions().list(teamDriveId) + .setSupportsTeamDrives(true) + .execute(); + for (Permission permission : response.getItems()) { + this.service.permissions().delete(teamDriveId, permission.getId()) + .setSupportsTeamDrives(true) + .execute(); + } + return teamDriveId; + } +} From bb59d2e17d7204f5155b7062ed7331c539b67991 Mon Sep 17 00:00:00 2001 From: Rajesh Mudaliyar Date: Wed, 8 Jun 2022 10:07:05 -0700 Subject: [PATCH 101/262] Drive-v3: File snippets UnitTest patch1 (#233) * git-on-borg files of gmail-api-snippets * Update build.gradle test12 * Update build.gradle * Drive-v3: File snippets UnitTest patch1 Co-authored-by: sanjuktaghosh7 Co-authored-by: Manvendra-P-Singh --- .../drive_v3/src/main/java/UploadBasic.java | 4 ++-- .../drive_v3/src/main/java/UploadRevision.java | 2 +- .../src/test/java/TestUploadBasic.java | 15 +++++++++++++++ .../src/test/java/TestUploadRevision.java | 18 ++++++++++++++++++ 4 files changed, 36 insertions(+), 3 deletions(-) create mode 100644 drive/snippets/drive_v3/src/test/java/TestUploadBasic.java create mode 100644 drive/snippets/drive_v3/src/test/java/TestUploadRevision.java diff --git a/drive/snippets/drive_v3/src/main/java/UploadBasic.java b/drive/snippets/drive_v3/src/main/java/UploadBasic.java index 4a83ebfe..65b30ad3 100644 --- a/drive/snippets/drive_v3/src/main/java/UploadBasic.java +++ b/drive/snippets/drive_v3/src/main/java/UploadBasic.java @@ -36,7 +36,7 @@ public class UploadBasic { * @return Inserted file metadata if successful, {@code null} otherwise. * @throws IOException if service account credentials file not found. */ - private static File uploadBasic() throws IOException{ + public static String uploadBasic() throws IOException{ // Load pre-authorized user credentials from the environment. // TODO(developer) - See https://developers.google.com/identity for // guides on implementing OAuth2 for your application. @@ -62,7 +62,7 @@ private static File uploadBasic() throws IOException{ .setFields("id") .execute(); System.out.println("File ID: " + file.getId()); - return file; + return file.getId(); }catch (GoogleJsonResponseException e) { // TODO(developer) - handle error appropriately System.err.println("Unable to upload file: " + e.getDetails()); diff --git a/drive/snippets/drive_v3/src/main/java/UploadRevision.java b/drive/snippets/drive_v3/src/main/java/UploadRevision.java index 97b5fb34..93e1c4f5 100644 --- a/drive/snippets/drive_v3/src/main/java/UploadRevision.java +++ b/drive/snippets/drive_v3/src/main/java/UploadRevision.java @@ -37,7 +37,7 @@ public class UploadRevision { * @return Inserted file ID if successful, {@code null} otherwise. * @throws IOException if service account credentials file not found. */ - private static String uploadRevision(String realFileId) throws IOException{ + public static String uploadRevision(String realFileId) throws IOException{ // Load pre-authorized user credentials from the environment. // TODO(developer) - See https://developers.google.com/identity for // guides on implementing OAuth2 for your application. diff --git a/drive/snippets/drive_v3/src/test/java/TestUploadBasic.java b/drive/snippets/drive_v3/src/test/java/TestUploadBasic.java new file mode 100644 index 00000000..c301131c --- /dev/null +++ b/drive/snippets/drive_v3/src/test/java/TestUploadBasic.java @@ -0,0 +1,15 @@ +import org.junit.Test; + +import java.io.IOException; +import java.security.GeneralSecurityException; + +import static org.junit.Assert.assertNotNull; + +public class TestUploadBasic extends BaseTest{ + @Test + public void uploadBasic() throws IOException, GeneralSecurityException { + String id = UploadBasic.uploadBasic(); + assertNotNull(id); + deleteFileOnCleanup(id); + } +} diff --git a/drive/snippets/drive_v3/src/test/java/TestUploadRevision.java b/drive/snippets/drive_v3/src/test/java/TestUploadRevision.java new file mode 100644 index 00000000..77682baa --- /dev/null +++ b/drive/snippets/drive_v3/src/test/java/TestUploadRevision.java @@ -0,0 +1,18 @@ +import org.junit.Test; + +import java.io.IOException; +import java.security.GeneralSecurityException; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; + +public class TestUploadRevision extends BaseTest{ + @Test + public void uploadRevision() throws IOException, GeneralSecurityException { + String id = UploadBasic.uploadBasic(); + assertNotNull(id); + deleteFileOnCleanup(id); + String id2 = UploadRevision.uploadRevision(id); + assertEquals(id, id2); + } +} From 05736e82e407e54a82a26819cf563564fbbeda56 Mon Sep 17 00:00:00 2001 From: Rajesh Mudaliyar Date: Wed, 8 Jun 2022 10:08:05 -0700 Subject: [PATCH 102/262] Gmail unit testcase (#234) * git-on-borg files of gmail-api-snippets * Update build.gradle test12 * Update build.gradle * Gmail-snippets * Gmail unit testcase * Gmail unit testcase * Gmail snippet * Gmail snippet * Gmail snippet * Gmail snippet Co-authored-by: sanjuktaghosh7 Co-authored-by: Manvendra-P-Singh --- gmail/snippets/build.gradle | 14 +- gmail/snippets/src/main/java/CreateDraft.java | 23 +- .../main/java/CreateDraftWithAttachment.java | 24 +- gmail/snippets/src/main/java/CreateEmail.java | 53 +++ .../snippets/src/main/java/CreateFilter.java | 28 +- .../snippets/src/main/java/CreateMessage.java | 45 ++ .../src/main/java/EnableAutoReply.java | 20 +- .../src/main/java/EnableForwarding.java | 17 +- .../src/main/java/InsertCertFromCsv.java | 5 +- .../src/main/java/InsertSmimeInfo.java | 20 +- gmail/snippets/src/main/java/SendMessage.java | 18 +- .../main/java/SendMessageWithAttachment.java | 19 +- .../src/main/java/UpdateSignature.java | 19 +- .../src/main/java/UpdateSmimeCerts.java | 14 +- .../src/main/java/UpdateSmimeFromCsv.java | 4 +- gmail/snippets/src/test/java/BaseTest.java | 92 +--- .../snippets/src/test/java/SendEmailTest.java | 70 ---- .../src/test/java/SettingsSnippetsTest.java | 82 ---- .../src/test/java/SmimeSnippetsTest.java | 392 ------------------ .../src/test/java/TestCreateDraft.java | 31 ++ .../java/TestCreateDraftWithAttachment.java | 33 ++ .../src/test/java/TestCreateEmail.java | 37 ++ .../src/test/java/TestCreateFilter.java | 11 +- .../src/test/java/TestCreateMessage.java | 35 ++ .../src/test/java/TestCreateSmimeInfo.java | 1 + .../src/test/java/TestEnableAutoReply.java | 10 +- .../src/test/java/TestEnableForwarding.java | 6 +- .../src/test/java/TestInsertCertFromCsv.java | 102 +++++ .../src/test/java/TestInsertSmimeInfo.java | 117 ++++++ .../src/test/java/TestSendMessage.java | 30 ++ .../java/TestSendMessageWithAttachment.java | 34 ++ .../src/test/java/TestUpdateSignature.java | 5 +- .../src/test/java/TestUpdateSmimeCerts.java | 270 ++++++++++++ .../src/test/java/TestUpdateSmimeFromCsv.java | 140 +++++++ 34 files changed, 1079 insertions(+), 742 deletions(-) create mode 100644 gmail/snippets/src/main/java/CreateEmail.java create mode 100644 gmail/snippets/src/main/java/CreateMessage.java delete mode 100644 gmail/snippets/src/test/java/SendEmailTest.java delete mode 100644 gmail/snippets/src/test/java/SettingsSnippetsTest.java delete mode 100644 gmail/snippets/src/test/java/SmimeSnippetsTest.java create mode 100644 gmail/snippets/src/test/java/TestCreateDraft.java create mode 100644 gmail/snippets/src/test/java/TestCreateDraftWithAttachment.java create mode 100644 gmail/snippets/src/test/java/TestCreateEmail.java create mode 100644 gmail/snippets/src/test/java/TestCreateMessage.java create mode 100644 gmail/snippets/src/test/java/TestInsertCertFromCsv.java create mode 100644 gmail/snippets/src/test/java/TestInsertSmimeInfo.java create mode 100644 gmail/snippets/src/test/java/TestSendMessage.java create mode 100644 gmail/snippets/src/test/java/TestSendMessageWithAttachment.java create mode 100644 gmail/snippets/src/test/java/TestUpdateSmimeCerts.java create mode 100644 gmail/snippets/src/test/java/TestUpdateSmimeFromCsv.java diff --git a/gmail/snippets/build.gradle b/gmail/snippets/build.gradle index bf1befca..85351fa9 100644 --- a/gmail/snippets/build.gradle +++ b/gmail/snippets/build.gradle @@ -5,14 +5,10 @@ repositories { } dependencies { - implementation 'com.google.api-client:google-api-client:1.33.0' - implementation 'com.google.auth:google-auth-library-oauth2-http:1.3.0' - implementation 'com.google.apis:google-api-services-gmail:v1-rev20211108-1.32.1' - implementation 'com.google.code.gson:gson:2.4' - implementation 'javax.mail:mail:1.4' - implementation 'org.apache.commons:commons-csv:1.1' + implementation 'com.google.auth:google-auth-library-oauth2-http:1.6.0' + implementation 'com.google.apis:google-api-services-gmail:v1-rev20220404-1.32.1' + implementation 'javax.mail:mail:1.4.7' + implementation 'org.apache.commons:commons-csv:1.9.0' testImplementation 'junit:junit:4.13.2' - testImplementation 'org.hamcrest:hamcrest-all:1.3' - //testImplementation 'org.mockito:mockito-core:4.2.0' - testImplementation 'org.mockito:mockito-inline:4.3.1' + testImplementation 'org.mockito:mockito-inline:4.5.1' } diff --git a/gmail/snippets/src/main/java/CreateDraft.java b/gmail/snippets/src/main/java/CreateDraft.java index 087cf3ba..683119c8 100644 --- a/gmail/snippets/src/main/java/CreateDraft.java +++ b/gmail/snippets/src/main/java/CreateDraft.java @@ -14,6 +14,7 @@ // [START gmail_create_draft] +import com.google.api.client.googleapis.json.GoogleJsonError; import com.google.api.client.googleapis.json.GoogleJsonResponseException; import com.google.api.client.http.HttpRequestInitializer; import com.google.api.client.http.javanet.NetHttpTransport; @@ -32,7 +33,6 @@ import javax.mail.internet.MimeMessage; import java.io.ByteArrayOutputStream; import java.io.IOException; -import java.util.Collections; import java.util.Properties; /* Class to demonstrate the use of Gmail Create Draft API */ @@ -42,16 +42,16 @@ public class CreateDraft { * * @param fromEmailAddress - Email address to appear in the from: header * @param toEmailAddress - Email address of the recipient - * @return the created draft - * @throws MessagingException - * @throws IOException + * @return the created draft, {@code null} otherwise. + * @throws MessagingException - if a wrongly formatted address is encountered. + * @throws IOException - if service account credentials file not found. */ public static Draft createDraftMessage(String fromEmailAddress, String toEmailAddress) throws MessagingException, IOException { - // Load pre-authorized user credentials from the environment. - // TODO(developer) - See https://developers.google.com/identity for - // guides on implementing OAuth2 for your application. + /* Load pre-authorized user credentials from the environment. + TODO(developer) - See https://developers.google.com/identity for + guides on implementing OAuth2 for your application.*/ GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() .createScoped(GmailScopes.GMAIL_COMPOSE); HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter(credentials); @@ -95,9 +95,14 @@ public static Draft createDraftMessage(String fromEmailAddress, return draft; } catch (GoogleJsonResponseException e) { // TODO(developer) - handle error appropriately - System.err.println("Unable to create draft: " + e.getDetails()); - throw e; + GoogleJsonError error = e.getDetails(); + if (error.getCode() == 403) { + System.err.println("Unable to create draft: " + e.getMessage()); + } else { + throw e; + } } + return null; } } // [END gmail_create_draft] \ No newline at end of file diff --git a/gmail/snippets/src/main/java/CreateDraftWithAttachment.java b/gmail/snippets/src/main/java/CreateDraftWithAttachment.java index 626299e0..b7b2144d 100644 --- a/gmail/snippets/src/main/java/CreateDraftWithAttachment.java +++ b/gmail/snippets/src/main/java/CreateDraftWithAttachment.java @@ -14,6 +14,7 @@ // [START gmail_create_draft_with_attachment] +import com.google.api.client.googleapis.json.GoogleJsonError; import com.google.api.client.googleapis.json.GoogleJsonResponseException; import com.google.api.client.http.HttpRequestInitializer; import com.google.api.client.http.javanet.NetHttpTransport; @@ -45,12 +46,12 @@ /* Class to demonstrate the use of Gmail Create Draft with attachment API */ public class CreateDraftWithAttachment { /** - * Create a draft email. + * Create a draft email with attachment. * * @param fromEmailAddress - Email address to appear in the from: header. * @param toEmailAddress - Email address of the recipient. * @param file - Path to the file to be attached. - * @return the created draft + * @return the created draft, {@code null} otherwise. * @throws MessagingException - if a wrongly formatted address is encountered. * @throws IOException - if service account credentials file not found. */ @@ -58,11 +59,11 @@ public static Draft createDraftMessageWithAttachment(String fromEmailAddress, String toEmailAddress, File file) throws MessagingException, IOException { - // Load pre-authorized user credentials from the environment. - // TODO(developer) - See https://developers.google.com/identity for - // guides on implementing OAuth2 for your application. - GoogleCredentials credentials = GoogleCredentials.getApplicationDefault().createScoped( - GmailScopes.GMAIL_COMPOSE); + /* Load pre-authorized user credentials from the environment. + TODO(developer) - See https://developers.google.com/identity for + guides on implementing OAuth2 for your application.*/ + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(GmailScopes.GMAIL_COMPOSE); HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter(credentials); // Create the gmail API client @@ -114,9 +115,14 @@ public static Draft createDraftMessageWithAttachment(String fromEmailAddress, return draft; } catch (GoogleJsonResponseException e) { // TODO(developer) - handle error appropriately - System.err.println("Unable to create draft: " + e.getDetails()); - throw e; + GoogleJsonError error = e.getDetails(); + if (error.getCode() == 403){ + System.err.println("Unable to create draft: " + e.getDetails()); + } else { + throw e; + } } + return null; } } // [END gmail_create_draft_with_attachment] \ No newline at end of file diff --git a/gmail/snippets/src/main/java/CreateEmail.java b/gmail/snippets/src/main/java/CreateEmail.java new file mode 100644 index 00000000..5a9b3497 --- /dev/null +++ b/gmail/snippets/src/main/java/CreateEmail.java @@ -0,0 +1,53 @@ +// Copyright 2021 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// [START gmail_create_email] +import javax.mail.MessagingException; +import javax.mail.Session; +import javax.mail.internet.InternetAddress; +import javax.mail.internet.MimeMessage; +import java.util.Properties; + +/* Class to demonstrate the use of Gmail Create Email API */ +public class CreateEmail { + + /** + * Create a MimeMessage using the parameters provided. + * + * @param toEmailAddress email address of the receiver + * @param fromEmailAddress email address of the sender, the mailbox account + * @param subject subject of the email + * @param bodyText body text of the email + * @return the MimeMessage to be used to send email + * @throws MessagingException - if a wrongly formatted address is encountered. + */ + public static MimeMessage createEmail(String toEmailAddress, + String fromEmailAddress, + String subject, + String bodyText) + throws MessagingException { + Properties props = new Properties(); + Session session = Session.getDefaultInstance(props, null); + + MimeMessage email = new MimeMessage(session); + + email.setFrom(new InternetAddress(fromEmailAddress)); + email.addRecipient(javax.mail.Message.RecipientType.TO, + new InternetAddress(toEmailAddress)); + email.setSubject(subject); + email.setText(bodyText); + return email; + } +} +// [END gmail_create_email] diff --git a/gmail/snippets/src/main/java/CreateFilter.java b/gmail/snippets/src/main/java/CreateFilter.java index 8faea942..354eafbf 100644 --- a/gmail/snippets/src/main/java/CreateFilter.java +++ b/gmail/snippets/src/main/java/CreateFilter.java @@ -14,6 +14,7 @@ // [START gmail_create_filter] +import com.google.api.client.googleapis.json.GoogleJsonError; import com.google.api.client.googleapis.json.GoogleJsonResponseException; import com.google.api.client.http.HttpRequestInitializer; import com.google.api.client.http.javanet.NetHttpTransport; @@ -33,20 +34,17 @@ public class CreateFilter { /** * Create a new filter. * - * @param realLabelId - ID of the user label to add - * @return the created filter id + * @param labelId - ID of the user label to add + * @return the created filter id, {@code null} otherwise. * @throws IOException - if service account credentials file not found. */ - public static String createNewFilter(String realLabelId) throws IOException { - // TODO(developer) - Replace with your email address. - String userEmail = "ci-test01@workspacesamples.dev"; - + public static String createNewFilter(String labelId) throws IOException { /* Load pre-authorized user credentials from the environment. TODO(developer) - See https://developers.google.com/identity for guides on implementing OAuth2 for your application. */ GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() - .createScoped(GmailScopes.GMAIL_SETTINGS_BASIC, GmailScopes.GMAIL_LABELS) - .createDelegated(userEmail); + .createScoped(GmailScopes.GMAIL_SETTINGS_BASIC, + GmailScopes.GMAIL_LABELS); HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter(credentials); // Create the gmail API client @@ -56,11 +54,6 @@ public static String createNewFilter(String realLabelId) throws IOException { .setApplicationName("Gmail samples") .build(); - String labelId = "Label_14"; // ID of the user label to add - // [START_EXCLUDE silent] - labelId = realLabelId; - // [END_EXCLUDE] - try { // Filter the mail from sender and archive them(skip the inbox) Filter filter = new Filter() @@ -76,9 +69,14 @@ public static String createNewFilter(String realLabelId) throws IOException { return result.getId(); } catch (GoogleJsonResponseException e) { // TODO(developer) - handle error appropriately - System.err.println("Unable to create filter: " + e.getDetails()); - throw e; + GoogleJsonError error = e.getDetails(); + if (error.getCode() == 403) { + System.err.println("Unable to create filter: " + e.getDetails()); + } else { + throw e; + } } + return null; } } // [END gmail_create_filter] diff --git a/gmail/snippets/src/main/java/CreateMessage.java b/gmail/snippets/src/main/java/CreateMessage.java new file mode 100644 index 00000000..c5e43d86 --- /dev/null +++ b/gmail/snippets/src/main/java/CreateMessage.java @@ -0,0 +1,45 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// [START gmail_create_message] +import com.google.api.services.gmail.model.Message; +import org.apache.commons.codec.binary.Base64; +import javax.mail.MessagingException; +import javax.mail.internet.MimeMessage; +import java.io.ByteArrayOutputStream; +import java.io.IOException; + +/* Class to demonstrate the use of Gmail Create Message API */ +public class CreateMessage { + + /** + * Create a message from an email. + * + * @param emailContent Email to be set to raw of message + * @return a message containing a base64url encoded email + * @throws IOException - if service account credentials file not found. + * @throws MessagingException - if a wrongly formatted address is encountered. + */ + public static Message createMessageWithEmail(MimeMessage emailContent) + throws MessagingException, IOException { + ByteArrayOutputStream buffer = new ByteArrayOutputStream(); + emailContent.writeTo(buffer); + byte[] bytes = buffer.toByteArray(); + String encodedEmail = Base64.encodeBase64URLSafeString(bytes); + Message message = new Message(); + message.setRaw(encodedEmail); + return message; + } +} +// [END gmail_create_message] \ No newline at end of file diff --git a/gmail/snippets/src/main/java/EnableAutoReply.java b/gmail/snippets/src/main/java/EnableAutoReply.java index 9453cb6c..8cff0c9a 100644 --- a/gmail/snippets/src/main/java/EnableAutoReply.java +++ b/gmail/snippets/src/main/java/EnableAutoReply.java @@ -14,6 +14,7 @@ // [START gmail_enable_auto_reply] +import com.google.api.client.googleapis.json.GoogleJsonError; import com.google.api.client.googleapis.json.GoogleJsonResponseException; import com.google.api.client.http.HttpRequestInitializer; import com.google.api.client.http.javanet.NetHttpTransport; @@ -38,15 +39,11 @@ public class EnableAutoReply { * @throws IOException - if service account credentials file not found. */ public static VacationSettings autoReply() throws IOException{ - // TODO(developer) - Replace with your email address. - String userEmail = "ci-test01@workspacesamples.dev"; - /* Load pre-authorized user credentials from the environment. - TODO(developer) - See https://developers.google.com/identity for - guides on implementing OAuth2 for your application. */ + TODO(developer) - See https://developers.google.com/identity for + guides on implementing OAuth2 for your application. */ GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() - .createScoped(Collections.singleton(GmailScopes.GMAIL_SETTINGS_BASIC)) - .createDelegated(userEmail); + .createScoped(GmailScopes.GMAIL_SETTINGS_BASIC); HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter(credentials); // Create the gmail API client @@ -74,9 +71,14 @@ public static VacationSettings autoReply() throws IOException{ return response; } catch (GoogleJsonResponseException e) { // TODO(developer) - handle error appropriately - System.err.println("Unable to enable auto reply: " + e.getDetails()); - throw e; + GoogleJsonError error = e.getDetails(); + if (error.getCode() == 403) { + System.err.println("Unable to enable auto reply: " + e.getDetails()); + } else { + throw e; + } } + return null; } } // [END gmail_enable_auto_reply] \ No newline at end of file diff --git a/gmail/snippets/src/main/java/EnableForwarding.java b/gmail/snippets/src/main/java/EnableForwarding.java index a4357275..c18183bd 100644 --- a/gmail/snippets/src/main/java/EnableForwarding.java +++ b/gmail/snippets/src/main/java/EnableForwarding.java @@ -14,6 +14,7 @@ // [START gmail_enable_forwarding] +import com.google.api.client.googleapis.json.GoogleJsonError; import com.google.api.client.googleapis.json.GoogleJsonResponseException; import com.google.api.client.http.HttpRequestInitializer; import com.google.api.client.http.javanet.NetHttpTransport; @@ -34,18 +35,14 @@ public class EnableForwarding { * * @param forwardingEmail - Email address of the recipient whose email will be forwarded. * @return forwarding id and metadata, {@code null} otherwise. - * @throws IOException if service account credentials file not found. + * @throws IOException - if service account credentials file not found. */ public static AutoForwarding enableAutoForwarding(String forwardingEmail) throws IOException{ - // TODO(developer) - Replace with your email address. - String userEmail = "ci-test01@workspacesamples.dev"; - /* Load pre-authorized user credentials from the environment. TODO(developer) - See https://developers.google.com/identity for guides on implementing OAuth2 for your application. */ GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() - .createScoped(GmailScopes.GMAIL_SETTINGS_SHARING) - .createDelegated(userEmail); + .createScoped(GmailScopes.GMAIL_SETTINGS_SHARING); HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter(credentials); // Create the gmail API client @@ -72,8 +69,12 @@ public static AutoForwarding enableAutoForwarding(String forwardingEmail) throws } } catch (GoogleJsonResponseException e) { // TODO(developer) - handle error appropriately - System.err.println("Unable to enable forwarding : " + e.getDetails()); - throw e; + GoogleJsonError error = e.getDetails(); + if (error.getCode() == 403) { + System.err.println("Unable to enable forwarding: " + e.getDetails()); + } else { + throw e; + } } return null; } diff --git a/gmail/snippets/src/main/java/InsertCertFromCsv.java b/gmail/snippets/src/main/java/InsertCertFromCsv.java index d31607e0..2259098c 100644 --- a/gmail/snippets/src/main/java/InsertCertFromCsv.java +++ b/gmail/snippets/src/main/java/InsertCertFromCsv.java @@ -43,10 +43,9 @@ public static void insertCertFromCsv(String csvFilename) { SmimeInfo smimeInfo = CreateSmimeInfo.createSmimeInfo(certFilename, certPassword); if (smimeInfo != null) { - InsertSmimeInfo.insertSmimeInfo(certFilename, - certPassword, + InsertSmimeInfo.insertSmimeInfo(userId, userId, - userId); + smimeInfo); } else { System.err.printf("Unable to read certificate file for userId: %s\n", userId); } diff --git a/gmail/snippets/src/main/java/InsertSmimeInfo.java b/gmail/snippets/src/main/java/InsertSmimeInfo.java index 1f598ef2..e686126d 100644 --- a/gmail/snippets/src/main/java/InsertSmimeInfo.java +++ b/gmail/snippets/src/main/java/InsertSmimeInfo.java @@ -14,6 +14,8 @@ // [START gmail_insert_smime_info] +import com.google.api.client.googleapis.json.GoogleJsonError; +import com.google.api.client.googleapis.json.GoogleJsonResponseException; import com.google.api.client.http.HttpRequestInitializer; import com.google.api.client.http.javanet.NetHttpTransport; import com.google.api.client.json.gson.GsonFactory; @@ -31,23 +33,21 @@ public class InsertSmimeInfo { /** * Upload an S/MIME certificate for the user. * - * @param filename Name of the file containing the S/MIME certificate. - * @param password Password for the certificate file, or null if the file - * is not password-protected. * @param userId User's email address. * @param sendAsEmail The "send as" email address, or null if it should be the same as userId. - * @return An SmimeInfo object with details about the uploaded certificate. + * @param smimeInfo The SmimeInfo object containing the user's S/MIME certificate. + * @return An SmimeInfo object with details about the uploaded certificate, {@code null} otherwise. + * @throws IOException - if service account credentials file not found. */ - public static SmimeInfo insertSmimeInfo(String filename, - String password, - String userId, - String sendAsEmail) + public static SmimeInfo insertSmimeInfo(String userId, + String sendAsEmail, + SmimeInfo smimeInfo) throws IOException { /* Load pre-authorized user credentials from the environment. TODO(developer) - See https://developers.google.com/identity for guides on implementing OAuth2 for your application. */ GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() - .createScoped(Collections.singletonList(GmailScopes.GMAIL_SETTINGS_SHARING)); + .createScoped(GmailScopes.GMAIL_SETTINGS_SHARING); HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( credentials); @@ -63,7 +63,6 @@ public static SmimeInfo insertSmimeInfo(String filename, } try { - SmimeInfo smimeInfo = CreateSmimeInfo.createSmimeInfo(filename, password); SmimeInfo results = service.users().settings().sendAs().smimeInfo() .insert(userId, sendAsEmail, smimeInfo) .execute(); @@ -72,7 +71,6 @@ public static SmimeInfo insertSmimeInfo(String filename, } catch (IOException e) { System.err.printf("An error occured: %s", e); } - return null; } } diff --git a/gmail/snippets/src/main/java/SendMessage.java b/gmail/snippets/src/main/java/SendMessage.java index 7402b122..9e0ec4b7 100644 --- a/gmail/snippets/src/main/java/SendMessage.java +++ b/gmail/snippets/src/main/java/SendMessage.java @@ -14,6 +14,7 @@ // [START gmail_send_message] +import com.google.api.client.googleapis.json.GoogleJsonError; import com.google.api.client.googleapis.json.GoogleJsonResponseException; import com.google.api.client.http.HttpRequestInitializer; import com.google.api.client.http.javanet.NetHttpTransport; @@ -42,16 +43,16 @@ public class SendMessage { * * @param fromEmailAddress - Email address to appear in the from: header * @param toEmailAddress - Email address of the recipient - * @return the sent message + * @return the sent message, {@code null} otherwise. * @throws MessagingException - if a wrongly formatted address is encountered. * @throws IOException - if service account credentials file not found. */ public static Message sendEmail(String fromEmailAddress, String toEmailAddress) throws MessagingException, IOException { - // Load pre-authorized user credentials from the environment. - // TODO(developer) - See https://developers.google.com/identity for - // guides on implementing OAuth2 for your application. + /* Load pre-authorized user credentials from the environment. + TODO(developer) - See https://developers.google.com/identity for + guides on implementing OAuth2 for your application.*/ GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() .createScoped(GmailScopes.GMAIL_SEND); HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter(credentials); @@ -93,9 +94,14 @@ public static Message sendEmail(String fromEmailAddress, return message; } catch (GoogleJsonResponseException e) { // TODO(developer) - handle error appropriately - System.err.println("Unable to send message: " + e.getDetails()); - throw e; + GoogleJsonError error = e.getDetails(); + if (error.getCode() == 403) { + System.err.println("Unable to send message: " + e.getDetails()); + } else { + throw e; + } } + return null; } } // [END gmail_send_message] \ No newline at end of file diff --git a/gmail/snippets/src/main/java/SendMessageWithAttachment.java b/gmail/snippets/src/main/java/SendMessageWithAttachment.java index 36c1fb98..29c28ec4 100644 --- a/gmail/snippets/src/main/java/SendMessageWithAttachment.java +++ b/gmail/snippets/src/main/java/SendMessageWithAttachment.java @@ -14,6 +14,7 @@ // [START gmail_send_message_with_attachment] +import com.google.api.client.googleapis.json.GoogleJsonError; import com.google.api.client.googleapis.json.GoogleJsonResponseException; import com.google.api.client.http.HttpRequestInitializer; import com.google.api.client.http.javanet.NetHttpTransport; @@ -28,7 +29,6 @@ import java.io.ByteArrayOutputStream; import java.io.File; import java.io.IOException; -import java.util.Collections; import java.util.Properties; import javax.activation.DataHandler; @@ -50,7 +50,7 @@ public class SendMessageWithAttachment{ * @param fromEmailAddress - Email address to appear in the from: header. * @param toEmailAddress - Email address of the recipient. * @param file - Path to the file to be attached. - * @return the sent message. + * @return the sent message, {@code null} otherwise. * @throws MessagingException - if a wrongly formatted address is encountered. * @throws IOException - if service account credentials file not found. */ @@ -58,9 +58,9 @@ public static Message sendEmailWithAttachment(String fromEmailAddress, String toEmailAddress, File file) throws MessagingException, IOException { - // Load pre-authorized user credentials from the environment. - // TODO(developer) - See https://developers.google.com/identity for - // guides on implementing OAuth2 for your application. + /* Load pre-authorized user credentials from the environment. + TODO(developer) - See https://developers.google.com/identity for + guides on implementing OAuth2 for your application.*/ GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() .createScoped(GmailScopes.GMAIL_SEND); HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter(credentials); @@ -112,9 +112,14 @@ public static Message sendEmailWithAttachment(String fromEmailAddress, return message; } catch (GoogleJsonResponseException e) { // TODO(developer) - handle error appropriately - System.err.println("Unable to send message: " + e.getDetails()); - throw e; + GoogleJsonError error = e.getDetails(); + if (error.getCode() == 403) { + System.err.println("Unable to send message: " + e.getDetails()); + } else { + throw e; + } } + return null; } } // [END gmail_send_message_with_attachment] \ No newline at end of file diff --git a/gmail/snippets/src/main/java/UpdateSignature.java b/gmail/snippets/src/main/java/UpdateSignature.java index af27e159..ca21e77e 100644 --- a/gmail/snippets/src/main/java/UpdateSignature.java +++ b/gmail/snippets/src/main/java/UpdateSignature.java @@ -14,6 +14,7 @@ // [START gmail_update_signature] +import com.google.api.client.googleapis.json.GoogleJsonError; import com.google.api.client.googleapis.json.GoogleJsonResponseException; import com.google.api.client.http.HttpRequestInitializer; import com.google.api.client.http.javanet.NetHttpTransport; @@ -25,26 +26,21 @@ import com.google.auth.http.HttpCredentialsAdapter; import com.google.auth.oauth2.GoogleCredentials; import java.io.IOException; -import java.util.Collections; /* Class to demonstrate the use of Gmail Update Signature API */ public class UpdateSignature { /** * Update the gmail signature. * - * @return the updated signature id + * @return the updated signature id , {@code null} otherwise. * @throws IOException - if service account credentials file not found. */ public static String updateGmailSignature() throws IOException { - // TODO(developer) - Replace with your email address. - String userEmail = "gduser1@workspacesamples.dev"; - /* Load pre-authorized user credentials from the environment. TODO(developer) - See https://developers.google.com/identity for guides on implementing OAuth2 for your application. */ GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() - .createScoped(GmailScopes.GMAIL_SETTINGS_BASIC) - .createDelegated(userEmail); + .createScoped(GmailScopes.GMAIL_SETTINGS_BASIC); HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter(credentials); // Create the gmail API client @@ -75,9 +71,14 @@ public static String updateGmailSignature() throws IOException { return result.getSignature(); } catch (GoogleJsonResponseException e) { // TODO(developer) - handle error appropriately - System.err.println("Unable to update signature: " + e.getDetails()); - throw e; + GoogleJsonError error = e.getDetails(); + if (error.getCode() == 403) { + System.err.println("Unable to update signature: " + e.getDetails()); + } else { + throw e; + } } + return null; } } // [END gmail_update_signature] \ No newline at end of file diff --git a/gmail/snippets/src/main/java/UpdateSmimeCerts.java b/gmail/snippets/src/main/java/UpdateSmimeCerts.java index 2e014a68..cd9ccb2c 100644 --- a/gmail/snippets/src/main/java/UpdateSmimeCerts.java +++ b/gmail/snippets/src/main/java/UpdateSmimeCerts.java @@ -47,7 +47,8 @@ public class UpdateSmimeCerts { * password-protected. * @param expireTime DateTime object against which the certificate expiration is compared. If * None, uses the current time. @ returns: The ID of the default certificate. - * @return The ID of the default certifcate. + * @return The ID of the default certificate, {@code null} otherwise. + * @throws IOException - if service account credentials file not found. */ public static String updateSmimeCerts(String userId, String sendAsEmail, @@ -59,7 +60,7 @@ public static String updateSmimeCerts(String userId, TODO(developer) - See https://developers.google.com/identity for guides on implementing OAuth2 for your application. */ GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() - .createScoped(Collections.singletonList(GmailScopes.GMAIL_SETTINGS_SHARING)); + .createScoped(GmailScopes.GMAIL_SETTINGS_SHARING); HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( credentials); @@ -114,10 +115,11 @@ public static String updateSmimeCerts(String userId, if (defaultCertId == null) { String defaultId = bestCertId; if (defaultId == null && certFilename != null) { - SmimeInfo insertResults = InsertSmimeInfo.insertSmimeInfo(certFilename, - certPassword, - userId, - sendAsEmail); + SmimeInfo smimeInfo = CreateSmimeInfo.createSmimeInfo(certFilename, + certPassword); + SmimeInfo insertResults = InsertSmimeInfo.insertSmimeInfo(userId, + sendAsEmail, + smimeInfo); if (insertResults != null) { defaultId = insertResults.getId(); } diff --git a/gmail/snippets/src/main/java/UpdateSmimeFromCsv.java b/gmail/snippets/src/main/java/UpdateSmimeFromCsv.java index 3f7d3964..efe3052b 100644 --- a/gmail/snippets/src/main/java/UpdateSmimeFromCsv.java +++ b/gmail/snippets/src/main/java/UpdateSmimeFromCsv.java @@ -36,9 +36,7 @@ public class UpdateSmimeFromCsv { public static void updateSmimeFromCsv(String csvFilename, LocalDateTime expireTime) { try { File csvFile = new File(csvFilename); - CSVParser parser = - CSVParser.parse( - csvFile, + CSVParser parser = CSVParser.parse( csvFile, java.nio.charset.StandardCharsets.UTF_8, CSVFormat.DEFAULT.withHeader().withSkipHeaderRecord()); for (CSVRecord record : parser) { diff --git a/gmail/snippets/src/test/java/BaseTest.java b/gmail/snippets/src/test/java/BaseTest.java index 11f8fbd3..4e287a9f 100644 --- a/gmail/snippets/src/test/java/BaseTest.java +++ b/gmail/snippets/src/test/java/BaseTest.java @@ -1,99 +1,49 @@ -import com.google.api.client.googleapis.auth.oauth2.GoogleCredential; import com.google.api.client.http.HttpRequestInitializer; -import com.google.api.client.http.HttpTransport; import com.google.api.client.http.javanet.NetHttpTransport; import com.google.api.client.json.gson.GsonFactory; import com.google.api.services.gmail.Gmail; import com.google.api.services.gmail.GmailScopes; import com.google.auth.http.HttpCredentialsAdapter; import com.google.auth.oauth2.GoogleCredentials; -import org.junit.After; import org.junit.Before; -import org.mockito.MockedStatic; -import org.mockito.Mockito; - -import java.io.FileInputStream; -import java.io.FileNotFoundException; import java.io.IOException; -import java.io.InputStream; -import java.util.*; -import java.util.logging.Handler; -import java.util.logging.Level; -import java.util.logging.LogRecord; -import java.util.logging.Logger; public class BaseTest { - public static final String TEST_USER = "ci-test01@workspacesamples.dev"; - public static final String RECIPIENT = "gduser01@workspacesamples.dev"; - public static final String FORWARDING_ADDRESS = "gduser01@workspacesamples.dev"; - - static { - enableLogging(); - } + public static final String RECIPIENT = "gduser1@workspacesamples.dev"; + public static final String FORWARDING_ADDRESS = "gduser1@workspacesamples.dev"; protected Gmail service; - - public static void enableLogging() { - Logger logger = Logger.getLogger(HttpTransport.class.getName()); - logger.setLevel(Level.ALL); - logger.addHandler(new Handler() { - - @Override - public void close() throws SecurityException { - } - - @Override - public void flush() { - } - - @Override - public void publish(LogRecord record) { - // default ConsoleHandler will print >= INFO to System.err - if (record.getLevel().intValue() < Level.INFO.intValue()) { - System.out.println(record.getMessage()); - } - } - }); - } - + /** + * Create a default authorization Gmail client service. + * + * @return an authorized Gmail client service + * @throws IOException - if credentials file not found. + */ public Gmail buildService() throws IOException { - String serviceAccountPath = System.getenv("SERVICE_ACCOUNT_CREDENTIALS"); - try (InputStream stream = new FileInputStream(serviceAccountPath)) { - GoogleCredentials credentials = GoogleCredentials.fromStream(stream); - credentials = credentials.createScoped( - "email", - GmailScopes.MAIL_GOOGLE_COM, - GmailScopes.GMAIL_SETTINGS_BASIC, - GmailScopes.GMAIL_COMPOSE, - GmailScopes.GMAIL_SETTINGS_SHARING, - GmailScopes.GMAIL_LABELS).createDelegated(TEST_USER); - HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter(credentials); - return new Gmail.Builder( - new NetHttpTransport(), + /* Load pre-authorized user credentials from the environment. + TODO(developer) - See https://developers.google.com/identity for + guides on implementing OAuth2 for your application.*/ + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(GmailScopes.GMAIL_SETTINGS_BASIC, + GmailScopes.GMAIL_COMPOSE, + GmailScopes.GMAIL_SETTINGS_SHARING, + GmailScopes.GMAIL_LABELS); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter(credentials); + + // Create the Gmail API client + Gmail service = new Gmail.Builder(new NetHttpTransport(), GsonFactory.getDefaultInstance(), requestInitializer) .setApplicationName("Gmail API Snippets") .build(); - } + return service; } @Before public void setupService() throws IOException { this.service = buildService(); } - - public MockedStatic useServiceAccount() throws IOException { - MockedStatic mockedGoogleCredentials; - String serviceAccountPath = System.getenv("SERVICE_ACCOUNT_CREDENTIALS"); - try (InputStream stream = new FileInputStream(serviceAccountPath)) { - GoogleCredentials credentials = GoogleCredentials.fromStream(stream); - mockedGoogleCredentials = Mockito.mockStatic(GoogleCredentials.class); - mockedGoogleCredentials.when(GoogleCredentials::getApplicationDefault).thenReturn(credentials); - return mockedGoogleCredentials; - } - } - } diff --git a/gmail/snippets/src/test/java/SendEmailTest.java b/gmail/snippets/src/test/java/SendEmailTest.java deleted file mode 100644 index 6d17129b..00000000 --- a/gmail/snippets/src/test/java/SendEmailTest.java +++ /dev/null @@ -1,70 +0,0 @@ -import com.google.api.services.gmail.model.*; -import org.junit.Test; - -import javax.mail.Message; -import javax.mail.MessagingException; -import javax.mail.internet.MimeMessage; -import java.io.IOException; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; - -public class SendEmailTest extends BaseTest { - - @Test - public void createEmail() throws MessagingException, IOException { - MimeMessage mimeMessage = SendEmail.createEmail(RECIPIENT, - TEST_USER, - "test", - "Hello!"); - assertEquals("test", mimeMessage.getSubject()); - assertEquals("Hello!", mimeMessage.getContent()); - assertEquals(RECIPIENT, mimeMessage.getRecipients(Message.RecipientType.TO)[0].toString()); - assertEquals(TEST_USER, mimeMessage.getFrom()[0].toString()); - } - - @Test - public void createEmailWithAttachment() throws MessagingException, IOException { - MimeMessage mimeMessage = SendEmail.createEmailWithAttachment(RECIPIENT, - TEST_USER, - "test", - "Hello!", - new java.io.File("files/photo.jpg")); - assertEquals("test", mimeMessage.getSubject()); - assertEquals(RECIPIENT, mimeMessage.getRecipients(Message.RecipientType.TO)[0].toString()); - assertEquals(TEST_USER, mimeMessage.getFrom()[0].toString()); - } - - @Test - public void createMessageWithEmail() throws MessagingException, IOException { - MimeMessage mimeMessage = SendEmail.createEmail(RECIPIENT, - TEST_USER, - "test", - "Hello!"); - - com.google.api.services.gmail.model.Message message = SendEmail.createMessageWithEmail(mimeMessage); - assertNotNull(message.getRaw()); // Weak assertion... - } - - @Test - public void createDraft() throws MessagingException, IOException { - MimeMessage mimeMessage = SendEmail.createEmail(RECIPIENT, - TEST_USER, - "test", - "Hello!"); - Draft draft = SendEmail.createDraft(this.service, "me", mimeMessage); - assertNotNull(draft); - this.service.users().drafts().delete("me", draft.getId()); - } - - @Test - public void sendEmail() throws MessagingException, IOException { - MimeMessage mimeMessage = SendEmail.createEmailWithAttachment(RECIPIENT, - TEST_USER, - "test", - "Hello!", - new java.io.File("files/photo.jpg")); - com.google.api.services.gmail.model.Message message = SendEmail.sendMessage(this.service, "me", mimeMessage); - assertNotNull(message); - } -} diff --git a/gmail/snippets/src/test/java/SettingsSnippetsTest.java b/gmail/snippets/src/test/java/SettingsSnippetsTest.java deleted file mode 100644 index b1017b59..00000000 --- a/gmail/snippets/src/test/java/SettingsSnippetsTest.java +++ /dev/null @@ -1,82 +0,0 @@ - -import com.google.api.services.gmail.model.AutoForwarding; -import com.google.api.services.gmail.model.Label; -import com.google.api.services.gmail.model.ListLabelsResponse; -import com.google.api.services.gmail.model.VacationSettings; -import org.junit.After; -import org.junit.Before; -import org.junit.Test; - -import java.io.IOException; -import java.security.GeneralSecurityException; - -import static org.junit.Assert.*; - -public class SettingsSnippetsTest extends BaseTest { - - private SettingsSnippets snippets; - private Label testLabel = null; - - @Before - public void createSnippets() { - this.snippets = new SettingsSnippets(this.service); - } - - @Before - public void createLabel() throws IOException { - ListLabelsResponse response = this.service.users().labels().list("me").execute(); - for (Label l : response.getLabels()) { - if (l.getName().equals("testLabel")) { - testLabel = l; - } - } - if (testLabel == null) { - Label label = new Label() - .setName("testLabel") - .setLabelListVisibility("labelShow") - .setMessageListVisibility("show"); - testLabel = this.service.users().labels().create("me", label).execute(); - } - } - - @After - public void deleteLabel() throws IOException { - if (testLabel != null) { - this.service.users().labels().delete("me", testLabel.getId()).execute(); - testLabel = null; - } - } - - @Test - public void updateSignature() throws IOException, GeneralSecurityException { - String signature = this.snippets.updateSignature(); - assertEquals("I heart cats.", signature); - } - - @Test - public void createFilter() throws IOException, GeneralSecurityException { - String id = this.snippets.createFilter(testLabel.getId()); - assertNotNull(id); - this.service.users().settings().filters().delete("me", id).execute(); - } - - @Test - public void enableAutoForwarding() throws IOException, GeneralSecurityException { - try { - AutoForwarding forwarding = new AutoForwarding().setEnabled(false); - this.service.users().settings().updateAutoForwarding("me", forwarding).execute(); - this.service.users().settings().forwardingAddresses().delete("me", FORWARDING_ADDRESS).execute(); - } catch (Exception e) { - // Ignore - resources might not exist - e.printStackTrace(); - } - AutoForwarding forwarding = this.snippets.enableForwarding(FORWARDING_ADDRESS); - assertNotNull(forwarding); - } - - @Test - public void enableAutoReply() throws IOException, GeneralSecurityException { - VacationSettings settings = this.snippets.enableAutoReply(); - assertNotNull(settings); - } -} diff --git a/gmail/snippets/src/test/java/SmimeSnippetsTest.java b/gmail/snippets/src/test/java/SmimeSnippetsTest.java deleted file mode 100644 index 78e6c48c..00000000 --- a/gmail/snippets/src/test/java/SmimeSnippetsTest.java +++ /dev/null @@ -1,392 +0,0 @@ -import static org.hamcrest.Matchers.greaterThan; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertNull; -import static org.junit.Assert.assertThat; -import static org.mockito.ArgumentMatchers.eq; -import static org.mockito.Mockito.*; - -import com.google.api.services.gmail.Gmail; -import com.google.api.services.gmail.model.*; - -import java.io.File; -import java.io.IOException; -import java.time.Instant; -import java.time.LocalDateTime; -import java.time.ZoneId; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import org.junit.After; -import org.junit.Before; -import org.junit.Rule; -import org.junit.Test; -import org.mockito.Mock; -import org.mockito.junit.MockitoJUnit; -import org.mockito.junit.MockitoRule; - -public class SmimeSnippetsTest { - - private static final long CURRENT_TIME_MS = 1234567890; - private static final LocalDateTime CURRENT_TIME = - LocalDateTime.ofInstant(Instant.ofEpochMilli(CURRENT_TIME_MS), ZoneId.systemDefault()); - private static final String TEST_USER = "user1@example.com"; - - @Mock private Gmail mockService; - @Mock private Gmail.Users mockUsers; - @Mock private Gmail.Users.Settings mockSettings; - @Mock private Gmail.Users.Settings.SendAs mockSendAs; - @Mock private Gmail.Users.Settings.SendAs.SmimeInfo mockSmimeInfo; - @Mock private Gmail.Users.Settings.SendAs.SmimeInfo.Delete mockDelete; - @Mock private Gmail.Users.Settings.SendAs.SmimeInfo.Get mockGet; - @Mock private Gmail.Users.Settings.SendAs.SmimeInfo.Insert mockInsert; - @Mock private Gmail.Users.Settings.SendAs.SmimeInfo.List mockList; - @Mock private Gmail.Users.Settings.SendAs.SmimeInfo.SetDefault mockSetDefault; - - @Rule public MockitoRule mockitoRule = MockitoJUnit.rule(); - - @Before - public void setup() throws IOException { - when(mockService.users()).thenReturn(mockUsers); - when(mockUsers.settings()).thenReturn(mockSettings); - when(mockSettings.sendAs()).thenReturn(mockSendAs); - when(mockSendAs.smimeInfo()).thenReturn(mockSmimeInfo); - - when(mockSmimeInfo.delete(any(), any(), any())).thenReturn(mockDelete); - when(mockSmimeInfo.get(any(), any(), any())).thenReturn(mockGet); - when(mockSmimeInfo.insert(any(), any(), any())).thenReturn(mockInsert); - when(mockSmimeInfo.list(any(), any())).thenReturn(mockList); - when(mockSmimeInfo.setDefault(any(), any(), any())).thenReturn(mockSetDefault); - } - - - @Test - public void testCreateSmimeInfo() { - SmimeInfo smimeInfo = SmimeSnippets.createSmimeInfo("files/cert.p12", null /* password */); - - assertNotNull(smimeInfo); - assertNull(smimeInfo.getEncryptedKeyPassword()); - assertNull(smimeInfo.getExpiration()); - assertNull(smimeInfo.getId()); - assertNull(smimeInfo.getIsDefault()); - assertNull(smimeInfo.getIssuerCn()); - assertNull(smimeInfo.getPem()); - assertThat(smimeInfo.getPkcs12().length(), greaterThan(0)); - } - - @Test - public void testCreateSmimeInfoWithPassword() { - SmimeInfo smimeInfo = SmimeSnippets.createSmimeInfo("files/cert.p12", "certpass"); - - assertNotNull(smimeInfo); - assertEquals(smimeInfo.getEncryptedKeyPassword(), "certpass"); - assertNull(smimeInfo.getExpiration()); - assertNull(smimeInfo.getId()); - assertNull(smimeInfo.getIsDefault()); - assertNull(smimeInfo.getIssuerCn()); - assertNull(smimeInfo.getPem()); - assertThat(smimeInfo.getPkcs12().length(), greaterThan(0)); - } - - @Test - public void testCreateSmimeInfoFileNotFound() { - SmimeInfo smimeInfo = SmimeSnippets.createSmimeInfo("files/notfound.p12", null /* password */); - - assertNull(smimeInfo); - } - - @Test - public void testInsertSmimeInfo() throws IOException { - SmimeInfo insertResult = makeFakeInsertResult(); - when(mockInsert.execute()).thenReturn(insertResult); - - SmimeInfo smimeInfo = SmimeSnippets.createSmimeInfo("files/cert.p12", null /* password */); - SmimeInfo result = SmimeSnippets.insertSmimeInfo(mockService, TEST_USER, TEST_USER, smimeInfo); - - //verifySmimeApiCalled(1); - verify(mockSmimeInfo).insert(eq(TEST_USER), eq(TEST_USER), eq(smimeInfo)); - verify(mockInsert).execute(); - - assertEquals(insertResult, result); - } - - @Test - public void testInsertSmimeInfoError() throws IOException { - when(mockInsert.execute()).thenThrow(IOException.class); - - SmimeInfo smimeInfo = SmimeSnippets.createSmimeInfo("files/cert.p12", null /* password */); - SmimeInfo result = SmimeSnippets.insertSmimeInfo(mockService, TEST_USER, TEST_USER, smimeInfo); - - verifySmimeApiCalled(1); - verify(mockSmimeInfo).insert(eq(TEST_USER), eq(TEST_USER), eq(smimeInfo)); - verify(mockInsert).execute(); - - assertNull(result); - } - - @Test - public void testInsertSmimeFromCsv() throws IOException { - when(mockInsert.execute()).thenReturn(makeFakeInsertResult()); - SmimeSnippets.insertCertFromCsv((u) -> mockService, "files/certs.csv"); - - //verifySmimeApiCalled(2); - //verify(mockSmimeInfo).insert(eq("user1@example.com"), eq("user1@example.com"), any()); - //verify(mockSmimeInfo).insert(eq("user2@example.com"), eq("user2@example.com"), any()); - verify(mockInsert, times(2)).execute(); - } - - @Test - public void testInsertSmimeFromCsvFails() throws IOException { - when(mockInsert.execute()).thenReturn(makeFakeInsertResult()); - - SmimeSnippets.insertCertFromCsv((u) -> mockService, "files/notfound.csv"); - } - - @Test - public void testUpdateSmimeCertsNoCerts() throws IOException { - when(mockList.execute()).thenReturn(makeFakeListResult()); - - String defaultCertId = - SmimeSnippets.updateSmimeCerts( - mockService, - TEST_USER, - TEST_USER, - null /* certFilename */, - null /* certPassword */, - CURRENT_TIME); - - verifySmimeApiCalled(1); - verify(mockSmimeInfo).list(eq(TEST_USER), eq(TEST_USER)); - verify(mockList).execute(); - - assertNull(defaultCertId); - } - - @Test - public void testUpdateSmimeCertsNoCertsUploadNewCert() throws IOException { - when(mockList.execute()).thenReturn(makeFakeListResult()); - when(mockInsert.execute()).thenReturn(makeFakeInsertResult()); - - String defaultCertId = - SmimeSnippets.updateSmimeCerts( - mockService, - TEST_USER, - TEST_USER, - "files/cert.p12", - null /* certPassword */, - CURRENT_TIME); - - verifySmimeApiCalled(3); - verify(mockSmimeInfo).list(eq(TEST_USER), eq(TEST_USER)); - verify(mockSmimeInfo).insert(eq(TEST_USER), eq(TEST_USER), any()); - verify(mockSmimeInfo).setDefault(eq(TEST_USER), eq(TEST_USER), eq("new_certificate_id")); - verify(mockList).execute(); - verify(mockInsert).execute(); - verify(mockSetDefault).execute(); - - assertEquals(defaultCertId, "new_certificate_id"); - } - - @Test - public void testUpdateSmimeCertsValidDefaultCertNoUpload() throws IOException { - ListSmimeInfoResponse listResponse = - makeFakeListResult(Arrays.asList(true), Arrays.asList(CURRENT_TIME_MS + 1)); - when(mockList.execute()).thenReturn(listResponse); - - String defaultCertId = - SmimeSnippets.updateSmimeCerts( - mockService, - TEST_USER, - TEST_USER, - "files/cert.p12", - null /* certPassword */, - CURRENT_TIME); - - verifySmimeApiCalled(1); - verify(mockSmimeInfo).list(eq(TEST_USER), eq(TEST_USER)); - verify(mockList).execute(); - - assertEquals(defaultCertId, "existing_certificate_id0"); - } - - @Test - public void testUpdateSmimeCertsExpiredDefaultCertUploadNewCert() throws IOException { - LocalDateTime expireTime = - LocalDateTime.ofInstant(Instant.ofEpochMilli(CURRENT_TIME_MS + 2), ZoneId.systemDefault()); - ListSmimeInfoResponse listResponse = - makeFakeListResult(Arrays.asList(true), Arrays.asList(CURRENT_TIME_MS + 1)); - when(mockList.execute()).thenReturn(listResponse); - - when(mockInsert.execute()).thenReturn(makeFakeInsertResult()); - - String defaultCertId = - SmimeSnippets.updateSmimeCerts( - mockService, - TEST_USER, - TEST_USER, - "files/cert.p12", - null /* certPassword */, - expireTime); - - verifySmimeApiCalled(3); - verify(mockSmimeInfo).list(eq(TEST_USER), eq(TEST_USER)); - verify(mockSmimeInfo).insert(eq(TEST_USER), eq(TEST_USER), any()); - verify(mockSmimeInfo).setDefault(eq(TEST_USER), eq(TEST_USER), eq("new_certificate_id")); - verify(mockList).execute(); - verify(mockInsert).execute(); - verify(mockSetDefault).execute(); - - assertEquals(defaultCertId, "new_certificate_id"); - } - - @Test - public void testUpdateSmimeCertsExpiredDefaultCertOtherCertNewDefault() throws IOException { - ListSmimeInfoResponse listResponse = - makeFakeListResult( - Arrays.asList(true, false), Arrays.asList(CURRENT_TIME_MS - 1, CURRENT_TIME_MS + 1)); - when(mockList.execute()).thenReturn(listResponse); - - String defaultCertId = - SmimeSnippets.updateSmimeCerts( - mockService, - TEST_USER, - TEST_USER, - "files/cert.p12", - null /* certPassword */, - CURRENT_TIME); - - verifySmimeApiCalled(2); - verify(mockSmimeInfo).list(eq(TEST_USER), eq(TEST_USER)); - verify(mockSmimeInfo).setDefault(eq(TEST_USER), eq(TEST_USER), eq("existing_certificate_id1")); - verify(mockList).execute(); - verify(mockSetDefault).execute(); - - assertEquals(defaultCertId, "existing_certificate_id1"); - } - - @Test - public void testUpdateSmimeCertsNoCertsNoDefaultsChooseBestCertAsNewDefault() throws IOException { - ListSmimeInfoResponse listResponse = - makeFakeListResult( - Arrays.asList(false, false, false, false), - Arrays.asList( - CURRENT_TIME_MS + 2, - CURRENT_TIME_MS + 1, - CURRENT_TIME_MS + 4, - CURRENT_TIME_MS + 3)); - when(mockList.execute()).thenReturn(listResponse); - - String defaultCertId = - SmimeSnippets.updateSmimeCerts( - mockService, - TEST_USER, - TEST_USER, - "files/cert.p12", - null /* certPassword */, - CURRENT_TIME); - - verifySmimeApiCalled(2); - verify(mockSmimeInfo).list(eq(TEST_USER), eq(TEST_USER)); - verify(mockSmimeInfo).setDefault(eq(TEST_USER), eq(TEST_USER), eq("existing_certificate_id2")); - verify(mockList).execute(); - verify(mockSetDefault).execute(); - - assertEquals(defaultCertId, "existing_certificate_id2"); - } - - @Test - public void testUpdateSmimeCertsError() throws IOException { - when(mockList.execute()).thenThrow(IOException.class); - - String defaultCertId = - SmimeSnippets.updateSmimeCerts( - mockService, - TEST_USER, - TEST_USER, - "files/cert.p12", - null /* certPassword */, - CURRENT_TIME); - - verifySmimeApiCalled(1); - verify(mockSmimeInfo).list(eq(TEST_USER), eq(TEST_USER)); - verify(mockList).execute(); - - assertNull(defaultCertId); - } - - @Test - public void testUpdateSmimeFromCsv() throws IOException { - when(mockList.execute()).thenReturn(makeFakeListResult()); - when(mockInsert.execute()).thenReturn(makeFakeInsertResult()); - - SmimeSnippets.updateSmimeFromCsv((u) -> mockService, "files/certs.csv", CURRENT_TIME); - - verifySmimeApiCalled(9); - verify(mockSmimeInfo).list(eq("user1@example.com"), eq("user1@example.com")); - verify(mockSmimeInfo).list(eq("user2@example.com"), eq("user2@example.com")); - verify(mockSmimeInfo).list(eq("user3@example.com"), eq("user3@example.com")); - verify(mockSmimeInfo).insert(eq("user1@example.com"), eq("user1@example.com"), any()); - verify(mockSmimeInfo).insert(eq("user2@example.com"), eq("user2@example.com"), any()); - verify(mockSmimeInfo).insert(eq("user3@example.com"), eq("user3@example.com"), any()); - verify(mockSmimeInfo) - .setDefault(eq("user1@example.com"), eq("user1@example.com"), eq("new_certificate_id")); - verify(mockSmimeInfo) - .setDefault(eq("user2@example.com"), eq("user2@example.com"), eq("new_certificate_id")); - verify(mockSmimeInfo) - .setDefault(eq("user3@example.com"), eq("user3@example.com"), eq("new_certificate_id")); - verify(mockList, times(3)).execute(); - verify(mockInsert, times(3)).execute(); - verify(mockSetDefault, times(3)).execute(); - } - - @Test - public void testUpdateSmimeFromCsvFails() { - SmimeSnippets.insertCertFromCsv((u) -> mockService, "files/notfound.csv"); - // tearDown() verifies that there were no interactions with the API. - } - - private void verifySmimeApiCalled(int numCalls) { - verify(mockService, times(numCalls)).users(); - verify(mockUsers, times(numCalls)).settings(); - verify(mockSettings, times(numCalls)).sendAs(); - verify(mockSendAs, times(numCalls)).smimeInfo(); - } - - private ListSmimeInfoResponse makeFakeListResult(List isDefault, List expiration) { - ListSmimeInfoResponse listResponse = new ListSmimeInfoResponse(); - if (isDefault == null || expiration == null) { - return listResponse; - } - - assertEquals(isDefault.size(), expiration.size()); - - List smimeInfoList = new ArrayList(); - for (int i = 0; i < isDefault.size(); i++) { - SmimeInfo smimeInfo = new SmimeInfo(); - smimeInfo.setId(String.format("existing_certificate_id%d", i)); - smimeInfo.setIsDefault(isDefault.get(i)); - smimeInfo.setExpiration(expiration.get(i)); - smimeInfoList.add(smimeInfo); - } - listResponse.setSmimeInfo(smimeInfoList); - - return listResponse; - } - - private ListSmimeInfoResponse makeFakeListResult() { - return makeFakeListResult(null /* isDefault */, null /* expiration */); - } - - private SmimeInfo makeFakeInsertResult(String id, boolean isDefault, long expiration) { - SmimeInfo insertResult = new SmimeInfo(); - insertResult.setId(id); - insertResult.setIsDefault(isDefault); - insertResult.setExpiration(expiration); - - return insertResult; - } - - private SmimeInfo makeFakeInsertResult() { - return makeFakeInsertResult("new_certificate_id", false, CURRENT_TIME_MS + 1); - } -} diff --git a/gmail/snippets/src/test/java/TestCreateDraft.java b/gmail/snippets/src/test/java/TestCreateDraft.java new file mode 100644 index 00000000..e3eb2fb2 --- /dev/null +++ b/gmail/snippets/src/test/java/TestCreateDraft.java @@ -0,0 +1,31 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + + +import com.google.api.services.gmail.model.Draft; +import org.junit.Test; +import javax.mail.MessagingException; +import java.io.IOException; +import static org.junit.Assert.assertNotNull; + +// Unit testcase for gmail create draft snippet +public class TestCreateDraft extends BaseTest{ + + @Test + public void testCreateDraft() throws MessagingException, IOException { + Draft draft = CreateDraft.createDraftMessage(RECIPIENT,TEST_USER); + assertNotNull(draft); + this.service.users().drafts().delete("me", draft.getId()).execute(); + } +} diff --git a/gmail/snippets/src/test/java/TestCreateDraftWithAttachment.java b/gmail/snippets/src/test/java/TestCreateDraftWithAttachment.java new file mode 100644 index 00000000..d0031682 --- /dev/null +++ b/gmail/snippets/src/test/java/TestCreateDraftWithAttachment.java @@ -0,0 +1,33 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + + +import com.google.api.services.gmail.model.Draft; +import org.junit.Test; +import javax.mail.MessagingException; +import java.io.IOException; +import static org.junit.Assert.assertNotNull; + +// Unit testcase for gmail create draft with attachment snippet +public class TestCreateDraftWithAttachment extends BaseTest{ + + @Test + public void testCreateDraftWithAttachment() throws MessagingException, IOException { + Draft draft = CreateDraftWithAttachment.createDraftMessageWithAttachment(RECIPIENT, + TEST_USER, + new java.io.File("files/photo.jpg")); + assertNotNull(draft); + this.service.users().drafts().delete(TEST_USER, draft.getId()).execute(); + } +} diff --git a/gmail/snippets/src/test/java/TestCreateEmail.java b/gmail/snippets/src/test/java/TestCreateEmail.java new file mode 100644 index 00000000..1248aa35 --- /dev/null +++ b/gmail/snippets/src/test/java/TestCreateEmail.java @@ -0,0 +1,37 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + + +import org.junit.Test; +import javax.mail.Message; +import javax.mail.MessagingException; +import javax.mail.internet.MimeMessage; +import java.io.IOException; +import static org.junit.Assert.assertEquals; + +// Unit testcase for gmail create email snippet +public class TestCreateEmail extends BaseTest{ + + @Test + public void createEmail() throws MessagingException, IOException { + MimeMessage mimeMessage = CreateEmail.createEmail(RECIPIENT, + TEST_USER, + "test", + "Hello!"); + assertEquals("test", mimeMessage.getSubject()); + assertEquals("Hello!", mimeMessage.getContent()); + assertEquals(RECIPIENT, mimeMessage.getRecipients(Message.RecipientType.TO)[0].toString()); + assertEquals(TEST_USER, mimeMessage.getFrom()[0].toString()); + } +} diff --git a/gmail/snippets/src/test/java/TestCreateFilter.java b/gmail/snippets/src/test/java/TestCreateFilter.java index 4a5eabf8..b345afa1 100644 --- a/gmail/snippets/src/test/java/TestCreateFilter.java +++ b/gmail/snippets/src/test/java/TestCreateFilter.java @@ -18,11 +18,10 @@ import org.junit.After; import org.junit.Before; import org.junit.Test; -import org.mockito.MockedStatic; - import java.io.IOException; import static org.junit.Assert.assertNotNull; +// Unit testcase for gmail create filter snippet public class TestCreateFilter extends BaseTest { private Label testLabel = null; @@ -54,10 +53,8 @@ public void deleteLabel() throws IOException { @Test public void testCreateNewFilter() throws IOException { - try (MockedStatic credentials = useServiceAccount()) { - String id = CreateFilter.createNewFilter(testLabel.getId()); - assertNotNull(id); - this.service.users().settings().filters().delete("me", id).execute(); - } + String id = CreateFilter.createNewFilter(testLabel.getId()); + assertNotNull(id); + this.service.users().settings().filters().delete("me", id).execute(); } } diff --git a/gmail/snippets/src/test/java/TestCreateMessage.java b/gmail/snippets/src/test/java/TestCreateMessage.java new file mode 100644 index 00000000..775e7c1f --- /dev/null +++ b/gmail/snippets/src/test/java/TestCreateMessage.java @@ -0,0 +1,35 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import org.junit.Test; +import javax.mail.MessagingException; +import javax.mail.internet.MimeMessage; +import java.io.IOException; +import static org.junit.Assert.assertNotNull; + +// Unit testcase for gmail create message snippet +public class TestCreateMessage extends BaseTest{ + + @Test + public void testCreateMessageWithEmail() throws MessagingException, + IOException { + MimeMessage mimeMessage = CreateEmail.createEmail(RECIPIENT, + TEST_USER, + "test", + "Hello!"); + + com.google.api.services.gmail.model.Message message = CreateMessage.createMessageWithEmail(mimeMessage); + assertNotNull(message.getRaw()); // Weak assertion... + } +} diff --git a/gmail/snippets/src/test/java/TestCreateSmimeInfo.java b/gmail/snippets/src/test/java/TestCreateSmimeInfo.java index 7d6b1fdb..5357536e 100644 --- a/gmail/snippets/src/test/java/TestCreateSmimeInfo.java +++ b/gmail/snippets/src/test/java/TestCreateSmimeInfo.java @@ -21,6 +21,7 @@ import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; +// Unit testcase for gmail create smime info snippet public class TestCreateSmimeInfo { @Test diff --git a/gmail/snippets/src/test/java/TestEnableAutoReply.java b/gmail/snippets/src/test/java/TestEnableAutoReply.java index 6cd79e91..c961b734 100644 --- a/gmail/snippets/src/test/java/TestEnableAutoReply.java +++ b/gmail/snippets/src/test/java/TestEnableAutoReply.java @@ -12,21 +12,17 @@ // See the License for the specific language governing permissions and // limitations under the License. - import com.google.api.services.gmail.model.VacationSettings; import org.junit.Test; -import org.mockito.MockedStatic; - import java.io.IOException; import static org.junit.Assert.assertNotNull; +// Unit testcase for gmail enable auto reply snippet public class TestEnableAutoReply extends BaseTest { @Test public void testAutoReply() throws IOException { - try (MockedStatic credentials = useServiceAccount()) { - VacationSettings settings = EnableAutoReply.autoReply(); - assertNotNull(settings); - } + VacationSettings settings = EnableAutoReply.autoReply(); + assertNotNull(settings); } } \ No newline at end of file diff --git a/gmail/snippets/src/test/java/TestEnableForwarding.java b/gmail/snippets/src/test/java/TestEnableForwarding.java index 92ec74a4..6250c13c 100644 --- a/gmail/snippets/src/test/java/TestEnableForwarding.java +++ b/gmail/snippets/src/test/java/TestEnableForwarding.java @@ -14,22 +14,18 @@ import com.google.api.services.gmail.model.AutoForwarding; -import org.junit.After; import org.junit.Before; import org.junit.Test; -import org.mockito.MockedStatic; - import java.io.IOException; import static org.junit.Assert.assertNotNull; +// Unit testcase for gmail enable forwarding snippet public class TestEnableForwarding extends BaseTest { @Test public void TestEnableAutoForwarding() throws IOException { - try (MockedStatic credentials = useServiceAccount()) { AutoForwarding forwarding = EnableForwarding.enableAutoForwarding(FORWARDING_ADDRESS); assertNotNull(forwarding); - } } @Before diff --git a/gmail/snippets/src/test/java/TestInsertCertFromCsv.java b/gmail/snippets/src/test/java/TestInsertCertFromCsv.java new file mode 100644 index 00000000..2853cc2e --- /dev/null +++ b/gmail/snippets/src/test/java/TestInsertCertFromCsv.java @@ -0,0 +1,102 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import com.google.api.services.gmail.Gmail; +import com.google.api.services.gmail.model.SmimeInfo; +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.mockito.Mock; +import org.mockito.junit.MockitoJUnit; +import org.mockito.junit.MockitoRule; +import java.io.IOException; + +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.*; + +// Unit testcase for gmail insert cert from csv snippet +public class TestInsertCertFromCsv extends BaseTest{ + + private static final long CURRENT_TIME_MS = 1234567890; + public static final String TEST_USER1 = "gduser1@workspacesamples.dev"; + public static final String TEST_USER2 = "gduser2@workspacesamples.dev"; + + @Mock + private Gmail mockService; + @Mock private Gmail.Users mockUsers; + @Mock private Gmail.Users.Settings mockSettings; + @Mock private Gmail.Users.Settings.SendAs mockSendAs; + @Mock private Gmail.Users.Settings.SendAs.SmimeInfo mockSmimeInfo; + @Mock private Gmail.Users.Settings.SendAs.SmimeInfo.Delete mockDelete; + @Mock private Gmail.Users.Settings.SendAs.SmimeInfo.Get mockGet; + @Mock private Gmail.Users.Settings.SendAs.SmimeInfo.Insert mockInsert; + @Mock private Gmail.Users.Settings.SendAs.SmimeInfo.List mockList; + @Mock private Gmail.Users.Settings.SendAs.SmimeInfo.SetDefault mockSetDefault; + + @Rule + public MockitoRule mockitoRule = MockitoJUnit.rule(); + + @Before + public void setup() throws IOException { + when(mockService.users()).thenReturn(mockUsers); + when(mockUsers.settings()).thenReturn(mockSettings); + when(mockSettings.sendAs()).thenReturn(mockSendAs); + when(mockSendAs.smimeInfo()).thenReturn(mockSmimeInfo); + + when(mockSmimeInfo.delete(any(), any(), any())).thenReturn(mockDelete); + when(mockSmimeInfo.get(any(), any(), any())).thenReturn(mockGet); + when(mockSmimeInfo.insert(any(), any(), any())).thenReturn(mockInsert); + when(mockSmimeInfo.list(any(), any())).thenReturn(mockList); + when(mockSmimeInfo.setDefault(any(), any(), any())).thenReturn(mockSetDefault); + } + + @Test + public void testInsertSmimeFromCsv() throws IOException { + when(mockInsert.execute()).thenReturn(makeFakeInsertResult()); + InsertCertFromCsv.insertCertFromCsv("files/certs.csv"); + + verifySmimeApiCalled(2); + verify(mockSmimeInfo).insert(eq(TEST_USER1), eq(TEST_USER1), any()); + verify(mockSmimeInfo).insert(eq(TEST_USER2), eq(TEST_USER2), any()); + verify(mockInsert, times(2)).execute(); + } + + @Test + public void testInsertSmimeFromCsvFails() throws IOException { + when(mockInsert.execute()).thenReturn(makeFakeInsertResult()); + + InsertCertFromCsv.insertCertFromCsv("files/notfound.csv"); + } + + private void verifySmimeApiCalled(int numCalls) { + verify(mockService, times(numCalls)).users(); + verify(mockUsers, times(numCalls)).settings(); + verify(mockSettings, times(numCalls)).sendAs(); + verify(mockSendAs, times(numCalls)).smimeInfo(); + } + + private SmimeInfo makeFakeInsertResult(String id, boolean isDefault, long expiration) { + SmimeInfo insertResult = new SmimeInfo(); + insertResult.setId(id); + insertResult.setIsDefault(isDefault); + insertResult.setExpiration(expiration); + + return insertResult; + } + + private SmimeInfo makeFakeInsertResult() { + return makeFakeInsertResult("new_certificate_id", false, CURRENT_TIME_MS + 1); + } +} diff --git a/gmail/snippets/src/test/java/TestInsertSmimeInfo.java b/gmail/snippets/src/test/java/TestInsertSmimeInfo.java new file mode 100644 index 00000000..3c70b89a --- /dev/null +++ b/gmail/snippets/src/test/java/TestInsertSmimeInfo.java @@ -0,0 +1,117 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import com.google.api.services.gmail.Gmail; +import com.google.api.services.gmail.model.SmimeInfo; +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.mockito.Mock; +import org.mockito.junit.MockitoJUnit; +import org.mockito.junit.MockitoRule; +import java.io.IOException; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNull; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.*; +import static org.mockito.Mockito.times; + +// Unit testcase for gmail insert smime info snippet +public class TestInsertSmimeInfo extends BaseTest{ + + private static final long CURRENT_TIME_MS = 1234567890; + + @Mock private Gmail mockService; + @Mock private Gmail.Users mockUsers; + @Mock private Gmail.Users.Settings mockSettings; + @Mock private Gmail.Users.Settings.SendAs mockSendAs; + @Mock private Gmail.Users.Settings.SendAs.SmimeInfo mockSmimeInfo; + @Mock private Gmail.Users.Settings.SendAs.SmimeInfo.Delete mockDelete; + @Mock private Gmail.Users.Settings.SendAs.SmimeInfo.Get mockGet; + @Mock private Gmail.Users.Settings.SendAs.SmimeInfo.Insert mockInsert; + @Mock private Gmail.Users.Settings.SendAs.SmimeInfo.List mockList; + @Mock private Gmail.Users.Settings.SendAs.SmimeInfo.SetDefault mockSetDefault; + + @Rule + public MockitoRule mockitoRule = MockitoJUnit.rule(); + + @Before + public void setup() throws IOException { + when(mockService.users()).thenReturn(mockUsers); + when(mockUsers.settings()).thenReturn(mockSettings); + when(mockSettings.sendAs()).thenReturn(mockSendAs); + when(mockSendAs.smimeInfo()).thenReturn(mockSmimeInfo); + + when(mockSmimeInfo.delete(any(), any(), any())).thenReturn(mockDelete); + when(mockSmimeInfo.get(any(), any(), any())).thenReturn(mockGet); + when(mockSmimeInfo.insert(any(), any(), any())).thenReturn(mockInsert); + when(mockSmimeInfo.list(any(), any())).thenReturn(mockList); + when(mockSmimeInfo.setDefault(any(), any(), any())).thenReturn(mockSetDefault); + } + + @Test + public void testInsertSmimeInfo() throws IOException { + SmimeInfo insertResult = makeFakeInsertResult(); + when(mockInsert.execute()).thenReturn(insertResult); + + SmimeInfo smimeInfo = CreateSmimeInfo.createSmimeInfo("files/cert.p12", + null /* password */); + SmimeInfo result = InsertSmimeInfo.insertSmimeInfo(TEST_USER, + TEST_USER, + smimeInfo); + verifySmimeApiCalled(1); + verify(mockSmimeInfo).insert(eq(TEST_USER), eq(TEST_USER), eq(smimeInfo)); + verify(mockInsert).execute(); + + assertEquals(insertResult, result); + } + + @Test + public void testInsertSmimeInfoError() throws IOException { + when(mockInsert.execute()).thenThrow(IOException.class); + + SmimeInfo smimeInfo = CreateSmimeInfo.createSmimeInfo("files/cert.p12", + null /* password */); + SmimeInfo result = InsertSmimeInfo.insertSmimeInfo(TEST_USER, + TEST_USER, smimeInfo); + + verifySmimeApiCalled(1); + verify(mockSmimeInfo).insert(eq(TEST_USER), eq(TEST_USER), eq(smimeInfo)); + verify(mockInsert).execute(); + + assertNull(result); + } + + private void verifySmimeApiCalled(int numCalls) { + verify(mockService, times(numCalls)).users(); + verify(mockUsers, times(numCalls)).settings(); + verify(mockSettings, times(numCalls)).sendAs(); + verify(mockSendAs, times(numCalls)).smimeInfo(); + } + + private SmimeInfo makeFakeInsertResult(String id, boolean isDefault, long expiration) { + SmimeInfo insertResult = new SmimeInfo(); + insertResult.setId(id); + insertResult.setIsDefault(isDefault); + insertResult.setExpiration(expiration); + + return insertResult; + } + + private SmimeInfo makeFakeInsertResult() { + return makeFakeInsertResult("new_certificate_id", false, CURRENT_TIME_MS + 1); + } +} diff --git a/gmail/snippets/src/test/java/TestSendMessage.java b/gmail/snippets/src/test/java/TestSendMessage.java new file mode 100644 index 00000000..2bde312c --- /dev/null +++ b/gmail/snippets/src/test/java/TestSendMessage.java @@ -0,0 +1,30 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import com.google.api.services.gmail.model.Message; +import org.junit.Test; +import javax.mail.MessagingException; +import java.io.IOException; +import static org.junit.Assert.assertNotNull; + +// Unit testcase for gmail send email snippet +public class TestSendMessage extends BaseTest{ + + @Test + public void testSendEmail() throws MessagingException, IOException { + Message message = SendMessage.sendEmail(RECIPIENT, TEST_USER); + assertNotNull(message); + this.service.users().messages().delete("me", message.getId()).execute(); + } +} diff --git a/gmail/snippets/src/test/java/TestSendMessageWithAttachment.java b/gmail/snippets/src/test/java/TestSendMessageWithAttachment.java new file mode 100644 index 00000000..56161969 --- /dev/null +++ b/gmail/snippets/src/test/java/TestSendMessageWithAttachment.java @@ -0,0 +1,34 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import com.google.api.services.gmail.model.Message; +import org.junit.Test; +import javax.mail.MessagingException; +import java.io.File; +import java.io.IOException; +import static org.junit.Assert.assertNotNull; + +// Unit testcase for gmail send email with attachment snippet +public class TestSendMessageWithAttachment extends BaseTest{ + + @Test + public void testSendEmailWithAttachment() throws MessagingException, + IOException{ + Message message = SendMessageWithAttachment.sendEmailWithAttachment(RECIPIENT, + TEST_USER, + new File("files/photo.jpg")); + assertNotNull(message); + this.service.users().messages().delete("me", message.getId()).execute(); + } +} diff --git a/gmail/snippets/src/test/java/TestUpdateSignature.java b/gmail/snippets/src/test/java/TestUpdateSignature.java index 4a9c3e2a..43f0559e 100644 --- a/gmail/snippets/src/test/java/TestUpdateSignature.java +++ b/gmail/snippets/src/test/java/TestUpdateSignature.java @@ -14,18 +14,15 @@ import org.junit.Test; -import org.mockito.MockedStatic; - import java.io.IOException; import static org.junit.Assert.assertEquals; +// Unit testcase for gmail update signature snippet public class TestUpdateSignature extends BaseTest { @Test public void testUpdateGmailSignature() throws IOException { - try (MockedStatic credentials = useServiceAccount()) { String signature = UpdateSignature.updateGmailSignature(); assertEquals("Automated Signature", signature); - } } } \ No newline at end of file diff --git a/gmail/snippets/src/test/java/TestUpdateSmimeCerts.java b/gmail/snippets/src/test/java/TestUpdateSmimeCerts.java new file mode 100644 index 00000000..c66ebb57 --- /dev/null +++ b/gmail/snippets/src/test/java/TestUpdateSmimeCerts.java @@ -0,0 +1,270 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import com.google.api.services.gmail.Gmail; +import com.google.api.services.gmail.model.ListSmimeInfoResponse; +import com.google.api.services.gmail.model.SmimeInfo; +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.mockito.Mock; +import org.mockito.junit.MockitoJUnit; +import org.mockito.junit.MockitoRule; + +import java.io.IOException; +import java.time.Instant; +import java.time.LocalDateTime; +import java.time.ZoneId; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNull; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.*; + +// Unit testcase for gmail update smime certs snippet +public class TestUpdateSmimeCerts extends BaseTest{ + + private static final long CURRENT_TIME_MS = 1234567890; + private static final LocalDateTime CURRENT_TIME = + LocalDateTime.ofInstant(Instant.ofEpochMilli(CURRENT_TIME_MS), ZoneId.systemDefault()); + @Mock + private Gmail mockService; + @Mock private Gmail.Users mockUsers; + @Mock private Gmail.Users.Settings mockSettings; + @Mock private Gmail.Users.Settings.SendAs mockSendAs; + @Mock private Gmail.Users.Settings.SendAs.SmimeInfo mockSmimeInfo; + @Mock private Gmail.Users.Settings.SendAs.SmimeInfo.Delete mockDelete; + @Mock private Gmail.Users.Settings.SendAs.SmimeInfo.Get mockGet; + @Mock private Gmail.Users.Settings.SendAs.SmimeInfo.Insert mockInsert; + @Mock private Gmail.Users.Settings.SendAs.SmimeInfo.List mockList; + @Mock private Gmail.Users.Settings.SendAs.SmimeInfo.SetDefault mockSetDefault; + + @Rule + public MockitoRule mockitoRule = MockitoJUnit.rule(); + + @Before + public void setup() throws IOException { + when(mockService.users()).thenReturn(mockUsers); + when(mockUsers.settings()).thenReturn(mockSettings); + when(mockSettings.sendAs()).thenReturn(mockSendAs); + when(mockSendAs.smimeInfo()).thenReturn(mockSmimeInfo); + + when(mockSmimeInfo.delete(any(), any(), any())).thenReturn(mockDelete); + when(mockSmimeInfo.get(any(), any(), any())).thenReturn(mockGet); + when(mockSmimeInfo.insert(any(), any(), any())).thenReturn(mockInsert); + when(mockSmimeInfo.list(any(), any())).thenReturn(mockList); + when(mockSmimeInfo.setDefault(any(), any(), any())).thenReturn(mockSetDefault); + } + + @Test + public void testUpdateSmimeCertsNoCerts() throws IOException { + when(mockList.execute()).thenReturn(makeFakeListResult()); + + String defaultCertId = UpdateSmimeCerts.updateSmimeCerts(TEST_USER, + TEST_USER, + null /* certFilename */, + null /* certPassword */, + CURRENT_TIME); + + verifySmimeApiCalled(1); + verify(mockSmimeInfo).list(eq(TEST_USER), eq(TEST_USER)); + verify(mockList).execute(); + + assertNull(defaultCertId); + } + + @Test + public void testUpdateSmimeCertsNoCertsUploadNewCert() throws IOException { + when(mockList.execute()).thenReturn(makeFakeListResult()); + when(mockInsert.execute()).thenReturn(makeFakeInsertResult()); + + String defaultCertId = UpdateSmimeCerts.updateSmimeCerts(TEST_USER, + TEST_USER, + "files/cert.p12", + null /* certPassword */, + CURRENT_TIME); + + verifySmimeApiCalled(3); + verify(mockSmimeInfo).list(eq(TEST_USER), eq(TEST_USER)); + verify(mockSmimeInfo).insert(eq(TEST_USER), eq(TEST_USER), any()); + verify(mockSmimeInfo).setDefault(eq(TEST_USER), eq(TEST_USER), eq("new_certificate_id")); + verify(mockList).execute(); + verify(mockInsert).execute(); + verify(mockSetDefault).execute(); + + assertEquals(defaultCertId, "new_certificate_id"); + } + + @Test + public void testUpdateSmimeCertsValidDefaultCertNoUpload() throws IOException { + ListSmimeInfoResponse listResponse = + makeFakeListResult(Arrays.asList(true), Arrays.asList(CURRENT_TIME_MS + 1)); + when(mockList.execute()).thenReturn(listResponse); + + String defaultCertId = UpdateSmimeCerts.updateSmimeCerts(TEST_USER, + TEST_USER, + "files/cert.p12", + null /* certPassword */, + CURRENT_TIME); + + verifySmimeApiCalled(1); + verify(mockSmimeInfo).list(eq(TEST_USER), eq(TEST_USER)); + verify(mockList).execute(); + + assertEquals(defaultCertId, "existing_certificate_id0"); + } + + @Test + public void testUpdateSmimeCertsExpiredDefaultCertUploadNewCert() throws IOException { + LocalDateTime expireTime = + LocalDateTime.ofInstant(Instant.ofEpochMilli(CURRENT_TIME_MS + 2), ZoneId.systemDefault()); + ListSmimeInfoResponse listResponse = + makeFakeListResult(Arrays.asList(true), Arrays.asList(CURRENT_TIME_MS + 1)); + when(mockList.execute()).thenReturn(listResponse); + + when(mockInsert.execute()).thenReturn(makeFakeInsertResult()); + + String defaultCertId = UpdateSmimeCerts.updateSmimeCerts(TEST_USER, + TEST_USER, + "files/cert.p12", + null /* certPassword */, + expireTime); + + verifySmimeApiCalled(3); + verify(mockSmimeInfo).list(eq(TEST_USER), eq(TEST_USER)); + verify(mockSmimeInfo).insert(eq(TEST_USER), eq(TEST_USER), any()); + verify(mockSmimeInfo).setDefault(eq(TEST_USER), eq(TEST_USER), eq("new_certificate_id")); + verify(mockList).execute(); + verify(mockInsert).execute(); + verify(mockSetDefault).execute(); + + assertEquals(defaultCertId, "new_certificate_id"); + } + + @Test + public void testUpdateSmimeCertsExpiredDefaultCertOtherCertNewDefault() throws IOException { + ListSmimeInfoResponse listResponse = + makeFakeListResult( + Arrays.asList(true, false), Arrays.asList(CURRENT_TIME_MS - 1, CURRENT_TIME_MS + 1)); + when(mockList.execute()).thenReturn(listResponse); + + String defaultCertId = UpdateSmimeCerts.updateSmimeCerts(TEST_USER, + TEST_USER, + "files/cert.p12", + null /* certPassword */, + CURRENT_TIME); + + verifySmimeApiCalled(2); + verify(mockSmimeInfo).list(eq(TEST_USER), eq(TEST_USER)); + verify(mockSmimeInfo).setDefault(eq(TEST_USER), eq(TEST_USER), eq("existing_certificate_id1")); + verify(mockList).execute(); + verify(mockSetDefault).execute(); + + assertEquals(defaultCertId, "existing_certificate_id1"); + } + + @Test + public void testUpdateSmimeCertsNoCertsNoDefaultsChooseBestCertAsNewDefault() throws IOException { + ListSmimeInfoResponse listResponse = + makeFakeListResult( + Arrays.asList(false, false, false, false), + Arrays.asList( + CURRENT_TIME_MS + 2, + CURRENT_TIME_MS + 1, + CURRENT_TIME_MS + 4, + CURRENT_TIME_MS + 3)); + when(mockList.execute()).thenReturn(listResponse); + + String defaultCertId = UpdateSmimeCerts.updateSmimeCerts(TEST_USER, + TEST_USER, + "files/cert.p12", + null /* certPassword */, + CURRENT_TIME); + + verifySmimeApiCalled(2); + verify(mockSmimeInfo).list(eq(TEST_USER), eq(TEST_USER)); + verify(mockSmimeInfo).setDefault(eq(TEST_USER), eq(TEST_USER), eq("existing_certificate_id2")); + verify(mockList).execute(); + verify(mockSetDefault).execute(); + + assertEquals(defaultCertId, "existing_certificate_id2"); + } + + @Test + public void testUpdateSmimeCertsError() throws IOException { + when(mockList.execute()).thenThrow(IOException.class); + + String defaultCertId = + UpdateSmimeCerts.updateSmimeCerts(TEST_USER, + TEST_USER, + "files/cert.p12", + null /* certPassword */, + CURRENT_TIME); + + verifySmimeApiCalled(1); + verify(mockSmimeInfo).list(eq(TEST_USER), eq(TEST_USER)); + verify(mockList).execute(); + + assertNull(defaultCertId); + } + + private void verifySmimeApiCalled(int numCalls) { + verify(mockService, times(numCalls)).users(); + verify(mockUsers, times(numCalls)).settings(); + verify(mockSettings, times(numCalls)).sendAs(); + verify(mockSendAs, times(numCalls)).smimeInfo(); + } + + private ListSmimeInfoResponse makeFakeListResult(List isDefault, List expiration) { + ListSmimeInfoResponse listResponse = new ListSmimeInfoResponse(); + if (isDefault == null || expiration == null) { + return listResponse; + } + + assertEquals(isDefault.size(), expiration.size()); + + List smimeInfoList = new ArrayList(); + for (int i = 0; i < isDefault.size(); i++) { + SmimeInfo smimeInfo = new SmimeInfo(); + smimeInfo.setId(String.format("existing_certificate_id%d", i)); + smimeInfo.setIsDefault(isDefault.get(i)); + smimeInfo.setExpiration(expiration.get(i)); + smimeInfoList.add(smimeInfo); + } + listResponse.setSmimeInfo(smimeInfoList); + + return listResponse; + } + + private ListSmimeInfoResponse makeFakeListResult() { + return makeFakeListResult(null /* isDefault */, null /* expiration */); + } + + private SmimeInfo makeFakeInsertResult(String id, boolean isDefault, long expiration) { + SmimeInfo insertResult = new SmimeInfo(); + insertResult.setId(id); + insertResult.setIsDefault(isDefault); + insertResult.setExpiration(expiration); + + return insertResult; + } + + private SmimeInfo makeFakeInsertResult() { + return makeFakeInsertResult("new_certificate_id", false, CURRENT_TIME_MS + 1); + } +} diff --git a/gmail/snippets/src/test/java/TestUpdateSmimeFromCsv.java b/gmail/snippets/src/test/java/TestUpdateSmimeFromCsv.java new file mode 100644 index 00000000..35bcee1e --- /dev/null +++ b/gmail/snippets/src/test/java/TestUpdateSmimeFromCsv.java @@ -0,0 +1,140 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import com.google.api.services.gmail.Gmail; +import com.google.api.services.gmail.model.ListSmimeInfoResponse; +import com.google.api.services.gmail.model.SmimeInfo; +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.mockito.Mock; +import org.mockito.junit.MockitoJUnit; +import org.mockito.junit.MockitoRule; + +import java.io.IOException; +import java.time.Instant; +import java.time.LocalDateTime; +import java.time.ZoneId; +import java.util.ArrayList; +import java.util.List; + +import static org.junit.Assert.assertEquals; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.*; + +// Unit testcase for gmail update smime from csv snippet +public class TestUpdateSmimeFromCsv extends BaseTest{ + + private static final long CURRENT_TIME_MS = 1234567890; + private static final LocalDateTime CURRENT_TIME = + LocalDateTime.ofInstant(Instant.ofEpochMilli(CURRENT_TIME_MS), ZoneId.systemDefault()); + + @Mock + private Gmail mockService; + @Mock private Gmail.Users mockUsers; + @Mock private Gmail.Users.Settings mockSettings; + @Mock private Gmail.Users.Settings.SendAs mockSendAs; + @Mock private Gmail.Users.Settings.SendAs.SmimeInfo mockSmimeInfo; + @Mock private Gmail.Users.Settings.SendAs.SmimeInfo.Delete mockDelete; + @Mock private Gmail.Users.Settings.SendAs.SmimeInfo.Get mockGet; + @Mock private Gmail.Users.Settings.SendAs.SmimeInfo.Insert mockInsert; + @Mock private Gmail.Users.Settings.SendAs.SmimeInfo.List mockList; + @Mock private Gmail.Users.Settings.SendAs.SmimeInfo.SetDefault mockSetDefault; + + @Rule + public MockitoRule mockitoRule = MockitoJUnit.rule(); + + @Before + public void setup() throws IOException { + when(mockService.users()).thenReturn(mockUsers); + when(mockUsers.settings()).thenReturn(mockSettings); + when(mockSettings.sendAs()).thenReturn(mockSendAs); + when(mockSendAs.smimeInfo()).thenReturn(mockSmimeInfo); + + when(mockSmimeInfo.delete(any(), any(), any())).thenReturn(mockDelete); + when(mockSmimeInfo.get(any(), any(), any())).thenReturn(mockGet); + when(mockSmimeInfo.insert(any(), any(), any())).thenReturn(mockInsert); + when(mockSmimeInfo.list(any(), any())).thenReturn(mockList); + when(mockSmimeInfo.setDefault(any(), any(), any())).thenReturn(mockSetDefault); + } + + @Test + public void testUpdateSmimeFromCsv() throws IOException { + when(mockList.execute()).thenReturn(makeFakeListResult()); + when(mockInsert.execute()).thenReturn(makeFakeInsertResult()); + + UpdateSmimeFromCsv.updateSmimeFromCsv("files/certs.csv", CURRENT_TIME); + + verifySmimeApiCalled(6); + verify(mockSmimeInfo).list(eq(TEST_USER), eq(TEST_USER)); + verify(mockSmimeInfo).insert(eq(TEST_USER), eq(TEST_USER), any()); + verify(mockSmimeInfo) + .setDefault(eq(TEST_USER), eq(TEST_USER), eq("new_certificate_id")); + verify(mockList, times(2)).execute(); + verify(mockInsert, times(2)).execute(); + verify(mockSetDefault, times(2)).execute(); + } + + @Test + public void testUpdateSmimeFromCsvFails() { + InsertCertFromCsv.insertCertFromCsv("files/notfound.csv"); + // tearDown() verifies that there were no interactions with the API. + } + + private void verifySmimeApiCalled(int numCalls) { + verify(mockService, times(numCalls)).users(); + verify(mockUsers, times(numCalls)).settings(); + verify(mockSettings, times(numCalls)).sendAs(); + verify(mockSendAs, times(numCalls)).smimeInfo(); + } + + private ListSmimeInfoResponse makeFakeListResult(List isDefault, List expiration) { + ListSmimeInfoResponse listResponse = new ListSmimeInfoResponse(); + if (isDefault == null || expiration == null) { + return listResponse; + } + + assertEquals(isDefault.size(), expiration.size()); + + List smimeInfoList = new ArrayList<>(); + for (int i = 0; i < isDefault.size(); i++) { + SmimeInfo smimeInfo = new SmimeInfo(); + smimeInfo.setId(String.format("existing_certificate_id%d", i)); + smimeInfo.setIsDefault(isDefault.get(i)); + smimeInfo.setExpiration(expiration.get(i)); + smimeInfoList.add(smimeInfo); + } + listResponse.setSmimeInfo(smimeInfoList); + + return listResponse; + } + + private ListSmimeInfoResponse makeFakeListResult() { + return makeFakeListResult(null /* isDefault */, null /* expiration */); + } + + private SmimeInfo makeFakeInsertResult(String id, boolean isDefault, long expiration) { + SmimeInfo insertResult = new SmimeInfo(); + insertResult.setId(id); + insertResult.setIsDefault(isDefault); + insertResult.setExpiration(expiration); + + return insertResult; + } + + private SmimeInfo makeFakeInsertResult() { + return makeFakeInsertResult("new_certificate_id", false, CURRENT_TIME_MS + 1); + } +} From 86e5c4a50b4153a1c7bf903c26fccfae948971a5 Mon Sep 17 00:00:00 2001 From: Rajesh Mudaliyar Date: Wed, 8 Jun 2022 10:08:29 -0700 Subject: [PATCH 103/262] Test drive v2 file snippets patch2 (#235) * git-on-borg files of gmail-api-snippets * Update build.gradle test12 * Update build.gradle * Drive-v2: file snippets patch-3 UnitTest Co-authored-by: sanjuktaghosh7 Co-authored-by: Manvendra-P-Singh From 5eaef5ee644b62eefa0b62df413f54ebaf624254 Mon Sep 17 00:00:00 2001 From: Rajesh Mudaliyar Date: Wed, 8 Jun 2022 10:09:03 -0700 Subject: [PATCH 104/262] Drive v3 file snippets patch3 (#236) * git-on-borg files of gmail-api-snippets * Update build.gradle test12 * Update build.gradle * Drive-v3: file snippets patch-3 Co-authored-by: sanjuktaghosh7 Co-authored-by: Manvendra-P-Singh From 4f843afe50a3c20ba40a77497caa285000ff48df Mon Sep 17 00:00:00 2001 From: Rajesh Mudaliyar Date: Wed, 8 Jun 2022 10:09:27 -0700 Subject: [PATCH 105/262] Drive-v3: File snippets UnitTest patch4 (#237) * git-on-borg files of gmail-api-snippets * Update build.gradle test12 * Update build.gradle * Drive-v3: File snippets UnitTest patch4 Co-authored-by: sanjuktaghosh7 Co-authored-by: Manvendra-P-Singh --- .../drive_v3/src/main/java/CreateFolder.java | 2 +- .../src/main/java/MoveFileToFolder.java | 2 +- .../drive_v3/src/main/java/SearchFile.java | 2 +- .../drive_v3/src/main/java/ShareFile.java | 2 +- .../src/test/java/TestCreateFolder.java | 15 +++++++++++++ .../src/test/java/TestMoveFileToFolder.java | 22 +++++++++++++++++++ .../src/test/java/TestSearchFiles.java | 18 +++++++++++++++ .../drive_v3/src/test/java/TestShareFile.java | 17 ++++++++++++++ 8 files changed, 76 insertions(+), 4 deletions(-) create mode 100644 drive/snippets/drive_v3/src/test/java/TestCreateFolder.java create mode 100644 drive/snippets/drive_v3/src/test/java/TestMoveFileToFolder.java create mode 100644 drive/snippets/drive_v3/src/test/java/TestSearchFiles.java create mode 100644 drive/snippets/drive_v3/src/test/java/TestShareFile.java diff --git a/drive/snippets/drive_v3/src/main/java/CreateFolder.java b/drive/snippets/drive_v3/src/main/java/CreateFolder.java index df92f77b..c9ee24b8 100644 --- a/drive/snippets/drive_v3/src/main/java/CreateFolder.java +++ b/drive/snippets/drive_v3/src/main/java/CreateFolder.java @@ -36,7 +36,7 @@ public class CreateFolder { * @return Inserted folder id if successful, {@code null} otherwise. * @throws IOException if service account credentials file not found. */ - private static String createFolder() throws IOException { + public static String createFolder() throws IOException { // Load pre-authorized user credentials from the environment. // TODO(developer) - See https://developers.google.com/identity for // guides on implementing OAuth2 for your application. diff --git a/drive/snippets/drive_v3/src/main/java/MoveFileToFolder.java b/drive/snippets/drive_v3/src/main/java/MoveFileToFolder.java index 31a3e53c..4b5603e8 100644 --- a/drive/snippets/drive_v3/src/main/java/MoveFileToFolder.java +++ b/drive/snippets/drive_v3/src/main/java/MoveFileToFolder.java @@ -38,7 +38,7 @@ public class MoveFileToFolder { * @param folderId Id of folder where the fill will be moved. * @return list of parent ids for the file. * */ - private static List moveFileToFolder(String fileId, String folderId) + public static List moveFileToFolder(String fileId, String folderId) throws IOException { /* Load pre-authorized user credentials from the environment. TODO(developer) - See https://developers.google.com/identity for diff --git a/drive/snippets/drive_v3/src/main/java/SearchFile.java b/drive/snippets/drive_v3/src/main/java/SearchFile.java index 1d68ccdd..632bf4ae 100644 --- a/drive/snippets/drive_v3/src/main/java/SearchFile.java +++ b/drive/snippets/drive_v3/src/main/java/SearchFile.java @@ -37,7 +37,7 @@ public class SearchFile { * @return search result list. * @throws IOException if service account credentials file not found. */ - private static List searchFile() throws IOException{ + public static List searchFile() throws IOException{ /*Load pre-authorized user credentials from the environment. TODO(developer) - See https://developers.google.com/identity for guides on implementing OAuth2 for your application.*/ diff --git a/drive/snippets/drive_v3/src/main/java/ShareFile.java b/drive/snippets/drive_v3/src/main/java/ShareFile.java index cbc1bb51..899edfef 100644 --- a/drive/snippets/drive_v3/src/main/java/ShareFile.java +++ b/drive/snippets/drive_v3/src/main/java/ShareFile.java @@ -44,7 +44,7 @@ public class ShareFile { * @return list of modified permissions if successful, {@code null} otherwise. * @throws IOException if service account credentials file not found. */ - private static List shareFile(String realFileId, String realUser, String realDomain) throws IOException{ + public static List shareFile(String realFileId, String realUser, String realDomain) throws IOException{ /* Load pre-authorized user credentials from the environment. TODO(developer) - See https://developers.google.com/identity for guides on implementing OAuth2 for your application.application*/ diff --git a/drive/snippets/drive_v3/src/test/java/TestCreateFolder.java b/drive/snippets/drive_v3/src/test/java/TestCreateFolder.java new file mode 100644 index 00000000..8d2a10bf --- /dev/null +++ b/drive/snippets/drive_v3/src/test/java/TestCreateFolder.java @@ -0,0 +1,15 @@ +import org.junit.Test; + +import java.io.IOException; +import java.security.GeneralSecurityException; + +import static org.junit.Assert.assertNotNull; + +public class TestCreateFolder extends BaseTest{ + @Test + public void createFolder() throws IOException, GeneralSecurityException { + String id = CreateFolder.createFolder(); + assertNotNull(id); + deleteFileOnCleanup(id); + } +} diff --git a/drive/snippets/drive_v3/src/test/java/TestMoveFileToFolder.java b/drive/snippets/drive_v3/src/test/java/TestMoveFileToFolder.java new file mode 100644 index 00000000..857c20d7 --- /dev/null +++ b/drive/snippets/drive_v3/src/test/java/TestMoveFileToFolder.java @@ -0,0 +1,22 @@ +import org.junit.Test; + +import javax.annotation.CheckReturnValue; +import java.io.IOException; +import java.security.GeneralSecurityException; +import java.util.List; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; + +public class TestMoveFileToFolder extends BaseTest{ + @Test + public void moveFileToFolder() + throws IOException, GeneralSecurityException { + String folderId = CreateFolder.createFolder(); + deleteFileOnCleanup(folderId); + String fileId = this.createTestBlob(); + List parents = MoveFileToFolder.moveFileToFolder(fileId, folderId); + assertTrue(parents.contains(folderId)); + assertEquals(1, parents.size()); + } +} diff --git a/drive/snippets/drive_v3/src/test/java/TestSearchFiles.java b/drive/snippets/drive_v3/src/test/java/TestSearchFiles.java new file mode 100644 index 00000000..48a8b818 --- /dev/null +++ b/drive/snippets/drive_v3/src/test/java/TestSearchFiles.java @@ -0,0 +1,18 @@ +import com.google.api.services.drive.model.File; +import org.junit.Test; + +import java.io.IOException; +import java.security.GeneralSecurityException; +import java.util.List; + +import static org.junit.Assert.assertNotEquals; + +public class TestSearchFiles extends BaseTest{ + @Test + public void searchFiles() + throws IOException, GeneralSecurityException { + this.createTestBlob(); + List files = SearchFile.searchFile(); + assertNotEquals(0, files.size()); + } +} diff --git a/drive/snippets/drive_v3/src/test/java/TestShareFile.java b/drive/snippets/drive_v3/src/test/java/TestShareFile.java new file mode 100644 index 00000000..746ef71a --- /dev/null +++ b/drive/snippets/drive_v3/src/test/java/TestShareFile.java @@ -0,0 +1,17 @@ +import org.junit.Test; + +import java.io.IOException; +import java.util.List; + +import static org.junit.Assert.assertEquals; + +public class TestShareFile extends BaseTest{ + @Test + public void shareFile() throws IOException { + String fileId = this.createTestBlob(); + List ids = ShareFile.shareFile(fileId, + "user@test.appsdevtesting.com", + "test.appsdevtesting.com"); + assertEquals(2, ids.size()); + } +} From c96f26aaaa1d5814b6c8753b0c70125d77ad87de Mon Sep 17 00:00:00 2001 From: Steven Bazyl Date: Wed, 18 May 2022 12:19:37 -0600 Subject: [PATCH 106/262] Switch to guard clause --- vault/quickstart/src/main/java/Quickstart.java | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/vault/quickstart/src/main/java/Quickstart.java b/vault/quickstart/src/main/java/Quickstart.java index 21188873..742b6184 100644 --- a/vault/quickstart/src/main/java/Quickstart.java +++ b/vault/quickstart/src/main/java/Quickstart.java @@ -123,12 +123,12 @@ public static void main(String[] args) throws IOException { List matters = response.getMatters(); if (matters == null || matters.size() == 0) { System.out.println("No matters found."); - } else { - System.out.println("Matters:"); - for (Matter matter: matters) { - System.out.printf("%s (%s)\n", matter.getName(), - matter.getMatterId()); - } + return; + } + System.out.println("Matters:"); + for (Matter matter: matters) { + System.out.printf("%s (%s)\n", matter.getName(), + matter.getMatterId()); } } } From 94f8d43f83102f1a91238967ff8f94873cae933d Mon Sep 17 00:00:00 2001 From: Rajesh Mudaliyar Date: Thu, 16 Jun 2022 11:01:14 -0700 Subject: [PATCH 107/262] Classroom testcase (#231) * git-on-borg files of gmail-api-snippets * Update build.gradle test12 * Update build.gradle * Classroom unit testcase * classroom snippet Co-authored-by: sanjuktaghosh7 Co-authored-by: Manvendra-P-Singh --- .../src/test/java/TestAddStudent.java | 33 +++++++++++++++++++ .../src/test/java/TestAddTeacher.java | 31 +++++++++++++++++ .../src/test/java/TestBatchAddStudents.java | 29 ++++++++++++++++ .../src/test/java/TestListCourseAliases.java | 29 ++++++++++++++++ 4 files changed, 122 insertions(+) create mode 100644 classroom/snippets/src/test/java/TestAddStudent.java create mode 100644 classroom/snippets/src/test/java/TestAddTeacher.java create mode 100644 classroom/snippets/src/test/java/TestBatchAddStudents.java create mode 100644 classroom/snippets/src/test/java/TestListCourseAliases.java diff --git a/classroom/snippets/src/test/java/TestAddStudent.java b/classroom/snippets/src/test/java/TestAddStudent.java new file mode 100644 index 00000000..8d6a9bb9 --- /dev/null +++ b/classroom/snippets/src/test/java/TestAddStudent.java @@ -0,0 +1,33 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import com.google.api.services.classroom.model.Course; +import com.google.api.services.classroom.model.Student; +import org.junit.Assert; +import org.junit.Test; +import java.io.IOException; + +// Unit test class for Add Student classroom snippet +public class TestAddStudent extends BaseTest{ + + @Test + public void testAddStudent() throws IOException { + Course course = CreateCourse.createCourse(); + Student student = AddStudent.addStudent(course.getId(), course.getEnrollmentCode()); + deleteCourse(course.getId()); + Assert.assertNotNull("Student not returned.", student); + Assert.assertEquals("Student added to wrong course.", course.getId(), + student.getCourseId()); + } +} \ No newline at end of file diff --git a/classroom/snippets/src/test/java/TestAddTeacher.java b/classroom/snippets/src/test/java/TestAddTeacher.java new file mode 100644 index 00000000..f66ce0bd --- /dev/null +++ b/classroom/snippets/src/test/java/TestAddTeacher.java @@ -0,0 +1,31 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import com.google.api.services.classroom.model.Teacher; +import org.junit.Assert; +import org.junit.Test; +import java.io.IOException; + +// Unit test class for Add Teacher classroom snippet +public class TestAddTeacher extends BaseTest{ + private String otherUser = "gduser1@workspacesamples.dev"; + + @Test + public void testAddTeacher() throws IOException { + Teacher teacher = AddTeacher.addTeacher(testCourse.getId(), this.otherUser); + Assert.assertNotNull("Teacher not returned.", teacher); + Assert.assertEquals("Teacher added to wrong course.", testCourse.getId(), + teacher.getCourseId()); + } +} \ No newline at end of file diff --git a/classroom/snippets/src/test/java/TestBatchAddStudents.java b/classroom/snippets/src/test/java/TestBatchAddStudents.java new file mode 100644 index 00000000..c21eb3f2 --- /dev/null +++ b/classroom/snippets/src/test/java/TestBatchAddStudents.java @@ -0,0 +1,29 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import org.junit.Test; +import java.io.IOException; +import java.util.Arrays; +import java.util.List; + +// Unit test class for Batch Add Students classroom snippet +public class TestBatchAddStudents extends BaseTest { + + @Test + public void testBatchAddStudents() throws IOException { + List studentEmails = Arrays.asList("gduser2@workpsacesamples.dev", + "gduser3@workpsacesamples.dev"); + BatchAddStudents.batchAddStudents(testCourse.getId(), studentEmails); + } +} \ No newline at end of file diff --git a/classroom/snippets/src/test/java/TestListCourseAliases.java b/classroom/snippets/src/test/java/TestListCourseAliases.java new file mode 100644 index 00000000..b7396361 --- /dev/null +++ b/classroom/snippets/src/test/java/TestListCourseAliases.java @@ -0,0 +1,29 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import com.google.api.services.classroom.model.CourseAlias; +import org.junit.Assert; +import org.junit.Test; +import java.io.IOException; +import java.util.List; + +// Unit test class for List Course Aliases classroom snippet +public class TestListCourseAliases extends BaseTest{ + + @Test + public void testListCourseAliases() throws IOException { + List courseAliases = ListCourseAliases.listCourseAliases(testCourse.getId()); + Assert.assertTrue("Incorrect number of course aliases returned.", courseAliases.size() == 1); + } +} \ No newline at end of file From 4021b58d831570d5dcbbe138cabbf65c7c84d067 Mon Sep 17 00:00:00 2001 From: Rajesh Mudaliyar Date: Thu, 16 Jun 2022 11:01:49 -0700 Subject: [PATCH 108/262] Test drive v3 change snippets (#238) * git-on-borg files of gmail-api-snippets * Update build.gradle test12 * Update build.gradle * Drive-v3: Change snippets UnitTest Co-authored-by: sanjuktaghosh7 Co-authored-by: Manvendra-P-Singh Co-authored-by: himanshupr2627 --- .../drive_v3/src/main/java/FetchChanges.java | 2 +- .../src/main/java/FetchStartPageToken.java | 2 +- .../src/test/java/TestFetchChanges.java | 32 +++++++++++++++++++ .../test/java/TestFetchStartPageToken.java | 28 ++++++++++++++++ 4 files changed, 62 insertions(+), 2 deletions(-) create mode 100644 drive/snippets/drive_v3/src/test/java/TestFetchChanges.java create mode 100644 drive/snippets/drive_v3/src/test/java/TestFetchStartPageToken.java diff --git a/drive/snippets/drive_v3/src/main/java/FetchChanges.java b/drive/snippets/drive_v3/src/main/java/FetchChanges.java index d803a1e4..aa921837 100644 --- a/drive/snippets/drive_v3/src/main/java/FetchChanges.java +++ b/drive/snippets/drive_v3/src/main/java/FetchChanges.java @@ -34,7 +34,7 @@ public class FetchChanges { * @return Saved token after last page. * @throws IOException if file is not found */ - private static String fetchChanges(String savedStartPageToken) throws IOException { + public static String fetchChanges(String savedStartPageToken) throws IOException { /*Load pre-authorized user credentials from the environment. TODO(developer) - See https://developers.google.com/identity for diff --git a/drive/snippets/drive_v3/src/main/java/FetchStartPageToken.java b/drive/snippets/drive_v3/src/main/java/FetchStartPageToken.java index 78728859..de8a2da3 100644 --- a/drive/snippets/drive_v3/src/main/java/FetchStartPageToken.java +++ b/drive/snippets/drive_v3/src/main/java/FetchStartPageToken.java @@ -34,7 +34,7 @@ public class FetchStartPageToken { * @return Start page token as String. * @throws IOException if file is not found */ - private static String fetchStartPageToken() throws IOException { + public static String fetchStartPageToken() throws IOException { /*Load pre-authorized user credentials from the environment. TODO(developer) - See https://developers.google.com/identity for guides on implementing OAuth2 for your application. */ diff --git a/drive/snippets/drive_v3/src/test/java/TestFetchChanges.java b/drive/snippets/drive_v3/src/test/java/TestFetchChanges.java new file mode 100644 index 00000000..7df7821a --- /dev/null +++ b/drive/snippets/drive_v3/src/test/java/TestFetchChanges.java @@ -0,0 +1,32 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import org.junit.Test; + +import java.io.IOException; + +import static org.junit.Assert.assertNotEquals; +import static org.junit.Assert.assertNotNull; + +// Unit test class for fetchChanges change snippet +public class TestFetchChanges extends BaseTest{ + @Test + public void fetchChanges() throws IOException { + String startPageToken = FetchStartPageToken.fetchStartPageToken(); + this.createTestBlob(); + String newStartPageToken = FetchChanges.fetchChanges(startPageToken); + assertNotNull(newStartPageToken); + assertNotEquals(startPageToken, newStartPageToken); + } +} diff --git a/drive/snippets/drive_v3/src/test/java/TestFetchStartPageToken.java b/drive/snippets/drive_v3/src/test/java/TestFetchStartPageToken.java new file mode 100644 index 00000000..fd4be2ad --- /dev/null +++ b/drive/snippets/drive_v3/src/test/java/TestFetchStartPageToken.java @@ -0,0 +1,28 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import org.junit.Test; + +import java.io.IOException; + +import static org.junit.Assert.assertNotNull; + +// Unit test class for fetchStartPageToken change snippet +public class TestFetchStartPageToken extends BaseTest{ + @Test + public void fetchStartPageToken() throws IOException { + String token = FetchStartPageToken.fetchStartPageToken(); + assertNotNull(token); + } +} From 5bb5996fe623e8c4162bf1b6ccb346693196bacd Mon Sep 17 00:00:00 2001 From: Rajesh Mudaliyar Date: Thu, 16 Jun 2022 11:02:11 -0700 Subject: [PATCH 109/262] Test drive v3 drive snippets (#239) * git-on-borg files of gmail-api-snippets * Update build.gradle test12 * Update build.gradle * Drive-v3: Drive snippets UnitTest Co-authored-by: sanjuktaghosh7 Co-authored-by: Manvendra-P-Singh Co-authored-by: himanshupr2627 --- .../drive_v3/src/main/java/CreateDrive.java | 2 +- .../drive_v3/src/main/java/RecoverDrive.java | 2 +- .../src/test/java/TestCreateDrive.java | 30 ++++++++++++ .../src/test/java/TestRecoverDrives.java | 48 +++++++++++++++++++ 4 files changed, 80 insertions(+), 2 deletions(-) create mode 100644 drive/snippets/drive_v3/src/test/java/TestCreateDrive.java create mode 100644 drive/snippets/drive_v3/src/test/java/TestRecoverDrives.java diff --git a/drive/snippets/drive_v3/src/main/java/CreateDrive.java b/drive/snippets/drive_v3/src/main/java/CreateDrive.java index e97af03f..be69cbec 100644 --- a/drive/snippets/drive_v3/src/main/java/CreateDrive.java +++ b/drive/snippets/drive_v3/src/main/java/CreateDrive.java @@ -34,7 +34,7 @@ public class CreateDrive { * @return Newly created drive id. * @throws IOException if service account credentials file not found. */ - private static String createDrive() throws IOException { + public static String createDrive() throws IOException { /*Load pre-authorized user credentials from the environment. TODO(developer) - See https://developers.google.com/identity for guides on implementing OAuth2 for your application.*/ diff --git a/drive/snippets/drive_v3/src/main/java/RecoverDrive.java b/drive/snippets/drive_v3/src/main/java/RecoverDrive.java index 402cb420..adf8162e 100644 --- a/drive/snippets/drive_v3/src/main/java/RecoverDrive.java +++ b/drive/snippets/drive_v3/src/main/java/RecoverDrive.java @@ -38,7 +38,7 @@ public class RecoverDrive { * @return All shared drives without an organizer. * @throws IOException if shared drive not found. */ - private static List recoverDrives(String realUser) + public static List recoverDrives(String realUser) throws IOException { /*Load pre-authorized user credentials from the environment. TODO(developer) - See https://developers.google.com/identity for diff --git a/drive/snippets/drive_v3/src/test/java/TestCreateDrive.java b/drive/snippets/drive_v3/src/test/java/TestCreateDrive.java new file mode 100644 index 00000000..c8937fa4 --- /dev/null +++ b/drive/snippets/drive_v3/src/test/java/TestCreateDrive.java @@ -0,0 +1,30 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import org.junit.Test; + +import java.io.IOException; +import java.security.GeneralSecurityException; + +import static org.junit.Assert.assertNotNull; + +// Unit test class for create-drive Drive snippet +public class TestCreateDrive extends BaseTest{ + @Test + public void createDrive() throws IOException, GeneralSecurityException { + String id = CreateDrive.createDrive(); + assertNotNull(id); + this.service.drives().delete(id); + } +} diff --git a/drive/snippets/drive_v3/src/test/java/TestRecoverDrives.java b/drive/snippets/drive_v3/src/test/java/TestRecoverDrives.java new file mode 100644 index 00000000..a638f0e6 --- /dev/null +++ b/drive/snippets/drive_v3/src/test/java/TestRecoverDrives.java @@ -0,0 +1,48 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import com.google.api.services.drive.model.Drive; +import com.google.api.services.drive.model.Permission; +import com.google.api.services.drive.model.PermissionList; +import org.junit.Test; + +import java.io.IOException; +import java.util.List; + +import static org.junit.Assert.assertNotEquals; + +// Unit test class for recover-drives Drive snippet +public class TestRecoverDrives extends BaseTest{ + @Test + public void recoverDrives() throws IOException { + String id = this.createOrphanedDrive(); + List results = RecoverDrive.recoverDrives( + "sbazyl@test.appsdevtesting.com"); + assertNotEquals(0, results.size()); + this.service.drives().delete(id).execute(); + } + + private String createOrphanedDrive() throws IOException { + String driveId = CreateDrive.createDrive(); + PermissionList response = this.service.permissions().list(driveId) + .setSupportsAllDrives(true) + .execute(); + for (Permission permission : response.getPermissions()) { + this.service.permissions().delete(driveId, permission.getId()) + .setSupportsAllDrives(true) + .execute(); + } + return driveId; + } +} From 60edf7fd2d2520e9379911c4480e47eebfe37f12 Mon Sep 17 00:00:00 2001 From: Rajesh Mudaliyar Date: Thu, 16 Jun 2022 11:02:33 -0700 Subject: [PATCH 110/262] Test drive v3 appdata snippets (#240) * git-on-borg files of gmail-api-snippets * Update build.gradle test12 * Update build.gradle * Drive-v3: AppData snippets UnitTest Co-authored-by: sanjuktaghosh7 Co-authored-by: Manvendra-P-Singh Co-authored-by: himanshupr2627 --- .../src/main/java/FetchAppDataFolder.java | 2 +- .../drive_v2/src/main/java/ListAppData.java | 2 +- .../drive_v2/src/main/java/UploadAppData.java | 2 +- .../src/test/java/TestFetchAppdataFolder.java | 29 +++++++++++++++++ .../src/test/java/TestListAppdata.java | 32 +++++++++++++++++++ .../src/test/java/TestUploadAppdata.java | 31 ++++++++++++++++++ 6 files changed, 95 insertions(+), 3 deletions(-) create mode 100644 drive/snippets/drive_v2/src/test/java/TestFetchAppdataFolder.java create mode 100644 drive/snippets/drive_v2/src/test/java/TestListAppdata.java create mode 100644 drive/snippets/drive_v2/src/test/java/TestUploadAppdata.java diff --git a/drive/snippets/drive_v2/src/main/java/FetchAppDataFolder.java b/drive/snippets/drive_v2/src/main/java/FetchAppDataFolder.java index a12f9e5d..c402a18a 100644 --- a/drive/snippets/drive_v2/src/main/java/FetchAppDataFolder.java +++ b/drive/snippets/drive_v2/src/main/java/FetchAppDataFolder.java @@ -38,7 +38,7 @@ public class FetchAppDataFolder { * Fetches appDataFolder and prints it's folder id. * @return Application data folder's ID. */ - public String fetchAppDataFolder() throws IOException { + public static String fetchAppDataFolder() throws IOException { /*Load pre-authorized user credentials from the environment. TODO(developer) - See https://developers.google.com/identity for guides on implementing OAuth2 for your application.*/ diff --git a/drive/snippets/drive_v2/src/main/java/ListAppData.java b/drive/snippets/drive_v2/src/main/java/ListAppData.java index 2aa87b7d..7ed0782e 100644 --- a/drive/snippets/drive_v2/src/main/java/ListAppData.java +++ b/drive/snippets/drive_v2/src/main/java/ListAppData.java @@ -38,7 +38,7 @@ public class ListAppData { * list down files in the application data folder. * @return list of 10 files. */ - public FileList listAppData() throws IOException { + public static FileList listAppData() throws IOException { /*Load pre-authorized user credentials from the environment. TODO(developer) - See https://developers.google.com/identity for guides on implementing OAuth2 for your application.*/ diff --git a/drive/snippets/drive_v2/src/main/java/UploadAppData.java b/drive/snippets/drive_v2/src/main/java/UploadAppData.java index 56d469d7..7731be4e 100644 --- a/drive/snippets/drive_v2/src/main/java/UploadAppData.java +++ b/drive/snippets/drive_v2/src/main/java/UploadAppData.java @@ -37,7 +37,7 @@ public class UploadAppData { * Creates a file in the application data folder. * @return Created file's Id. */ - private static String uploadAppData() throws IOException { + public static String uploadAppData() throws IOException { /*Load pre-authorized user credentials from the environment. TODO(developer) - See https://developers.google.com/identity for guides on implementing OAuth2 for your application.*/ diff --git a/drive/snippets/drive_v2/src/test/java/TestFetchAppdataFolder.java b/drive/snippets/drive_v2/src/test/java/TestFetchAppdataFolder.java new file mode 100644 index 00000000..f53dcd75 --- /dev/null +++ b/drive/snippets/drive_v2/src/test/java/TestFetchAppdataFolder.java @@ -0,0 +1,29 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import org.junit.Test; + +import java.io.IOException; +import java.security.GeneralSecurityException; + +import static org.junit.Assert.assertNotNull; + +// Unit test class for testing of FetchAppDataFolder snippet +public class TestFetchAppdataFolder { + @Test + public void fetchAppDataFolder() throws IOException, GeneralSecurityException { + String id = FetchAppDataFolder.fetchAppDataFolder(); + assertNotNull(id); + } +} diff --git a/drive/snippets/drive_v2/src/test/java/TestListAppdata.java b/drive/snippets/drive_v2/src/test/java/TestListAppdata.java new file mode 100644 index 00000000..fe137a43 --- /dev/null +++ b/drive/snippets/drive_v2/src/test/java/TestListAppdata.java @@ -0,0 +1,32 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import com.google.api.services.drive.model.FileList; +import org.junit.Test; + +import java.io.IOException; +import java.security.GeneralSecurityException; + +import static org.junit.Assert.assertNotEquals; + +// Unit test class for testing of ListAppData snippet +public class TestListAppdata extends BaseTest{ + @Test + public void listAppData() throws IOException, GeneralSecurityException { + String id = UploadAppData.uploadAppData(); + deleteFileOnCleanup(id); + FileList files = ListAppData.listAppData(); + assertNotEquals(0, files.getItems().size()); + } +} diff --git a/drive/snippets/drive_v2/src/test/java/TestUploadAppdata.java b/drive/snippets/drive_v2/src/test/java/TestUploadAppdata.java new file mode 100644 index 00000000..d5cd5e9e --- /dev/null +++ b/drive/snippets/drive_v2/src/test/java/TestUploadAppdata.java @@ -0,0 +1,31 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import org.junit.Test; + +import java.io.IOException; +import java.security.GeneralSecurityException; + +import static org.junit.Assert.assertNotNull; + +// Unit test class for testing of UploadAppData snippet +public class TestUploadAppdata extends BaseTest{ + @Test + public void uploadAppData() + throws IOException, GeneralSecurityException { + String id = UploadAppData.uploadAppData(); + assertNotNull(id); + deleteFileOnCleanup(id); + } +} From 1d101ff57f704a843fb335fc7503ae7de8a46cca Mon Sep 17 00:00:00 2001 From: Manvendra-P-Singh Date: Wed, 6 Jul 2022 20:20:45 +0000 Subject: [PATCH 111/262] test: drive v3 file snippets patch2 (#242) * git-on-borg files of gmail-api-snippets * Update build.gradle test12 * Update build.gradle * Drive-v3: File snippets UnitTest patch2 Co-authored-by: sanjuktaghosh7 Co-authored-by: Rajesh Mudaliyar --- .../drive_v3/src/main/java/UploadToFolder.java | 2 +- .../src/main/java/UploadWithConversion.java | 2 +- .../src/test/java/TestUploadToFolder.java | 18 ++++++++++++++++++ .../test/java/TestUploadWithConversion.java | 16 ++++++++++++++++ 4 files changed, 36 insertions(+), 2 deletions(-) create mode 100644 drive/snippets/drive_v3/src/test/java/TestUploadToFolder.java create mode 100644 drive/snippets/drive_v3/src/test/java/TestUploadWithConversion.java diff --git a/drive/snippets/drive_v3/src/main/java/UploadToFolder.java b/drive/snippets/drive_v3/src/main/java/UploadToFolder.java index 03c711a5..db2be62f 100644 --- a/drive/snippets/drive_v3/src/main/java/UploadToFolder.java +++ b/drive/snippets/drive_v3/src/main/java/UploadToFolder.java @@ -38,7 +38,7 @@ public class UploadToFolder { * @return Inserted file metadata if successful, {@code null} otherwise. * @throws IOException if service account credentials file not found. */ - private static File uploadToFolder(String realFolderId) throws IOException { + public static File uploadToFolder(String realFolderId) throws IOException { // Load pre-authorized user credentials from the environment. // TODO(developer) - See https://developers.google.com/identity for // guides on implementing OAuth2 for your application. diff --git a/drive/snippets/drive_v3/src/main/java/UploadWithConversion.java b/drive/snippets/drive_v3/src/main/java/UploadWithConversion.java index dca7e60a..21d871b5 100644 --- a/drive/snippets/drive_v3/src/main/java/UploadWithConversion.java +++ b/drive/snippets/drive_v3/src/main/java/UploadWithConversion.java @@ -36,7 +36,7 @@ public class UploadWithConversion { * @return Inserted file id if successful, {@code null} otherwise. * @throws IOException if service account credentials file not found. */ - private static String uploadWithConversion() throws IOException { + public static String uploadWithConversion() throws IOException { // Load pre-authorized user credentials from the environment. // TODO(developer) - See https://developers.google.com/identity for // guides on implementing OAuth2 for your application. diff --git a/drive/snippets/drive_v3/src/test/java/TestUploadToFolder.java b/drive/snippets/drive_v3/src/test/java/TestUploadToFolder.java new file mode 100644 index 00000000..bf4702e9 --- /dev/null +++ b/drive/snippets/drive_v3/src/test/java/TestUploadToFolder.java @@ -0,0 +1,18 @@ +import com.google.api.services.drive.model.File; +import org.junit.Test; + +import java.io.IOException; +import java.security.GeneralSecurityException; + +import static org.junit.Assert.assertTrue; + +public class TestUploadToFolder extends BaseTest{ + @Test + public void uploadToFolder() throws IOException, GeneralSecurityException { + String folderId = CreateFolder.createFolder(); + File file = UploadToFolder.uploadToFolder(folderId); + assertTrue(file.getParents().contains(folderId)); + deleteFileOnCleanup(file.getId()); + deleteFileOnCleanup(folderId); + } +} diff --git a/drive/snippets/drive_v3/src/test/java/TestUploadWithConversion.java b/drive/snippets/drive_v3/src/test/java/TestUploadWithConversion.java new file mode 100644 index 00000000..a3d69c52 --- /dev/null +++ b/drive/snippets/drive_v3/src/test/java/TestUploadWithConversion.java @@ -0,0 +1,16 @@ +import org.junit.Test; + +import java.io.IOException; +import java.security.GeneralSecurityException; + +import static org.junit.Assert.assertNotNull; + +public class TestUploadWithConversion extends BaseTest{ + @Test + public void uploadWithConversion() + throws IOException, GeneralSecurityException { + String id = UploadWithConversion.uploadWithConversion(); + assertNotNull(id); + deleteFileOnCleanup(id); + } +} From a5e8727fb3c1e745f46b7544a5d2e58e3ac78c53 Mon Sep 17 00:00:00 2001 From: Manvendra-P-Singh Date: Wed, 6 Jul 2022 20:21:13 +0000 Subject: [PATCH 112/262] test: drive v3 file snippets patch3 (#243) * git-on-borg files of gmail-api-snippets * Update build.gradle test12 * Update build.gradle * Drive-v3: File snippets UnitTest patch3 Co-authored-by: sanjuktaghosh7 Co-authored-by: Rajesh Mudaliyar --- .../drive_v3/src/main/java/CreateShortcut.java | 3 ++- .../drive_v3/src/main/java/DownloadFile.java | 2 +- .../drive_v3/src/main/java/ExportPdf.java | 2 +- .../drive_v3/src/main/java/TouchFile.java | 2 +- .../src/test/java/TestCreateShortcut.java | 15 +++++++++++++++ .../src/test/java/TestDownloadFile.java | 18 ++++++++++++++++++ .../drive_v3/src/test/java/TestExportPdf.java | 16 ++++++++++++++++ .../drive_v3/src/test/java/TestTouchFile.java | 16 ++++++++++++++++ 8 files changed, 70 insertions(+), 4 deletions(-) create mode 100644 drive/snippets/drive_v3/src/test/java/TestCreateShortcut.java create mode 100644 drive/snippets/drive_v3/src/test/java/TestDownloadFile.java create mode 100644 drive/snippets/drive_v3/src/test/java/TestExportPdf.java create mode 100644 drive/snippets/drive_v3/src/test/java/TestTouchFile.java diff --git a/drive/snippets/drive_v3/src/main/java/CreateShortcut.java b/drive/snippets/drive_v3/src/main/java/CreateShortcut.java index 98b35603..d75f104e 100644 --- a/drive/snippets/drive_v3/src/main/java/CreateShortcut.java +++ b/drive/snippets/drive_v3/src/main/java/CreateShortcut.java @@ -34,7 +34,7 @@ public class CreateShortcut { * Creates shortcut for file. * @throws IOException if service account credentials file not found. */ - private static void createShortcut() throws IOException{ + public static String createShortcut() throws IOException{ /* Load pre-authorized user credentials from the environment. TODO(developer) - See https://developers.google.com/identity for guides on implementing OAuth2 for your application.*/ @@ -57,6 +57,7 @@ private static void createShortcut() throws IOException{ .setFields("id") .execute(); System.out.println("File ID: " + file.getId()); + return file.getId(); }catch (GoogleJsonResponseException e) { // TODO(developer) - handle error appropriately System.err.println("Unable to create shortcut: " + e.getDetails()); diff --git a/drive/snippets/drive_v3/src/main/java/DownloadFile.java b/drive/snippets/drive_v3/src/main/java/DownloadFile.java index 8cf14a80..0931acc5 100644 --- a/drive/snippets/drive_v3/src/main/java/DownloadFile.java +++ b/drive/snippets/drive_v3/src/main/java/DownloadFile.java @@ -37,7 +37,7 @@ public class DownloadFile { * @return byte array stream if successful, {@code null} otherwise. * @throws IOException if service account credentials file not found. */ - private static ByteArrayOutputStream downloadFile(String realFileId) throws IOException{ + public static ByteArrayOutputStream downloadFile(String realFileId) throws IOException{ /* Load pre-authorized user credentials from the environment. TODO(developer) - See https://developers.google.com/identity for guides on implementing OAuth2 for your application.*/ diff --git a/drive/snippets/drive_v3/src/main/java/ExportPdf.java b/drive/snippets/drive_v3/src/main/java/ExportPdf.java index fbc5f047..16d86539 100644 --- a/drive/snippets/drive_v3/src/main/java/ExportPdf.java +++ b/drive/snippets/drive_v3/src/main/java/ExportPdf.java @@ -37,7 +37,7 @@ public class ExportPdf { * @return byte array stream if successful, {@code null} otherwise. * @throws IOException if service account credentials file not found. */ - private static ByteArrayOutputStream exportPdf(String realFileId) throws IOException{ + public static ByteArrayOutputStream exportPdf(String realFileId) throws IOException{ // Load pre-authorized user credentials from the environment. // TODO(developer) - See https://developers.google.com/identity for // guides on implementing OAuth2 for your application. diff --git a/drive/snippets/drive_v3/src/main/java/TouchFile.java b/drive/snippets/drive_v3/src/main/java/TouchFile.java index f243e16a..2729133c 100644 --- a/drive/snippets/drive_v3/src/main/java/TouchFile.java +++ b/drive/snippets/drive_v3/src/main/java/TouchFile.java @@ -38,7 +38,7 @@ public class TouchFile { * @return long file's latest modification date value. * @throws IOException if service account credentials file not found. * */ - private static long touchFile(String realFileId, long realTimestamp) + public static long touchFile(String realFileId, long realTimestamp) throws IOException { /*Load pre-authorized user credentials from the environment. TODO(developer) - See https://developers.google.com/identity for diff --git a/drive/snippets/drive_v3/src/test/java/TestCreateShortcut.java b/drive/snippets/drive_v3/src/test/java/TestCreateShortcut.java new file mode 100644 index 00000000..a9aec655 --- /dev/null +++ b/drive/snippets/drive_v3/src/test/java/TestCreateShortcut.java @@ -0,0 +1,15 @@ +import org.junit.Test; + +import java.io.IOException; +import java.security.GeneralSecurityException; + +import static org.junit.Assert.assertNotNull; + +public class TestCreateShortcut extends BaseTest{ + @Test + public void createShortcut() throws IOException, GeneralSecurityException { + String id = CreateShortcut.createShortcut(); + assertNotNull(id); + deleteFileOnCleanup(id); + } +} diff --git a/drive/snippets/drive_v3/src/test/java/TestDownloadFile.java b/drive/snippets/drive_v3/src/test/java/TestDownloadFile.java new file mode 100644 index 00000000..2c4806f6 --- /dev/null +++ b/drive/snippets/drive_v3/src/test/java/TestDownloadFile.java @@ -0,0 +1,18 @@ +import org.junit.Test; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.security.GeneralSecurityException; + +import static org.junit.Assert.assertEquals; + +public class TestDownloadFile extends BaseTest{ + @Test + public void downloadFile() throws IOException, GeneralSecurityException { + String id = createTestBlob(); + ByteArrayOutputStream out = DownloadFile.downloadFile(id); + byte[] bytes = out.toByteArray(); + assertEquals((byte) 0xFF, bytes[0]); + assertEquals((byte) 0xD8, bytes[1]); + } +} diff --git a/drive/snippets/drive_v3/src/test/java/TestExportPdf.java b/drive/snippets/drive_v3/src/test/java/TestExportPdf.java new file mode 100644 index 00000000..f8741feb --- /dev/null +++ b/drive/snippets/drive_v3/src/test/java/TestExportPdf.java @@ -0,0 +1,16 @@ +import org.junit.Test; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.security.GeneralSecurityException; + +import static org.junit.Assert.assertEquals; + +public class TestExportPdf extends BaseTest{ + @Test + public void exportPdf() throws IOException, GeneralSecurityException { + String id = createTestDocument(); + ByteArrayOutputStream out = ExportPdf.exportPdf(id); + assertEquals("%PDF", out.toString("UTF-8").substring(0, 4)); + } +} diff --git a/drive/snippets/drive_v3/src/test/java/TestTouchFile.java b/drive/snippets/drive_v3/src/test/java/TestTouchFile.java new file mode 100644 index 00000000..3280bcbb --- /dev/null +++ b/drive/snippets/drive_v3/src/test/java/TestTouchFile.java @@ -0,0 +1,16 @@ +import org.junit.Test; + +import java.io.IOException; +import java.security.GeneralSecurityException; + +import static org.junit.Assert.assertEquals; + +public class TestTouchFile extends BaseTest{ + @Test + public void touchFile() throws IOException, GeneralSecurityException { + String id = this.createTestBlob(); + long now = System.currentTimeMillis(); + long modifiedTime = TouchFile.touchFile(id, now); + assertEquals(now, modifiedTime); + } +} From 9647a4a59b1e6cea61d36133464acfe0e4e73e0b Mon Sep 17 00:00:00 2001 From: Sanjukta Ghosh Date: Wed, 13 Jul 2022 16:11:29 +0000 Subject: [PATCH 113/262] test: added testcase for slide snippets (#245) * git-on-borg files of gmail-api-snippets * Update build.gradle test12 * Update build.gradle * test: added testcase for slide snippets * test: added testcase for slide snippets * fix: update in slide snippets Co-authored-by: Rajesh Mudaliyar Co-authored-by: Manvendra-P-Singh Co-authored-by: himanshupr2627 --- .../snippets/src/main/java/CreateImage.java | 3 +- .../snippets/src/main/java/CreateSlide.java | 5 +- slides/snippets/src/main/java/Snippets.java | 450 ------------------ slides/snippets/src/test/java/BaseTest.java | 108 ++--- .../snippets/src/test/java/SnippetsTest.java | 160 ------- .../src/test/java/TestCopyPresentation.java | 31 ++ .../src/test/java/TestCreateBulletedText.java | 35 ++ .../src/test/java/TestCreateImage.java | 39 ++ .../src/test/java/TestCreatePresentation.java | 30 ++ .../src/test/java/TestCreateSheetsChart.java | 40 ++ .../src/test/java/TestCreateSlide.java | 37 ++ .../test/java/TestCreateTextboxWithText.java | 38 ++ .../src/test/java/TestImageMerging.java | 45 ++ .../src/test/java/TestRefreshSheetsChart.java | 38 ++ .../src/test/java/TestSimpleTextReplace.java | 35 ++ .../src/test/java/TestTextMerging.java | 46 ++ .../src/test/java/TestTextStyleUpdate.java | 35 ++ 17 files changed, 482 insertions(+), 693 deletions(-) delete mode 100644 slides/snippets/src/main/java/Snippets.java delete mode 100644 slides/snippets/src/test/java/SnippetsTest.java create mode 100644 slides/snippets/src/test/java/TestCopyPresentation.java create mode 100644 slides/snippets/src/test/java/TestCreateBulletedText.java create mode 100644 slides/snippets/src/test/java/TestCreateImage.java create mode 100644 slides/snippets/src/test/java/TestCreatePresentation.java create mode 100644 slides/snippets/src/test/java/TestCreateSheetsChart.java create mode 100644 slides/snippets/src/test/java/TestCreateSlide.java create mode 100644 slides/snippets/src/test/java/TestCreateTextboxWithText.java create mode 100644 slides/snippets/src/test/java/TestImageMerging.java create mode 100644 slides/snippets/src/test/java/TestRefreshSheetsChart.java create mode 100644 slides/snippets/src/test/java/TestSimpleTextReplace.java create mode 100644 slides/snippets/src/test/java/TestTextMerging.java create mode 100644 slides/snippets/src/test/java/TestTextStyleUpdate.java diff --git a/slides/snippets/src/main/java/CreateImage.java b/slides/snippets/src/main/java/CreateImage.java index 6338d405..132b3493 100644 --- a/slides/snippets/src/main/java/CreateImage.java +++ b/slides/snippets/src/main/java/CreateImage.java @@ -46,14 +46,12 @@ public class CreateImage { * * @param presentationId - id of the presentation. * @param slideId - id of the shape. - * @param imageId - id for the image. * @param imageUrl - Url of the image. * @return image id * @throws IOException - if credentials file not found. */ public static BatchUpdatePresentationResponse createImage(String presentationId, String slideId, - String imageId, String imageUrl) throws IOException { /* Load pre-authorized user credentials from the environment. @@ -73,6 +71,7 @@ public static BatchUpdatePresentationResponse createImage(String presentationId, // Create a new image, using the supplied object ID, with content downloaded from imageUrl. List requests = new ArrayList<>(); + String imageId = "MyImageId_01"; Dimension emu4M = new Dimension().setMagnitude(4000000.0).setUnit("EMU"); requests.add(new Request() .setCreateImage(new CreateImageRequest() diff --git a/slides/snippets/src/main/java/CreateSlide.java b/slides/snippets/src/main/java/CreateSlide.java index c1a55b99..9a809264 100644 --- a/slides/snippets/src/main/java/CreateSlide.java +++ b/slides/snippets/src/main/java/CreateSlide.java @@ -41,12 +41,10 @@ public class CreateSlide { * Creates a new slide. * * @param presentationId - id of the presentation. - * @param slideId - id for the new slide. * @return slide id * @throws IOException - if credentials file not found. */ - public static BatchUpdatePresentationResponse createSlide(String presentationId, - String slideId) throws IOException { + public static BatchUpdatePresentationResponse createSlide(String presentationId) throws IOException { /* Load pre-authorized user credentials from the environment. TODO(developer) - See https://developers.google.com/identity for guides on implementing OAuth2 for your application. */ @@ -64,6 +62,7 @@ public static BatchUpdatePresentationResponse createSlide(String presentationId, // Add a slide at index 1 using the predefined "TITLE_AND_TWO_COLUMNS" layout List requests = new ArrayList<>(); + String slideId = "MyNewSlide_001"; BatchUpdatePresentationResponse response = null; try { requests.add(new Request() diff --git a/slides/snippets/src/main/java/Snippets.java b/slides/snippets/src/main/java/Snippets.java deleted file mode 100644 index c1c07907..00000000 --- a/slides/snippets/src/main/java/Snippets.java +++ /dev/null @@ -1,450 +0,0 @@ -import com.google.api.client.googleapis.auth.oauth2.GoogleCredential; -import com.google.api.services.drive.Drive; -import com.google.api.services.drive.model.File; -import com.google.api.services.sheets.v4.Sheets; -import com.google.api.services.sheets.v4.model.ValueRange; -import com.google.api.services.slides.v1.Slides; -import com.google.api.services.slides.v1.model.*; - -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; - -public class Snippets { - - private Slides service; - private Drive driveService; - private Sheets sheetsService; - - Snippets(Slides service, Drive driveService, Sheets sheetsService) { - this.service = service; - this.driveService = driveService; - this.sheetsService = sheetsService; - } - - public String createPresentation(String title) throws IOException { - Slides slidesService = this.service; - // [START slides_create_presentation] - Presentation presentation = new Presentation() - .setTitle(title); - presentation = slidesService.presentations().create(presentation) - .setFields("presentationId") - .execute(); - System.out.println("Created presentation with ID: " + presentation.getPresentationId()); - // [END slides_create_presentation] - return presentation.getPresentationId(); - } - - public String copyPresentation(String presentationId, String copyTitle) throws IOException { - Drive driveService = this.driveService; - // [START slides_copy_presentation] - File copyMetadata = new File().setName(copyTitle); - File presentationCopyFile = - driveService.files().copy(presentationId, copyMetadata).execute(); - String presentationCopyId = presentationCopyFile.getId(); - // [END slides_copy_presentation] - return presentationCopyId; - } - - public BatchUpdatePresentationResponse createSlide(String presentationId) throws IOException { - Slides slidesService = this.service; - // [START slides_create_slide] - // Add a slide at index 1 using the predefined "TITLE_AND_TWO_COLUMNS" layout - // and the ID "MyNewSlide_001". - List requests = new ArrayList<>(); - String slideId = "MyNewSlide_001"; - requests.add(new Request() - .setCreateSlide(new CreateSlideRequest() - .setObjectId(slideId) - .setInsertionIndex(1) - .setSlideLayoutReference(new LayoutReference() - .setPredefinedLayout("TITLE_AND_TWO_COLUMNS")))); - - // If you wish to populate the slide with elements, add create requests here, - // using the slide ID specified above. - - // Execute the request. - BatchUpdatePresentationRequest body = - new BatchUpdatePresentationRequest().setRequests(requests); - BatchUpdatePresentationResponse response = - slidesService.presentations().batchUpdate(presentationId, body).execute(); - CreateSlideResponse createSlideResponse = response.getReplies().get(0).getCreateSlide(); - System.out.println("Created slide with ID: " + createSlideResponse.getObjectId()); - // [END slides_create_slide] - return response; - } - - public BatchUpdatePresentationResponse createTextBoxWithText( - String presentationId, String slideId) throws IOException { - Slides slidesService = this.service; - // [START slides_create_textbox_with_text] - // Create a new square text box, using a supplied object ID. - List requests = new ArrayList<>(); - String textBoxId = "MyTextBox_01"; - Dimension pt350 = new Dimension().setMagnitude(350.0).setUnit("PT"); - requests.add(new Request() - .setCreateShape(new CreateShapeRequest() - .setObjectId(textBoxId) - .setShapeType("TEXT_BOX") - .setElementProperties(new PageElementProperties() - .setPageObjectId(slideId) - .setSize(new Size() - .setHeight(pt350) - .setWidth(pt350)) - .setTransform(new AffineTransform() - .setScaleX(1.0) - .setScaleY(1.0) - .setTranslateX(350.0) - .setTranslateY(100.0) - .setUnit("PT"))))); - - // Insert text into the box, using the object ID given to it. - requests.add(new Request() - .setInsertText(new InsertTextRequest() - .setObjectId(textBoxId) - .setInsertionIndex(0) - .setText("New Box Text Inserted"))); - - // Execute the requests. - BatchUpdatePresentationRequest body = - new BatchUpdatePresentationRequest().setRequests(requests); - BatchUpdatePresentationResponse response = - slidesService.presentations().batchUpdate(presentationId, body).execute(); - CreateShapeResponse createShapeResponse = response.getReplies().get(0).getCreateShape(); - System.out.println("Created textbox with ID: " + createShapeResponse.getObjectId()); - // [END slides_create_textbox_with_text] - return response; - } - - - public BatchUpdatePresentationResponse createImage(String presentationId, - String slideId, - GoogleCredential credential) - throws IOException { - Slides slidesService = this.service; - // [START slides_create_image] - String imageUrl = "https://www.google.com/images/branding/googlelogo/2x/googlelogo_color_272x92dp.png"; - - // Create a new image, using the supplied object ID, with content downloaded from imageUrl. - List requests = new ArrayList<>(); - String imageId = "MyImageId_01"; - Dimension emu4M = new Dimension().setMagnitude(4000000.0).setUnit("EMU"); - requests.add(new Request() - .setCreateImage(new CreateImageRequest() - .setObjectId(imageId) - .setUrl(imageUrl) - .setElementProperties(new PageElementProperties() - .setPageObjectId(slideId) - .setSize(new Size() - .setHeight(emu4M) - .setWidth(emu4M)) - .setTransform(new AffineTransform() - .setScaleX(1.0) - .setScaleY(1.0) - .setTranslateX(100000.0) - .setTranslateY(100000.0) - .setUnit("EMU"))))); - - // Execute the request. - BatchUpdatePresentationRequest body = - new BatchUpdatePresentationRequest().setRequests(requests); - BatchUpdatePresentationResponse response = - slidesService.presentations().batchUpdate(presentationId, body).execute(); - CreateImageResponse createImageResponse = response.getReplies().get(0).getCreateImage(); - System.out.println("Created image with ID: " + createImageResponse.getObjectId()); - // [END slides_create_image] - return response; - } - - public List textMerging( - String templatePresentationId, String dataSpreadsheetId) throws IOException { - Slides slidesService = this.service; - Drive driveService = this.driveService; - Sheets sheetsService = this.sheetsService; - List responses = new ArrayList<>(5); - // [START slides_text_merging] - // Use the Sheets API to load data, one record per row. - String dataRangeNotation = "Customers!A2:M6"; - ValueRange sheetsResponse = sheetsService.spreadsheets().values() - .get(dataSpreadsheetId, dataRangeNotation).execute(); - List> values = sheetsResponse.getValues(); - - // For each record, create a new merged presentation. - for (List row: values) { - String customerName = row.get(2).toString(); // name in column 3 - String caseDescription = row.get(5).toString(); // case description in column 6 - String totalPortfolio = row.get(11).toString(); // total portfolio in column 12 - - // Duplicate the template presentation using the Drive API. - String copyTitle = customerName + " presentation"; - File content = new File().setName(copyTitle); - File presentationFile = - driveService.files().copy(templatePresentationId, content).execute(); - String presentationId = presentationFile.getId(); - - // Create the text merge (replaceAllText) requests for this presentation. - List requests = new ArrayList<>(); - requests.add(new Request() - .setReplaceAllText(new ReplaceAllTextRequest() - .setContainsText(new SubstringMatchCriteria() - .setText("{{customer-name}}") - .setMatchCase(true)) - .setReplaceText(customerName))); - requests.add(new Request() - .setReplaceAllText(new ReplaceAllTextRequest() - .setContainsText(new SubstringMatchCriteria() - .setText("{{case-description}}") - .setMatchCase(true)) - .setReplaceText(caseDescription))); - requests.add(new Request() - .setReplaceAllText(new ReplaceAllTextRequest() - .setContainsText(new SubstringMatchCriteria() - .setText("{{total-portfolio}}") - .setMatchCase(true)) - .setReplaceText(totalPortfolio))); - - // Execute the requests for this presentation. - BatchUpdatePresentationRequest body = - new BatchUpdatePresentationRequest().setRequests(requests); - BatchUpdatePresentationResponse response = - slidesService.presentations().batchUpdate(presentationId, body).execute(); - // [START_EXCLUDE silent] - responses.add(response); - // [END_EXCLUDE] - // Count total number of replacements made. - int numReplacements = 0; - for (Response resp : response.getReplies()) { - numReplacements += resp.getReplaceAllText().getOccurrencesChanged(); - } - - System.out.println("Created merged presentation for " + - customerName + " with ID: " + presentationId); - System.out.println("Replaced " + numReplacements + " text instances."); - } - // [END slides_text_merging] - return responses; - } - - public BatchUpdatePresentationResponse imageMerging(String templatePresentationId, - String imageUrl, - String customerName) throws IOException { - Slides slidesService = this.service; - Drive driveService = this.driveService; - String logoUrl = imageUrl; - String customerGraphicUrl = imageUrl; - - // [START slides_image_merging] - // Duplicate the template presentation using the Drive API. - String copyTitle = customerName + " presentation"; - File content = new File().setName(copyTitle); - File presentationFile = - driveService.files().copy(templatePresentationId, content).execute(); - String presentationId = presentationFile.getId(); - - // Create the image merge (replaceAllShapesWithImage) requests. - List requests = new ArrayList<>(); - requests.add(new Request() - .setReplaceAllShapesWithImage(new ReplaceAllShapesWithImageRequest() - .setImageUrl(logoUrl) - .setReplaceMethod("CENTER_INSIDE") - .setContainsText(new SubstringMatchCriteria() - .setText("{{company-logo}}") - .setMatchCase(true)))); - requests.add(new Request() - .setReplaceAllShapesWithImage(new ReplaceAllShapesWithImageRequest() - .setImageUrl(customerGraphicUrl) - .setReplaceMethod("CENTER_INSIDE") - .setContainsText(new SubstringMatchCriteria() - .setText("{{customer-graphic}}") - .setMatchCase(true)))); - - // Execute the requests. - BatchUpdatePresentationRequest body = - new BatchUpdatePresentationRequest().setRequests(requests); - BatchUpdatePresentationResponse response = - slidesService.presentations().batchUpdate(presentationId, body).execute(); - - // Count total number of replacements made. - int numReplacements = 0; - for(Response resp: response.getReplies()) { - numReplacements += resp.getReplaceAllShapesWithImage().getOccurrencesChanged(); - } - - System.out.println("Created merged presentation with ID: " + presentationId); - System.out.println("Replaced " + numReplacements + " shapes instances with images."); - // [END slides_image_merging] - return response; - } - - public BatchUpdatePresentationResponse simpleTextReplace( - String presentationId, String shapeId, String replacementText) throws IOException { - Slides slidesService = this.service; - // [START slides_simple_text_replace] - // Remove existing text in the shape, then insert the new text. - List requests = new ArrayList<>(); - requests.add(new Request() - .setDeleteText(new DeleteTextRequest() - .setObjectId(shapeId) - .setTextRange(new Range() - .setType("ALL")))); - requests.add(new Request() - .setInsertText(new InsertTextRequest() - .setObjectId(shapeId) - .setInsertionIndex(0) - .setText(replacementText))); - - // Execute the requests. - BatchUpdatePresentationRequest body = - new BatchUpdatePresentationRequest().setRequests(requests); - BatchUpdatePresentationResponse response = - slidesService.presentations().batchUpdate(presentationId, body).execute(); - - System.out.println("Replaced text in shape with ID: " + shapeId); - // [END slides_simple_text_replace] - return response; - } - - public BatchUpdatePresentationResponse textStyleUpdate(String presentationId, String shapeId) - throws IOException { - Slides slidesService = this.service; - // [START slides_text_style_update] - // Update the text style so that the first 5 characters are bolded - // and italicized, and the next 5 are displayed in blue 14 pt Times - // New Roman font, and the next five are hyperlinked. - List requests = new ArrayList<>(); - requests.add(new Request() - .setUpdateTextStyle(new UpdateTextStyleRequest() - .setObjectId(shapeId) - .setTextRange(new Range() - .setType("FIXED_RANGE") - .setStartIndex(0) - .setEndIndex(5)) - .setStyle(new TextStyle() - .setBold(true) - .setItalic(true)) - .setFields("bold,italic"))); - requests.add(new Request() - .setUpdateTextStyle(new UpdateTextStyleRequest() - .setObjectId(shapeId) - .setTextRange(new Range() - .setType("FIXED_RANGE") - .setStartIndex(5) - .setEndIndex(10)) - .setStyle(new TextStyle() - .setFontFamily("Times New Roman") - .setFontSize(new Dimension() - .setMagnitude(14.0) - .setUnit("PT")) - .setForegroundColor(new OptionalColor() - .setOpaqueColor(new OpaqueColor() - .setRgbColor(new RgbColor() - .setBlue(1.0F) - .setGreen(0.0F) - .setRed(0.0F))))) - .setFields("foregroundColor,fontFamily,fontSize"))); - requests.add(new Request() - .setUpdateTextStyle(new UpdateTextStyleRequest() - .setObjectId(shapeId) - .setTextRange(new Range() - .setType("FIXED_RANGE") - .setStartIndex(10) - .setEndIndex(15)) - .setStyle(new TextStyle() - .setLink(new Link() - .setUrl("www.example.com"))) - .setFields("link"))); - - // Execute the requests. - BatchUpdatePresentationRequest body = - new BatchUpdatePresentationRequest().setRequests(requests); - BatchUpdatePresentationResponse response = - slidesService.presentations().batchUpdate(presentationId, body).execute(); - - System.out.println("Updated text style for shape with ID: " + shapeId); - // [END slides_text_style_update] - return response; - } - - public BatchUpdatePresentationResponse createBulletedText(String presentationId, - String shapeId) throws IOException { - Slides slidesService = this.service; - // [START slides_create_bulleted_text] - // Add arrow-diamond-disc bullets to all text in the shape. - List requests = new ArrayList<>(); - requests.add(new Request() - .setCreateParagraphBullets(new CreateParagraphBulletsRequest() - .setObjectId(shapeId) - .setTextRange(new Range() - .setType("ALL")) - .setBulletPreset("BULLET_ARROW_DIAMOND_DISC"))); - - // Execute the request. - BatchUpdatePresentationRequest body = - new BatchUpdatePresentationRequest().setRequests(requests); - BatchUpdatePresentationResponse response = - slidesService.presentations().batchUpdate(presentationId, body).execute(); - System.out.println("Added bullets to text in shape with ID: " + shapeId); - // [END slides_create_bulleted_text] - return response; - } - - public BatchUpdatePresentationResponse createSheetsChart( - String presentationId, String pageId, String spreadsheetId, Integer sheetChartId) - throws IOException { - Slides slidesService = this.service; - // [START slides_create_sheets_chart] - // Embed a Sheets chart (indicated by the spreadsheetId and sheetChartId) onto - // a page in the presentation. Setting the linking mode as "LINKED" allows the - // chart to be refreshed if the Sheets version is updated. - List requests = new ArrayList<>(); - Dimension emu4M = new Dimension().setMagnitude(4000000.0).setUnit("EMU"); - String presentationChartId = "MyEmbeddedChart"; - requests.add(new Request() - .setCreateSheetsChart(new CreateSheetsChartRequest() - .setObjectId(presentationChartId) - .setSpreadsheetId(spreadsheetId) - .setChartId(sheetChartId) - .setLinkingMode("LINKED") - .setElementProperties(new PageElementProperties() - .setPageObjectId(pageId) - .setSize(new Size() - .setHeight(emu4M) - .setWidth(emu4M)) - .setTransform(new AffineTransform() - .setScaleX(1.0) - .setScaleY(1.0) - .setTranslateX(100000.0) - .setTranslateY(100000.0) - .setUnit("EMU"))))); - - // Execute the request. - BatchUpdatePresentationRequest body = - new BatchUpdatePresentationRequest().setRequests(requests); - BatchUpdatePresentationResponse response = - slidesService.presentations().batchUpdate(presentationId, body).execute(); - System.out.println("Added a linked Sheets chart with ID " + presentationChartId); - // [END slides_create_sheets_chart] - return response; - } - - public BatchUpdatePresentationResponse refreshSheetsChart( - String presentationId, String presentationChartId) throws IOException { - Slides slidesService = this.service; - // [START slides_refresh_sheets_chart] - List requests = new ArrayList<>(); - - // Refresh an existing linked Sheets chart embedded a presentation. - requests.add(new Request() - .setRefreshSheetsChart(new RefreshSheetsChartRequest() - .setObjectId(presentationChartId))); - - // Execute the request. - BatchUpdatePresentationRequest body = - new BatchUpdatePresentationRequest().setRequests(requests); - BatchUpdatePresentationResponse response = - slidesService.presentations().batchUpdate(presentationId, body).execute(); - System.out.println("Refreshed a linked Sheets chart with ID " + presentationChartId); - // [END slides_refresh_sheets_chart] - return response; - } -} diff --git a/slides/snippets/src/test/java/BaseTest.java b/slides/snippets/src/test/java/BaseTest.java index 99e97610..f88fec7c 100644 --- a/slides/snippets/src/test/java/BaseTest.java +++ b/slides/snippets/src/test/java/BaseTest.java @@ -1,117 +1,71 @@ -import com.google.api.client.googleapis.auth.oauth2.GoogleCredential; -import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport; -import com.google.api.client.http.HttpTransport; -import com.google.api.client.json.jackson2.JacksonFactory; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; import com.google.api.services.drive.Drive; -import com.google.api.services.drive.DriveScopes; import com.google.api.services.sheets.v4.Sheets; import com.google.api.services.slides.v1.Slides; +import com.google.api.services.slides.v1.SlidesScopes; import com.google.api.services.slides.v1.model.*; - import java.io.IOException; import java.security.GeneralSecurityException; import java.util.*; import java.util.List; -import java.util.logging.Handler; -import java.util.logging.Level; -import java.util.logging.LogRecord; -import java.util.logging.Logger; -import org.junit.After; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; import org.junit.Before; +import org.junit.After; public class BaseTest { - static { - enableLogging(); - } - - protected GoogleCredential credential; protected Slides service; protected Drive driveService; protected Sheets sheetsService; - protected Set filesToDelete = new HashSet<>(); - - - public static void enableLogging() { - Logger logger = Logger.getLogger(HttpTransport.class.getName()); - logger.setLevel(Level.INFO); - logger.addHandler(new Handler() { - - @Override - public void close() throws SecurityException { - } - - @Override - public void flush() { - } - - @Override - public void publish(LogRecord record) { - // default ConsoleHandler will print >= INFO to System.err - if (record.getLevel().intValue() < Level.INFO.intValue()) { - System.out.println(record.getMessage()); - } - } - }); - } - public GoogleCredential getCredential() throws IOException { - return GoogleCredential.getApplicationDefault() - .createScoped(Arrays.asList(DriveScopes.DRIVE)); + public GoogleCredentials getCredential() throws IOException { + /* Load pre-authorized user credentials from the environment. + TODO(developer) - See https://developers.google.com/identity for + guides on implementing OAuth2 for your application. */ + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(SlidesScopes.PRESENTATIONS, SlidesScopes.DRIVE); + return credentials; } - public Slides buildService(GoogleCredential credential) - throws IOException, GeneralSecurityException { + public Slides buildService(GoogleCredentials credential) { return new Slides.Builder( - GoogleNetHttpTransport.newTrustedTransport(), - JacksonFactory.getDefaultInstance(), - credential) + new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + new HttpCredentialsAdapter(credential)) .setApplicationName("Slides API Snippets") .build(); } - public Drive buildDriveService(GoogleCredential credential) - throws IOException, GeneralSecurityException { + public Drive buildDriveService(GoogleCredentials credential) { return new Drive.Builder( - GoogleNetHttpTransport.newTrustedTransport(), - JacksonFactory.getDefaultInstance(), - credential) + new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + new HttpCredentialsAdapter(credential)) .setApplicationName("Slides API Snippets") .build(); } - public Sheets buildSheetsService(GoogleCredential credential) - throws IOException, GeneralSecurityException { + public Sheets buildSheetsService(GoogleCredentials credential) { return new Sheets.Builder( - GoogleNetHttpTransport.newTrustedTransport(), - JacksonFactory.getDefaultInstance(), - credential) + new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + new HttpCredentialsAdapter(credential)) .setApplicationName("Slides API Snippets") .build(); } @Before - public void setup() throws IOException, GeneralSecurityException { - this.credential = getCredential(); + public void setup() throws IOException { + GoogleCredentials credential = getCredential(); this.service = buildService(credential); this.driveService = buildDriveService(credential); this.sheetsService = buildSheetsService(credential); - this.filesToDelete.clear(); - } - - @After - public void cleanupFiles() { - for(String id : filesToDelete) { - try { - this.driveService.files().delete(id).execute(); - } catch (IOException e) { - System.err.println("Unable to cleanup file " + id); - } - } } - protected void deleteFileOnCleanup(String id) { - filesToDelete.add(id); + protected void deleteFileOnCleanup(String id) throws IOException { + this.driveService.files().delete(id).execute(); } protected String createTestPresentation() throws IOException { @@ -120,9 +74,7 @@ protected String createTestPresentation() throws IOException { presentation = service.presentations().create(presentation) .setFields("presentationId") .execute(); - String presentationId = presentation.getPresentationId(); - this.deleteFileOnCleanup(presentationId); - return presentationId; + return presentation.getPresentationId(); } protected String createTestSlide(String presentationId) throws IOException { diff --git a/slides/snippets/src/test/java/SnippetsTest.java b/slides/snippets/src/test/java/SnippetsTest.java deleted file mode 100644 index ec2a4ce7..00000000 --- a/slides/snippets/src/test/java/SnippetsTest.java +++ /dev/null @@ -1,160 +0,0 @@ -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; - -import com.google.api.services.slides.v1.model.*; - -import java.io.IOException; -import java.util.List; - -import org.junit.Before; -import org.junit.Test; - -public class SnippetsTest extends BaseTest { - - private Snippets snippets; - - private final String IMAGE_URL = - "https://www.google.com/images/branding/googlelogo/2x/googlelogo_color_272x92dp.png"; - private final String TEMPLATE_PRESENTATION_ID = "1wJUN1B5CQ2wQOBzmz2apky48QNK1OsE2oNKHPMLpKDc"; - private final String DATA_SPREADSHEET_ID = "14KaZMq2aCAGt5acV77zaA_Ps8aDt04G7T0ei4KiXLX8"; - private final Integer CHART_ID = 1107320627; - - private final String CUSTOMER_NAME = "Fake Customer"; - - @Before - public void createSnippets() { - this.snippets = new Snippets(this.service, this.driveService, this.sheetsService); - } - - @Test - public void testCreatePresentation() throws IOException { - String presentationId = this.snippets.createPresentation("Title"); - assertNotNull(presentationId); - this.deleteFileOnCleanup(presentationId); - } - - @Test - public void testCopyPresentation() throws IOException { - String presentationId = this.createTestPresentation(); - String copyId = this.snippets.copyPresentation(presentationId, "My Duplicate Presentation"); - assertNotNull(copyId); - this.deleteFileOnCleanup(copyId); - } - - @Test - public void testCreateSlide() throws IOException { - String presentationId = this.createTestPresentation(); - BatchUpdatePresentationResponse response = this.snippets.createSlide(presentationId); - assertNotNull(response); - assertEquals(1, response.getReplies().size()); - String pageId = response.getReplies().get(0).getCreateSlide().getObjectId(); - assertNotNull(pageId); - } - - @Test - public void testCreateTextBox() throws IOException { - String presentationId = this.createTestPresentation(); - String pageId = this.createTestSlide(presentationId); - BatchUpdatePresentationResponse response = - this.snippets.createTextBoxWithText(presentationId, pageId); - assertEquals(2, response.getReplies().size()); - String boxId = response.getReplies().get(0).getCreateShape().getObjectId(); - assertNotNull(boxId); - } - - @Test - public void testCreateImage() throws IOException { - String presentationId = this.createTestPresentation(); - String pageId = this.createTestSlide(presentationId); - BatchUpdatePresentationResponse response = this.snippets.createImage( - presentationId, pageId, this.credential); - assertEquals(1, response.getReplies().size()); - String imageId = response.getReplies().get(0).getCreateImage().getObjectId(); - assertNotNull(imageId); - } - - @Test - public void testTextMerge() throws IOException { - List responses = - this.snippets.textMerging(TEMPLATE_PRESENTATION_ID, DATA_SPREADSHEET_ID); - for (BatchUpdatePresentationResponse response: responses) { - String presentationId = response.getPresentationId(); - assertNotNull(presentationId); - assertEquals(3, response.getReplies().size()); - int numReplacements = 0; - for (Response resp : response.getReplies()) { - numReplacements += resp.getReplaceAllText().getOccurrencesChanged(); - } - assertEquals(4, numReplacements); - this.deleteFileOnCleanup(presentationId); - } - } - - @Test - public void testImageMerge() throws IOException { - BatchUpdatePresentationResponse response = - this.snippets.imageMerging(TEMPLATE_PRESENTATION_ID, IMAGE_URL, CUSTOMER_NAME); - String presentationId = response.getPresentationId(); - assertNotNull(presentationId); - assertEquals(2, response.getReplies().size()); - int numReplacements = 0; - for(Response resp: response.getReplies()) { - numReplacements += resp.getReplaceAllShapesWithImage().getOccurrencesChanged(); - } - assertEquals(2, numReplacements); - this.deleteFileOnCleanup(presentationId); - } - - @Test - public void testSimpleTextReplace() throws IOException { - String presentationId = this.createTestPresentation(); - String pageId = this.createTestSlide(presentationId); - String boxId = this.createTestTextBox(presentationId, pageId); - BatchUpdatePresentationResponse response = - this.snippets.simpleTextReplace(presentationId, boxId, "MY NEW TEXT"); - assertEquals(2, response.getReplies().size()); - } - - @Test - public void testTextStyleUpdate() throws IOException { - String presentationId = this.createTestPresentation(); - String pageId = this.createTestSlide(presentationId); - String boxId = this.createTestTextBox(presentationId, pageId); - BatchUpdatePresentationResponse response = - this.snippets.textStyleUpdate(presentationId, boxId); - assertEquals(3, response.getReplies().size()); - } - - @Test - public void testCreateBulletText() throws IOException { - String presentationId = this.createTestPresentation(); - String pageId = this.createTestSlide(presentationId); - String boxId = this.createTestTextBox(presentationId, pageId); - BatchUpdatePresentationResponse response = - this.snippets.createBulletedText(presentationId, boxId); - assertEquals(1, response.getReplies().size()); - } - - @Test - public void testCreateSheetsChart() throws IOException { - String presentationId = this.createTestPresentation(); - String pageId = this.createTestSlide(presentationId); - BatchUpdatePresentationResponse response = - this.snippets.createSheetsChart( - presentationId, pageId, DATA_SPREADSHEET_ID, CHART_ID); - assertEquals(1, response.getReplies().size()); - String chartId = response.getReplies().get(0).getCreateSheetsChart().getObjectId(); - assertNotNull(chartId); - } - - @Test - public void testRefreshSheetsChart() throws IOException { - String presentationId = this.createTestPresentation(); - String pageId = this.createTestSlide(presentationId); - String chartId = - this.createTestSheetsChart(presentationId, pageId, DATA_SPREADSHEET_ID, CHART_ID); - BatchUpdatePresentationResponse response = - this.snippets.refreshSheetsChart(presentationId, chartId); - assertEquals(1, response.getReplies().size()); - } -} diff --git a/slides/snippets/src/test/java/TestCopyPresentation.java b/slides/snippets/src/test/java/TestCopyPresentation.java new file mode 100644 index 00000000..a4772d09 --- /dev/null +++ b/slides/snippets/src/test/java/TestCopyPresentation.java @@ -0,0 +1,31 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import org.junit.Test; + +import java.io.IOException; + +import static org.junit.Assert.assertNotNull; + +// Unit testcase for copy presentation snippet +public class TestCopyPresentation extends BaseTest{ + + @Test + public void testCopyPresentation() throws IOException { + String presentationId = createTestPresentation(); + String copyId = CopyPresentation.copyPresentation(presentationId, "My Duplicate Presentation"); + assertNotNull(copyId); + deleteFileOnCleanup(copyId); + } +} diff --git a/slides/snippets/src/test/java/TestCreateBulletedText.java b/slides/snippets/src/test/java/TestCreateBulletedText.java new file mode 100644 index 00000000..c6c00cf9 --- /dev/null +++ b/slides/snippets/src/test/java/TestCreateBulletedText.java @@ -0,0 +1,35 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import com.google.api.services.slides.v1.model.BatchUpdatePresentationResponse; +import org.junit.Test; + +import java.io.IOException; + +import static org.junit.Assert.assertEquals; + +// Unit testcase for createBulletedText snippet +public class TestCreateBulletedText extends BaseTest{ + + @Test + public void testCreateBulletText() throws IOException { + String presentationId = createTestPresentation(); + String pageId = createTestSlide(presentationId); + String boxId = createTestTextBox(presentationId, pageId); + BatchUpdatePresentationResponse response = + CreateBulletedText.createBulletedText(presentationId, boxId); + assertEquals(1, response.getReplies().size()); + deleteFileOnCleanup(presentationId); + } +} diff --git a/slides/snippets/src/test/java/TestCreateImage.java b/slides/snippets/src/test/java/TestCreateImage.java new file mode 100644 index 00000000..f2493670 --- /dev/null +++ b/slides/snippets/src/test/java/TestCreateImage.java @@ -0,0 +1,39 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import com.google.api.services.slides.v1.model.BatchUpdatePresentationResponse; +import org.junit.Test; + +import java.io.IOException; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; + +// Unit testcase for createImage snippet +public class TestCreateImage extends BaseTest { + + private final String IMAGE_URL = + "https://www.google.com/images/branding/googlelogo/2x/googlelogo_color_272x92dp.png"; + + @Test + public void testCreateImage() throws IOException { + String presentationId = createTestPresentation(); + String slideId = createTestSlide(presentationId); + BatchUpdatePresentationResponse response = CreateImage.createImage( + presentationId, slideId, IMAGE_URL); + assertEquals(1, response.getReplies().size()); + String imageId = response.getReplies().get(0).getCreateImage().getObjectId(); + assertNotNull(imageId); + } +} diff --git a/slides/snippets/src/test/java/TestCreatePresentation.java b/slides/snippets/src/test/java/TestCreatePresentation.java new file mode 100644 index 00000000..8a44c76c --- /dev/null +++ b/slides/snippets/src/test/java/TestCreatePresentation.java @@ -0,0 +1,30 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import org.junit.Test; + +import java.io.IOException; + +import static org.junit.Assert.assertNotNull; + +// Unit testcase for createPresentation snippet +public class TestCreatePresentation extends BaseTest{ + + @Test + public void testCreatePresentation() throws IOException { + String presentationId = CreatePresentation.createPresentation("Title"); + assertNotNull(presentationId); + deleteFileOnCleanup(presentationId); + } +} diff --git a/slides/snippets/src/test/java/TestCreateSheetsChart.java b/slides/snippets/src/test/java/TestCreateSheetsChart.java new file mode 100644 index 00000000..c4905b83 --- /dev/null +++ b/slides/snippets/src/test/java/TestCreateSheetsChart.java @@ -0,0 +1,40 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import com.google.api.services.slides.v1.model.BatchUpdatePresentationResponse; +import org.junit.Test; + +import java.io.IOException; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; + +// Unit testcase for createSheetsChart snippet +public class TestCreateSheetsChart extends BaseTest{ + // TODO(developer) - change the IDs before executing + private final String DATA_SPREADSHEET_ID = "1ZCGbdHSvLnp776gDGSGtkEBxWQ-FDMuWEF4EOSmeDDw"; + private final Integer CHART_ID = 1107320627; + @Test + public void testCreateSheetsChart() throws IOException { + String presentationId = this.createTestPresentation(); + String pageId = this.createTestSlide(presentationId); + BatchUpdatePresentationResponse response = + CreateSheetsChart.createSheetsChart( + presentationId, pageId, DATA_SPREADSHEET_ID, CHART_ID); + assertEquals(1, response.getReplies().size()); + String chartId = response.getReplies().get(0).getCreateSheetsChart().getObjectId(); + assertNotNull(chartId); + deleteFileOnCleanup(presentationId); + } +} diff --git a/slides/snippets/src/test/java/TestCreateSlide.java b/slides/snippets/src/test/java/TestCreateSlide.java new file mode 100644 index 00000000..84997780 --- /dev/null +++ b/slides/snippets/src/test/java/TestCreateSlide.java @@ -0,0 +1,37 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import com.google.api.services.slides.v1.model.BatchUpdatePresentationResponse; +import org.junit.Test; + +import java.io.IOException; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; + +// Unit testcase for createSlide snippet +public class TestCreateSlide extends BaseTest{ + + @Test + public void testCreateSlide() throws IOException { + String presentationId = createTestPresentation(); + BatchUpdatePresentationResponse response = + CreateSlide.createSlide(presentationId); + assertNotNull(response); + assertEquals(1, response.getReplies().size()); + String pageId = response.getReplies().get(0).getCreateSlide().getObjectId(); + assertNotNull(pageId); + deleteFileOnCleanup(presentationId); + } +} diff --git a/slides/snippets/src/test/java/TestCreateTextboxWithText.java b/slides/snippets/src/test/java/TestCreateTextboxWithText.java new file mode 100644 index 00000000..5fbf15bc --- /dev/null +++ b/slides/snippets/src/test/java/TestCreateTextboxWithText.java @@ -0,0 +1,38 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import com.google.api.services.slides.v1.model.BatchUpdatePresentationResponse; +import org.junit.Test; + +import java.io.IOException; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; + +// Unit testcase for createTextboxWithText snippet +public class TestCreateTextboxWithText extends BaseTest{ + + @Test + public void testCreateTextBox() throws IOException { + String presentationId = createTestPresentation(); + String pageId = createTestSlide(presentationId); + BatchUpdatePresentationResponse response = + CreateTextboxWithText.createTextBoxWithText(presentationId, + pageId, "MyTextBox"); + assertEquals(2, response.getReplies().size()); + String boxId = response.getReplies().get(0).getCreateShape().getObjectId(); + assertNotNull(boxId); + deleteFileOnCleanup(presentationId); + } +} diff --git a/slides/snippets/src/test/java/TestImageMerging.java b/slides/snippets/src/test/java/TestImageMerging.java new file mode 100644 index 00000000..73a16f90 --- /dev/null +++ b/slides/snippets/src/test/java/TestImageMerging.java @@ -0,0 +1,45 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import com.google.api.services.slides.v1.model.BatchUpdatePresentationResponse; +import com.google.api.services.slides.v1.model.Response; +import org.junit.Test; + +import java.io.IOException; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; + +// Unit testcase for imageMerging snippet +public class TestImageMerging extends BaseTest{ + // TODO(developer) - change the IDs before executing + private final String IMAGE_URL = + "https://www.google.com/images/branding/googlelogo/2x/googlelogo_color_272x92dp.png"; + private final String TEMPLATE_PRESENTATION_ID = "1wJUN1B5CQ2wQOBzmz2apky48QNK1OsE2oNKHPMLpKDc"; + private final String CUSTOMER_NAME = "Fake Customer"; + @Test + public void testImageMerge() throws IOException { + BatchUpdatePresentationResponse response = + ImageMerging.imageMerging(TEMPLATE_PRESENTATION_ID, IMAGE_URL, CUSTOMER_NAME); + String presentationId = response.getPresentationId(); + assertNotNull(presentationId); + assertEquals(2, response.getReplies().size()); + int numReplacements = 0; + for(Response resp: response.getReplies()) { + numReplacements += resp.getReplaceAllShapesWithImage().getOccurrencesChanged(); + } + assertEquals(2, numReplacements); + deleteFileOnCleanup(presentationId); + } +} diff --git a/slides/snippets/src/test/java/TestRefreshSheetsChart.java b/slides/snippets/src/test/java/TestRefreshSheetsChart.java new file mode 100644 index 00000000..b2c17928 --- /dev/null +++ b/slides/snippets/src/test/java/TestRefreshSheetsChart.java @@ -0,0 +1,38 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import com.google.api.services.slides.v1.model.BatchUpdatePresentationResponse; +import org.junit.Test; + +import java.io.IOException; + +import static org.junit.Assert.assertEquals; + +// Unit testcase for refreshSheetsChart snippet +public class TestRefreshSheetsChart extends BaseTest{ + // TODO(developer) - change the IDs before executing + private final String DATA_SPREADSHEET_ID = "14KaZMq2aCAGt5acV77zaA_Ps8aDt04G7T0ei4KiXLX8"; + private final Integer CHART_ID = 1107320627; + @Test + public void testRefreshSheetsChart() throws IOException { + String presentationId = this.createTestPresentation(); + String pageId = this.createTestSlide(presentationId); + String chartId = + this.createTestSheetsChart(presentationId, pageId, DATA_SPREADSHEET_ID, CHART_ID); + BatchUpdatePresentationResponse response = + RefreshSheetsChart.refreshSheetsChart(presentationId, chartId); + assertEquals(1, response.getReplies().size()); + deleteFileOnCleanup(presentationId); + } +} diff --git a/slides/snippets/src/test/java/TestSimpleTextReplace.java b/slides/snippets/src/test/java/TestSimpleTextReplace.java new file mode 100644 index 00000000..397a3263 --- /dev/null +++ b/slides/snippets/src/test/java/TestSimpleTextReplace.java @@ -0,0 +1,35 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import com.google.api.services.slides.v1.model.BatchUpdatePresentationResponse; +import org.junit.Test; + +import java.io.IOException; + +import static org.junit.Assert.assertEquals; + +// Unit testcase for simpleTextReplace snippet +public class TestSimpleTextReplace extends BaseTest{ + + @Test + public void testSimpleTextReplace() throws IOException { + String presentationId = createTestPresentation(); + String pageId = createTestSlide(presentationId); + String boxId = createTestTextBox(presentationId, pageId); + BatchUpdatePresentationResponse response = + SimpleTextReplace.simpleTextReplace(presentationId, boxId, "MY NEW TEXT"); + assertEquals(2, response.getReplies().size()); + deleteFileOnCleanup(presentationId); + } +} diff --git a/slides/snippets/src/test/java/TestTextMerging.java b/slides/snippets/src/test/java/TestTextMerging.java new file mode 100644 index 00000000..35917aa3 --- /dev/null +++ b/slides/snippets/src/test/java/TestTextMerging.java @@ -0,0 +1,46 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import com.google.api.services.slides.v1.model.BatchUpdatePresentationResponse; +import com.google.api.services.slides.v1.model.Response; +import org.junit.Test; + +import java.io.IOException; +import java.util.List; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; + +// Unit testcase for textMerging snippet +public class TestTextMerging extends BaseTest{ + // TODO(developer) - change the IDs before executing + private final String TEMPLATE_PRESENTATION_ID = "1wJUN1B5CQ2wQOBzmz2apky48QNK1OsE2oNKHPMLpKDc"; + private final String DATA_SPREADSHEET_ID = "14KaZMq2aCAGt5acV77zaA_Ps8aDt04G7T0ei4KiXLX8"; + @Test + public void testTextMerge() throws IOException { + List responses = + TextMerging.textMerging(TEMPLATE_PRESENTATION_ID, DATA_SPREADSHEET_ID); + for (BatchUpdatePresentationResponse response: responses) { + String presentationId = response.getPresentationId(); + assertNotNull(presentationId); + assertEquals(3, response.getReplies().size()); + int numReplacements = 0; + for (Response resp : response.getReplies()) { + numReplacements += resp.getReplaceAllText().getOccurrencesChanged(); + } + assertEquals(4, numReplacements); + deleteFileOnCleanup(presentationId); + } + } +} diff --git a/slides/snippets/src/test/java/TestTextStyleUpdate.java b/slides/snippets/src/test/java/TestTextStyleUpdate.java new file mode 100644 index 00000000..6bf13102 --- /dev/null +++ b/slides/snippets/src/test/java/TestTextStyleUpdate.java @@ -0,0 +1,35 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import com.google.api.services.slides.v1.model.BatchUpdatePresentationResponse; +import org.junit.Test; + +import java.io.IOException; + +import static org.junit.Assert.assertEquals; + +// Unit testcase for textStyleUpdate snippet +public class TestTextStyleUpdate extends BaseTest{ + + @Test + public void testTextStyleUpdate() throws IOException { + String presentationId = this.createTestPresentation(); + String pageId = this.createTestSlide(presentationId); + String boxId = this.createTestTextBox(presentationId, pageId); + BatchUpdatePresentationResponse response = + TextStyleUpdate.textStyleUpdate(presentationId, boxId); + assertEquals(3, response.getReplies().size()); + deleteFileOnCleanup(presentationId); + } +} From f07b8cf24f776c35e82e796a6a3b4856914f38a7 Mon Sep 17 00:00:00 2001 From: Manvendra-P-Singh Date: Wed, 13 Jul 2022 16:11:48 +0000 Subject: [PATCH 114/262] test: removing deprecated GoogleCredential from drive v3 BaseTest (#246) * git-on-borg files of gmail-api-snippets * Update build.gradle test12 * Update build.gradle * test: Implemented auth using GoogleCredentials in v3 Co-authored-by: sanjuktaghosh7 Co-authored-by: Rajesh Mudaliyar Co-authored-by: himanshupr2627 --- drive/snippets/drive_v3/build.gradle | 4 ++ .../drive_v3/src/test/java/BaseTest.java | 42 ++++++++++++------- 2 files changed, 31 insertions(+), 15 deletions(-) diff --git a/drive/snippets/drive_v3/build.gradle b/drive/snippets/drive_v3/build.gradle index ce70eda8..4327d404 100644 --- a/drive/snippets/drive_v3/build.gradle +++ b/drive/snippets/drive_v3/build.gradle @@ -9,4 +9,8 @@ dependencies { implementation 'com.google.auth:google-auth-library-oauth2-http:1.3.0' implementation 'com.google.code.gson:gson:2.4' testImplementation 'junit:junit:4.12' +} + +test { + useJUnitPlatform() } \ No newline at end of file diff --git a/drive/snippets/drive_v3/src/test/java/BaseTest.java b/drive/snippets/drive_v3/src/test/java/BaseTest.java index 1177eee1..f46d3225 100644 --- a/drive/snippets/drive_v3/src/test/java/BaseTest.java +++ b/drive/snippets/drive_v3/src/test/java/BaseTest.java @@ -1,6 +1,5 @@ -import com.google.api.client.googleapis.auth.oauth2.GoogleCredential; -import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport; import com.google.api.client.http.FileContent; +import com.google.api.client.http.HttpRequestInitializer; import com.google.api.client.http.HttpTransport; import com.google.api.client.http.apache.ApacheHttpTransport; import com.google.api.client.http.javanet.NetHttpTransport; @@ -8,6 +7,8 @@ import com.google.api.services.drive.Drive; import com.google.api.services.drive.DriveScopes; import com.google.api.services.drive.model.File; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; import org.junit.After; import org.junit.Before; @@ -51,22 +52,33 @@ public void publish(LogRecord record) { }); } - public GoogleCredential getCredential() throws IOException { - return GoogleCredential.getApplicationDefault() - .createScoped(Arrays.asList(DriveScopes.DRIVE, DriveScopes.DRIVE_APPDATA)); + public GoogleCredentials getCredential() throws IOException { + return GoogleCredentials.getApplicationDefault() + .createScoped(Arrays.asList(DriveScopes.DRIVE, DriveScopes.DRIVE_APPDATA,DriveScopes.DRIVE_FILE)); } - public Drive buildService() throws IOException, GeneralSecurityException { - GoogleCredential credential = getCredential(); - return new Drive.Builder( - //new ApacheHttpTransport(), - //GoogleNetHttpTransport.newTrustedTransport(), - new NetHttpTransport(), + /** + * Creates a default authorization Drive client service. + * + * @return an authorized Drive client service + * @throws IOException - if credentials file not found. + */ + protected Drive buildService() throws IOException { + /* Load pre-authorized user credentials from the environment. + TODO(developer) - See https://developers.google.com/identity for + guides on implementing OAuth2 for your application. */ + GoogleCredentials credentials = getCredential(); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + + // Create the classroom API client + Drive service = new Drive.Builder(new NetHttpTransport(), GsonFactory.getDefaultInstance(), - //GsonFactory.getDefaultInstance(), - credential) - .setApplicationName("Drive API Snippets") - .build(); + requestInitializer) + .setApplicationName("Drive Snippets") + .build(); + + return service; } @Before From ca7379ced6dd418555daba7ff4f36f2867f3fad2 Mon Sep 17 00:00:00 2001 From: googleworkspace-bot <109114539+googleworkspace-bot@users.noreply.github.com> Date: Thu, 21 Jul 2022 11:12:44 -0600 Subject: [PATCH 115/262] chore: Synced file(s) with googleworkspace/.github (#248) * chore: Created local '.github/workflows/lint.yml' from remote 'sync-files/defaults/.github/workflows/lint.yml' * chore: Created local '.github/workflows/test.yml' from remote 'sync-files/defaults/.github/workflows/test.yml' * chore: Created local '.github/CODEOWNERS' from remote 'sync-files/defaults/.github/CODEOWNERS' * chore: Created local '.github/sync-repo-settings.yaml' from remote 'sync-files/defaults/.github/sync-repo-settings.yaml' * chore: Created local '.github/workflows/automation.yml' from remote 'sync-files/defaults/.github/workflows/automation.yml' * chore: Created local 'SECURITY.md' from remote 'SECURITY.md' --- .github/CODEOWNERS | 17 ++++++++++ .github/sync-repo-settings.yaml | 54 ++++++++++++++++++++++++++++++++ .github/workflows/automation.yml | 28 +++++++++++++++++ .github/workflows/lint.yml | 24 ++++++++++++++ .github/workflows/test.yml | 24 ++++++++++++++ SECURITY.md | 6 ++++ 6 files changed, 153 insertions(+) create mode 100644 .github/CODEOWNERS create mode 100644 .github/sync-repo-settings.yaml create mode 100644 .github/workflows/automation.yml create mode 100644 .github/workflows/lint.yml create mode 100644 .github/workflows/test.yml create mode 100644 SECURITY.md diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS new file mode 100644 index 00000000..804a0939 --- /dev/null +++ b/.github/CODEOWNERS @@ -0,0 +1,17 @@ +# Copyright 2022 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# https://help.github.com/en/github/creating-cloning-and-archiving-repositories/about-code-owners + +.github/ @googleworkspace/workspace-devrel-dpe diff --git a/.github/sync-repo-settings.yaml b/.github/sync-repo-settings.yaml new file mode 100644 index 00000000..757d7bb5 --- /dev/null +++ b/.github/sync-repo-settings.yaml @@ -0,0 +1,54 @@ +# Copyright 2022 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# .github/sync-repo-settings.yaml +# See https://github.com/googleapis/repo-automation-bots/tree/main/packages/sync-repo-settings for app options. +rebaseMergeAllowed: true +squashMergeAllowed: true +mergeCommitAllowed: false +deleteBranchOnMerge: true +branchProtectionRules: + - pattern: main + isAdminEnforced: false + requiresStrictStatusChecks: false + requiredStatusCheckContexts: + # .github/workflows/test.yml with a job called "test" + - "test" + # .github/workflows/lint.yml with a job called "lint" + - "lint" + # Google bots below + - "cla/google" + - "snippet-bot check" + - "header-check" + - "conventionalcommits.org" + requiredApprovingReviewCount: 1 + requiresCodeOwnerReviews: true + - pattern: master + isAdminEnforced: false + requiresStrictStatusChecks: false + requiredStatusCheckContexts: + # .github/workflows/test.yml with a job called "test" + - "test" + # .github/workflows/lint.yml with a job called "lint" + - "lint" + # Google bots below + - "cla/google" + - "snippet-bot check" + - "header-check" + - "conventionalcommits.org" + requiredApprovingReviewCount: 1 + requiresCodeOwnerReviews: true +permissionRules: + - team: workspace-devrel-dpe + permission: admin diff --git a/.github/workflows/automation.yml b/.github/workflows/automation.yml new file mode 100644 index 00000000..a5b0e865 --- /dev/null +++ b/.github/workflows/automation.yml @@ -0,0 +1,28 @@ +# Copyright 2022 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +name: Automation +on: [pull_request] +jobs: + dependabot: + runs-on: ubuntu-latest + if: ${{ github.actor == 'dependabot[bot]' }} + env: + PR_URL: ${{github.event.pull_request.html_url}} + GITHUB_TOKEN: ${{secrets.GOOGLEWORKSPACE_BOT_TOKEN}} + steps: + - name: approve + run: gh pr review --approve "$PR_URL" + - name: merge + run: gh pr merge --auto --squash --delete-branch "$PR_URL diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml new file mode 100644 index 00000000..c5cb1be8 --- /dev/null +++ b/.github/workflows/lint.yml @@ -0,0 +1,24 @@ +# Copyright 2022 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +name: Lint +on: [push, pull_request] +jobs: + lint: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - run: | + echo "No lint checks"; + exit 1; diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml new file mode 100644 index 00000000..debf4655 --- /dev/null +++ b/.github/workflows/test.yml @@ -0,0 +1,24 @@ +# Copyright 2022 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +name: Test +on: [push, pull_request] +jobs: + test: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - run: | + echo "No tests"; + exit 1; diff --git a/SECURITY.md b/SECURITY.md new file mode 100644 index 00000000..968a1fb3 --- /dev/null +++ b/SECURITY.md @@ -0,0 +1,6 @@ +# Report a security issue + +To report a security issue, please use https://g.co/vulnz. We use +https://g.co/vulnz for our intake, and do coordination and disclosure here on +GitHub (including using GitHub Security Advisory). The Google Security Team will +respond within 5 working days of your report on g.co/vulnz. From 6ca85bb70195bbb7b9a00ebf0d89e0f9151820d5 Mon Sep 17 00:00:00 2001 From: Justin Poehnelt Date: Thu, 21 Jul 2022 12:13:18 -0600 Subject: [PATCH 116/262] chore: standardize workflows (#249) * chore: standardize workflows * test: aggregate matrix --- .github/workflows/ci.yaml | 51 ----------------------------- .github/workflows/lint.yaml | 39 ---------------------- .github/workflows/lint.yml | 24 +++++++++----- .github/workflows/test.yml | 65 ++++++++++++++++++++++++++----------- 4 files changed, 62 insertions(+), 117 deletions(-) delete mode 100644 .github/workflows/ci.yaml delete mode 100644 .github/workflows/lint.yaml diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml deleted file mode 100644 index 88816de2..00000000 --- a/.github/workflows/ci.yaml +++ /dev/null @@ -1,51 +0,0 @@ -name: CI - -on: - push: - branches: [ master ] - pull_request: - branches: [ master ] - workflow_dispatch: - -jobs: - test: - concurrency: - group: ${{ github.head_ref || github.ref }} - cancel-in-progress: true - # Only run for internal PRs or after a merge - if: ${{ github.event_name == 'push' || github.event.pull_request.head.repo.full_name == github.repository }} - runs-on: ubuntu-latest - strategy: - matrix: - # TODO - expand matrix once stable - java-version: [11] - steps: - - uses: actions/checkout@v3 - - name: Fetch and Diff PR with base from which it was cloned - if: ${{ github.event.pull_request.base.sha }} - run: | - git fetch origin master "${{ github.event.pull_request.base.sha }}" - git diff --diff-filter=ACM --name-only "${{ github.event.pull_request.base.sha }}" "${{ github.sha }}" > "${HOME}/changed_files.txt" - - name: Set up Java ${{ matrix.java-version }} - uses: actions/setup-java@v2 - with: - distribution: 'temurin' - java-version: ${{ matrix.java-version }} - - name: Write test credentials - run: | - mkdir "${HOME}/secrets" - echo "${DEFAULT_CREDENTIALS}" > "${HOME}/secrets/default_credentials.json" - echo "${SERVICE_ACCOUNT_CREDENTIALS}" > "${HOME}/secrets/service_account.json" - echo "${CLIENT_ID_FILE}" > "${HOME}/secrets/client_id.json" - env: - DEFAULT_CREDENTIALS: ${{secrets.SNIPPETS_DEFAULT_CREDENTIALS}} - SERVICE_ACCOUNT_CREDENTIALS: ${{secrets.SNIPPETS_DELEGATED_ADMIN_SERVICE_ACCOUNT}} - CLIENT_ID_FILE: ${{secrets.SNIPPETS_CLIENT_ID_FILE}} - - name: Validate Gradle wrapper - uses: gradle/wrapper-validation-action@v1 - - name: Setup Gradle - uses: gradle/gradle-build-action@v2.1.1 - with: - gradle-version: 7.4 - - name: Run tests - run: ./.github/scripts/test.sh diff --git a/.github/workflows/lint.yaml b/.github/workflows/lint.yaml deleted file mode 100644 index 285a7e99..00000000 --- a/.github/workflows/lint.yaml +++ /dev/null @@ -1,39 +0,0 @@ -# Copyright 2021 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -name: Lint -on: - push: - branches: - - master - pull_request: - branches: - - master - workflow_dispatch: - -jobs: - lint: - concurrency: - group: ${{ github.head_ref || github.ref }} - cancel-in-progress: true - runs-on: ubuntu-20.04 - steps: - - uses: actions/checkout@v2.4.0 - with: - fetch-depth: 0 - - uses: github/super-linter/slim@v4.8.5 - env: - ERROR_ON_MISSING_EXEC_BIT: true - VALIDATE_JSCPD: false - VALIDATE_ALL_CODEBASE: ${{ github.event_name == 'push' }} - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index c5cb1be8..befb9074 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -1,4 +1,4 @@ -# Copyright 2022 Google LLC +# Copyright 2021 Google LLC # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -11,14 +11,22 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. - name: Lint -on: [push, pull_request] +on: [push, pull_request, workflow_dispatch] + jobs: lint: - runs-on: ubuntu-latest + concurrency: + group: ${{ github.head_ref || github.ref }} + cancel-in-progress: true + runs-on: ubuntu-20.04 steps: - - uses: actions/checkout@v2 - - run: | - echo "No lint checks"; - exit 1; + - uses: actions/checkout@v2.4.0 + with: + fetch-depth: 0 + - uses: github/super-linter/slim@v4.8.5 + env: + ERROR_ON_MISSING_EXEC_BIT: true + VALIDATE_JSCPD: false + VALIDATE_ALL_CODEBASE: ${{ github.event_name == 'push' }} + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index debf4655..31604d02 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -1,24 +1,51 @@ -# Copyright 2022 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - name: Test -on: [push, pull_request] + +on: [push, pull_request, workflow_dispatch] + jobs: + matrix: + concurrency: + group: ${{ github.head_ref || github.ref }} + cancel-in-progress: true + # Only run for internal PRs or after a merge + if: ${{ github.event_name == 'push' || github.event.pull_request.head.repo.full_name == github.repository }} + runs-on: ubuntu-latest + strategy: + matrix: + # TODO - expand matrix once stable + java-version: [11] + steps: + - uses: actions/checkout@v3 + - name: Fetch and Diff PR with base from which it was cloned + if: ${{ github.event.pull_request.base.sha }} + run: | + git fetch origin master "${{ github.event.pull_request.base.sha }}" + git diff --diff-filter=ACM --name-only "${{ github.event.pull_request.base.sha }}" "${{ github.sha }}" > "${HOME}/changed_files.txt" + - name: Set up Java ${{ matrix.java-version }} + uses: actions/setup-java@v2 + with: + distribution: 'temurin' + java-version: ${{ matrix.java-version }} + - name: Write test credentials + run: | + mkdir "${HOME}/secrets" + echo "${DEFAULT_CREDENTIALS}" > "${HOME}/secrets/default_credentials.json" + echo "${SERVICE_ACCOUNT_CREDENTIALS}" > "${HOME}/secrets/service_account.json" + echo "${CLIENT_ID_FILE}" > "${HOME}/secrets/client_id.json" + env: + DEFAULT_CREDENTIALS: ${{secrets.SNIPPETS_DEFAULT_CREDENTIALS}} + SERVICE_ACCOUNT_CREDENTIALS: ${{secrets.SNIPPETS_DELEGATED_ADMIN_SERVICE_ACCOUNT}} + CLIENT_ID_FILE: ${{secrets.SNIPPETS_CLIENT_ID_FILE}} + - name: Validate Gradle wrapper + uses: gradle/wrapper-validation-action@v1 + - name: Setup Gradle + uses: gradle/gradle-build-action@v2.1.1 + with: + gradle-version: 7.4 + - name: Run tests + run: ./.github/scripts/test.sh test: + needs: [matrix] runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 - - run: | - echo "No tests"; - exit 1; + - run: echo "Test matrix finished" \ No newline at end of file From fbe50d8a3263deaf65291deba31209868d1137a3 Mon Sep 17 00:00:00 2001 From: Justin Poehnelt Date: Thu, 21 Jul 2022 12:25:54 -0600 Subject: [PATCH 117/262] chore: add license headers (#250) --- .github/linters/sun_checks.xml | 16 ++++++++++++++++ .github/snippet-bot.yml | 14 ++++++++++++++ .github/workflows/test.yml | 14 ++++++++++++++ .travis.yml | 14 ++++++++++++++ calendar/sync/packaging.yaml | 14 ++++++++++++++ calendar/sync/pom.xml | 16 ++++++++++++++++ classroom/snippets/src/main/java/Courses.java | 16 ++++++++++++++++ classroom/snippets/src/test/java/BaseTest.java | 16 ++++++++++++++++ .../snippets/src/test/java/CoursesTest.java | 16 ++++++++++++++++ .../drive_v2/src/main/java/AppDataSnippets.java | 16 ++++++++++++++++ .../drive_v2/src/main/java/ChangeSnippets.java | 16 ++++++++++++++++ .../drive_v2/src/main/java/DriveSnippets.java | 16 ++++++++++++++++ .../drive_v2/src/main/java/FileSnippets.java | 16 ++++++++++++++++ .../src/main/java/TeamDriveSnippets.java | 16 ++++++++++++++++ .../src/test/java/AppDataSnippetsTest.java | 16 ++++++++++++++++ .../drive_v2/src/test/java/BaseTest.java | 16 ++++++++++++++++ .../src/test/java/ChangeSnippetsTest.java | 16 ++++++++++++++++ .../src/test/java/DriveSnippetsTest.java | 16 ++++++++++++++++ .../drive_v2/src/test/java/FileSnippetsTest.java | 16 ++++++++++++++++ .../src/test/java/TeamDriveSnippetsTest.java | 16 ++++++++++++++++ .../drive_v2/src/test/java/TestCreateDrive.java | 16 ++++++++++++++++ .../drive_v2/src/test/java/TestCreateFolder.java | 16 ++++++++++++++++ .../src/test/java/TestCreateShortcut.java | 16 ++++++++++++++++ .../src/test/java/TestCreateTeamDrive.java | 16 ++++++++++++++++ .../drive_v2/src/test/java/TestDownloadFile.java | 16 ++++++++++++++++ .../drive_v2/src/test/java/TestExportPdf.java | 16 ++++++++++++++++ .../drive_v2/src/test/java/TestFetchChanges.java | 16 ++++++++++++++++ .../src/test/java/TestFetchStartPageToken.java | 16 ++++++++++++++++ .../src/test/java/TestMoveFileToFolder.java | 16 ++++++++++++++++ .../src/test/java/TestRecoverDrives.java | 16 ++++++++++++++++ .../src/test/java/TestRecoverTeamDrives.java | 16 ++++++++++++++++ .../drive_v2/src/test/java/TestSearchFiles.java | 16 ++++++++++++++++ .../drive_v2/src/test/java/TestShareFile.java | 16 ++++++++++++++++ .../drive_v2/src/test/java/TestTouchFile.java | 16 ++++++++++++++++ .../drive_v2/src/test/java/TestUploadBasic.java | 16 ++++++++++++++++ .../src/test/java/TestUploadRevision.java | 16 ++++++++++++++++ .../src/test/java/TestUploadToFolder.java | 16 ++++++++++++++++ .../src/test/java/TestUploadWithConversion.java | 16 ++++++++++++++++ .../drive_v3/src/main/java/AppDataSnippets.java | 16 ++++++++++++++++ .../drive_v3/src/main/java/ChangeSnippets.java | 16 ++++++++++++++++ .../drive_v3/src/main/java/DriveSnippets.java | 16 ++++++++++++++++ .../drive_v3/src/main/java/FileSnippets.java | 16 ++++++++++++++++ .../src/main/java/TeamDriveSnippets.java | 16 ++++++++++++++++ .../src/test/java/AppDataSnippetsTest.java | 16 ++++++++++++++++ .../drive_v3/src/test/java/BaseTest.java | 16 ++++++++++++++++ .../src/test/java/ChangeSnippetsTest.java | 16 ++++++++++++++++ .../src/test/java/DriveSnippetsTest.java | 16 ++++++++++++++++ .../drive_v3/src/test/java/FileSnippetsTest.java | 16 ++++++++++++++++ .../src/test/java/TeamDriveSnippetsTest.java | 16 ++++++++++++++++ .../drive_v3/src/test/java/TestCreateFolder.java | 16 ++++++++++++++++ .../src/test/java/TestCreateShortcut.java | 16 ++++++++++++++++ .../drive_v3/src/test/java/TestDownloadFile.java | 16 ++++++++++++++++ .../drive_v3/src/test/java/TestExportPdf.java | 16 ++++++++++++++++ .../src/test/java/TestFetchAppDataFolder.java | 16 ++++++++++++++++ .../drive_v3/src/test/java/TestListAppData.java | 16 ++++++++++++++++ .../src/test/java/TestMoveFileToFolder.java | 16 ++++++++++++++++ .../drive_v3/src/test/java/TestSearchFiles.java | 16 ++++++++++++++++ .../drive_v3/src/test/java/TestShareFile.java | 16 ++++++++++++++++ .../drive_v3/src/test/java/TestTouchFile.java | 16 ++++++++++++++++ .../src/test/java/TestUploadAppdata.java | 16 ++++++++++++++++ .../drive_v3/src/test/java/TestUploadBasic.java | 16 ++++++++++++++++ .../src/test/java/TestUploadRevision.java | 16 ++++++++++++++++ .../src/test/java/TestUploadToFolder.java | 16 ++++++++++++++++ .../src/test/java/TestUploadWithConversion.java | 16 ++++++++++++++++ gmail/snippets/src/main/java/SendEmail.java | 16 ++++++++++++++++ .../snippets/src/main/java/SettingsSnippets.java | 16 ++++++++++++++++ gmail/snippets/src/main/java/SmimeSnippets.java | 16 ++++++++++++++++ gmail/snippets/src/test/java/BaseTest.java | 16 ++++++++++++++++ sheets/snippets/src/test/java/BaseTest.java | 16 ++++++++++++++++ .../snippets/src/test/java/TestPivotTable.java | 16 ++++++++++++++++ slides/snippets/src/test/java/BaseTest.java | 16 ++++++++++++++++ .../vault/chatmigration/DirectoryService.java | 16 ++++++++++++++++ .../vault/chatmigration/DuplicateHold.java | 16 ++++++++++++++++ .../google/vault/chatmigration/HoldsReport.java | 16 ++++++++++++++++ .../vault/chatmigration/MigrationHelper.java | 16 ++++++++++++++++ .../google/vault/chatmigration/QuickStart.java | 16 ++++++++++++++++ .../vault/chatmigration/RetryableTemplate.java | 16 ++++++++++++++++ 77 files changed, 1224 insertions(+) diff --git a/.github/linters/sun_checks.xml b/.github/linters/sun_checks.xml index 5585111e..59cbc573 100644 --- a/.github/linters/sun_checks.xml +++ b/.github/linters/sun_checks.xml @@ -1,4 +1,20 @@ + + diff --git a/.github/snippet-bot.yml b/.github/snippet-bot.yml index e69de29b..bb488a81 100644 --- a/.github/snippet-bot.yml +++ b/.github/snippet-bot.yml @@ -0,0 +1,14 @@ +# Copyright 2022 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 31604d02..1ce73dbb 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -1,3 +1,17 @@ +# Copyright 2022 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + name: Test on: [push, pull_request, workflow_dispatch] diff --git a/.travis.yml b/.travis.yml index c8b5032d..16a64d16 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,3 +1,17 @@ +# Copyright 2022 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + language: java jdk: - oraclejdk11 diff --git a/calendar/sync/packaging.yaml b/calendar/sync/packaging.yaml index 4a6cb239..e150add5 100644 --- a/calendar/sync/packaging.yaml +++ b/calendar/sync/packaging.yaml @@ -1,3 +1,17 @@ +# Copyright 2022 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + # GOOGLE SAMPLE PACKAGING DATA # # This file is used by Google as part of our samples packaging process. diff --git a/calendar/sync/pom.xml b/calendar/sync/pom.xml index e97d4a68..333decb2 100644 --- a/calendar/sync/pom.xml +++ b/calendar/sync/pom.xml @@ -1,4 +1,20 @@ + + 4.0.0 diff --git a/classroom/snippets/src/main/java/Courses.java b/classroom/snippets/src/main/java/Courses.java index df399390..0526ddd5 100644 --- a/classroom/snippets/src/main/java/Courses.java +++ b/classroom/snippets/src/main/java/Courses.java @@ -1,3 +1,19 @@ +/* + * Copyright 2022 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + import com.google.api.client.googleapis.batch.BatchRequest; import com.google.api.client.googleapis.batch.json.JsonBatchCallback; import com.google.api.client.googleapis.json.GoogleJsonError; diff --git a/classroom/snippets/src/test/java/BaseTest.java b/classroom/snippets/src/test/java/BaseTest.java index 8fa029f5..4b69228f 100644 --- a/classroom/snippets/src/test/java/BaseTest.java +++ b/classroom/snippets/src/test/java/BaseTest.java @@ -1,3 +1,19 @@ +/* + * Copyright 2022 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + import com.google.api.client.http.HttpRequestInitializer; import com.google.api.client.http.javanet.NetHttpTransport; import com.google.api.client.json.gson.GsonFactory; diff --git a/classroom/snippets/src/test/java/CoursesTest.java b/classroom/snippets/src/test/java/CoursesTest.java index dc7342bd..858d4540 100644 --- a/classroom/snippets/src/test/java/CoursesTest.java +++ b/classroom/snippets/src/test/java/CoursesTest.java @@ -1,3 +1,19 @@ +/* + * Copyright 2022 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + import com.google.api.services.classroom.Classroom; import com.google.api.services.classroom.model.Course; import com.google.api.services.classroom.model.CourseAlias; diff --git a/drive/snippets/drive_v2/src/main/java/AppDataSnippets.java b/drive/snippets/drive_v2/src/main/java/AppDataSnippets.java index a05d5cc3..cee70b57 100644 --- a/drive/snippets/drive_v2/src/main/java/AppDataSnippets.java +++ b/drive/snippets/drive_v2/src/main/java/AppDataSnippets.java @@ -1,3 +1,19 @@ +/* + * Copyright 2022 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + import com.google.api.client.http.FileContent; import com.google.api.services.drive.Drive; import com.google.api.services.drive.model.File; diff --git a/drive/snippets/drive_v2/src/main/java/ChangeSnippets.java b/drive/snippets/drive_v2/src/main/java/ChangeSnippets.java index 23710324..ae8d4558 100644 --- a/drive/snippets/drive_v2/src/main/java/ChangeSnippets.java +++ b/drive/snippets/drive_v2/src/main/java/ChangeSnippets.java @@ -1,3 +1,19 @@ +/* + * Copyright 2022 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + import com.google.api.services.drive.Drive; import com.google.api.services.drive.model.Change; import com.google.api.services.drive.model.ChangeList; diff --git a/drive/snippets/drive_v2/src/main/java/DriveSnippets.java b/drive/snippets/drive_v2/src/main/java/DriveSnippets.java index 49942b6d..8c70c3da 100644 --- a/drive/snippets/drive_v2/src/main/java/DriveSnippets.java +++ b/drive/snippets/drive_v2/src/main/java/DriveSnippets.java @@ -1,3 +1,19 @@ +/* + * Copyright 2022 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + import com.google.api.services.drive.model.Drive; import com.google.api.services.drive.model.DriveList; import com.google.api.services.drive.model.Permission; diff --git a/drive/snippets/drive_v2/src/main/java/FileSnippets.java b/drive/snippets/drive_v2/src/main/java/FileSnippets.java index f79a8159..f1a86c7c 100644 --- a/drive/snippets/drive_v2/src/main/java/FileSnippets.java +++ b/drive/snippets/drive_v2/src/main/java/FileSnippets.java @@ -1,3 +1,19 @@ +/* + * Copyright 2022 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + import com.google.api.client.googleapis.batch.BatchRequest; import com.google.api.client.googleapis.batch.json.JsonBatchCallback; import com.google.api.client.googleapis.json.GoogleJsonError; diff --git a/drive/snippets/drive_v2/src/main/java/TeamDriveSnippets.java b/drive/snippets/drive_v2/src/main/java/TeamDriveSnippets.java index 0a6572b6..1f740c8a 100644 --- a/drive/snippets/drive_v2/src/main/java/TeamDriveSnippets.java +++ b/drive/snippets/drive_v2/src/main/java/TeamDriveSnippets.java @@ -1,3 +1,19 @@ +/* + * Copyright 2022 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + import com.google.api.client.http.FileContent; import com.google.api.services.drive.Drive; import com.google.api.services.drive.model.File; diff --git a/drive/snippets/drive_v2/src/test/java/AppDataSnippetsTest.java b/drive/snippets/drive_v2/src/test/java/AppDataSnippetsTest.java index 747103f5..b4237983 100644 --- a/drive/snippets/drive_v2/src/test/java/AppDataSnippetsTest.java +++ b/drive/snippets/drive_v2/src/test/java/AppDataSnippetsTest.java @@ -1,3 +1,19 @@ +/* + * Copyright 2022 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + import com.google.api.services.drive.model.File; import com.google.api.services.drive.model.FileList; import org.junit.Before; diff --git a/drive/snippets/drive_v2/src/test/java/BaseTest.java b/drive/snippets/drive_v2/src/test/java/BaseTest.java index d3851aed..1bbf6e2e 100644 --- a/drive/snippets/drive_v2/src/test/java/BaseTest.java +++ b/drive/snippets/drive_v2/src/test/java/BaseTest.java @@ -1,3 +1,19 @@ +/* + * Copyright 2022 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + import com.google.api.client.http.HttpRequestInitializer; import com.google.auth.http.HttpCredentialsAdapter; import com.google.auth.oauth2.GoogleCredentials; diff --git a/drive/snippets/drive_v2/src/test/java/ChangeSnippetsTest.java b/drive/snippets/drive_v2/src/test/java/ChangeSnippetsTest.java index 3a33e4e8..4323cc7d 100644 --- a/drive/snippets/drive_v2/src/test/java/ChangeSnippetsTest.java +++ b/drive/snippets/drive_v2/src/test/java/ChangeSnippetsTest.java @@ -1,3 +1,19 @@ +/* + * Copyright 2022 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + import org.junit.Before; import org.junit.Test; diff --git a/drive/snippets/drive_v2/src/test/java/DriveSnippetsTest.java b/drive/snippets/drive_v2/src/test/java/DriveSnippetsTest.java index cbe27af2..42bbaf53 100644 --- a/drive/snippets/drive_v2/src/test/java/DriveSnippetsTest.java +++ b/drive/snippets/drive_v2/src/test/java/DriveSnippetsTest.java @@ -1,3 +1,19 @@ +/* + * Copyright 2022 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + import com.google.api.services.drive.model.Drive; import com.google.api.services.drive.model.Permission; import com.google.api.services.drive.model.PermissionList; diff --git a/drive/snippets/drive_v2/src/test/java/FileSnippetsTest.java b/drive/snippets/drive_v2/src/test/java/FileSnippetsTest.java index dab8987b..1efd149b 100644 --- a/drive/snippets/drive_v2/src/test/java/FileSnippetsTest.java +++ b/drive/snippets/drive_v2/src/test/java/FileSnippetsTest.java @@ -1,3 +1,19 @@ +/* + * Copyright 2022 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + import com.google.api.services.drive.model.File; import com.google.api.services.drive.model.FileList; import org.junit.Before; diff --git a/drive/snippets/drive_v2/src/test/java/TeamDriveSnippetsTest.java b/drive/snippets/drive_v2/src/test/java/TeamDriveSnippetsTest.java index 59bdf809..bfed9e79 100644 --- a/drive/snippets/drive_v2/src/test/java/TeamDriveSnippetsTest.java +++ b/drive/snippets/drive_v2/src/test/java/TeamDriveSnippetsTest.java @@ -1,3 +1,19 @@ +/* + * Copyright 2022 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + import com.google.api.services.drive.model.TeamDrive; import com.google.api.services.drive.model.Permission; import com.google.api.services.drive.model.PermissionList; diff --git a/drive/snippets/drive_v2/src/test/java/TestCreateDrive.java b/drive/snippets/drive_v2/src/test/java/TestCreateDrive.java index dee4bc33..4db53c7b 100644 --- a/drive/snippets/drive_v2/src/test/java/TestCreateDrive.java +++ b/drive/snippets/drive_v2/src/test/java/TestCreateDrive.java @@ -1,3 +1,19 @@ +/* + * Copyright 2022 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + import org.junit.Test; import java.io.IOException; diff --git a/drive/snippets/drive_v2/src/test/java/TestCreateFolder.java b/drive/snippets/drive_v2/src/test/java/TestCreateFolder.java index 4d744772..0c7a25af 100644 --- a/drive/snippets/drive_v2/src/test/java/TestCreateFolder.java +++ b/drive/snippets/drive_v2/src/test/java/TestCreateFolder.java @@ -1,3 +1,19 @@ +/* + * Copyright 2022 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + import org.junit.Test; import java.io.IOException; diff --git a/drive/snippets/drive_v2/src/test/java/TestCreateShortcut.java b/drive/snippets/drive_v2/src/test/java/TestCreateShortcut.java index a9aec655..1853773d 100644 --- a/drive/snippets/drive_v2/src/test/java/TestCreateShortcut.java +++ b/drive/snippets/drive_v2/src/test/java/TestCreateShortcut.java @@ -1,3 +1,19 @@ +/* + * Copyright 2022 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + import org.junit.Test; import java.io.IOException; diff --git a/drive/snippets/drive_v2/src/test/java/TestCreateTeamDrive.java b/drive/snippets/drive_v2/src/test/java/TestCreateTeamDrive.java index bca94def..72695b33 100644 --- a/drive/snippets/drive_v2/src/test/java/TestCreateTeamDrive.java +++ b/drive/snippets/drive_v2/src/test/java/TestCreateTeamDrive.java @@ -1,3 +1,19 @@ +/* + * Copyright 2022 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + import org.junit.Test; import java.io.IOException; diff --git a/drive/snippets/drive_v2/src/test/java/TestDownloadFile.java b/drive/snippets/drive_v2/src/test/java/TestDownloadFile.java index 2c4806f6..ce285417 100644 --- a/drive/snippets/drive_v2/src/test/java/TestDownloadFile.java +++ b/drive/snippets/drive_v2/src/test/java/TestDownloadFile.java @@ -1,3 +1,19 @@ +/* + * Copyright 2022 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + import org.junit.Test; import java.io.ByteArrayOutputStream; diff --git a/drive/snippets/drive_v2/src/test/java/TestExportPdf.java b/drive/snippets/drive_v2/src/test/java/TestExportPdf.java index f8741feb..fc6deabb 100644 --- a/drive/snippets/drive_v2/src/test/java/TestExportPdf.java +++ b/drive/snippets/drive_v2/src/test/java/TestExportPdf.java @@ -1,3 +1,19 @@ +/* + * Copyright 2022 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + import org.junit.Test; import java.io.ByteArrayOutputStream; diff --git a/drive/snippets/drive_v2/src/test/java/TestFetchChanges.java b/drive/snippets/drive_v2/src/test/java/TestFetchChanges.java index b5a60ee3..751c47ec 100644 --- a/drive/snippets/drive_v2/src/test/java/TestFetchChanges.java +++ b/drive/snippets/drive_v2/src/test/java/TestFetchChanges.java @@ -1,3 +1,19 @@ +/* + * Copyright 2022 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + import org.junit.Test; import java.io.IOException; diff --git a/drive/snippets/drive_v2/src/test/java/TestFetchStartPageToken.java b/drive/snippets/drive_v2/src/test/java/TestFetchStartPageToken.java index 701ee971..270d09a1 100644 --- a/drive/snippets/drive_v2/src/test/java/TestFetchStartPageToken.java +++ b/drive/snippets/drive_v2/src/test/java/TestFetchStartPageToken.java @@ -1,3 +1,19 @@ +/* + * Copyright 2022 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + import org.junit.Test; import java.io.IOException; diff --git a/drive/snippets/drive_v2/src/test/java/TestMoveFileToFolder.java b/drive/snippets/drive_v2/src/test/java/TestMoveFileToFolder.java index b563346d..7ad8f1bf 100644 --- a/drive/snippets/drive_v2/src/test/java/TestMoveFileToFolder.java +++ b/drive/snippets/drive_v2/src/test/java/TestMoveFileToFolder.java @@ -1,3 +1,19 @@ +/* + * Copyright 2022 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + import org.junit.Test; import java.io.IOException; diff --git a/drive/snippets/drive_v2/src/test/java/TestRecoverDrives.java b/drive/snippets/drive_v2/src/test/java/TestRecoverDrives.java index d8b246a2..c214234e 100644 --- a/drive/snippets/drive_v2/src/test/java/TestRecoverDrives.java +++ b/drive/snippets/drive_v2/src/test/java/TestRecoverDrives.java @@ -1,3 +1,19 @@ +/* + * Copyright 2022 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + import com.google.api.services.drive.model.Drive; import com.google.api.services.drive.model.Permission; import com.google.api.services.drive.model.PermissionList; diff --git a/drive/snippets/drive_v2/src/test/java/TestRecoverTeamDrives.java b/drive/snippets/drive_v2/src/test/java/TestRecoverTeamDrives.java index 41399754..9b1a7892 100644 --- a/drive/snippets/drive_v2/src/test/java/TestRecoverTeamDrives.java +++ b/drive/snippets/drive_v2/src/test/java/TestRecoverTeamDrives.java @@ -1,3 +1,19 @@ +/* + * Copyright 2022 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + import com.google.api.services.drive.model.Permission; import com.google.api.services.drive.model.PermissionList; import com.google.api.services.drive.model.TeamDrive; diff --git a/drive/snippets/drive_v2/src/test/java/TestSearchFiles.java b/drive/snippets/drive_v2/src/test/java/TestSearchFiles.java index 48a8b818..6772cb40 100644 --- a/drive/snippets/drive_v2/src/test/java/TestSearchFiles.java +++ b/drive/snippets/drive_v2/src/test/java/TestSearchFiles.java @@ -1,3 +1,19 @@ +/* + * Copyright 2022 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + import com.google.api.services.drive.model.File; import org.junit.Test; diff --git a/drive/snippets/drive_v2/src/test/java/TestShareFile.java b/drive/snippets/drive_v2/src/test/java/TestShareFile.java index 746ef71a..c47ec72c 100644 --- a/drive/snippets/drive_v2/src/test/java/TestShareFile.java +++ b/drive/snippets/drive_v2/src/test/java/TestShareFile.java @@ -1,3 +1,19 @@ +/* + * Copyright 2022 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + import org.junit.Test; import java.io.IOException; diff --git a/drive/snippets/drive_v2/src/test/java/TestTouchFile.java b/drive/snippets/drive_v2/src/test/java/TestTouchFile.java index 3280bcbb..aecfabf4 100644 --- a/drive/snippets/drive_v2/src/test/java/TestTouchFile.java +++ b/drive/snippets/drive_v2/src/test/java/TestTouchFile.java @@ -1,3 +1,19 @@ +/* + * Copyright 2022 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + import org.junit.Test; import java.io.IOException; diff --git a/drive/snippets/drive_v2/src/test/java/TestUploadBasic.java b/drive/snippets/drive_v2/src/test/java/TestUploadBasic.java index 35cdf8a4..79617d8d 100644 --- a/drive/snippets/drive_v2/src/test/java/TestUploadBasic.java +++ b/drive/snippets/drive_v2/src/test/java/TestUploadBasic.java @@ -1,3 +1,19 @@ +/* + * Copyright 2022 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + import org.junit.Test; import java.io.IOException; diff --git a/drive/snippets/drive_v2/src/test/java/TestUploadRevision.java b/drive/snippets/drive_v2/src/test/java/TestUploadRevision.java index 77682baa..de932e4f 100644 --- a/drive/snippets/drive_v2/src/test/java/TestUploadRevision.java +++ b/drive/snippets/drive_v2/src/test/java/TestUploadRevision.java @@ -1,3 +1,19 @@ +/* + * Copyright 2022 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + import org.junit.Test; import java.io.IOException; diff --git a/drive/snippets/drive_v2/src/test/java/TestUploadToFolder.java b/drive/snippets/drive_v2/src/test/java/TestUploadToFolder.java index 6dceb63b..815982d9 100644 --- a/drive/snippets/drive_v2/src/test/java/TestUploadToFolder.java +++ b/drive/snippets/drive_v2/src/test/java/TestUploadToFolder.java @@ -1,3 +1,19 @@ +/* + * Copyright 2022 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + import com.google.api.services.drive.model.File; import org.junit.Test; diff --git a/drive/snippets/drive_v2/src/test/java/TestUploadWithConversion.java b/drive/snippets/drive_v2/src/test/java/TestUploadWithConversion.java index a3d69c52..ae3a889c 100644 --- a/drive/snippets/drive_v2/src/test/java/TestUploadWithConversion.java +++ b/drive/snippets/drive_v2/src/test/java/TestUploadWithConversion.java @@ -1,3 +1,19 @@ +/* + * Copyright 2022 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + import org.junit.Test; import java.io.IOException; diff --git a/drive/snippets/drive_v3/src/main/java/AppDataSnippets.java b/drive/snippets/drive_v3/src/main/java/AppDataSnippets.java index 05300c26..975aafb6 100644 --- a/drive/snippets/drive_v3/src/main/java/AppDataSnippets.java +++ b/drive/snippets/drive_v3/src/main/java/AppDataSnippets.java @@ -1,3 +1,19 @@ +/* + * Copyright 2022 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + import com.google.api.client.http.FileContent; import com.google.api.services.drive.Drive; import com.google.api.services.drive.model.File; diff --git a/drive/snippets/drive_v3/src/main/java/ChangeSnippets.java b/drive/snippets/drive_v3/src/main/java/ChangeSnippets.java index 147668fa..5710478b 100644 --- a/drive/snippets/drive_v3/src/main/java/ChangeSnippets.java +++ b/drive/snippets/drive_v3/src/main/java/ChangeSnippets.java @@ -1,3 +1,19 @@ +/* + * Copyright 2022 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + import com.google.api.services.drive.Drive; import com.google.api.services.drive.model.Change; import com.google.api.services.drive.model.ChangeList; diff --git a/drive/snippets/drive_v3/src/main/java/DriveSnippets.java b/drive/snippets/drive_v3/src/main/java/DriveSnippets.java index 0262a6f4..3bedd15e 100644 --- a/drive/snippets/drive_v3/src/main/java/DriveSnippets.java +++ b/drive/snippets/drive_v3/src/main/java/DriveSnippets.java @@ -1,3 +1,19 @@ +/* + * Copyright 2022 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + import com.google.api.client.http.FileContent; //import com.google.api.services.drive.Drive; import com.google.api.services.drive.model.Drive; diff --git a/drive/snippets/drive_v3/src/main/java/FileSnippets.java b/drive/snippets/drive_v3/src/main/java/FileSnippets.java index 784a2bbe..84117f41 100644 --- a/drive/snippets/drive_v3/src/main/java/FileSnippets.java +++ b/drive/snippets/drive_v3/src/main/java/FileSnippets.java @@ -1,3 +1,19 @@ +/* + * Copyright 2022 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + import com.google.api.client.googleapis.batch.BatchRequest; import com.google.api.client.googleapis.batch.json.JsonBatchCallback; import com.google.api.client.googleapis.json.GoogleJsonError; diff --git a/drive/snippets/drive_v3/src/main/java/TeamDriveSnippets.java b/drive/snippets/drive_v3/src/main/java/TeamDriveSnippets.java index 10ca713f..eb2e0711 100644 --- a/drive/snippets/drive_v3/src/main/java/TeamDriveSnippets.java +++ b/drive/snippets/drive_v3/src/main/java/TeamDriveSnippets.java @@ -1,3 +1,19 @@ +/* + * Copyright 2022 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + import com.google.api.client.http.FileContent; import com.google.api.services.drive.Drive; import com.google.api.services.drive.model.TeamDrive; diff --git a/drive/snippets/drive_v3/src/test/java/AppDataSnippetsTest.java b/drive/snippets/drive_v3/src/test/java/AppDataSnippetsTest.java index 39d5111b..cab4ed28 100644 --- a/drive/snippets/drive_v3/src/test/java/AppDataSnippetsTest.java +++ b/drive/snippets/drive_v3/src/test/java/AppDataSnippetsTest.java @@ -1,3 +1,19 @@ +/* + * Copyright 2022 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + import com.google.api.services.drive.model.File; import com.google.api.services.drive.model.FileList; import org.junit.Before; diff --git a/drive/snippets/drive_v3/src/test/java/BaseTest.java b/drive/snippets/drive_v3/src/test/java/BaseTest.java index f46d3225..75e636f3 100644 --- a/drive/snippets/drive_v3/src/test/java/BaseTest.java +++ b/drive/snippets/drive_v3/src/test/java/BaseTest.java @@ -1,3 +1,19 @@ +/* + * Copyright 2022 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + import com.google.api.client.http.FileContent; import com.google.api.client.http.HttpRequestInitializer; import com.google.api.client.http.HttpTransport; diff --git a/drive/snippets/drive_v3/src/test/java/ChangeSnippetsTest.java b/drive/snippets/drive_v3/src/test/java/ChangeSnippetsTest.java index 3a33e4e8..4323cc7d 100644 --- a/drive/snippets/drive_v3/src/test/java/ChangeSnippetsTest.java +++ b/drive/snippets/drive_v3/src/test/java/ChangeSnippetsTest.java @@ -1,3 +1,19 @@ +/* + * Copyright 2022 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + import org.junit.Before; import org.junit.Test; diff --git a/drive/snippets/drive_v3/src/test/java/DriveSnippetsTest.java b/drive/snippets/drive_v3/src/test/java/DriveSnippetsTest.java index f520db8b..71ec6b25 100644 --- a/drive/snippets/drive_v3/src/test/java/DriveSnippetsTest.java +++ b/drive/snippets/drive_v3/src/test/java/DriveSnippetsTest.java @@ -1,3 +1,19 @@ +/* + * Copyright 2022 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + import com.google.api.services.drive.model.Drive; import com.google.api.services.drive.model.Permission; import com.google.api.services.drive.model.PermissionList; diff --git a/drive/snippets/drive_v3/src/test/java/FileSnippetsTest.java b/drive/snippets/drive_v3/src/test/java/FileSnippetsTest.java index 94eafc4c..a9641861 100644 --- a/drive/snippets/drive_v3/src/test/java/FileSnippetsTest.java +++ b/drive/snippets/drive_v3/src/test/java/FileSnippetsTest.java @@ -1,3 +1,19 @@ +/* + * Copyright 2022 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + import com.google.api.services.drive.model.File; import com.google.api.services.drive.model.FileList; import org.junit.Before; diff --git a/drive/snippets/drive_v3/src/test/java/TeamDriveSnippetsTest.java b/drive/snippets/drive_v3/src/test/java/TeamDriveSnippetsTest.java index 3e46bd38..43447b4d 100644 --- a/drive/snippets/drive_v3/src/test/java/TeamDriveSnippetsTest.java +++ b/drive/snippets/drive_v3/src/test/java/TeamDriveSnippetsTest.java @@ -1,3 +1,19 @@ +/* + * Copyright 2022 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + import com.google.api.services.drive.model.TeamDrive; import com.google.api.services.drive.model.Permission; import com.google.api.services.drive.model.PermissionList; diff --git a/drive/snippets/drive_v3/src/test/java/TestCreateFolder.java b/drive/snippets/drive_v3/src/test/java/TestCreateFolder.java index 8d2a10bf..9c12f12f 100644 --- a/drive/snippets/drive_v3/src/test/java/TestCreateFolder.java +++ b/drive/snippets/drive_v3/src/test/java/TestCreateFolder.java @@ -1,3 +1,19 @@ +/* + * Copyright 2022 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + import org.junit.Test; import java.io.IOException; diff --git a/drive/snippets/drive_v3/src/test/java/TestCreateShortcut.java b/drive/snippets/drive_v3/src/test/java/TestCreateShortcut.java index a9aec655..1853773d 100644 --- a/drive/snippets/drive_v3/src/test/java/TestCreateShortcut.java +++ b/drive/snippets/drive_v3/src/test/java/TestCreateShortcut.java @@ -1,3 +1,19 @@ +/* + * Copyright 2022 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + import org.junit.Test; import java.io.IOException; diff --git a/drive/snippets/drive_v3/src/test/java/TestDownloadFile.java b/drive/snippets/drive_v3/src/test/java/TestDownloadFile.java index 2c4806f6..ce285417 100644 --- a/drive/snippets/drive_v3/src/test/java/TestDownloadFile.java +++ b/drive/snippets/drive_v3/src/test/java/TestDownloadFile.java @@ -1,3 +1,19 @@ +/* + * Copyright 2022 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + import org.junit.Test; import java.io.ByteArrayOutputStream; diff --git a/drive/snippets/drive_v3/src/test/java/TestExportPdf.java b/drive/snippets/drive_v3/src/test/java/TestExportPdf.java index f8741feb..fc6deabb 100644 --- a/drive/snippets/drive_v3/src/test/java/TestExportPdf.java +++ b/drive/snippets/drive_v3/src/test/java/TestExportPdf.java @@ -1,3 +1,19 @@ +/* + * Copyright 2022 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + import org.junit.Test; import java.io.ByteArrayOutputStream; diff --git a/drive/snippets/drive_v3/src/test/java/TestFetchAppDataFolder.java b/drive/snippets/drive_v3/src/test/java/TestFetchAppDataFolder.java index 4049e5f6..95c69b6c 100644 --- a/drive/snippets/drive_v3/src/test/java/TestFetchAppDataFolder.java +++ b/drive/snippets/drive_v3/src/test/java/TestFetchAppDataFolder.java @@ -1,3 +1,19 @@ +/* + * Copyright 2022 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + import org.junit.Test; import java.io.IOException; diff --git a/drive/snippets/drive_v3/src/test/java/TestListAppData.java b/drive/snippets/drive_v3/src/test/java/TestListAppData.java index 52544bfd..fe67a1f2 100644 --- a/drive/snippets/drive_v3/src/test/java/TestListAppData.java +++ b/drive/snippets/drive_v3/src/test/java/TestListAppData.java @@ -1,3 +1,19 @@ +/* + * Copyright 2022 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + import com.google.api.services.drive.model.FileList; import org.junit.Test; diff --git a/drive/snippets/drive_v3/src/test/java/TestMoveFileToFolder.java b/drive/snippets/drive_v3/src/test/java/TestMoveFileToFolder.java index 857c20d7..7e4b2b8d 100644 --- a/drive/snippets/drive_v3/src/test/java/TestMoveFileToFolder.java +++ b/drive/snippets/drive_v3/src/test/java/TestMoveFileToFolder.java @@ -1,3 +1,19 @@ +/* + * Copyright 2022 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + import org.junit.Test; import javax.annotation.CheckReturnValue; diff --git a/drive/snippets/drive_v3/src/test/java/TestSearchFiles.java b/drive/snippets/drive_v3/src/test/java/TestSearchFiles.java index 48a8b818..6772cb40 100644 --- a/drive/snippets/drive_v3/src/test/java/TestSearchFiles.java +++ b/drive/snippets/drive_v3/src/test/java/TestSearchFiles.java @@ -1,3 +1,19 @@ +/* + * Copyright 2022 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + import com.google.api.services.drive.model.File; import org.junit.Test; diff --git a/drive/snippets/drive_v3/src/test/java/TestShareFile.java b/drive/snippets/drive_v3/src/test/java/TestShareFile.java index 746ef71a..c47ec72c 100644 --- a/drive/snippets/drive_v3/src/test/java/TestShareFile.java +++ b/drive/snippets/drive_v3/src/test/java/TestShareFile.java @@ -1,3 +1,19 @@ +/* + * Copyright 2022 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + import org.junit.Test; import java.io.IOException; diff --git a/drive/snippets/drive_v3/src/test/java/TestTouchFile.java b/drive/snippets/drive_v3/src/test/java/TestTouchFile.java index 3280bcbb..aecfabf4 100644 --- a/drive/snippets/drive_v3/src/test/java/TestTouchFile.java +++ b/drive/snippets/drive_v3/src/test/java/TestTouchFile.java @@ -1,3 +1,19 @@ +/* + * Copyright 2022 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + import org.junit.Test; import java.io.IOException; diff --git a/drive/snippets/drive_v3/src/test/java/TestUploadAppdata.java b/drive/snippets/drive_v3/src/test/java/TestUploadAppdata.java index 67e2d13c..a8dbd5be 100644 --- a/drive/snippets/drive_v3/src/test/java/TestUploadAppdata.java +++ b/drive/snippets/drive_v3/src/test/java/TestUploadAppdata.java @@ -1,3 +1,19 @@ +/* + * Copyright 2022 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + import org.junit.Test; import java.io.IOException; diff --git a/drive/snippets/drive_v3/src/test/java/TestUploadBasic.java b/drive/snippets/drive_v3/src/test/java/TestUploadBasic.java index c301131c..b33b7866 100644 --- a/drive/snippets/drive_v3/src/test/java/TestUploadBasic.java +++ b/drive/snippets/drive_v3/src/test/java/TestUploadBasic.java @@ -1,3 +1,19 @@ +/* + * Copyright 2022 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + import org.junit.Test; import java.io.IOException; diff --git a/drive/snippets/drive_v3/src/test/java/TestUploadRevision.java b/drive/snippets/drive_v3/src/test/java/TestUploadRevision.java index 77682baa..de932e4f 100644 --- a/drive/snippets/drive_v3/src/test/java/TestUploadRevision.java +++ b/drive/snippets/drive_v3/src/test/java/TestUploadRevision.java @@ -1,3 +1,19 @@ +/* + * Copyright 2022 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + import org.junit.Test; import java.io.IOException; diff --git a/drive/snippets/drive_v3/src/test/java/TestUploadToFolder.java b/drive/snippets/drive_v3/src/test/java/TestUploadToFolder.java index bf4702e9..c328994e 100644 --- a/drive/snippets/drive_v3/src/test/java/TestUploadToFolder.java +++ b/drive/snippets/drive_v3/src/test/java/TestUploadToFolder.java @@ -1,3 +1,19 @@ +/* + * Copyright 2022 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + import com.google.api.services.drive.model.File; import org.junit.Test; diff --git a/drive/snippets/drive_v3/src/test/java/TestUploadWithConversion.java b/drive/snippets/drive_v3/src/test/java/TestUploadWithConversion.java index a3d69c52..ae3a889c 100644 --- a/drive/snippets/drive_v3/src/test/java/TestUploadWithConversion.java +++ b/drive/snippets/drive_v3/src/test/java/TestUploadWithConversion.java @@ -1,3 +1,19 @@ +/* + * Copyright 2022 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + import org.junit.Test; import java.io.IOException; diff --git a/gmail/snippets/src/main/java/SendEmail.java b/gmail/snippets/src/main/java/SendEmail.java index 002f2f53..9b671f32 100644 --- a/gmail/snippets/src/main/java/SendEmail.java +++ b/gmail/snippets/src/main/java/SendEmail.java @@ -1,3 +1,19 @@ +/* + * Copyright 2022 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + import com.google.api.services.gmail.Gmail; import com.google.api.services.gmail.model.Draft; import com.google.api.services.gmail.model.Message; diff --git a/gmail/snippets/src/main/java/SettingsSnippets.java b/gmail/snippets/src/main/java/SettingsSnippets.java index fab67fa6..89bb8fd9 100644 --- a/gmail/snippets/src/main/java/SettingsSnippets.java +++ b/gmail/snippets/src/main/java/SettingsSnippets.java @@ -1,3 +1,19 @@ +/* + * Copyright 2022 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + import com.google.api.client.googleapis.batch.BatchRequest; import com.google.api.client.googleapis.json.GoogleJsonError; import com.google.api.client.http.FileContent; diff --git a/gmail/snippets/src/main/java/SmimeSnippets.java b/gmail/snippets/src/main/java/SmimeSnippets.java index 85f3d0de..7c0fd468 100644 --- a/gmail/snippets/src/main/java/SmimeSnippets.java +++ b/gmail/snippets/src/main/java/SmimeSnippets.java @@ -1,3 +1,19 @@ +/* + * Copyright 2022 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + import com.google.api.services.gmail.Gmail; import com.google.api.services.gmail.model.*; import com.google.api.services.gmail.model.SmimeInfo; diff --git a/gmail/snippets/src/test/java/BaseTest.java b/gmail/snippets/src/test/java/BaseTest.java index 4e287a9f..3fc90c8b 100644 --- a/gmail/snippets/src/test/java/BaseTest.java +++ b/gmail/snippets/src/test/java/BaseTest.java @@ -1,3 +1,19 @@ +/* + * Copyright 2022 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + import com.google.api.client.http.HttpRequestInitializer; import com.google.api.client.http.javanet.NetHttpTransport; import com.google.api.client.json.gson.GsonFactory; diff --git a/sheets/snippets/src/test/java/BaseTest.java b/sheets/snippets/src/test/java/BaseTest.java index 12a1db27..b1f27a1a 100644 --- a/sheets/snippets/src/test/java/BaseTest.java +++ b/sheets/snippets/src/test/java/BaseTest.java @@ -1,3 +1,19 @@ +/* + * Copyright 2022 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + import com.google.api.client.http.javanet.NetHttpTransport; import com.google.api.client.json.gson.GsonFactory; import com.google.api.services.drive.Drive; diff --git a/sheets/snippets/src/test/java/TestPivotTable.java b/sheets/snippets/src/test/java/TestPivotTable.java index 84c1b043..83d26883 100644 --- a/sheets/snippets/src/test/java/TestPivotTable.java +++ b/sheets/snippets/src/test/java/TestPivotTable.java @@ -1,3 +1,19 @@ +/* + * Copyright 2022 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + import com.google.api.services.sheets.v4.model.BatchUpdateSpreadsheetResponse; import org.junit.Test; import java.io.IOException; diff --git a/slides/snippets/src/test/java/BaseTest.java b/slides/snippets/src/test/java/BaseTest.java index f88fec7c..f28c5117 100644 --- a/slides/snippets/src/test/java/BaseTest.java +++ b/slides/snippets/src/test/java/BaseTest.java @@ -1,3 +1,19 @@ +/* + * Copyright 2022 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + import com.google.api.client.http.javanet.NetHttpTransport; import com.google.api.client.json.gson.GsonFactory; import com.google.api.services.drive.Drive; diff --git a/vault/vault-hold-migration-api/src/main/java/com/google/vault/chatmigration/DirectoryService.java b/vault/vault-hold-migration-api/src/main/java/com/google/vault/chatmigration/DirectoryService.java index 55d2bf7c..24514a5e 100644 --- a/vault/vault-hold-migration-api/src/main/java/com/google/vault/chatmigration/DirectoryService.java +++ b/vault/vault-hold-migration-api/src/main/java/com/google/vault/chatmigration/DirectoryService.java @@ -1,3 +1,19 @@ +/* + * Copyright 2022 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + package com.google.vault.chatmigration; import com.github.rholder.retry.RetryException; diff --git a/vault/vault-hold-migration-api/src/main/java/com/google/vault/chatmigration/DuplicateHold.java b/vault/vault-hold-migration-api/src/main/java/com/google/vault/chatmigration/DuplicateHold.java index 7cfc8ed7..cf8ef242 100644 --- a/vault/vault-hold-migration-api/src/main/java/com/google/vault/chatmigration/DuplicateHold.java +++ b/vault/vault-hold-migration-api/src/main/java/com/google/vault/chatmigration/DuplicateHold.java @@ -1,3 +1,19 @@ +/* + * Copyright 2022 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + package com.google.vault.chatmigration; import com.github.rholder.retry.RetryException; diff --git a/vault/vault-hold-migration-api/src/main/java/com/google/vault/chatmigration/HoldsReport.java b/vault/vault-hold-migration-api/src/main/java/com/google/vault/chatmigration/HoldsReport.java index 8ed6af36..b2bb1a07 100644 --- a/vault/vault-hold-migration-api/src/main/java/com/google/vault/chatmigration/HoldsReport.java +++ b/vault/vault-hold-migration-api/src/main/java/com/google/vault/chatmigration/HoldsReport.java @@ -1,3 +1,19 @@ +/* + * Copyright 2022 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + package com.google.vault.chatmigration; import com.google.api.services.admin.directory.model.OrgUnit; diff --git a/vault/vault-hold-migration-api/src/main/java/com/google/vault/chatmigration/MigrationHelper.java b/vault/vault-hold-migration-api/src/main/java/com/google/vault/chatmigration/MigrationHelper.java index 4e4772f6..2da593c3 100644 --- a/vault/vault-hold-migration-api/src/main/java/com/google/vault/chatmigration/MigrationHelper.java +++ b/vault/vault-hold-migration-api/src/main/java/com/google/vault/chatmigration/MigrationHelper.java @@ -1,3 +1,19 @@ +/* + * Copyright 2022 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + package com.google.vault.chatmigration; import com.google.api.client.auth.oauth2.Credential; diff --git a/vault/vault-hold-migration-api/src/main/java/com/google/vault/chatmigration/QuickStart.java b/vault/vault-hold-migration-api/src/main/java/com/google/vault/chatmigration/QuickStart.java index b4fd4cea..70e5943e 100644 --- a/vault/vault-hold-migration-api/src/main/java/com/google/vault/chatmigration/QuickStart.java +++ b/vault/vault-hold-migration-api/src/main/java/com/google/vault/chatmigration/QuickStart.java @@ -1,3 +1,19 @@ +/* + * Copyright 2022 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + package com.google.vault.chatmigration; import com.google.api.services.admin.directory.Directory; diff --git a/vault/vault-hold-migration-api/src/main/java/com/google/vault/chatmigration/RetryableTemplate.java b/vault/vault-hold-migration-api/src/main/java/com/google/vault/chatmigration/RetryableTemplate.java index 5f1fc347..d9642d58 100644 --- a/vault/vault-hold-migration-api/src/main/java/com/google/vault/chatmigration/RetryableTemplate.java +++ b/vault/vault-hold-migration-api/src/main/java/com/google/vault/chatmigration/RetryableTemplate.java @@ -1,3 +1,19 @@ +/* + * Copyright 2022 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + package com.google.vault.chatmigration; import com.github.rholder.retry.RetryException; From fa9e1d2363a1c8f67bc220d0afc85c1587a98a69 Mon Sep 17 00:00:00 2001 From: googleworkspace-bot <109114539+googleworkspace-bot@users.noreply.github.com> Date: Thu, 21 Jul 2022 12:52:45 -0600 Subject: [PATCH 118/262] chore: Synced local '.github/workflows/automation.yml' with remote 'sync-files/defaults/.github/workflows/automation.yml' (#251) --- .github/workflows/automation.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/automation.yml b/.github/workflows/automation.yml index a5b0e865..aaef124b 100644 --- a/.github/workflows/automation.yml +++ b/.github/workflows/automation.yml @@ -11,7 +11,7 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. - +--- name: Automation on: [pull_request] jobs: @@ -25,4 +25,4 @@ jobs: - name: approve run: gh pr review --approve "$PR_URL" - name: merge - run: gh pr merge --auto --squash --delete-branch "$PR_URL + run: gh pr merge --auto --squash --delete-branch "$PR_URL" From 9e7d6708d7b6b0d02506aa17eee9f1c09495efd0 Mon Sep 17 00:00:00 2001 From: googleworkspace-bot <109114539+googleworkspace-bot@users.noreply.github.com> Date: Fri, 22 Jul 2022 16:32:37 -0600 Subject: [PATCH 119/262] chore: Synced local '.github/workflows/automation.yml' with remote 'sync-files/defaults/.github/workflows/automation.yml' (#252) --- .github/workflows/automation.yml | 45 ++++++++++++++++++++++++++++++-- 1 file changed, 43 insertions(+), 2 deletions(-) diff --git a/.github/workflows/automation.yml b/.github/workflows/automation.yml index aaef124b..5144afe4 100644 --- a/.github/workflows/automation.yml +++ b/.github/workflows/automation.yml @@ -13,11 +13,11 @@ # limitations under the License. --- name: Automation -on: [pull_request] +on: [push, pull_request, workflow_dispatch] jobs: dependabot: runs-on: ubuntu-latest - if: ${{ github.actor == 'dependabot[bot]' }} + if: ${{ github.actor == 'dependabot[bot]' && github.event_name == 'pull_request' }} env: PR_URL: ${{github.event.pull_request.html_url}} GITHUB_TOKEN: ${{secrets.GOOGLEWORKSPACE_BOT_TOKEN}} @@ -26,3 +26,44 @@ jobs: run: gh pr review --approve "$PR_URL" - name: merge run: gh pr merge --auto --squash --delete-branch "$PR_URL" + default-branch-migration: + # this job helps with migrating the default branch to main + # it pushes main to master if master exists and main is the default branch + # it pushes master to main if master is the default branch + runs-on: ubuntu-latest + if: ${{ github.ref == 'refs/heads/main' || github.ref == 'refs/heads/master' }} + steps: + - uses: actions/checkout@v2 + with: + fetch-depth: 0 + # required otherwise GitHub blocks infinite loops in pushes originating in an action + token: ${{ secrets.GOOGLEWORKSPACE_BOT_TOKEN }} + - name: Set env + run: | + # set DEFAULT BRANCH + echo "DEFAULT_BRANCH=$(gh repo view --json defaultBranchRef --jq '.defaultBranchRef.name')" >> $GITHUB_ENV; + + # set HAS_MASTER_BRANCH + if [ ! -z "$(git ls-remote --heads origin master)" ]; then + echo "HAS_MASTER_BRANCH=true" >> $GITHUB_ENV + else + echo "HAS_MASTER_BRANCH=false" >> $GITHUB_ENV + fi + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + - name: configure git + run: | + git config --global user.name 'googleworkspace-bot' + git config --global user.email 'googleworkspace-bot@google.com' + - if: ${{ env.DEFAULT_BRANCH == 'main' && env.HAS_MASTER_BRANCH == 'true' }} + name: Update master branch from main + run: | + git checkout -b master + git reset --hard origin/main + git push origin master + - if: ${{ env.DEFAULT_BRANCH == 'master'}} + name: Update main branch from master + run: | + git checkout -b main + git reset --hard origin/master + git push origin main From e39e8b5eedfdcffafa27090375a82d9180e46fe9 Mon Sep 17 00:00:00 2001 From: Justin Poehnelt Date: Fri, 22 Jul 2022 17:06:47 -0600 Subject: [PATCH 120/262] chore: switch to main (#253) --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 189f8f47..2ab1be1a 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# Google Workspace APIs Java Samples [![Build Status](https://travis-ci.org/googleworkspace/java-samples.svg?branch=master)](https://travis-ci.org/googleworkspace/java-samples) +# Google Workspace APIs Java Samples [![Build Status](https://travis-ci.org/googleworkspace/java-samples.svg?branch=main)](https://travis-ci.org/googleworkspace/java-samples) A collection of samples that demonstrate how to call Google Workspace APIs in Java. From f0b358e76dcd6a5d058d5d1df00029a77643760d Mon Sep 17 00:00:00 2001 From: Justin Poehnelt Date: Thu, 28 Jul 2022 10:54:51 -0600 Subject: [PATCH 121/262] build: remove travis (#254) --- .travis.yml | 31 ------------------------------- README.md | 2 -- 2 files changed, 33 deletions(-) delete mode 100644 .travis.yml diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index 16a64d16..00000000 --- a/.travis.yml +++ /dev/null @@ -1,31 +0,0 @@ -# Copyright 2022 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -language: java -jdk: - - oraclejdk11 -# Use a Build Matrix for subdirs (https://lord.io/blog/2014/travis-multiple-subdirs/) -env: - - DIR=adminSDK/alertcenter/quickstart - - DIR=adminSDK/directory/quickstart - - DIR=adminSDK/reports/quickstart - - DIR=adminSDK/reseller/quickstart - - DIR=appsScript/quickstart - - DIR=classroom/quickstart - - DIR=drive/quickstart - - DIR=gmail/quickstart - - DIR=sheets/quickstart - - DIR=slides/quickstart - - DIR=tasks/quickstart -script: cd $DIR && gradle build # gradle -q run diff --git a/README.md b/README.md index 2ab1be1a..46bec9a3 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,3 @@ -# Google Workspace APIs Java Samples [![Build Status](https://travis-ci.org/googleworkspace/java-samples.svg?branch=main)](https://travis-ci.org/googleworkspace/java-samples) - A collection of samples that demonstrate how to call Google Workspace APIs in Java. ## APIs From d2da6ab1106e623eb0802e58f97b526963626b58 Mon Sep 17 00:00:00 2001 From: googleworkspace-bot <109114539+googleworkspace-bot@users.noreply.github.com> Date: Fri, 29 Jul 2022 11:17:43 -0600 Subject: [PATCH 122/262] chore: Synced file(s) with googleworkspace/.github (#255) * chore: Synced local '.github/sync-repo-settings.yaml' with remote 'sync-files/defaults/.github/sync-repo-settings.yaml' * chore: Synced local '.github/workflows/automation.yml' with remote 'sync-files/defaults/.github/workflows/automation.yml' --- .github/sync-repo-settings.yaml | 15 --------------- .github/workflows/automation.yml | 4 ++-- 2 files changed, 2 insertions(+), 17 deletions(-) diff --git a/.github/sync-repo-settings.yaml b/.github/sync-repo-settings.yaml index 757d7bb5..1e81cab7 100644 --- a/.github/sync-repo-settings.yaml +++ b/.github/sync-repo-settings.yaml @@ -34,21 +34,6 @@ branchProtectionRules: - "conventionalcommits.org" requiredApprovingReviewCount: 1 requiresCodeOwnerReviews: true - - pattern: master - isAdminEnforced: false - requiresStrictStatusChecks: false - requiredStatusCheckContexts: - # .github/workflows/test.yml with a job called "test" - - "test" - # .github/workflows/lint.yml with a job called "lint" - - "lint" - # Google bots below - - "cla/google" - - "snippet-bot check" - - "header-check" - - "conventionalcommits.org" - requiredApprovingReviewCount: 1 - requiresCodeOwnerReviews: true permissionRules: - team: workspace-devrel-dpe permission: admin diff --git a/.github/workflows/automation.yml b/.github/workflows/automation.yml index 5144afe4..b01e9cf9 100644 --- a/.github/workflows/automation.yml +++ b/.github/workflows/automation.yml @@ -58,12 +58,12 @@ jobs: - if: ${{ env.DEFAULT_BRANCH == 'main' && env.HAS_MASTER_BRANCH == 'true' }} name: Update master branch from main run: | - git checkout -b master + git checkout -B master git reset --hard origin/main git push origin master - if: ${{ env.DEFAULT_BRANCH == 'master'}} name: Update main branch from master run: | - git checkout -b main + git checkout -B main git reset --hard origin/master git push origin main From 41559c4daa0b838348c9cbc4426ee6d4c4a98ffe Mon Sep 17 00:00:00 2001 From: Steve Bazyl Date: Thu, 4 Aug 2022 16:41:56 -0600 Subject: [PATCH 123/262] chore: Remove no longer used files. (#256) --- .../drive_v2/src/main/java/FileSnippets.java | 313 ------------------ .../src/main/java/TeamDriveSnippets.java | 98 ------ .../drive_v3/src/main/java/FileSnippets.java | 306 ----------------- .../src/main/java/TeamDriveSnippets.java | 100 ------ .../src/main/java/SettingsSnippets.java | 122 ------- .../snippets/src/main/java/SmimeSnippets.java | 275 --------------- 6 files changed, 1214 deletions(-) delete mode 100644 drive/snippets/drive_v2/src/main/java/FileSnippets.java delete mode 100644 drive/snippets/drive_v2/src/main/java/TeamDriveSnippets.java delete mode 100644 drive/snippets/drive_v3/src/main/java/FileSnippets.java delete mode 100644 drive/snippets/drive_v3/src/main/java/TeamDriveSnippets.java delete mode 100644 gmail/snippets/src/main/java/SettingsSnippets.java delete mode 100644 gmail/snippets/src/main/java/SmimeSnippets.java diff --git a/drive/snippets/drive_v2/src/main/java/FileSnippets.java b/drive/snippets/drive_v2/src/main/java/FileSnippets.java deleted file mode 100644 index f1a86c7c..00000000 --- a/drive/snippets/drive_v2/src/main/java/FileSnippets.java +++ /dev/null @@ -1,313 +0,0 @@ -/* - * Copyright 2022 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import com.google.api.client.googleapis.batch.BatchRequest; -import com.google.api.client.googleapis.batch.json.JsonBatchCallback; -import com.google.api.client.googleapis.json.GoogleJsonError; -import com.google.api.client.http.FileContent; -import com.google.api.client.http.HttpHeaders; -import com.google.api.client.util.DateTime; -import com.google.api.services.drive.Drive; -import com.google.api.services.drive.model.File; -import com.google.api.services.drive.model.FileList; -import com.google.api.services.drive.model.Permission; -import com.google.api.services.drive.model.ParentReference; - -import java.io.ByteArrayOutputStream; -import java.io.IOException; -import java.io.OutputStream; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; - - -public class FileSnippets { - - private Drive service; - - public FileSnippets(Drive service) { - this.service = service; - } - - public String uploadBasic() throws IOException { - Drive driveService = this.service; - // [START uploadBasic] - File fileMetadata = new File(); - fileMetadata.setTitle("photo.jpg"); - java.io.File filePath = new java.io.File("files/photo.jpg"); - FileContent mediaContent = new FileContent("image/jpeg", filePath); - File file = driveService.files().insert(fileMetadata, mediaContent) - .setFields("id") - .execute(); - System.out.println("File ID: " + file.getId()); - // [END uploadBasic] - return file.getId(); - } - - public String uploadRevision(String realFileId) throws IOException { - Drive driveService = this.service; - // [START uploadRevision] - String fileId = "0BwwA4oUTeiV1UVNwOHItT0xfa2M"; - // [START_EXCLUDE silent] - fileId = realFileId; - // [END_EXCLUDE] - java.io.File filePath = new java.io.File("files/photo.jpg"); - FileContent mediaContent = new FileContent("image/jpeg", filePath); - Drive.Files.Update request = driveService.files().update(fileId, new File(), mediaContent) - .setFields("id"); - request.getMediaHttpUploader().setDirectUploadEnabled(true); - File file = request.execute(); - System.out.println("File ID: " + file.getId()); - // [END uploadRevision] - return file.getId(); - } - - - public File uploadToFolder(String realFolderId) throws IOException { - Drive driveService = this.service; - // [START uploadToFolder] - String folderId = "0BwwA4oUTeiV1TGRPeTVjaWRDY1E"; - File fileMetadata = new File(); - // [START_EXCLUDE silent] - folderId = realFolderId; - // [END_EXCLUDE] - fileMetadata.setTitle("photo.jpg"); - fileMetadata.setParents(Collections.singletonList( - new ParentReference().setId(folderId))); - java.io.File filePath = new java.io.File("files/photo.jpg"); - FileContent mediaContent = new FileContent("image/jpeg", filePath); - File file = driveService.files().insert(fileMetadata, mediaContent) - .setFields("id, parents") - .execute(); - System.out.println("File ID: " + file.getId()); - // [END uploadToFolder] - return file; - } - - public String uploadWithConversion() throws IOException { - Drive driveService = this.service; - - // [START uploadWithConversion] - File fileMetadata = new File(); - fileMetadata.setTitle("My Report"); - fileMetadata.setMimeType("application/vnd.google-apps.spreadsheet"); - - java.io.File filePath = new java.io.File("files/report.csv"); - FileContent mediaContent = new FileContent("text/csv", filePath); - File file = driveService.files().insert(fileMetadata, mediaContent) - .setFields("id") - .execute(); - System.out.println("File ID: " + file.getId()); - // [END uploadWithConversion] - return file.getId(); - } - - public ByteArrayOutputStream exportPdf(String realFileId) - throws IOException { - Drive driveService = this.service; - // [START exportPdf] - String fileId = "1ZdR3L3qP4Bkq8noWLJHSr_iBau0DNT4Kli4SxNc2YEo"; - OutputStream outputStream = new ByteArrayOutputStream(); - // [START_EXCLUDE silent] - fileId = realFileId; - // [END_EXCLUDE] - driveService.files().export(fileId, "application/pdf") - .executeMediaAndDownloadTo(outputStream); - // [END exportPdf] - return (ByteArrayOutputStream) outputStream; - } - - public ByteArrayOutputStream downloadFile(String realFileId) - throws IOException { - Drive driveService = this.service; - // [START downloadFile] - String fileId = "0BwwA4oUTeiV1UVNwOHItT0xfa2M"; - OutputStream outputStream = new ByteArrayOutputStream(); - // [START_EXCLUDE silent] - fileId = realFileId; - // [END_EXCLUDE] - driveService.files().get(fileId) - .executeMediaAndDownloadTo(outputStream); - // [END downloadFile] - return (ByteArrayOutputStream) outputStream; - } - - public String createShortcut() throws IOException { - Drive driveService = this.service; - // [START createShortcut] - File fileMetadata = new File(); - fileMetadata.setTitle("Project plan"); - fileMetadata.setMimeType("application/vnd.google-apps.drive-sdk"); - - File file = driveService.files().insert(fileMetadata) - .setFields("id") - .execute(); - System.out.println("File ID: " + file.getId()); - // [END createShortcut] - return file.getId(); - } - - public long touchFile(String realFileId, long realTimestamp) - throws IOException { - Drive driveService = this.service; - - // [START touchFile] - String fileId = "1sTWaJ_j7PkjzaBWtNc3IzovK5hQf21FbOw9yLeeLPNQ"; - File fileMetadata = new File(); - fileMetadata.setModifiedDate(new DateTime(System.currentTimeMillis())); - // [START_EXCLUDE silent] - fileId = realFileId; - fileMetadata.setModifiedDate(new DateTime(realTimestamp)); - // [END_EXCLUDE] - File file = driveService.files().update(fileId, fileMetadata) - .setSetModifiedDate(true) - .setFields("id, modifiedDate") - .execute(); - System.out.println("Modified time: " + file.getModifiedDate()); - // [END touchFile] - return file.getModifiedDate().getValue(); - } - - public String createFolder() throws IOException { - Drive driveService = this.service; - // [START createFolder] - File fileMetadata = new File(); - fileMetadata.setTitle("Invoices"); - fileMetadata.setMimeType("application/vnd.google-apps.folder"); - - File file = driveService.files().insert(fileMetadata) - .setFields("id") - .execute(); - System.out.println("Folder ID: " + file.getId()); - // [END createFolder] - return file.getId(); - } - - public List moveFileToFolder(String realFileId, String realFolderId) - throws IOException { - Drive driveService = this.service; - // [START moveFileToFolder] - String fileId = "1sTWaJ_j7PkjzaBWtNc3IzovK5hQf21FbOw9yLeeLPNQ"; - String folderId = "0BwwA4oUTeiV1TGRPeTVjaWRDY1E"; - // [START_EXCLUDE silent] - fileId = realFileId; - folderId = realFolderId; - // [END_EXCLUDE] - // Retrieve the existing parents to remove - File file = driveService.files().get(fileId) - .setFields("parents") - .execute(); - StringBuilder previousParents = new StringBuilder(); - for (ParentReference parent : file.getParents()) { - previousParents.append(parent.getId()); - previousParents.append(','); - } - // Move the file to the new folder - file = driveService.files().update(fileId, null) - .setAddParents(folderId) - .setRemoveParents(previousParents.toString()) - .setFields("id, parents") - .execute(); - // [END moveFileToFolder] - List parents = new ArrayList(); - for (ParentReference parent : file.getParents()) { - parents.add(parent.getId()); - } - return parents; - } - - public List searchFiles() throws IOException { - Drive driveService = this.service; - List files = new ArrayList(); - // [START searchFiles] - String pageToken = null; - do { - FileList result = driveService.files().list() - .setQ("mimeType='image/jpeg'") - .setSpaces("drive") - .setFields("nextPageToken, items(id, title)") - .setPageToken(pageToken) - .execute(); - for (File file : result.getItems()) { - System.out.printf("Found file: %s (%s)\n", - file.getTitle(), file.getId()); - } - // [START_EXCLUDE silent] - files.addAll(result.getItems()); - // [END_EXCLUDE] - pageToken = result.getNextPageToken(); - } while (pageToken != null); - // [END searchFiles] - return files; - } - - public List shareFile(String realFileId, String realUser, String realDomain) - throws IOException { - Drive driveService = this.service; - final List ids = new ArrayList(); - // [START shareFile] - String fileId = "1sTWaJ_j7PkjzaBWtNc3IzovK5hQf21FbOw9yLeeLPNQ"; - // [START_EXCLUDE silent] - fileId = realFileId; - // [END_EXCLUDE] - JsonBatchCallback callback = new JsonBatchCallback() { - @Override - public void onFailure(GoogleJsonError e, - HttpHeaders responseHeaders) - throws IOException { - // Handle error - System.err.println(e.getMessage()); - } - - @Override - public void onSuccess(Permission permission, - HttpHeaders responseHeaders) - throws IOException { - System.out.println("Permission ID: " + permission.getId()); - // [START_EXCLUDE silent] - ids.add(permission.getId()); - // [END_EXCLUDE] - } - }; - BatchRequest batch = driveService.batch(); - Permission userPermission = new Permission() - .setType("user") - .setRole("writer") - .setValue("user@example.com"); - // [START_EXCLUDE silent] - userPermission.setValue(realUser); - // [END_EXCLUDE] - driveService.permissions().insert(fileId, userPermission) - .setFields("id") - .queue(batch, callback); - - Permission domainPermission = new Permission() - .setType("domain") - .setRole("reader") - .setValue("example.com"); - // [START_EXCLUDE silent] - domainPermission.setValue(realDomain); - // [END_EXCLUDE] - driveService.permissions().insert(fileId, domainPermission) - .setFields("id") - .queue(batch, callback); - - batch.execute(); - // [END shareFile] - return ids; - } - -} diff --git a/drive/snippets/drive_v2/src/main/java/TeamDriveSnippets.java b/drive/snippets/drive_v2/src/main/java/TeamDriveSnippets.java deleted file mode 100644 index 1f740c8a..00000000 --- a/drive/snippets/drive_v2/src/main/java/TeamDriveSnippets.java +++ /dev/null @@ -1,98 +0,0 @@ -/* - * Copyright 2022 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import com.google.api.client.http.FileContent; -import com.google.api.services.drive.Drive; -import com.google.api.services.drive.model.File; -import com.google.api.services.drive.model.TeamDrive; -import com.google.api.services.drive.model.TeamDriveList; -import com.google.api.services.drive.model.Permission; - -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; -import java.util.UUID; - -public class TeamDriveSnippets { - private Drive service; - - public TeamDriveSnippets(Drive service) { - this.service = service; - } - - public String createTeamDrive() throws IOException { - Drive driveService = this.service; - // [START createTeamDrive] - TeamDrive teamDriveMetadata = new TeamDrive(); - teamDriveMetadata.setName("Project Resources"); - String requestId = UUID.randomUUID().toString(); - TeamDrive teamDrive = driveService.teamdrives().insert(requestId, teamDriveMetadata) - .execute(); - System.out.println("Team Drive ID: " + teamDrive.getId()); - // [END createTeamDrive] - return teamDrive.getId(); - } - - public List recoverTeamDrives(String realUser) - throws IOException { - Drive driveService = this.service; - List teamDrives = new ArrayList(); - // [START recoverTeamDrives] - // Find all Team Drives without an organizer and add one. - // Note: This example does not capture all cases. Team Drives - // that have an empty group as the sole organizer, or an - // organizer outside the organization are not captured. A - // more exhaustive approach would evaluate each Team Drive - // and the associated permissions and groups to ensure an active - // organizer is assigned. - String pageToken = null; - Permission newOrganizerPermission = new Permission() - .setType("user") - .setRole("organizer") - .setValue("user@example.com"); - // [START_EXCLUDE silent] - newOrganizerPermission.setValue(realUser); - // [END_EXCLUDE] - - do { - TeamDriveList result = driveService.teamdrives().list() - .setQ("organizerCount = 0") - .setUseDomainAdminAccess(true) - .setFields("nextPageToken, items(id, name)") - .setPageToken(pageToken) - .execute(); - for (TeamDrive teamDrive : result.getItems()) { - System.out.printf("Found Team Drive without organizer: %s (%s)\n", - teamDrive.getName(), teamDrive.getId()); - // Note: For improved efficiency, consider batching - // permission insert requests - Permission permissionResult = driveService.permissions() - .insert(teamDrive.getId(), newOrganizerPermission) - .setUseDomainAdminAccess(true) - .setSupportsTeamDrives(true) - .setFields("id") - .execute(); - System.out.printf("Added organizer permission: %s\n", permissionResult.getId()); - } - // [START_EXCLUDE silent] - teamDrives.addAll(result.getItems()); - // [END_EXCLUDE] - pageToken = result.getNextPageToken(); - } while (pageToken != null); - // [END recoverTeamDrives] - return teamDrives; - } -} diff --git a/drive/snippets/drive_v3/src/main/java/FileSnippets.java b/drive/snippets/drive_v3/src/main/java/FileSnippets.java deleted file mode 100644 index 84117f41..00000000 --- a/drive/snippets/drive_v3/src/main/java/FileSnippets.java +++ /dev/null @@ -1,306 +0,0 @@ -/* - * Copyright 2022 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import com.google.api.client.googleapis.batch.BatchRequest; -import com.google.api.client.googleapis.batch.json.JsonBatchCallback; -import com.google.api.client.googleapis.json.GoogleJsonError; -import com.google.api.client.http.FileContent; -import com.google.api.client.http.HttpHeaders; -import com.google.api.client.util.DateTime; -import com.google.api.services.drive.Drive; -import com.google.api.services.drive.model.File; -import com.google.api.services.drive.model.FileList; -import com.google.api.services.drive.model.Permission; - -import java.io.ByteArrayOutputStream; -import java.io.IOException; -import java.io.OutputStream; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; - - -public class FileSnippets { - - private Drive service; - - public FileSnippets(Drive service) { - this.service = service; - } - - public String uploadBasic() throws IOException { - Drive driveService = this.service; - // [START uploadBasic] - File fileMetadata = new File(); - fileMetadata.setName("photo.jpg"); - java.io.File filePath = new java.io.File("files/photo.jpg"); - FileContent mediaContent = new FileContent("image/jpeg", filePath); - File file = driveService.files().create(fileMetadata, mediaContent) - .setFields("id") - .execute(); - System.out.println("File ID: " + file.getId()); - // [END uploadBasic] - return file.getId(); - } - - public String uploadRevision(String realFileId) throws IOException { - Drive driveService = this.service; - // [START uploadRevision] - String fileId = "0BwwA4oUTeiV1UVNwOHItT0xfa2M"; - // [START_EXCLUDE silent] - fileId = realFileId; - // [END_EXCLUDE] - java.io.File filePath = new java.io.File("files/photo.jpg"); - FileContent mediaContent = new FileContent("image/jpeg", filePath); - Drive.Files.Update request = driveService.files().update(fileId, new File(), mediaContent) - .setFields("id"); - request.getMediaHttpUploader().setDirectUploadEnabled(true); - File file = request.execute(); - System.out.println("File ID: " + file.getId()); - // [END uploadRevision] - return file.getId(); - } - - - public File uploadToFolder(String realFolderId) throws IOException { - Drive driveService = this.service; - // [START uploadToFolder] - String folderId = "0BwwA4oUTeiV1TGRPeTVjaWRDY1E"; - File fileMetadata = new File(); - // [START_EXCLUDE silent] - folderId = realFolderId; - // [END_EXCLUDE] - fileMetadata.setName("photo.jpg"); - fileMetadata.setParents(Collections.singletonList(folderId)); - java.io.File filePath = new java.io.File("files/photo.jpg"); - FileContent mediaContent = new FileContent("image/jpeg", filePath); - File file = driveService.files().create(fileMetadata, mediaContent) - .setFields("id, parents") - .execute(); - System.out.println("File ID: " + file.getId()); - // [END uploadToFolder] - return file; - } - - public String uploadWithConversion() throws IOException { - Drive driveService = this.service; - - // [START uploadWithConversion] - File fileMetadata = new File(); - fileMetadata.setName("My Report"); - fileMetadata.setMimeType("application/vnd.google-apps.spreadsheet"); - - java.io.File filePath = new java.io.File("files/report.csv"); - FileContent mediaContent = new FileContent("text/csv", filePath); - File file = driveService.files().create(fileMetadata, mediaContent) - .setFields("id") - .execute(); - System.out.println("File ID: " + file.getId()); - // [END uploadWithConversion] - return file.getId(); - } - - public ByteArrayOutputStream exportPdf(String realFileId) - throws IOException { - Drive driveService = this.service; - // [START exportPdf] - String fileId = "1ZdR3L3qP4Bkq8noWLJHSr_iBau0DNT4Kli4SxNc2YEo"; - OutputStream outputStream = new ByteArrayOutputStream(); - // [START_EXCLUDE silent] - fileId = realFileId; - // [END_EXCLUDE] - driveService.files().export(fileId, "application/pdf") - .executeMediaAndDownloadTo(outputStream); - // [END exportPdf] - return (ByteArrayOutputStream) outputStream; - } - - public ByteArrayOutputStream downloadFile(String realFileId) - throws IOException { - Drive driveService = this.service; - // [START downloadFile] - String fileId = "0BwwA4oUTeiV1UVNwOHItT0xfa2M"; - OutputStream outputStream = new ByteArrayOutputStream(); - // [START_EXCLUDE silent] - fileId = realFileId; - // [END_EXCLUDE] - driveService.files().get(fileId) - .executeMediaAndDownloadTo(outputStream); - // [END downloadFile] - return (ByteArrayOutputStream) outputStream; - } - - public String createShortcut() throws IOException { - Drive driveService = this.service; - // [START createShortcut] - File fileMetadata = new File(); - fileMetadata.setName("Project plan"); - fileMetadata.setMimeType("application/vnd.google-apps.drive-sdk"); - - File file = driveService.files().create(fileMetadata) - .setFields("id") - .execute(); - System.out.println("File ID: " + file.getId()); - // [END createShortcut] - return file.getId(); - } - - public long touchFile(String realFileId, long realTimestamp) - throws IOException { - Drive driveService = this.service; - - // [START touchFile] - String fileId = "1sTWaJ_j7PkjzaBWtNc3IzovK5hQf21FbOw9yLeeLPNQ"; - File fileMetadata = new File(); - fileMetadata.setModifiedTime(new DateTime(System.currentTimeMillis())); - // [START_EXCLUDE silent] - fileId = realFileId; - fileMetadata.setModifiedTime(new DateTime(realTimestamp)); - // [END_EXCLUDE] - File file = driveService.files().update(fileId, fileMetadata) - .setFields("id, modifiedTime") - .execute(); - System.out.println("Modified time: " + file.getModifiedTime()); - // [END touchFile] - return file.getModifiedTime().getValue(); - } - - public String createFolder() throws IOException { - Drive driveService = this.service; - // [START createFolder] - File fileMetadata = new File(); - fileMetadata.setName("Invoices"); - fileMetadata.setMimeType("application/vnd.google-apps.folder"); - - File file = driveService.files().create(fileMetadata) - .setFields("id") - .execute(); - System.out.println("Folder ID: " + file.getId()); - // [END createFolder] - return file.getId(); - } - - public List moveFileToFolder(String realFileId, String realFolderId) - throws IOException { - Drive driveService = this.service; - // [START moveFileToFolder] - String fileId = "1sTWaJ_j7PkjzaBWtNc3IzovK5hQf21FbOw9yLeeLPNQ"; - String folderId = "0BwwA4oUTeiV1TGRPeTVjaWRDY1E"; - // [START_EXCLUDE silent] - fileId = realFileId; - folderId = realFolderId; - // [END_EXCLUDE] - // Retrieve the existing parents to remove - File file = driveService.files().get(fileId) - .setFields("parents") - .execute(); - StringBuilder previousParents = new StringBuilder(); - for (String parent : file.getParents()) { - previousParents.append(parent); - previousParents.append(','); - } - // Move the file to the new folder - file = driveService.files().update(fileId, null) - .setAddParents(folderId) - .setRemoveParents(previousParents.toString()) - .setFields("id, parents") - .execute(); - // [END moveFileToFolder] - return file.getParents(); - } - - public List searchFiles() throws IOException { - Drive driveService = this.service; - List files = new ArrayList(); - // [START searchFiles] - String pageToken = null; - do { - FileList result = driveService.files().list() - .setQ("mimeType='image/jpeg'") - .setSpaces("drive") - .setFields("nextPageToken, files(id, name)") - .setPageToken(pageToken) - .execute(); - for (File file : result.getFiles()) { - System.out.printf("Found file: %s (%s)\n", - file.getName(), file.getId()); - } - // [START_EXCLUDE silent] - files.addAll(result.getFiles()); - // [END_EXCLUDE] - pageToken = result.getNextPageToken(); - } while (pageToken != null); - // [END searchFiles] - return files; - } - - public List shareFile(String realFileId, String realUser, String realDomain) - throws IOException { - Drive driveService = this.service; - final List ids = new ArrayList(); - // [START shareFile] - String fileId = "1sTWaJ_j7PkjzaBWtNc3IzovK5hQf21FbOw9yLeeLPNQ"; - // [START_EXCLUDE silent] - fileId = realFileId; - // [END_EXCLUDE] - JsonBatchCallback callback = new JsonBatchCallback() { - @Override - public void onFailure(GoogleJsonError e, - HttpHeaders responseHeaders) - throws IOException { - // Handle error - System.err.println(e.getMessage()); - } - - @Override - public void onSuccess(Permission permission, - HttpHeaders responseHeaders) - throws IOException { - System.out.println("Permission ID: " + permission.getId()); - // [START_EXCLUDE silent] - ids.add(permission.getId()); - // [END_EXCLUDE] - } - }; - BatchRequest batch = driveService.batch(); - Permission userPermission = new Permission() - .setType("user") - .setRole("writer") - .setEmailAddress("user@example.com"); - // [START_EXCLUDE silent] - userPermission.setEmailAddress(realUser); - // [END_EXCLUDE] - driveService.permissions().create(fileId, userPermission) - .setFields("id") - .queue(batch, callback); - - Permission domainPermission = new Permission() - .setType("domain") - .setRole("reader") - .setDomain("example.com"); - // [START_EXCLUDE silent] - domainPermission.setDomain(realDomain); - // [END_EXCLUDE] - driveService.permissions().create(fileId, domainPermission) - .setFields("id") - .queue(batch, callback); - - batch.execute(); - // [END shareFile] - return ids; - } - -} diff --git a/drive/snippets/drive_v3/src/main/java/TeamDriveSnippets.java b/drive/snippets/drive_v3/src/main/java/TeamDriveSnippets.java deleted file mode 100644 index eb2e0711..00000000 --- a/drive/snippets/drive_v3/src/main/java/TeamDriveSnippets.java +++ /dev/null @@ -1,100 +0,0 @@ -/* - * Copyright 2022 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import com.google.api.client.http.FileContent; -import com.google.api.services.drive.Drive; -import com.google.api.services.drive.model.TeamDrive; -import com.google.api.services.drive.model.TeamDriveList; -import com.google.api.services.drive.model.Permission; - -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; -import java.util.UUID; - -public class TeamDriveSnippets { - private Drive service; - - public TeamDriveSnippets(Drive service) { - this.service = service; - } - - public String createTeamDrive() throws IOException { - Drive driveService = this.service; - // [START createTeamDrive] - TeamDrive teamDriveMetadata = new TeamDrive(); - teamDriveMetadata.setName("Project Resources"); - String requestId = UUID.randomUUID().toString(); - TeamDrive teamDrive = driveService.teamdrives().create(requestId, - teamDriveMetadata) - .execute(); - System.out.println("Team Drive ID: " + teamDrive.getId()); - // [END createTeamDrive] - return teamDrive.getId(); - } - - public List recoverTeamDrives(String realUser) - throws IOException { - Drive driveService = this.service; - List teamDrives = new ArrayList(); - // [START recoverTeamDrives] - // Find all Team Drives without an organizer and add one. - // Note: This example does not capture all cases. Team Drives - // that have an empty group as the sole organizer, or an - // organizer outside the organization are not captured. A - // more exhaustive approach would evaluate each Team Drive - // and the associated permissions and groups to ensure an active - // organizer is assigned. - String pageToken = null; - Permission newOrganizerPermission = new Permission() - .setType("user") - .setRole("organizer") - .setEmailAddress("user@example.com"); - // [START_EXCLUDE silent] - newOrganizerPermission.setEmailAddress(realUser); - // [END_EXCLUDE] - - do { - TeamDriveList result = driveService.teamdrives().list() - .setQ("organizerCount = 0") - .setFields("nextPageToken, teamDrives(id, name)") - .setUseDomainAdminAccess(true) - .setPageToken(pageToken) - .execute(); - for (TeamDrive teamDrive : result.getTeamDrives()) { - System.out.printf("Found Team Drive without organizer: %s (%s)\n", - teamDrive.getName(), teamDrive.getId()); - // Note: For improved efficiency, consider batching - // permission insert requests - Permission permissionResult = driveService.permissions() - .create(teamDrive.getId(), newOrganizerPermission) - .setUseDomainAdminAccess(true) - .setSupportsTeamDrives(true) - .setFields("id") - .execute(); - System.out.printf("Added organizer permission: %s\n", - permissionResult.getId()); - - } - // [START_EXCLUDE silent] - teamDrives.addAll(result.getTeamDrives()); - // [END_EXCLUDE] - pageToken = result.getNextPageToken(); - } while (pageToken != null); - // [END recoverTeamDrives] - return teamDrives; - } -} diff --git a/gmail/snippets/src/main/java/SettingsSnippets.java b/gmail/snippets/src/main/java/SettingsSnippets.java deleted file mode 100644 index 89bb8fd9..00000000 --- a/gmail/snippets/src/main/java/SettingsSnippets.java +++ /dev/null @@ -1,122 +0,0 @@ -/* - * Copyright 2022 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import com.google.api.client.googleapis.batch.BatchRequest; -import com.google.api.client.googleapis.json.GoogleJsonError; -import com.google.api.client.http.FileContent; -import com.google.api.client.http.HttpHeaders; -import com.google.api.client.util.DateTime; -import com.google.api.services.gmail.Gmail; -import com.google.api.services.gmail.model.*; - -import java.io.ByteArrayOutputStream; -import java.io.IOException; -import java.io.OutputStream; -import java.time.LocalDateTime; -import java.time.ZoneOffset; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.List; - - -public class SettingsSnippets { - - private Gmail service; - - public SettingsSnippets(Gmail service) { - this.service = service; - } - - public String updateSignature() throws IOException { - Gmail gmailService = this.service; - // [START updateSignature] - SendAs primaryAlias = null; - ListSendAsResponse aliases = gmailService.users().settings().sendAs().list("me").execute(); - for (SendAs alias: aliases.getSendAs()) { - if (alias.getIsPrimary()) { - primaryAlias = alias; - break; - } - } - SendAs aliasSettings = new SendAs().setSignature("I heart cats."); - SendAs result = gmailService.users().settings().sendAs().patch( - "me", - primaryAlias.getSendAsEmail(), - aliasSettings) - .execute(); - System.out.println("Updated signature for " + result.getDisplayName()); - // [END updateSignature] - return result.getSignature(); - } - - public String createFilter(String realLabelId) throws IOException { - Gmail gmailService = this.service; - // [START createFilter] - String labelId = "Label_14"; // ID of the user label to add - // [START_EXCLUDE silent] - labelId = realLabelId; - // [END_EXCLUDE] - Filter filter = new Filter() - .setCriteria(new FilterCriteria() - .setFrom("cat-enthusiasts@example.com")) - .setAction(new FilterAction() - .setAddLabelIds(Arrays.asList(labelId)) - .setRemoveLabelIds(Arrays.asList("INBOX"))); - Filter result = gmailService.users().settings().filters().create("me", filter).execute(); - System.out.println("Created filter " + result.getId()); - // [END createFilter] - return result.getId(); - } - - public AutoForwarding enableForwarding(String realForwardingAddress) throws IOException { - Gmail gmailService = this.service; - // [START enableForwarding] - ForwardingAddress address = new ForwardingAddress() - .setForwardingEmail("user2@example.com"); - // [START_EXCLUDE silent] - address.setForwardingEmail(realForwardingAddress); - // [END_EXCLUDE] - ForwardingAddress createAddressResult = gmailService.users().settings().forwardingAddresses() - .create("me", address).execute(); - if (createAddressResult.getVerificationStatus().equals("accepted")) { - AutoForwarding autoForwarding = new AutoForwarding() - .setEnabled(true) - .setEmailAddress(address.getForwardingEmail()) - .setDisposition("trash"); - autoForwarding = gmailService.users().settings().updateAutoForwarding("me", autoForwarding).execute(); - // [START_EXCLUDE silent] - return autoForwarding; - } - // [END enableForwarding] - return null; - } - - public VacationSettings enableAutoReply() throws IOException { - Gmail gmailService = this.service; - // [START enableAutoReply] - VacationSettings vacationSettings = new VacationSettings() - .setEnableAutoReply(true) - .setResponseBodyHtml("I'm on vacation and will reply when I'm back in the office. Thanks!") - .setRestrictToDomain(true) - .setStartTime(LocalDateTime.now().toEpochSecond(ZoneOffset.UTC) * 1000) - .setEndTime(LocalDateTime.now().plusDays(7).toEpochSecond(ZoneOffset.UTC) * 1000); - VacationSettings response = gmailService.users().settings().updateVacation("me", vacationSettings).execute(); - // [END enableAutoReply] - return response; - } - -} diff --git a/gmail/snippets/src/main/java/SmimeSnippets.java b/gmail/snippets/src/main/java/SmimeSnippets.java deleted file mode 100644 index 7c0fd468..00000000 --- a/gmail/snippets/src/main/java/SmimeSnippets.java +++ /dev/null @@ -1,275 +0,0 @@ -/* - * Copyright 2022 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import com.google.api.services.gmail.Gmail; -import com.google.api.services.gmail.model.*; -import com.google.api.services.gmail.model.SmimeInfo; - -import java.io.*; -import java.nio.file.Files; -import java.nio.file.Paths; -import java.time.Instant; -import java.time.LocalDateTime; -import java.time.ZoneId; -import java.util.Base64; -import org.apache.commons.csv.CSVFormat; -import org.apache.commons.csv.CSVParser; -import org.apache.commons.csv.CSVRecord; - -class SmimeSnippets { - - SmimeSnippets() {} - - // [START create_smime_info] - /** - * Create an SmimeInfo resource for a certificate from file. - * - * @param filename Name of the file containing the S/MIME certificate. - * @param password Password for the certificate file, or null if the file is not - * password-protected. - * @return An SmimeInfo object with the specified certificate. - */ - public static SmimeInfo createSmimeInfo(String filename, String password) { - SmimeInfo smimeInfo = null; - InputStream in = null; - - try { - byte[] fileContent = Files.readAllBytes(Paths.get(filename)); - smimeInfo = new SmimeInfo(); - smimeInfo.setPkcs12(Base64.getUrlEncoder().encodeToString(fileContent)); - if (password != null && password.length() > 0) { - smimeInfo.setEncryptedKeyPassword(password); - } - } catch (Exception e) { - System.out.printf("An error occured while reading the certificate file: %s\n", e); - } - return smimeInfo; - } - // [END create_smime_info] - - // [START insert_smime_info] - /** - * Upload an S/MIME certificate for the user. - * - * @param service Authorized GMail API service instance. - * @param userId User's email address. - * @param sendAsEmail The "send as" email address, or null if it should be the same as userId. - * @param smimeInfo The SmimeInfo object containing the user's S/MIME certificate. - * @return An SmimeInfo object with details about the uploaded certificate. - */ - public static SmimeInfo insertSmimeInfo( - Gmail service, String userId, String sendAsEmail, SmimeInfo smimeInfo) { - if (sendAsEmail == null) { - sendAsEmail = userId; - } - - try { - SmimeInfo results = - service - .users() - .settings() - .sendAs() - .smimeInfo() - .insert(userId, sendAsEmail, smimeInfo) - .execute(); - System.out.printf("Inserted certificate, id: %s\n", results.getId()); - return results; - } catch (IOException e) { - System.err.printf("An error occured: %s", e); - } - - return null; - } - // [END insert_smime_info] - - // [START insert_cert_from_csv] - /** - * A builder that returns a GMail API service instance that is authorized to act on behalf of the - * specified user. - */ - @FunctionalInterface - public interface GmailServiceBuilder { - Gmail buildGmailServiceFromUserId(String userId) throws IOException; - } - - /** - * Upload S/MIME certificates based on the contents of a CSV file. - * - *

Each row of the CSV file should contain a user ID, path to the certificate, and the - * certificate password. - * - * @param serviceBuilder A function that returns an authorized GMail API service instance for a - * given user. - * @param csvFilename Name of the CSV file. - */ - public static void insertCertFromCsv(GmailServiceBuilder serviceBuilder, String csvFilename) { - try { - File csvFile = new File(csvFilename); - CSVParser parser = CSVParser.parse(csvFile, java.nio.charset.StandardCharsets.UTF_8, CSVFormat.DEFAULT); - for (CSVRecord record : parser) { - String userId = record.get(0); - String certFilename = record.get(1); - String certPassword = record.get(2); - SmimeInfo smimeInfo = createSmimeInfo(certFilename, certPassword); - if (smimeInfo == null) { - System.err.printf("Unable to read certificate file for userId: %s\n", userId); - continue; - } - insertSmimeInfo(serviceBuilder.buildGmailServiceFromUserId(userId), userId, userId, smimeInfo); - } - } catch (Exception e) { - System.err.printf("An error occured while reading the CSV file: %s", e); - } - } - // [END insert_cert_from_csv] - - // [START update_smime_certs] - /** - * Update S/MIME certificates for the user. - * - *

First performs a lookup of all certificates for a user. If there are no certificates, or - * they all expire before the specified date/time, uploads the certificate in the specified file. - * If the default certificate is expired or there was no default set, chooses the certificate with - * the expiration furthest into the future and sets it as default. - * - * @param service Authorized GMail API service instance. - * @param userId User's email address. - * @param sendAsEmail The "send as" email address, or None if it should be the same as user_id. - * @param certFilename Name of the file containing the S/MIME certificate. - * @param certPassword Password for the certificate file, or None if the file is not - * password-protected. - * @param expireTime DateTime object against which the certificate expiration is compared. If - * None, uses the current time. @ returns: The ID of the default certificate. - * @return The ID of the default certifcate. - */ - public static String updateSmimeCerts( - Gmail service, - String userId, - String sendAsEmail, - String certFilename, - String certPassword, - LocalDateTime expireTime) { - if (sendAsEmail == null) { - sendAsEmail = userId; - } - - ListSmimeInfoResponse listResults = null; - try { - listResults = - service.users().settings().sendAs().smimeInfo().list(userId, sendAsEmail).execute(); - } catch (IOException e) { - System.err.printf("An error occurred during list: %s\n", e); - return null; - } - - String defaultCertId = null; - String bestCertId = null; - LocalDateTime bestCertExpire = LocalDateTime.MIN; - - if (expireTime == null) { - expireTime = LocalDateTime.now(); - } - if (listResults != null && listResults.getSmimeInfo() != null) { - for (SmimeInfo smimeInfo : listResults.getSmimeInfo()) { - String certId = smimeInfo.getId(); - boolean isDefaultCert = smimeInfo.getIsDefault(); - if (isDefaultCert) { - defaultCertId = certId; - } - LocalDateTime exp = LocalDateTime.ofInstant( - Instant.ofEpochMilli(smimeInfo.getExpiration()), ZoneId.systemDefault()); - if (exp.isAfter(expireTime)) { - if (exp.isAfter(bestCertExpire)) { - bestCertId = certId; - bestCertExpire = exp; - } - } else { - if (isDefaultCert) { - defaultCertId = null; - } - } - } - } - if (defaultCertId == null) { - String defaultId = bestCertId; - if (defaultId == null && certFilename != null) { - SmimeInfo smimeInfo = createSmimeInfo(certFilename, certPassword); - SmimeInfo insertResults = insertSmimeInfo(service, userId, sendAsEmail, smimeInfo); - if (insertResults != null) { - defaultId = insertResults.getId(); - } - } - - if (defaultId != null) { - try { - service - .users() - .settings() - .sendAs() - .smimeInfo() - .setDefault(userId, sendAsEmail, defaultId) - .execute(); - return defaultId; - } catch (IOException e) { - System.err.printf("An error occured during setDefault: %s", e); - } - } - } else { - return defaultCertId; - } - - return null; - } - - /** - * Update S/MIME certificates based on the contents of a CSV file. - * - *

Each row of the CSV file should contain a user ID, path to the certificate, and the - * certificate password. - * - * @param serviceBuilder A function that returns an authorized GMail API service instance for a - * given user. - * @param csvFilename Name of the CSV file. - * @param expireTime DateTime object against which the certificate expiration is compared. If - * None, uses the current time. - */ - public static void updateSmimeFromCsv( - GmailServiceBuilder serviceBuilder, String csvFilename, LocalDateTime expireTime) { - try { - File csvFile = new File(csvFilename); - CSVParser parser = - CSVParser.parse( - csvFile, - java.nio.charset.StandardCharsets.UTF_8, - CSVFormat.DEFAULT.withHeader().withSkipHeaderRecord()); - for (CSVRecord record : parser) { - String userId = record.get(0); - String certFilename = record.get(1); - String certPassword = record.get(2); - updateSmimeCerts( - serviceBuilder.buildGmailServiceFromUserId(userId), - userId, - userId, - certFilename, - certPassword, - expireTime); - } - } catch (Exception e) { - System.err.printf("An error occured while reading the CSV file: %s", e); - } - } - // [END update_smime_certs] -} From 39bf07bc89c4fa11fd5ade6abed0cfb1ddd0564b Mon Sep 17 00:00:00 2001 From: Steven Bazyl Date: Fri, 5 Aug 2022 10:21:46 -0600 Subject: [PATCH 124/262] chore: Remove stray lint to appease linter --- .github/snippet-bot.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/snippet-bot.yml b/.github/snippet-bot.yml index bb488a81..6d6d1266 100644 --- a/.github/snippet-bot.yml +++ b/.github/snippet-bot.yml @@ -11,4 +11,3 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. - From 6b09f7c7a4356ae4a33ab0f7e620d226b53aea72 Mon Sep 17 00:00:00 2001 From: googleworkspace-bot <109114539+googleworkspace-bot@users.noreply.github.com> Date: Fri, 5 Aug 2022 12:25:11 -0600 Subject: [PATCH 125/262] chore: Synced local '.github/linters/' with remote 'sync-files/defaults/.github/linters/' (#257) --- .github/linters/.htmlhintrc | 25 ++++++++++++++ .github/linters/.yaml-lint.yml | 59 ++++++++++++++++++++++++++++++++++ .github/linters/sun_checks.xml | 3 -- 3 files changed, 84 insertions(+), 3 deletions(-) create mode 100644 .github/linters/.htmlhintrc create mode 100644 .github/linters/.yaml-lint.yml diff --git a/.github/linters/.htmlhintrc b/.github/linters/.htmlhintrc new file mode 100644 index 00000000..70391a46 --- /dev/null +++ b/.github/linters/.htmlhintrc @@ -0,0 +1,25 @@ +{ + "tagname-lowercase": true, + "attr-lowercase": true, + "attr-value-double-quotes": true, + "attr-value-not-empty": false, + "attr-no-duplication": true, + "doctype-first": false, + "tag-pair": true, + "tag-self-close": false, + "spec-char-escape": false, + "id-unique": true, + "src-not-empty": true, + "title-require": false, + "alt-require": true, + "doctype-html5": true, + "id-class-value": false, + "style-disabled": false, + "inline-style-disabled": false, + "inline-script-disabled": false, + "space-tab-mixed-disabled": "space", + "id-class-ad-disabled": false, + "href-abs-or-rel": false, + "attr-unsafe-chars": true, + "head-script-disabled": false +} diff --git a/.github/linters/.yaml-lint.yml b/.github/linters/.yaml-lint.yml new file mode 100644 index 00000000..e8394fd5 --- /dev/null +++ b/.github/linters/.yaml-lint.yml @@ -0,0 +1,59 @@ +--- +########################################### +# These are the rules used for # +# linting all the yaml files in the stack # +# NOTE: # +# You can disable line with: # +# # yamllint disable-line # +########################################### +rules: + braces: + level: warning + min-spaces-inside: 0 + max-spaces-inside: 0 + min-spaces-inside-empty: 1 + max-spaces-inside-empty: 5 + brackets: + level: warning + min-spaces-inside: 0 + max-spaces-inside: 0 + min-spaces-inside-empty: 1 + max-spaces-inside-empty: 5 + colons: + level: warning + max-spaces-before: 0 + max-spaces-after: 1 + commas: + level: warning + max-spaces-before: 0 + min-spaces-after: 1 + max-spaces-after: 1 + comments: disable + comments-indentation: disable + document-end: disable + document-start: + level: warning + present: true + empty-lines: + level: warning + max: 2 + max-start: 0 + max-end: 0 + hyphens: + level: warning + max-spaces-after: 1 + indentation: + level: warning + spaces: consistent + indent-sequences: true + check-multi-line-strings: false + key-duplicates: enable + line-length: + level: warning + max: 120 + allow-non-breakable-words: true + allow-non-breakable-inline-mappings: true + new-line-at-end-of-file: disable + new-lines: + type: unix + trailing-spaces: disable \ No newline at end of file diff --git a/.github/linters/sun_checks.xml b/.github/linters/sun_checks.xml index 59cbc573..de6c6cd4 100644 --- a/.github/linters/sun_checks.xml +++ b/.github/linters/sun_checks.xml @@ -1,13 +1,10 @@ - - 4.0.0 - - com.google - google - 5 - - com.google.apis-samples - calendar-sync-samples - 1 - Samples demonstrating syncing techniques for the Calendar API. - TODO: Determine the final URL. - 2014 - - 2.0.9 - + + 4.0.0 + + com.google + google + 5 + + com.google.apis-samples + calendar-sync-samples + 1 + Samples demonstrating syncing techniques for the Calendar API. + TODO: Determine the final URL. + 2014 + + 2.0.9 + - - - - org.apache.maven.plugins - maven-compiler-plugin - 2.3.2 - - 1.6 - 1.6 - - - - org.codehaus.mojo - exec-maven-plugin - 1.1 - - - - java - - - - - - - java.util.logging.config.file - logging.properties - - - - - - ${project.artifactId}-${project.version} - + + + + org.apache.maven.plugins + maven-compiler-plugin + 2.3.2 + + 1.6 + 1.6 + + + + org.codehaus.mojo + exec-maven-plugin + 1.1 + + + + java + + + + + + + java.util.logging.config.file + logging.properties + + + + + + ${project.artifactId}-${project.version} + - - - com.google.apis - google-api-services-calendar - v3-rev20211026-1.32.1 - - - com.google.api-client - google-api-client - 1.33.0 - - - com.google.http-client - google-http-client-jackson2 - ${project.http.version} - - - com.google.oauth-client - google-oauth-client-jetty - ${project.oauth.version} - - - com.google.collections - google-collections - 1.0 - - + + + com.google.apis + google-api-services-calendar + v3-rev20211026-1.32.1 + + + com.google.api-client + google-api-client + 1.33.0 + + + com.google.http-client + google-http-client-jackson2 + ${project.http.version} + + + com.google.oauth-client + google-oauth-client-jetty + ${project.oauth.version} + + + com.google.collections + google-collections + 1.0 + + - - 1.41.0 - 1.32.1 - UTF-8 - + + 1.41.0 + 1.32.1 + UTF-8 + diff --git a/calendar/sync/src/main/java/com/google/api/services/samples/calendar/sync/ConditionalModificationSample.java b/calendar/sync/src/main/java/com/google/api/services/samples/calendar/sync/ConditionalModificationSample.java index e84a36a4..a3b0c500 100644 --- a/calendar/sync/src/main/java/com/google/api/services/samples/calendar/sync/ConditionalModificationSample.java +++ b/calendar/sync/src/main/java/com/google/api/services/samples/calendar/sync/ConditionalModificationSample.java @@ -20,7 +20,6 @@ import com.google.api.services.calendar.CalendarScopes; import com.google.api.services.calendar.model.Event; import com.google.common.collect.Lists; - import java.io.IOException; import java.util.List; @@ -35,10 +34,14 @@ */ public class ConditionalModificationSample { - /** The maximum number of times to attempt to update the event, before aborting. */ + /** + * The maximum number of times to attempt to update the event, before aborting. + */ private static final int MAX_UPDATE_ATTEMPTS = 5; - /** Global instance of the Calendar client. */ + /** + * Global instance of the Calendar client. + */ private static Calendar client; public static void main(String[] args) { diff --git a/calendar/sync/src/main/java/com/google/api/services/samples/calendar/sync/ConditionalRetrievalSample.java b/calendar/sync/src/main/java/com/google/api/services/samples/calendar/sync/ConditionalRetrievalSample.java index 1d20f796..66dd210d 100644 --- a/calendar/sync/src/main/java/com/google/api/services/samples/calendar/sync/ConditionalRetrievalSample.java +++ b/calendar/sync/src/main/java/com/google/api/services/samples/calendar/sync/ConditionalRetrievalSample.java @@ -20,7 +20,6 @@ import com.google.api.services.calendar.CalendarScopes; import com.google.api.services.calendar.model.Event; import com.google.common.collect.Lists; - import java.io.IOException; import java.util.List; @@ -35,7 +34,9 @@ */ public class ConditionalRetrievalSample { - /** Global instance of the Calendar client. */ + /** + * Global instance of the Calendar client. + */ private static Calendar client; public static void main(String[] args) { diff --git a/calendar/sync/src/main/java/com/google/api/services/samples/calendar/sync/SyncTokenSample.java b/calendar/sync/src/main/java/com/google/api/services/samples/calendar/sync/SyncTokenSample.java index 38b24ee3..396de651 100644 --- a/calendar/sync/src/main/java/com/google/api/services/samples/calendar/sync/SyncTokenSample.java +++ b/calendar/sync/src/main/java/com/google/api/services/samples/calendar/sync/SyncTokenSample.java @@ -22,7 +22,6 @@ import com.google.api.services.calendar.model.Event; import com.google.api.services.calendar.model.Events; import com.google.common.collect.Lists; - import java.io.IOException; import java.util.Date; import java.util.List; @@ -37,18 +36,23 @@ */ public class SyncTokenSample { - /** Global instance of the Calendar client. */ + /** + * The key in the sync settings datastore that holds the current sync token. + */ + private static final String SYNC_TOKEN_KEY = "syncToken"; + /** + * Global instance of the Calendar client. + */ private static Calendar client; - - /** Global instance of the event datastore. */ + /** + * Global instance of the event datastore. + */ private static DataStore eventDataStore; - - /** Global instance of the sync settings datastore. */ + /** + * Global instance of the sync settings datastore. + */ private static DataStore syncSettingsDataStore; - /** The key in the sync settings datastore that holds the current sync token. */ - private static final String SYNC_TOKEN_KEY = "syncToken"; - public static void main(String[] args) { try { List scopes = Lists.newArrayList(CalendarScopes.CALENDAR_READONLY); diff --git a/calendar/sync/src/main/java/com/google/api/services/samples/calendar/sync/Utils.java b/calendar/sync/src/main/java/com/google/api/services/samples/calendar/sync/Utils.java index 32e9fb87..775dc403 100644 --- a/calendar/sync/src/main/java/com/google/api/services/samples/calendar/sync/Utils.java +++ b/calendar/sync/src/main/java/com/google/api/services/samples/calendar/sync/Utils.java @@ -30,7 +30,6 @@ import com.google.api.services.calendar.model.Event; import com.google.api.services.calendar.model.Event.Reminders; import com.google.api.services.calendar.model.EventDateTime; - import java.io.IOException; import java.io.InputStreamReader; import java.util.Date; @@ -41,20 +40,27 @@ * A collection of utility methods used by these samples. */ public class Utils { - /** Application name */ + /** + * Application name + */ private static final String APPLICATION_NAME = "Calendar Sync Samples"; - /** Directory to store user credentials. */ + /** + * Directory to store user credentials. + */ private static final java.io.File DATA_STORE_DIR = new java.io.File(System.getProperty("user.home"), ".store/calendar-sync"); - - /** Global instance of the {@link DataStoreFactory}. */ - private static FileDataStoreFactory dataStoreFactory; - - /** Global instance of the JSON factory. */ + /** + * Global instance of the JSON factory. + */ private static final JsonFactory JSON_FACTORY = JacksonFactory.getDefaultInstance(); - - /** Global instance of the HTTP transport. */ + /** + * Global instance of the {@link DataStoreFactory}. + */ + private static FileDataStoreFactory dataStoreFactory; + /** + * Global instance of the HTTP transport. + */ private static HttpTransport httpTransport; static { @@ -67,14 +73,18 @@ public class Utils { } } - /** Creates a new Calendar client to use when making requests to the API. */ + /** + * Creates a new Calendar client to use when making requests to the API. + */ public static Calendar createCalendarClient(List scopes) throws Exception { Credential credential = authorize(scopes); return new Calendar.Builder( httpTransport, JSON_FACTORY, credential).setApplicationName(APPLICATION_NAME).build(); } - /** Authorizes the installed application to access user's protected data. */ + /** + * Authorizes the installed application to access user's protected data. + */ public static Credential authorize(List scopes) throws Exception { // Load client secrets. GoogleClientSecrets clientSecrets = GoogleClientSecrets.load(JSON_FACTORY, @@ -83,7 +93,7 @@ public static Credential authorize(List scopes) throws Exception { || clientSecrets.getDetails().getClientSecret().startsWith("Enter")) { System.out.println( "Overwrite the src/main/resources/client_secrets.json file with the client secrets file " - + "you downloaded from your Google Developers Console project."); + + "you downloaded from your Google Developers Console project."); System.exit(1); } @@ -94,12 +104,16 @@ public static Credential authorize(List scopes) throws Exception { return new AuthorizationCodeInstalledApp(flow, receiver).authorize("user"); } - /** Gets the datastore factory used in these samples. */ + /** + * Gets the datastore factory used in these samples. + */ public static DataStoreFactory getDataStoreFactory() { return dataStoreFactory; } - /** Creates a test event. */ + /** + * Creates a test event. + */ public static Event createTestEvent(Calendar client, String summary) throws IOException { Date oneHourFromNow = Utils.getRelativeDate(java.util.Calendar.HOUR, 1); Date twoHoursFromNow = Utils.getRelativeDate(java.util.Calendar.HOUR, 2); @@ -116,7 +130,7 @@ public static Event createTestEvent(Calendar client, String summary) throws IOEx /** * Gets a new {@link java.util.Date} relative to the current date and time. * - * @param field the field identifier from {@link java.util.Calendar} to increment + * @param field the field identifier from {@link java.util.Calendar} to increment * @param amount the amount of the field to increment * @return the new date */ diff --git a/classroom/quickstart/src/main/java/ClassroomQuickstart.java b/classroom/quickstart/src/main/java/ClassroomQuickstart.java index 29d9ae24..fb174b5e 100644 --- a/classroom/quickstart/src/main/java/ClassroomQuickstart.java +++ b/classroom/quickstart/src/main/java/ClassroomQuickstart.java @@ -13,6 +13,7 @@ // limitations under the License. // [START classroom_quickstart] + import com.google.api.client.auth.oauth2.Credential; import com.google.api.client.extensions.java6.auth.oauth2.AuthorizationCodeInstalledApp; import com.google.api.client.extensions.jetty.auth.oauth2.LocalServerReceiver; @@ -36,61 +37,66 @@ import java.util.List; public class ClassroomQuickstart { - private static final String APPLICATION_NAME = "Google Classroom API Java Quickstart"; - private static final JsonFactory JSON_FACTORY = GsonFactory.getDefaultInstance(); - private static final String TOKENS_DIRECTORY_PATH = "tokens"; - - /** - * Global instance of the scopes required by this quickstart. - * If modifying these scopes, delete your previously saved tokens/ folder. - */ - private static final List SCOPES = Collections.singletonList(ClassroomScopes.CLASSROOM_COURSES_READONLY); - private static final String CREDENTIALS_FILE_PATH = "/credentials.json"; + private static final String APPLICATION_NAME = "Google Classroom API Java Quickstart"; + private static final JsonFactory JSON_FACTORY = GsonFactory.getDefaultInstance(); + private static final String TOKENS_DIRECTORY_PATH = "tokens"; - /** - * Creates an authorized Credential object. - * @param HTTP_TRANSPORT The network HTTP Transport. - * @return An authorized Credential object. - * @throws IOException If the credentials.json file cannot be found. - */ - private static Credential getCredentials(final NetHttpTransport HTTP_TRANSPORT) throws IOException { - // Load client secrets. - InputStream in = ClassroomQuickstart.class.getResourceAsStream(CREDENTIALS_FILE_PATH); - if (in == null) { - throw new FileNotFoundException("Resource not found: " + CREDENTIALS_FILE_PATH); - } - GoogleClientSecrets clientSecrets = GoogleClientSecrets.load(JSON_FACTORY, new InputStreamReader(in)); + /** + * Global instance of the scopes required by this quickstart. + * If modifying these scopes, delete your previously saved tokens/ folder. + */ + private static final List SCOPES = + Collections.singletonList(ClassroomScopes.CLASSROOM_COURSES_READONLY); + private static final String CREDENTIALS_FILE_PATH = "/credentials.json"; - // Build flow and trigger user authorization request. - GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow.Builder( - HTTP_TRANSPORT, JSON_FACTORY, clientSecrets, SCOPES) - .setDataStoreFactory(new FileDataStoreFactory(new java.io.File(TOKENS_DIRECTORY_PATH))) - .setAccessType("offline") - .build(); - LocalServerReceiver receiver = new LocalServerReceiver.Builder().setPort(8888).build(); - return new AuthorizationCodeInstalledApp(flow, receiver).authorize("user"); + /** + * Creates an authorized Credential object. + * + * @param HTTP_TRANSPORT The network HTTP Transport. + * @return An authorized Credential object. + * @throws IOException If the credentials.json file cannot be found. + */ + private static Credential getCredentials(final NetHttpTransport HTTP_TRANSPORT) + throws IOException { + // Load client secrets. + InputStream in = ClassroomQuickstart.class.getResourceAsStream(CREDENTIALS_FILE_PATH); + if (in == null) { + throw new FileNotFoundException("Resource not found: " + CREDENTIALS_FILE_PATH); } + GoogleClientSecrets clientSecrets = + GoogleClientSecrets.load(JSON_FACTORY, new InputStreamReader(in)); + + // Build flow and trigger user authorization request. + GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow.Builder( + HTTP_TRANSPORT, JSON_FACTORY, clientSecrets, SCOPES) + .setDataStoreFactory(new FileDataStoreFactory(new java.io.File(TOKENS_DIRECTORY_PATH))) + .setAccessType("offline") + .build(); + LocalServerReceiver receiver = new LocalServerReceiver.Builder().setPort(8888).build(); + return new AuthorizationCodeInstalledApp(flow, receiver).authorize("user"); + } - public static void main(String... args) throws IOException, GeneralSecurityException { - // Build a new authorized API client service. - final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport(); - Classroom service = new Classroom.Builder(HTTP_TRANSPORT, JSON_FACTORY, getCredentials(HTTP_TRANSPORT)) - .setApplicationName(APPLICATION_NAME) - .build(); + public static void main(String... args) throws IOException, GeneralSecurityException { + // Build a new authorized API client service. + final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport(); + Classroom service = + new Classroom.Builder(HTTP_TRANSPORT, JSON_FACTORY, getCredentials(HTTP_TRANSPORT)) + .setApplicationName(APPLICATION_NAME) + .build(); - // List the first 10 courses that the user has access to. - ListCoursesResponse response = service.courses().list() - .setPageSize(10) - .execute(); - List courses = response.getCourses(); - if (courses == null || courses.size() == 0) { - System.out.println("No courses found."); - } else { - System.out.println("Courses:"); - for (Course course : courses) { - System.out.printf("%s\n", course.getName()); - } - } + // List the first 10 courses that the user has access to. + ListCoursesResponse response = service.courses().list() + .setPageSize(10) + .execute(); + List courses = response.getCourses(); + if (courses == null || courses.size() == 0) { + System.out.println("No courses found."); + } else { + System.out.println("Courses:"); + for (Course course : courses) { + System.out.printf("%s\n", course.getName()); + } } + } } // [END classroom_quickstart] diff --git a/classroom/snippets/src/main/java/AddStudent.java b/classroom/snippets/src/main/java/AddStudent.java index b3237c9a..142072a3 100644 --- a/classroom/snippets/src/main/java/AddStudent.java +++ b/classroom/snippets/src/main/java/AddStudent.java @@ -14,6 +14,7 @@ // [START classroom_add_student] + import com.google.api.client.googleapis.json.GoogleJsonError; import com.google.api.client.googleapis.json.GoogleJsonResponseException; import com.google.api.client.http.HttpRequestInitializer; @@ -29,52 +30,52 @@ /* Class to demonstrate the use of Classroom Add Student API */ public class AddStudent { - /** - * Add a student in a specified course. - * - * @param courseId - Id of the course. - * @param enrollmentCode - Code of the course to enroll. - * @return newly added student - * @throws IOException - if credentials file not found. - */ - public static Student addStudent(String courseId, String enrollmentCode) - throws IOException { + /** + * Add a student in a specified course. + * + * @param courseId - Id of the course. + * @param enrollmentCode - Code of the course to enroll. + * @return newly added student + * @throws IOException - if credentials file not found. + */ + public static Student addStudent(String courseId, String enrollmentCode) + throws IOException { /* Load pre-authorized user credentials from the environment. TODO(developer) - See https://developers.google.com/identity for guides on implementing OAuth2 for your application. */ - GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() - .createScoped(Collections.singleton(ClassroomScopes.CLASSROOM_ROSTERS)); - HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( - credentials); + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Collections.singleton(ClassroomScopes.CLASSROOM_ROSTERS)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); - // Create the classroom API client - Classroom service = new Classroom.Builder(new NetHttpTransport(), - GsonFactory.getDefaultInstance(), - requestInitializer) - .setApplicationName("Classroom samples") - .build(); + // Create the classroom API client + Classroom service = new Classroom.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Classroom samples") + .build(); - Student student = new Student().setUserId("me"); - try { - // Enrolling a student to a specified course - student = service.courses().students().create(courseId, student) - .setEnrollmentCode(enrollmentCode) - .execute(); - // Prints the course id with the Student name - System.out.printf("User '%s' was enrolled as a student in the course with ID '%s'.\n", - student.getProfile().getName().getFullName(), courseId); - } catch (GoogleJsonResponseException e) { - // TODO(developer) - handle error appropriately - GoogleJsonError error = e.getDetails(); - if (error.getCode() == 409) { - System.out.println("You are already a member of this course."); - } else if (error.getCode() == 403) { - System.out.println("The caller does not have permission.\n"); - } else { - throw e; - } - } - return student; + Student student = new Student().setUserId("me"); + try { + // Enrolling a student to a specified course + student = service.courses().students().create(courseId, student) + .setEnrollmentCode(enrollmentCode) + .execute(); + // Prints the course id with the Student name + System.out.printf("User '%s' was enrolled as a student in the course with ID '%s'.\n", + student.getProfile().getName().getFullName(), courseId); + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + GoogleJsonError error = e.getDetails(); + if (error.getCode() == 409) { + System.out.println("You are already a member of this course."); + } else if (error.getCode() == 403) { + System.out.println("The caller does not have permission.\n"); + } else { + throw e; + } } + return student; + } } // [END classroom_add_student] \ No newline at end of file diff --git a/classroom/snippets/src/main/java/AddTeacher.java b/classroom/snippets/src/main/java/AddTeacher.java index bede3367..9f5652e3 100644 --- a/classroom/snippets/src/main/java/AddTeacher.java +++ b/classroom/snippets/src/main/java/AddTeacher.java @@ -14,6 +14,7 @@ // [START classroom_add_teacher] + import com.google.api.client.googleapis.json.GoogleJsonError; import com.google.api.client.googleapis.json.GoogleJsonResponseException; import com.google.api.client.http.HttpRequestInitializer; @@ -29,50 +30,50 @@ /* Class to demonstrate the use of Classroom Add Teacher API */ public class AddTeacher { - /** - * Add teacher to a specific course. - * - * @param courseId - Id of the course. - * @param teacherEmail - Email address of the teacher. - * @return newly created teacher - * @throws IOException - if credentials file not found. - */ - public static Teacher addTeacher(String courseId, String teacherEmail) - throws IOException { + /** + * Add teacher to a specific course. + * + * @param courseId - Id of the course. + * @param teacherEmail - Email address of the teacher. + * @return newly created teacher + * @throws IOException - if credentials file not found. + */ + public static Teacher addTeacher(String courseId, String teacherEmail) + throws IOException { /* Load pre-authorized user credentials from the environment. TODO(developer) - See https://developers.google.com/identity for guides on implementing OAuth2 for your application. */ - GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() - .createScoped(Collections.singleton(ClassroomScopes.CLASSROOM_ROSTERS)); - HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( - credentials); + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Collections.singleton(ClassroomScopes.CLASSROOM_ROSTERS)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); - // Create the classroom API client - Classroom service = new Classroom.Builder(new NetHttpTransport(), - GsonFactory.getDefaultInstance(), - requestInitializer) - .setApplicationName("Classroom samples") - .build(); + // Create the classroom API client + Classroom service = new Classroom.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Classroom samples") + .build(); - Teacher teacher = new Teacher().setUserId(teacherEmail); - try { - // Add a teacher to a specified course - teacher = service.courses().teachers().create(courseId, teacher).execute(); - // Prints the course id with the teacher name - System.out.printf("User '%s' was added as a teacher to the course with ID '%s'.\n", - teacher.getProfile().getName().getFullName(), courseId); - } catch (GoogleJsonResponseException e) { - // TODO(developer) - handle error appropriately - GoogleJsonError error = e.getDetails(); - if (error.getCode() == 409) { - System.out.printf("User '%s' is already a member of this course.\n", teacherEmail); - } else if (error.getCode() == 403) { - System.out.println("The caller does not have permission.\n"); - } else { - throw e; - } - } - return teacher; + Teacher teacher = new Teacher().setUserId(teacherEmail); + try { + // Add a teacher to a specified course + teacher = service.courses().teachers().create(courseId, teacher).execute(); + // Prints the course id with the teacher name + System.out.printf("User '%s' was added as a teacher to the course with ID '%s'.\n", + teacher.getProfile().getName().getFullName(), courseId); + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + GoogleJsonError error = e.getDetails(); + if (error.getCode() == 409) { + System.out.printf("User '%s' is already a member of this course.\n", teacherEmail); + } else if (error.getCode() == 403) { + System.out.println("The caller does not have permission.\n"); + } else { + throw e; + } } + return teacher; + } } // [END classroom_add_teacher] \ No newline at end of file diff --git a/classroom/snippets/src/main/java/BatchAddStudents.java b/classroom/snippets/src/main/java/BatchAddStudents.java index 676cddc3..9588ec3d 100644 --- a/classroom/snippets/src/main/java/BatchAddStudents.java +++ b/classroom/snippets/src/main/java/BatchAddStudents.java @@ -14,6 +14,7 @@ // [START classroom_batch_add_students] + import com.google.api.client.googleapis.batch.BatchRequest; import com.google.api.client.googleapis.batch.json.JsonBatchCallback; import com.google.api.client.googleapis.json.GoogleJsonError; @@ -32,46 +33,46 @@ /* Class to demonstrate the use of Classroom Batch Add Students API */ public class BatchAddStudents { - /** - * Add multiple students in a specified course. - * - * @param courseId - Id of the course to add students. - * @param studentEmails - Email address of the students. - * @throws IOException - if credentials file not found. - */ - public static void batchAddStudents(String courseId, List studentEmails) - throws IOException { + /** + * Add multiple students in a specified course. + * + * @param courseId - Id of the course to add students. + * @param studentEmails - Email address of the students. + * @throws IOException - if credentials file not found. + */ + public static void batchAddStudents(String courseId, List studentEmails) + throws IOException { /* Load pre-authorized user credentials from the environment. TODO(developer) - See https://developers.google.com/identity for guides on implementing OAuth2 for your application. */ - GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() - .createScoped(Collections.singleton(ClassroomScopes.CLASSROOM_ROSTERS)); - HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( - credentials); + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Collections.singleton(ClassroomScopes.CLASSROOM_ROSTERS)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); - // Create the classroom API client - Classroom service = new Classroom.Builder(new NetHttpTransport(), - GsonFactory.getDefaultInstance(), - requestInitializer) - .setApplicationName("Classroom samples") - .build(); + // Create the classroom API client + Classroom service = new Classroom.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Classroom samples") + .build(); - BatchRequest batch = service.batch(); - JsonBatchCallback callback = new JsonBatchCallback<>() { - public void onSuccess(Student student, HttpHeaders responseHeaders) { - System.out.printf("User '%s' was added as a student to the course.\n", - student.getProfile().getName().getFullName()); - } + BatchRequest batch = service.batch(); + JsonBatchCallback callback = new JsonBatchCallback<>() { + public void onSuccess(Student student, HttpHeaders responseHeaders) { + System.out.printf("User '%s' was added as a student to the course.\n", + student.getProfile().getName().getFullName()); + } - public void onFailure(GoogleJsonError error, HttpHeaders responseHeaders) { - System.out.printf("Error adding student to the course: %s\n", error.getMessage()); - } - }; - for (String studentEmail : studentEmails) { - Student student = new Student().setUserId(studentEmail); - service.courses().students().create(courseId, student).queue(batch, callback); - } - batch.execute(); + public void onFailure(GoogleJsonError error, HttpHeaders responseHeaders) { + System.out.printf("Error adding student to the course: %s\n", error.getMessage()); + } + }; + for (String studentEmail : studentEmails) { + Student student = new Student().setUserId(studentEmail); + service.courses().students().create(courseId, student).queue(batch, callback); } + batch.execute(); + } } // [END classroom_batch_add_students] \ No newline at end of file diff --git a/classroom/snippets/src/main/java/Courses.java b/classroom/snippets/src/main/java/Courses.java deleted file mode 100644 index 0526ddd5..00000000 --- a/classroom/snippets/src/main/java/Courses.java +++ /dev/null @@ -1,273 +0,0 @@ -/* - * Copyright 2022 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import com.google.api.client.googleapis.batch.BatchRequest; -import com.google.api.client.googleapis.batch.json.JsonBatchCallback; -import com.google.api.client.googleapis.json.GoogleJsonError; -import com.google.api.client.googleapis.json.GoogleJsonResponseException; -import com.google.api.client.http.HttpHeaders; -import com.google.api.services.classroom.Classroom; -import com.google.api.services.classroom.model.Course; -import com.google.api.services.classroom.model.CourseAlias; -import com.google.api.services.classroom.model.ListCourseAliasesResponse; -import com.google.api.services.classroom.model.ListCoursesResponse; -import com.google.api.services.classroom.model.Student; -import com.google.api.services.classroom.model.Teacher; - -import java.io.IOException; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; - - -public class Courses { - public static Course createCourse(Classroom service) throws IOException { - // [START createCourse] - Course course = new Course() - .setName("10th Grade Biology") - .setSection("Period 2") - .setDescriptionHeading("Welcome to 10th Grade Biology") - .setDescription("We'll be learning about about the structure of living creatures " - + "from a combination of textbooks, guest lectures, and lab work. Expect " - + "to be excited!") - .setRoom("301") - .setOwnerId("me") - .setCourseState("PROVISIONED"); - course = service.courses().create(course).execute(); - System.out.printf("Course created: %s (%s)\n", course.getName(), course.getId()); - // [END createCourse] - return course; - } - - public static Course getCourse(Classroom service, String _courseId) throws IOException { - // [START getCourse] - String courseId = "123456"; - // [START_EXCLUDE silent] - courseId = _courseId; - // [END_EXCLUDE] - Course course = null; - try { - course = service.courses().get(courseId).execute(); - System.out.printf("Course '%s' found.\n", course.getName()); - } catch (GoogleJsonResponseException e) { - GoogleJsonError error = e.getDetails(); - if (error.getCode() == 404) { - System.out.printf("Course with ID '%s' not found.\n", courseId); - } else { - throw e; - } - } - // [END getCourse] - return course; - } - - public static List listCourses(Classroom service) throws IOException { - // [START listCourses] - String pageToken = null; - List courses = new ArrayList(); - - do { - ListCoursesResponse response = service.courses().list() - .setPageSize(100) - .setPageToken(pageToken) - .execute(); - courses.addAll(response.getCourses()); - pageToken = response.getNextPageToken(); - } while (pageToken != null); - - if (courses.isEmpty()) { - System.out.println("No courses found."); - } else { - System.out.println("Courses:"); - for (Course course : courses) { - System.out.printf("%s (%s)\n", course.getName(), course.getId()); - } - } - // [END listCourses] - return courses; - } - - public static Course updateCourse(Classroom service, String _courseId) throws IOException { - // [START updateCourse] - String courseId = "123456"; - // [START_EXCLUDE silent] - courseId = _courseId; - // [END_EXCLUDE] - Course course = service.courses().get(courseId).execute(); - course.setSection("Period 3"); - course.setRoom("302"); - course = service.courses().update(courseId, course).execute(); - System.out.printf("Course '%s' updated.\n", course.getName()); - // [END updateCourse] - return course; - } - - public static Course patchCourse(Classroom service, String _courseId) throws IOException { - // [START patchCourse] - String courseId = "123456"; - // [START_EXCLUDE silent] - courseId = _courseId; - // [END_EXCLUDE] - Course course = new Course() - .setSection("Period 3") - .setRoom("302"); - course = service.courses().patch(courseId, course) - .setUpdateMask("section,room") - .execute(); - System.out.printf("Course '%s' updated.\n", course.getName()); - // [END patchCourse] - return course; - } - - public static CourseAlias createCourseAlias(Classroom service, String _courseId, String _alias) - throws IOException { - // [START createCourseAlias] - String courseId = "123456"; - String alias = "p:bio10p2"; - // [START_EXCLUDE silent] - courseId = _courseId; - alias = _alias; - // [END_EXCLUDE] - CourseAlias courseAlias = new CourseAlias().setAlias(alias); - try { - courseAlias = service.courses().aliases().create(courseId, courseAlias).execute(); - System.out.printf("Alias '%s' created.\n", courseAlias.getAlias()); - } catch (GoogleJsonResponseException e) { - GoogleJsonError error = e.getDetails(); - if (error.getCode() == 409) { - System.out.printf("Alias '%s' is already in use.\n", alias); - } else { - throw e; - } - } - // [END createCourseAlias] - return courseAlias; - } - - public static List listCourseAliases(Classroom service, String _courseId) - throws IOException { - // [START listCourseAliases] - String courseId = "123456"; - // [START_EXCLUDE silent] - courseId = _courseId; - // [END_EXCLUDE] - String pageToken = null; - List courseAliases = new ArrayList(); - - do { - ListCourseAliasesResponse response = service.courses().aliases().list(courseId) - .setPageSize(100) - .setPageToken(pageToken) - .execute(); - courseAliases.addAll(response.getAliases()); - pageToken = response.getNextPageToken(); - } while (pageToken != null); - - if (courseAliases.isEmpty()) { - System.out.println("No aliases found."); - } else { - System.out.println("Aliases:"); - for (CourseAlias courseAlias : courseAliases) { - System.out.println(courseAlias.getAlias()); - } - } - // [END listCourseAliases] - return courseAliases; - } - - public static Teacher addTeacher(Classroom service, String _courseId, String _teacherEmail) - throws IOException { - // [START addTeacher] - String courseId = "123456"; - String teacherEmail = "alice@example.edu"; - // [START_EXCLUDE silent] - courseId = _courseId; - teacherEmail = _teacherEmail; - // [END_EXCLUDE] - Teacher teacher = new Teacher().setUserId(teacherEmail); - try { - teacher = service.courses().teachers().create(courseId, teacher).execute(); - System.out.printf("User '%s' was added as a teacher to the course with ID '%s'.\n", - teacher.getProfile().getName().getFullName(), courseId); - } catch (GoogleJsonResponseException e) { - GoogleJsonError error = e.getDetails(); - if (error.getCode() == 409) { - System.out.printf("User '%s' is already a member of this course.\n", teacherEmail); - } else { - throw e; - } - } - // [END addTeacher] - return teacher; - } - - public static Student enrollAsStudent(Classroom service, String _courseId, - String _enrollmentCode) throws IOException { - // [START enrollAsStudent] - String courseId = "123456"; - String enrollmentCode = "abcdef"; - // [START_EXCLUDE silent] - courseId = _courseId; - enrollmentCode = _enrollmentCode; - // [END_EXCLUDE] - Student student = new Student().setUserId("me"); - try { - student = service.courses().students().create(courseId, student) - .setEnrollmentCode(enrollmentCode) - .execute(); - System.out.printf("User '%s' was enrolled as a student in the course with ID '%s'.\n", - student.getProfile().getName().getFullName(), courseId); - } catch (GoogleJsonResponseException e) { - GoogleJsonError error = e.getDetails(); - if (error.getCode() == 409) { - System.out.println("You are already a member of this course."); - } else { - throw e; - } - } - // [END enrollAsStudent] - return student; - } - - public static void batchAddStudents(Classroom service, String _courseId, - List _studentEmails) throws IOException{ - // [START batchAddStudents] - String courseId = "123456"; - List studentEmails = Arrays.asList("alice@example.edu", "bob@example.edu"); - // [START_EXCLUDE silent] - courseId = _courseId; - studentEmails = _studentEmails; - // [END_EXCLUDE] - BatchRequest batch = service.batch(); - JsonBatchCallback callback = new JsonBatchCallback() { - public void onSuccess(Student student, HttpHeaders responseHeaders) { - System.out.printf("User '%s' was added as a student to the course.\n", - student.getProfile().getName().getFullName()); - } - - public void onFailure(GoogleJsonError error, HttpHeaders responseHeaders) - throws IOException { - System.out.printf("Error adding student to the course: %s\n", error.getMessage()); - } - }; - for (String studentEmail : studentEmails) { - Student student = new Student().setUserId(studentEmail); - service.courses().students().create(courseId, student).queue(batch, callback); - } - batch.execute(); - // [END batchAddStudents] - } -} diff --git a/classroom/snippets/src/main/java/CreateCourse.java b/classroom/snippets/src/main/java/CreateCourse.java index d1bca2d4..ce33dd4d 100644 --- a/classroom/snippets/src/main/java/CreateCourse.java +++ b/classroom/snippets/src/main/java/CreateCourse.java @@ -14,6 +14,7 @@ // [START classroom_create_course] + import com.google.api.client.googleapis.json.GoogleJsonError; import com.google.api.client.googleapis.json.GoogleJsonResponseException; import com.google.api.client.http.HttpRequestInitializer; @@ -29,53 +30,53 @@ /* Class to demonstrate the use of Classroom Create Course API */ public class CreateCourse { - /** - * Creates a course - * - * @return newly created course - * @throws IOException - if credentials file not found. - */ - public static Course createCourse() throws IOException { + /** + * Creates a course + * + * @return newly created course + * @throws IOException - if credentials file not found. + */ + public static Course createCourse() throws IOException { /* Load pre-authorized user credentials from the environment. TODO(developer) - See https://developers.google.com/identity for guides on implementing OAuth2 for your application. */ - GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() - .createScoped(Collections.singleton(ClassroomScopes.CLASSROOM_COURSES)); - HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( - credentials); + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Collections.singleton(ClassroomScopes.CLASSROOM_COURSES)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); - // Create the classroom API client - Classroom service = new Classroom.Builder(new NetHttpTransport(), - GsonFactory.getDefaultInstance(), - requestInitializer) - .setApplicationName("Classroom samples") - .build(); + // Create the classroom API client + Classroom service = new Classroom.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Classroom samples") + .build(); - Course course = null; - try { - // Adding a new course with description - course = new Course() - .setName("10th Grade Biology") - .setSection("Period 2") - .setDescriptionHeading("Welcome to 10th Grade Biology") - .setDescription("We'll be learning about about the structure of living creatures " - + "from a combination of textbooks, guest lectures, and lab work. Expect " - + "to be excited!") - .setRoom("301") - .setOwnerId("me") - .setCourseState("PROVISIONED"); - course = service.courses().create(course).execute(); - // Prints the new created course Id and name - System.out.printf("Course created: %s (%s)\n", course.getName(), course.getId()); - } catch (GoogleJsonResponseException e) { - GoogleJsonError error = e.getDetails(); - if (error.getCode() == 400) { - System.err.println("Unable to create course, ownerId not specified.\n"); - } else { - throw e; - } - } - return course; + Course course = null; + try { + // Adding a new course with description + course = new Course() + .setName("10th Grade Biology") + .setSection("Period 2") + .setDescriptionHeading("Welcome to 10th Grade Biology") + .setDescription("We'll be learning about about the structure of living creatures " + + "from a combination of textbooks, guest lectures, and lab work. Expect " + + "to be excited!") + .setRoom("301") + .setOwnerId("me") + .setCourseState("PROVISIONED"); + course = service.courses().create(course).execute(); + // Prints the new created course Id and name + System.out.printf("Course created: %s (%s)\n", course.getName(), course.getId()); + } catch (GoogleJsonResponseException e) { + GoogleJsonError error = e.getDetails(); + if (error.getCode() == 400) { + System.err.println("Unable to create course, ownerId not specified.\n"); + } else { + throw e; + } } + return course; + } } // [END classroom_create_course] \ No newline at end of file diff --git a/classroom/snippets/src/main/java/GetCourse.java b/classroom/snippets/src/main/java/GetCourse.java index ff20a729..7955f1da 100644 --- a/classroom/snippets/src/main/java/GetCourse.java +++ b/classroom/snippets/src/main/java/GetCourse.java @@ -14,6 +14,7 @@ // [START classroom_get_course] + import com.google.api.client.googleapis.json.GoogleJsonError; import com.google.api.client.googleapis.json.GoogleJsonResponseException; import com.google.api.client.http.HttpRequestInitializer; @@ -29,43 +30,43 @@ /* Class to demonstrate the use of Classroom Get Course API */ public class GetCourse { - /** - * Retrieve a single course's metadata. - * - * @param courseId - Id of the course to return. - * @return a course - * @throws IOException - if credentials file not found. - */ - public static Course getCourse(String courseId) throws IOException { + /** + * Retrieve a single course's metadata. + * + * @param courseId - Id of the course to return. + * @return a course + * @throws IOException - if credentials file not found. + */ + public static Course getCourse(String courseId) throws IOException { /* Load pre-authorized user credentials from the environment. TODO(developer) - See https://developers.google.com/identity for guides on implementing OAuth2 for your application. */ - GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() - .createScoped(Collections.singleton(ClassroomScopes.CLASSROOM_COURSES)); - HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( - credentials); + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Collections.singleton(ClassroomScopes.CLASSROOM_COURSES)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); - // Create the classroom API client - Classroom service = new Classroom.Builder(new NetHttpTransport(), - GsonFactory.getDefaultInstance(), - requestInitializer) - .setApplicationName("Classroom samples") - .build(); + // Create the classroom API client + Classroom service = new Classroom.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Classroom samples") + .build(); - Course course = null; - try { - course = service.courses().get(courseId).execute(); - System.out.printf("Course '%s' found.\n", course.getName()); - } catch (GoogleJsonResponseException e) { - // TODO(developer) - handle error appropriately - GoogleJsonError error = e.getDetails(); - if (error.getCode() == 404) { - System.out.printf("Course with ID '%s' not found.\n", courseId); - } else { - throw e; - } - } - return course; + Course course = null; + try { + course = service.courses().get(courseId).execute(); + System.out.printf("Course '%s' found.\n", course.getName()); + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + GoogleJsonError error = e.getDetails(); + if (error.getCode() == 404) { + System.out.printf("Course with ID '%s' not found.\n", courseId); + } else { + throw e; + } } + return course; + } } // [END classroom_get_course] \ No newline at end of file diff --git a/classroom/snippets/src/main/java/ListCourseAliases.java b/classroom/snippets/src/main/java/ListCourseAliases.java index 71101eb1..171f4fa6 100644 --- a/classroom/snippets/src/main/java/ListCourseAliases.java +++ b/classroom/snippets/src/main/java/ListCourseAliases.java @@ -14,6 +14,7 @@ // [START classroom_list_aliases] + import com.google.api.client.googleapis.json.GoogleJsonError; import com.google.api.client.googleapis.json.GoogleJsonResponseException; import com.google.api.client.http.HttpRequestInitializer; @@ -32,62 +33,62 @@ /* Class to demonstrate the use of Classroom List Alias API */ public class ListCourseAliases { - /** - * Retrieve the aliases for a course. - * - * @param courseId - id of the course. - * @return list of course aliases - * @throws IOException - if credentials file not found. - */ - public static List listCourseAliases(String courseId) - throws IOException { + /** + * Retrieve the aliases for a course. + * + * @param courseId - id of the course. + * @return list of course aliases + * @throws IOException - if credentials file not found. + */ + public static List listCourseAliases(String courseId) + throws IOException { /* Load pre-authorized user credentials from the environment. TODO(developer) - See https://developers.google.com/identity for guides on implementing OAuth2 for your application. */ - GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() - .createScoped(Collections.singleton(ClassroomScopes.CLASSROOM_COURSES)); - HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( - credentials); + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Collections.singleton(ClassroomScopes.CLASSROOM_COURSES)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); - // Create the classroom API client - Classroom service = new Classroom.Builder(new NetHttpTransport(), - GsonFactory.getDefaultInstance(), - requestInitializer) - .setApplicationName("Classroom samples") - .build(); + // Create the classroom API client + Classroom service = new Classroom.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Classroom samples") + .build(); - String pageToken = null; - List courseAliases = new ArrayList<>(); + String pageToken = null; + List courseAliases = new ArrayList<>(); - try { - // List of aliases of specified course - do { - ListCourseAliasesResponse response = service.courses().aliases().list(courseId) - .setPageSize(100) - .setPageToken(pageToken) - .execute(); - courseAliases.addAll(response.getAliases()); - pageToken = response.getNextPageToken(); - } while (pageToken != null); + try { + // List of aliases of specified course + do { + ListCourseAliasesResponse response = service.courses().aliases().list(courseId) + .setPageSize(100) + .setPageToken(pageToken) + .execute(); + courseAliases.addAll(response.getAliases()); + pageToken = response.getNextPageToken(); + } while (pageToken != null); - if (courseAliases.isEmpty()) { - System.out.println("No aliases found."); - } else { - System.out.println("Aliases:"); - for (CourseAlias courseAlias : courseAliases) { - System.out.println(courseAlias.getAlias()); - } - } - } catch (GoogleJsonResponseException e) { - // TODO(developer) - handle error appropriately - GoogleJsonError error = e.getDetails(); - if (error.getCode() == 404) { - System.err.println("Course does not exist.\n"); - } else { - throw e; - } + if (courseAliases.isEmpty()) { + System.out.println("No aliases found."); + } else { + System.out.println("Aliases:"); + for (CourseAlias courseAlias : courseAliases) { + System.out.println(courseAlias.getAlias()); } - return courseAliases; + } + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + GoogleJsonError error = e.getDetails(); + if (error.getCode() == 404) { + System.err.println("Course does not exist.\n"); + } else { + throw e; + } } + return courseAliases; + } } // [END classroom_list_aliases] \ No newline at end of file diff --git a/classroom/snippets/src/main/java/ListCourses.java b/classroom/snippets/src/main/java/ListCourses.java index 65a2be80..5b7bd58f 100644 --- a/classroom/snippets/src/main/java/ListCourses.java +++ b/classroom/snippets/src/main/java/ListCourses.java @@ -14,6 +14,7 @@ // [START classroom_list_courses] + import com.google.api.client.http.HttpRequestInitializer; import com.google.api.client.http.javanet.NetHttpTransport; import com.google.api.client.json.gson.GsonFactory; @@ -31,54 +32,54 @@ /* Class to demonstrate the use of Classroom List Course API */ public class ListCourses { - /** - * Retrieves all courses with metadata - * - * @return list of courses with its metadata - * @throws IOException - if credentials file not found. - */ - public static List listCourses() throws IOException { + /** + * Retrieves all courses with metadata + * + * @return list of courses with its metadata + * @throws IOException - if credentials file not found. + */ + public static List listCourses() throws IOException { /* Load pre-authorized user credentials from the environment. TODO(developer) - See https://developers.google.com/identity for guides on implementing OAuth2 for your application. */ - GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() - .createScoped(Collections.singleton(ClassroomScopes.CLASSROOM_COURSES)); - HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( - credentials); + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Collections.singleton(ClassroomScopes.CLASSROOM_COURSES)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); - // Create the classroom API client - Classroom service = new Classroom.Builder(new NetHttpTransport(), - GsonFactory.getDefaultInstance(), - requestInitializer) - .setApplicationName("Classroom samples") - .build(); + // Create the classroom API client + Classroom service = new Classroom.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Classroom samples") + .build(); - String pageToken = null; - List courses = new ArrayList<>(); + String pageToken = null; + List courses = new ArrayList<>(); - try { - do { - ListCoursesResponse response = service.courses().list() - .setPageSize(100) - .setPageToken(pageToken) - .execute(); - courses.addAll(response.getCourses()); - pageToken = response.getNextPageToken(); - } while (pageToken != null); + try { + do { + ListCoursesResponse response = service.courses().list() + .setPageSize(100) + .setPageToken(pageToken) + .execute(); + courses.addAll(response.getCourses()); + pageToken = response.getNextPageToken(); + } while (pageToken != null); - if (courses.isEmpty()) { - System.out.println("No courses found."); - } else { - System.out.println("Courses:"); - for (Course course : courses) { - System.out.printf("%s (%s)\n", course.getName(), course.getId()); - } - } - } catch (NullPointerException ne) { - // TODO(developer) - handle error appropriately - System.err.println("No courses found.\n"); + if (courses.isEmpty()) { + System.out.println("No courses found."); + } else { + System.out.println("Courses:"); + for (Course course : courses) { + System.out.printf("%s (%s)\n", course.getName(), course.getId()); } - return courses; + } + } catch (NullPointerException ne) { + // TODO(developer) - handle error appropriately + System.err.println("No courses found.\n"); } + return courses; + } } // [END classroom_list_courses] \ No newline at end of file diff --git a/classroom/snippets/src/main/java/PatchCourse.java b/classroom/snippets/src/main/java/PatchCourse.java index fd0f8e5b..e8c5d31b 100644 --- a/classroom/snippets/src/main/java/PatchCourse.java +++ b/classroom/snippets/src/main/java/PatchCourse.java @@ -14,6 +14,7 @@ // [START classroom_patch_course] + import com.google.api.client.googleapis.json.GoogleJsonError; import com.google.api.client.googleapis.json.GoogleJsonResponseException; import com.google.api.client.http.HttpRequestInitializer; @@ -29,47 +30,47 @@ /* Class to demonstrate the use of Classroom Patch Course API */ public class PatchCourse { - /** - * Updates one or more fields in a course. - * - * @param courseId - Id of the course to update. - * @return updated course - * @throws IOException - if credentials file not found. - */ - public static Course patchCourse(String courseId) throws IOException { + /** + * Updates one or more fields in a course. + * + * @param courseId - Id of the course to update. + * @return updated course + * @throws IOException - if credentials file not found. + */ + public static Course patchCourse(String courseId) throws IOException { /* Load pre-authorized user credentials from the environment. TODO(developer) - See https://developers.google.com/identity for guides on implementing OAuth2 for your application. */ - GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() - .createScoped(Collections.singleton(ClassroomScopes.CLASSROOM_COURSES)); - HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( - credentials); + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Collections.singleton(ClassroomScopes.CLASSROOM_COURSES)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); - // Create the classroom API client - Classroom service = new Classroom.Builder(new NetHttpTransport(), - GsonFactory.getDefaultInstance(), - requestInitializer) - .setApplicationName("Classroom samples") - .build(); - Course course = null; - try { - course = new Course() - .setSection("Period 3") - .setRoom("302"); - course = service.courses().patch(courseId, course) - .setUpdateMask("section,room") - .execute(); - System.out.printf("Course '%s' updated.\n", course.getName()); - } catch (GoogleJsonResponseException e) { - // TODO(developer) - handle error appropriately - GoogleJsonError error = e.getDetails(); - if (error.getCode() == 404) { - System.err.println("Course does not exist.\n"); - } else { - throw e; - } - } - return course; + // Create the classroom API client + Classroom service = new Classroom.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Classroom samples") + .build(); + Course course = null; + try { + course = new Course() + .setSection("Period 3") + .setRoom("302"); + course = service.courses().patch(courseId, course) + .setUpdateMask("section,room") + .execute(); + System.out.printf("Course '%s' updated.\n", course.getName()); + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + GoogleJsonError error = e.getDetails(); + if (error.getCode() == 404) { + System.err.println("Course does not exist.\n"); + } else { + throw e; + } } + return course; + } } // [END classroom_patch_course] \ No newline at end of file diff --git a/classroom/snippets/src/main/java/UpdateCourse.java b/classroom/snippets/src/main/java/UpdateCourse.java index bdd577cf..9e0d63ed 100644 --- a/classroom/snippets/src/main/java/UpdateCourse.java +++ b/classroom/snippets/src/main/java/UpdateCourse.java @@ -14,6 +14,7 @@ // [START classroom_update_course] + import com.google.api.client.googleapis.json.GoogleJsonError; import com.google.api.client.googleapis.json.GoogleJsonResponseException; import com.google.api.client.http.HttpRequestInitializer; @@ -29,48 +30,48 @@ /* Class to demonstrate the use of Classroom Update Course API */ public class UpdateCourse { - /** - * Updates a course's metadata. - * - * @param courseId - Id of the course to update. - * @return updated course - * @throws IOException - if credentials file not found. - */ - public static Course updateCourse(String courseId) throws IOException { + /** + * Updates a course's metadata. + * + * @param courseId - Id of the course to update. + * @return updated course + * @throws IOException - if credentials file not found. + */ + public static Course updateCourse(String courseId) throws IOException { /* Load pre-authorized user credentials from the environment. TODO(developer) - See https://developers.google.com/identity for guides on implementing OAuth2 for your application. */ - GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() - .createScoped(Collections.singleton(ClassroomScopes.CLASSROOM_COURSES)); - HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( - credentials); + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Collections.singleton(ClassroomScopes.CLASSROOM_COURSES)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); - // Create the classroom API client - Classroom service = new Classroom.Builder(new NetHttpTransport(), - GsonFactory.getDefaultInstance(), - requestInitializer) - .setApplicationName("Classroom samples") - .build(); + // Create the classroom API client + Classroom service = new Classroom.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Classroom samples") + .build(); - Course course = null; - try { - // Updating the section and room in a course - course = service.courses().get(courseId).execute(); - course.setSection("Period 3"); - course.setRoom("302"); - course = service.courses().update(courseId, course).execute(); - // Prints the updated course - System.out.printf("Course '%s' updated.\n", course.getName()); - } catch (GoogleJsonResponseException e) { - // TODO(developer) - handle error appropriately - GoogleJsonError error = e.getDetails(); - if (error.getCode() == 404) { - System.err.println("Course does not exist.\n"); - } else { - throw e; - } - } - return course; + Course course = null; + try { + // Updating the section and room in a course + course = service.courses().get(courseId).execute(); + course.setSection("Period 3"); + course.setRoom("302"); + course = service.courses().update(courseId, course).execute(); + // Prints the updated course + System.out.printf("Course '%s' updated.\n", course.getName()); + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + GoogleJsonError error = e.getDetails(); + if (error.getCode() == 404) { + System.err.println("Course does not exist.\n"); + } else { + throw e; + } } + return course; + } } // [END classroom_update_course] \ No newline at end of file diff --git a/classroom/snippets/src/test/java/BaseTest.java b/classroom/snippets/src/test/java/BaseTest.java index 4b69228f..c1e46717 100644 --- a/classroom/snippets/src/test/java/BaseTest.java +++ b/classroom/snippets/src/test/java/BaseTest.java @@ -29,57 +29,57 @@ import java.io.IOException; import java.util.UUID; - // Base class for integration tests. +// Base class for integration tests. public class BaseTest { - protected Classroom service; - protected Course testCourse; + protected Classroom service; + protected Course testCourse; - /** - * Creates a default authorization Classroom client service. - * - * @return an authorized Classroom client service - * @throws IOException - if credentials file not found. - */ - protected Classroom buildService() throws IOException { + /** + * Creates a default authorization Classroom client service. + * + * @return an authorized Classroom client service + * @throws IOException - if credentials file not found. + */ + protected Classroom buildService() throws IOException { /* Load pre-authorized user credentials from the environment. TODO(developer) - See https://developers.google.com/identity for guides on implementing OAuth2 for your application. */ - GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() - .createScoped(ClassroomScopes.CLASSROOM_ROSTERS); - HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( - credentials); + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(ClassroomScopes.CLASSROOM_ROSTERS); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); - // Create the classroom API client - Classroom service = new Classroom.Builder(new NetHttpTransport(), - GsonFactory.getDefaultInstance(), - requestInitializer) - .setApplicationName("Classroom Snippets") - .build(); + // Create the classroom API client + Classroom service = new Classroom.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Classroom Snippets") + .build(); - return service; - } + return service; + } - @Before - public void setup() throws IOException{ - this.service = buildService(); - this.testCourse = CreateCourse.createCourse(); - createAlias(this.testCourse.getId()); - } + @Before + public void setup() throws IOException { + this.service = buildService(); + this.testCourse = CreateCourse.createCourse(); + createAlias(this.testCourse.getId()); + } - @After - public void tearDown() throws IOException{ - deleteCourse(this.testCourse.getId()); - this.testCourse = null; - } + @After + public void tearDown() throws IOException { + deleteCourse(this.testCourse.getId()); + this.testCourse = null; + } - public CourseAlias createAlias(String courseId) throws IOException { - String alias = "p:" + UUID.randomUUID(); - CourseAlias courseAlias = new CourseAlias().setAlias(alias); - courseAlias = this.service.courses().aliases().create(courseId, courseAlias).execute(); - return courseAlias; - } + public CourseAlias createAlias(String courseId) throws IOException { + String alias = "p:" + UUID.randomUUID(); + CourseAlias courseAlias = new CourseAlias().setAlias(alias); + courseAlias = this.service.courses().aliases().create(courseId, courseAlias).execute(); + return courseAlias; + } - public void deleteCourse(String courseId) throws IOException { - this.service.courses().delete(courseId).execute(); - } + public void deleteCourse(String courseId) throws IOException { + this.service.courses().delete(courseId).execute(); + } } diff --git a/classroom/snippets/src/test/java/CoursesTest.java b/classroom/snippets/src/test/java/CoursesTest.java index 858d4540..81b6de6e 100644 --- a/classroom/snippets/src/test/java/CoursesTest.java +++ b/classroom/snippets/src/test/java/CoursesTest.java @@ -34,109 +34,109 @@ * Tests for the courses snippets. */ public class CoursesTest extends BaseTest { - private Classroom service; - private Course testCourse; - private String otherUser = "erics@homeroomacademy.com"; - - public CoursesTest() throws IOException { - this.service = this.getService(); - } - - @Before - public void setUp() throws IOException { - this.testCourse = createTestCourse("me"); - } - - @After - public void tearDown() throws IOException { - deleteCourse(this.testCourse.getId()); - this.testCourse = null; - } - - @Test - public void testCreateCourse() throws IOException { - Course course = Courses.createCourse(this.service); - Assert.assertNotNull("Course not returned.", course); - deleteCourse(course.getId()); - } - - @Test - public void testGetCourse() throws IOException { - Course course = Courses.getCourse(this.service, this.testCourse.getId()); - Assert.assertNotNull("Course not returned.", course); - Assert.assertEquals("Wrong course returned.", this.testCourse.getId(), course.getId()); - } - - @Test - public void testListCourses() throws IOException { - List courses = Courses.listCourses(this.service); - Assert.assertTrue("No courses returned.", courses.size() > 0); - } - - @Test - public void testUpdateCourse() throws IOException { - Course course = Courses.updateCourse(this.service, this.testCourse.getId()); - Assert.assertNotNull("Course not returned.", course); - Assert.assertEquals("Wrong course returned.", this.testCourse.getId(), course.getId()); - } - - @Test - public void testPatchCourse() throws IOException { - Course course = Courses.patchCourse(this.service, this.testCourse.getId()); - Assert.assertNotNull("Course not returned.", course); - Assert.assertEquals("Wrong course returned.", this.testCourse.getId(), course.getId()); - } - - @Test - public void testCreateCourseAlias() throws IOException { - String alias = "p:" + UUID.randomUUID().toString(); - CourseAlias courseAlias = - Courses.createCourseAlias(this.service, this.testCourse.getId(), alias); - Assert.assertNotNull("Course alias not returned.", courseAlias); - Assert.assertEquals("Wrong course alias returned.", alias, courseAlias.getAlias()); - } - - @Test - public void testListCourseAliases() throws IOException { - List courseAliases = - Courses.listCourseAliases(this.service, this.testCourse.getId()); - Assert.assertTrue("Incorrect number of course aliases returned.", courseAliases.size() == 1); - } - - @Test - public void testAddTeacher() throws IOException { - Teacher teacher = Courses.addTeacher(this.service, this.testCourse.getId(), this.otherUser); - Assert.assertNotNull("Teacher not returned.", teacher); - Assert.assertEquals("Teacher added to wrong course.", this.testCourse.getId(), - teacher.getCourseId()); - } - - @Test - public void testEnrollAsStudent() throws IOException { - Course course = this.createTestCourse(this.otherUser); - Student student = - Courses.enrollAsStudent(this.service, course.getId(), course.getEnrollmentCode()); - this.deleteCourse(course.getId()); - Assert.assertNotNull("Student not returned.", student); - Assert.assertEquals("Student added to wrong course.", course.getId(), - student.getCourseId()); - } - - @Test - public void testBatchAddStudents() throws IOException { - List studentEmails = - Arrays.asList("erics@homeroomacademy.com", "zach@homeroomacademy.com"); - Courses.batchAddStudents(this.service, this.testCourse.getId(), studentEmails); - } - - private Course createTestCourse(String ownerId) throws IOException { - String alias = "p:" + UUID.randomUUID().toString(); - Course course = new Course().setId(alias).setName("Test Course").setSection("Section") - .setOwnerId(ownerId); - return this.service.courses().create(course).execute(); - } - - private void deleteCourse(String courseId) throws IOException { - this.service.courses().delete(courseId).execute(); - } + private Classroom service; + private Course testCourse; + private String otherUser = "erics@homeroomacademy.com"; + + public CoursesTest() throws IOException { + this.service = this.getService(); + } + + @Before + public void setUp() throws IOException { + this.testCourse = createTestCourse("me"); + } + + @After + public void tearDown() throws IOException { + deleteCourse(this.testCourse.getId()); + this.testCourse = null; + } + + @Test + public void testCreateCourse() throws IOException { + Course course = Courses.createCourse(this.service); + Assert.assertNotNull("Course not returned.", course); + deleteCourse(course.getId()); + } + + @Test + public void testGetCourse() throws IOException { + Course course = Courses.getCourse(this.service, this.testCourse.getId()); + Assert.assertNotNull("Course not returned.", course); + Assert.assertEquals("Wrong course returned.", this.testCourse.getId(), course.getId()); + } + + @Test + public void testListCourses() throws IOException { + List courses = Courses.listCourses(this.service); + Assert.assertTrue("No courses returned.", courses.size() > 0); + } + + @Test + public void testUpdateCourse() throws IOException { + Course course = Courses.updateCourse(this.service, this.testCourse.getId()); + Assert.assertNotNull("Course not returned.", course); + Assert.assertEquals("Wrong course returned.", this.testCourse.getId(), course.getId()); + } + + @Test + public void testPatchCourse() throws IOException { + Course course = Courses.patchCourse(this.service, this.testCourse.getId()); + Assert.assertNotNull("Course not returned.", course); + Assert.assertEquals("Wrong course returned.", this.testCourse.getId(), course.getId()); + } + + @Test + public void testCreateCourseAlias() throws IOException { + String alias = "p:" + UUID.randomUUID().toString(); + CourseAlias courseAlias = + Courses.createCourseAlias(this.service, this.testCourse.getId(), alias); + Assert.assertNotNull("Course alias not returned.", courseAlias); + Assert.assertEquals("Wrong course alias returned.", alias, courseAlias.getAlias()); + } + + @Test + public void testListCourseAliases() throws IOException { + List courseAliases = + Courses.listCourseAliases(this.service, this.testCourse.getId()); + Assert.assertTrue("Incorrect number of course aliases returned.", courseAliases.size() == 1); + } + + @Test + public void testAddTeacher() throws IOException { + Teacher teacher = Courses.addTeacher(this.service, this.testCourse.getId(), this.otherUser); + Assert.assertNotNull("Teacher not returned.", teacher); + Assert.assertEquals("Teacher added to wrong course.", this.testCourse.getId(), + teacher.getCourseId()); + } + + @Test + public void testEnrollAsStudent() throws IOException { + Course course = this.createTestCourse(this.otherUser); + Student student = + Courses.enrollAsStudent(this.service, course.getId(), course.getEnrollmentCode()); + this.deleteCourse(course.getId()); + Assert.assertNotNull("Student not returned.", student); + Assert.assertEquals("Student added to wrong course.", course.getId(), + student.getCourseId()); + } + + @Test + public void testBatchAddStudents() throws IOException { + List studentEmails = + Arrays.asList("erics@homeroomacademy.com", "zach@homeroomacademy.com"); + Courses.batchAddStudents(this.service, this.testCourse.getId(), studentEmails); + } + + private Course createTestCourse(String ownerId) throws IOException { + String alias = "p:" + UUID.randomUUID().toString(); + Course course = new Course().setId(alias).setName("Test Course").setSection("Section") + .setOwnerId(ownerId); + return this.service.courses().create(course).execute(); + } + + private void deleteCourse(String courseId) throws IOException { + this.service.courses().delete(courseId).execute(); + } } diff --git a/classroom/snippets/src/test/java/TestAddStudent.java b/classroom/snippets/src/test/java/TestAddStudent.java index 8d6a9bb9..f023989a 100644 --- a/classroom/snippets/src/test/java/TestAddStudent.java +++ b/classroom/snippets/src/test/java/TestAddStudent.java @@ -19,15 +19,15 @@ import java.io.IOException; // Unit test class for Add Student classroom snippet -public class TestAddStudent extends BaseTest{ +public class TestAddStudent extends BaseTest { - @Test - public void testAddStudent() throws IOException { - Course course = CreateCourse.createCourse(); - Student student = AddStudent.addStudent(course.getId(), course.getEnrollmentCode()); - deleteCourse(course.getId()); - Assert.assertNotNull("Student not returned.", student); - Assert.assertEquals("Student added to wrong course.", course.getId(), - student.getCourseId()); - } + @Test + public void testAddStudent() throws IOException { + Course course = CreateCourse.createCourse(); + Student student = AddStudent.addStudent(course.getId(), course.getEnrollmentCode()); + deleteCourse(course.getId()); + Assert.assertNotNull("Student not returned.", student); + Assert.assertEquals("Student added to wrong course.", course.getId(), + student.getCourseId()); + } } \ No newline at end of file diff --git a/classroom/snippets/src/test/java/TestAddTeacher.java b/classroom/snippets/src/test/java/TestAddTeacher.java index f66ce0bd..f2846ddf 100644 --- a/classroom/snippets/src/test/java/TestAddTeacher.java +++ b/classroom/snippets/src/test/java/TestAddTeacher.java @@ -18,14 +18,14 @@ import java.io.IOException; // Unit test class for Add Teacher classroom snippet -public class TestAddTeacher extends BaseTest{ - private String otherUser = "gduser1@workspacesamples.dev"; +public class TestAddTeacher extends BaseTest { + private String otherUser = "gduser1@workspacesamples.dev"; - @Test - public void testAddTeacher() throws IOException { - Teacher teacher = AddTeacher.addTeacher(testCourse.getId(), this.otherUser); - Assert.assertNotNull("Teacher not returned.", teacher); - Assert.assertEquals("Teacher added to wrong course.", testCourse.getId(), - teacher.getCourseId()); - } + @Test + public void testAddTeacher() throws IOException { + Teacher teacher = AddTeacher.addTeacher(testCourse.getId(), this.otherUser); + Assert.assertNotNull("Teacher not returned.", teacher); + Assert.assertEquals("Teacher added to wrong course.", testCourse.getId(), + teacher.getCourseId()); + } } \ No newline at end of file diff --git a/classroom/snippets/src/test/java/TestBatchAddStudents.java b/classroom/snippets/src/test/java/TestBatchAddStudents.java index c21eb3f2..04ee930e 100644 --- a/classroom/snippets/src/test/java/TestBatchAddStudents.java +++ b/classroom/snippets/src/test/java/TestBatchAddStudents.java @@ -20,10 +20,10 @@ // Unit test class for Batch Add Students classroom snippet public class TestBatchAddStudents extends BaseTest { - @Test - public void testBatchAddStudents() throws IOException { - List studentEmails = Arrays.asList("gduser2@workpsacesamples.dev", - "gduser3@workpsacesamples.dev"); - BatchAddStudents.batchAddStudents(testCourse.getId(), studentEmails); - } + @Test + public void testBatchAddStudents() throws IOException { + List studentEmails = Arrays.asList("gduser2@workpsacesamples.dev", + "gduser3@workpsacesamples.dev"); + BatchAddStudents.batchAddStudents(testCourse.getId(), studentEmails); + } } \ No newline at end of file diff --git a/classroom/snippets/src/test/java/TestCreateCourse.java b/classroom/snippets/src/test/java/TestCreateCourse.java index caa70281..381f2c2c 100644 --- a/classroom/snippets/src/test/java/TestCreateCourse.java +++ b/classroom/snippets/src/test/java/TestCreateCourse.java @@ -18,12 +18,12 @@ import java.io.IOException; // Unit test class for Create Course classroom snippet -public class TestCreateCourse extends BaseTest{ +public class TestCreateCourse extends BaseTest { - @Test - public void testCreateCourse() throws IOException{ - Course course = CreateCourse.createCourse(); - Assert.assertNotNull("Course not returned.", course); - deleteCourse(course.getId()); - } + @Test + public void testCreateCourse() throws IOException { + Course course = CreateCourse.createCourse(); + Assert.assertNotNull("Course not returned.", course); + deleteCourse(course.getId()); + } } diff --git a/classroom/snippets/src/test/java/TestGetCourse.java b/classroom/snippets/src/test/java/TestGetCourse.java index a17cf197..c43059f7 100644 --- a/classroom/snippets/src/test/java/TestGetCourse.java +++ b/classroom/snippets/src/test/java/TestGetCourse.java @@ -18,12 +18,12 @@ import java.io.IOException; // Unit test class for Get Course classroom snippet -public class TestGetCourse extends BaseTest{ +public class TestGetCourse extends BaseTest { - @Test - public void testGetCourse() throws IOException { - Course course = GetCourse.getCourse(testCourse.getId()); - Assert.assertNotNull("Course not returned.", course); - Assert.assertEquals("Wrong course returned.", testCourse.getId(), course.getId()); - } + @Test + public void testGetCourse() throws IOException { + Course course = GetCourse.getCourse(testCourse.getId()); + Assert.assertNotNull("Course not returned.", course); + Assert.assertEquals("Wrong course returned.", testCourse.getId(), course.getId()); + } } diff --git a/classroom/snippets/src/test/java/TestListCourseAliases.java b/classroom/snippets/src/test/java/TestListCourseAliases.java index b7396361..f18c1cce 100644 --- a/classroom/snippets/src/test/java/TestListCourseAliases.java +++ b/classroom/snippets/src/test/java/TestListCourseAliases.java @@ -19,11 +19,11 @@ import java.util.List; // Unit test class for List Course Aliases classroom snippet -public class TestListCourseAliases extends BaseTest{ +public class TestListCourseAliases extends BaseTest { - @Test - public void testListCourseAliases() throws IOException { - List courseAliases = ListCourseAliases.listCourseAliases(testCourse.getId()); - Assert.assertTrue("Incorrect number of course aliases returned.", courseAliases.size() == 1); - } + @Test + public void testListCourseAliases() throws IOException { + List courseAliases = ListCourseAliases.listCourseAliases(testCourse.getId()); + Assert.assertTrue("Incorrect number of course aliases returned.", courseAliases.size() == 1); + } } \ No newline at end of file diff --git a/classroom/snippets/src/test/java/TestListCourses.java b/classroom/snippets/src/test/java/TestListCourses.java index 55a3a1fc..fe254b76 100644 --- a/classroom/snippets/src/test/java/TestListCourses.java +++ b/classroom/snippets/src/test/java/TestListCourses.java @@ -21,9 +21,9 @@ // Unit test class for List Course classroom snippet public class TestListCourses { - @Test - public void testListCourses() throws IOException { - List courses = ListCourses.listCourses(); - Assert.assertTrue("No courses returned.", courses.size() > 0); - } + @Test + public void testListCourses() throws IOException { + List courses = ListCourses.listCourses(); + Assert.assertTrue("No courses returned.", courses.size() > 0); + } } diff --git a/classroom/snippets/src/test/java/TestPatchCourse.java b/classroom/snippets/src/test/java/TestPatchCourse.java index 3cf341c8..51e05a43 100644 --- a/classroom/snippets/src/test/java/TestPatchCourse.java +++ b/classroom/snippets/src/test/java/TestPatchCourse.java @@ -18,12 +18,12 @@ import java.io.IOException; // Unit test class for Patch Course classroom snippet -public class TestPatchCourse extends BaseTest{ +public class TestPatchCourse extends BaseTest { - @Test - public void testPatchCourse() throws IOException { - Course course = PatchCourse.patchCourse(testCourse.getId()); - Assert.assertNotNull("Course not returned.", course); - Assert.assertEquals("Wrong course returned.", testCourse.getId(), course.getId()); - } + @Test + public void testPatchCourse() throws IOException { + Course course = PatchCourse.patchCourse(testCourse.getId()); + Assert.assertNotNull("Course not returned.", course); + Assert.assertEquals("Wrong course returned.", testCourse.getId(), course.getId()); + } } diff --git a/classroom/snippets/src/test/java/TestUpdateCourse.java b/classroom/snippets/src/test/java/TestUpdateCourse.java index 3926443e..f5e0080d 100644 --- a/classroom/snippets/src/test/java/TestUpdateCourse.java +++ b/classroom/snippets/src/test/java/TestUpdateCourse.java @@ -18,12 +18,12 @@ import java.io.IOException; // Unit test class for Update Course classroom snippet -public class TestUpdateCourse extends BaseTest{ +public class TestUpdateCourse extends BaseTest { - @Test - public void testUpdateCourse() throws IOException { - Course course = UpdateCourse.updateCourse(testCourse.getId()); - Assert.assertNotNull("Course not returned.", course); - Assert.assertEquals("Wrong course returned.", testCourse.getId(), course.getId()); - } + @Test + public void testUpdateCourse() throws IOException { + Course course = UpdateCourse.updateCourse(testCourse.getId()); + Assert.assertNotNull("Course not returned.", course); + Assert.assertEquals("Wrong course returned.", testCourse.getId(), course.getId()); + } } diff --git a/docs/outputJSON/src/main/java/OutputJSON.java b/docs/outputJSON/src/main/java/OutputJSON.java index 84e41f4e..e7ad0715 100644 --- a/docs/outputJSON/src/main/java/OutputJSON.java +++ b/docs/outputJSON/src/main/java/OutputJSON.java @@ -35,59 +35,60 @@ import java.util.List; // [START docs_output_json] + /** * OutputJSON prints the JSON representation of a Google Doc. */ public class OutputJSON { - private static final String APPLICATION_NAME = "Google Docs API Document Contents"; - private static final JsonFactory JSON_FACTORY = GsonFactory.getDefaultInstance(); - private static final String TOKENS_DIRECTORY_PATH = "tokens"; - private static final String DOCUMENT_ID = "YOUR_DOCUMENT_ID"; + private static final String APPLICATION_NAME = "Google Docs API Document Contents"; + private static final JsonFactory JSON_FACTORY = GsonFactory.getDefaultInstance(); + private static final String TOKENS_DIRECTORY_PATH = "tokens"; + private static final String DOCUMENT_ID = "YOUR_DOCUMENT_ID"; - /** - * Global instance of the scopes required by this sample. If modifying these scopes, delete - * your previously saved tokens/ folder. - */ - private static final List SCOPES = - Collections.singletonList(DocsScopes.DOCUMENTS_READONLY); + /** + * Global instance of the scopes required by this sample. If modifying these scopes, delete + * your previously saved tokens/ folder. + */ + private static final List SCOPES = + Collections.singletonList(DocsScopes.DOCUMENTS_READONLY); - private static final String CREDENTIALS_FILE_PATH = "/credentials.json"; + private static final String CREDENTIALS_FILE_PATH = "/credentials.json"; - /** - * Creates an authorized Credential object. - * - * @param HTTP_TRANSPORT The network HTTP Transport. - * @return An authorized Credential object. - * @throws IOException If the credentials.json file cannot be found. - */ - private static Credential getCredentials(final NetHttpTransport HTTP_TRANSPORT) - throws IOException { - // Load client secrets. - InputStream in = OutputJSON.class.getResourceAsStream(CREDENTIALS_FILE_PATH); - GoogleClientSecrets credentials = - GoogleClientSecrets.load(JSON_FACTORY, new InputStreamReader(in)); + /** + * Creates an authorized Credential object. + * + * @param HTTP_TRANSPORT The network HTTP Transport. + * @return An authorized Credential object. + * @throws IOException If the credentials.json file cannot be found. + */ + private static Credential getCredentials(final NetHttpTransport HTTP_TRANSPORT) + throws IOException { + // Load client secrets. + InputStream in = OutputJSON.class.getResourceAsStream(CREDENTIALS_FILE_PATH); + GoogleClientSecrets credentials = + GoogleClientSecrets.load(JSON_FACTORY, new InputStreamReader(in)); - // Build flow and trigger user authorization request. - GoogleAuthorizationCodeFlow flow = - new GoogleAuthorizationCodeFlow.Builder(HTTP_TRANSPORT, JSON_FACTORY, credentials, SCOPES) - .setDataStoreFactory(new FileDataStoreFactory(new java.io.File(TOKENS_DIRECTORY_PATH))) - .setAccessType("offline") - .build(); - LocalServerReceiver receiver = new LocalServerReceiver.Builder().setPort(8888).build(); - return new AuthorizationCodeInstalledApp(flow, receiver).authorize("user"); - } + // Build flow and trigger user authorization request. + GoogleAuthorizationCodeFlow flow = + new GoogleAuthorizationCodeFlow.Builder(HTTP_TRANSPORT, JSON_FACTORY, credentials, SCOPES) + .setDataStoreFactory(new FileDataStoreFactory(new java.io.File(TOKENS_DIRECTORY_PATH))) + .setAccessType("offline") + .build(); + LocalServerReceiver receiver = new LocalServerReceiver.Builder().setPort(8888).build(); + return new AuthorizationCodeInstalledApp(flow, receiver).authorize("user"); + } - public static void main(String... args) throws IOException, GeneralSecurityException { - // Build a new authorized API client service. - final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport(); - Docs docsService = - new Docs.Builder(HTTP_TRANSPORT, JSON_FACTORY, getCredentials(HTTP_TRANSPORT)) - .setApplicationName(APPLICATION_NAME) - .build(); + public static void main(String... args) throws IOException, GeneralSecurityException { + // Build a new authorized API client service. + final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport(); + Docs docsService = + new Docs.Builder(HTTP_TRANSPORT, JSON_FACTORY, getCredentials(HTTP_TRANSPORT)) + .setApplicationName(APPLICATION_NAME) + .build(); - Document response = docsService.documents().get(DOCUMENT_ID).execute(); - Gson gson = new GsonBuilder().setPrettyPrinting().create(); - System.out.println(gson.toJson(response)); - } + Document response = docsService.documents().get(DOCUMENT_ID).execute(); + Gson gson = new GsonBuilder().setPrettyPrinting().create(); + System.out.println(gson.toJson(response)); + } } // [END docs_output_json] diff --git a/docs/quickstart/src/main/java/DocsQuickstart.java b/docs/quickstart/src/main/java/DocsQuickstart.java index f8321a67..431c8394 100644 --- a/docs/quickstart/src/main/java/DocsQuickstart.java +++ b/docs/quickstart/src/main/java/DocsQuickstart.java @@ -13,6 +13,7 @@ // limitations under the License. // [START docs_quickstart] + import com.google.api.client.auth.oauth2.Credential; import com.google.api.client.extensions.java6.auth.oauth2.AuthorizationCodeInstalledApp; import com.google.api.client.extensions.jetty.auth.oauth2.LocalServerReceiver; @@ -37,60 +38,70 @@ /* class to demonstarte use of Docs get documents API */ public class DocsQuickstart { - /** Application name. */ - private static final String APPLICATION_NAME = "Google Docs API Java Quickstart"; - /** Global instance of the JSON factory. */ - private static final JsonFactory JSON_FACTORY = GsonFactory.getDefaultInstance(); - /** Directory to store authorization tokens for this application. */ - private static final String TOKENS_DIRECTORY_PATH = "tokens"; - private static final String DOCUMENT_ID = "195j9eDD3ccgjQRttHhJPymLJUCOUjs-jmwTrekvdjFE"; - - /** - * Global instance of the scopes required by this quickstart. - * If modifying these scopes, delete your previously saved tokens/ folder. - */ - private static final List SCOPES = Collections.singletonList(DocsScopes.DOCUMENTS_READONLY); - private static final String CREDENTIALS_FILE_PATH = "/credentials.json"; + /** + * Application name. + */ + private static final String APPLICATION_NAME = "Google Docs API Java Quickstart"; + /** + * Global instance of the JSON factory. + */ + private static final JsonFactory JSON_FACTORY = GsonFactory.getDefaultInstance(); + /** + * Directory to store authorization tokens for this application. + */ + private static final String TOKENS_DIRECTORY_PATH = "tokens"; + private static final String DOCUMENT_ID = "195j9eDD3ccgjQRttHhJPymLJUCOUjs-jmwTrekvdjFE"; - /** - * Creates an authorized Credential object. - * @param HTTP_TRANSPORT The network HTTP Transport. - * @return An authorized Credential object. - * @throws IOException If the credentials.json file cannot be found. - */ - private static Credential getCredentials(final NetHttpTransport HTTP_TRANSPORT) throws IOException { - // Load client secrets. - InputStream in = DocsQuickstart.class.getResourceAsStream(CREDENTIALS_FILE_PATH); - if (in == null) { - throw new FileNotFoundException("Resource not found: " + CREDENTIALS_FILE_PATH); - } - GoogleClientSecrets clientSecrets = GoogleClientSecrets.load(JSON_FACTORY, new InputStreamReader(in)); + /** + * Global instance of the scopes required by this quickstart. + * If modifying these scopes, delete your previously saved tokens/ folder. + */ + private static final List SCOPES = + Collections.singletonList(DocsScopes.DOCUMENTS_READONLY); + private static final String CREDENTIALS_FILE_PATH = "/credentials.json"; - // Build flow and trigger user authorization request. - GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow.Builder( - HTTP_TRANSPORT, JSON_FACTORY, clientSecrets, SCOPES) - .setDataStoreFactory(new FileDataStoreFactory(new java.io.File(TOKENS_DIRECTORY_PATH))) - .setAccessType("offline") - .build(); - LocalServerReceiver receiver = new LocalServerReceiver.Builder().setPort(8888).build(); - Credential credential = new AuthorizationCodeInstalledApp(flow, receiver).authorize("user"); - //returns an authorized Credential object. - return credential; + /** + * Creates an authorized Credential object. + * + * @param HTTP_TRANSPORT The network HTTP Transport. + * @return An authorized Credential object. + * @throws IOException If the credentials.json file cannot be found. + */ + private static Credential getCredentials(final NetHttpTransport HTTP_TRANSPORT) + throws IOException { + // Load client secrets. + InputStream in = DocsQuickstart.class.getResourceAsStream(CREDENTIALS_FILE_PATH); + if (in == null) { + throw new FileNotFoundException("Resource not found: " + CREDENTIALS_FILE_PATH); } + GoogleClientSecrets clientSecrets = + GoogleClientSecrets.load(JSON_FACTORY, new InputStreamReader(in)); - public static void main(String... args) throws IOException, GeneralSecurityException { - // Build a new authorized API client service. - final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport(); - Docs service = new Docs.Builder(HTTP_TRANSPORT, JSON_FACTORY, getCredentials(HTTP_TRANSPORT)) - .setApplicationName(APPLICATION_NAME) - .build(); + // Build flow and trigger user authorization request. + GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow.Builder( + HTTP_TRANSPORT, JSON_FACTORY, clientSecrets, SCOPES) + .setDataStoreFactory(new FileDataStoreFactory(new java.io.File(TOKENS_DIRECTORY_PATH))) + .setAccessType("offline") + .build(); + LocalServerReceiver receiver = new LocalServerReceiver.Builder().setPort(8888).build(); + Credential credential = new AuthorizationCodeInstalledApp(flow, receiver).authorize("user"); + //returns an authorized Credential object. + return credential; + } - // Prints the title of the requested doc: - // https://docs.google.com/document/d/195j9eDD3ccgjQRttHhJPymLJUCOUjs-jmwTrekvdjFE/edit - Document response = service.documents().get(DOCUMENT_ID).execute(); - String title = response.getTitle(); + public static void main(String... args) throws IOException, GeneralSecurityException { + // Build a new authorized API client service. + final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport(); + Docs service = new Docs.Builder(HTTP_TRANSPORT, JSON_FACTORY, getCredentials(HTTP_TRANSPORT)) + .setApplicationName(APPLICATION_NAME) + .build(); - System.out.printf("The title of the doc is: %s\n", title); - } + // Prints the title of the requested doc: + // https://docs.google.com/document/d/195j9eDD3ccgjQRttHhJPymLJUCOUjs-jmwTrekvdjFE/edit + Document response = service.documents().get(DOCUMENT_ID).execute(); + String title = response.getTitle(); + + System.out.printf("The title of the doc is: %s\n", title); + } } // [END docs_quickstart] diff --git a/drive/activity-v2/quickstart/src/main/java/DriveActivityQuickstart.java b/drive/activity-v2/quickstart/src/main/java/DriveActivityQuickstart.java index db0b7c36..6e2c9b16 100644 --- a/drive/activity-v2/quickstart/src/main/java/DriveActivityQuickstart.java +++ b/drive/activity-v2/quickstart/src/main/java/DriveActivityQuickstart.java @@ -13,6 +13,7 @@ // limitations under the License. // [START drive_activity_v2_quickstart] + import com.google.api.client.auth.oauth2.Credential; import com.google.api.client.extensions.java6.auth.oauth2.AuthorizationCodeInstalledApp; import com.google.api.client.extensions.jetty.auth.oauth2.LocalServerReceiver; @@ -36,182 +37,205 @@ import java.util.stream.Collectors; public class DriveActivityQuickstart { - /** Application name. */ - private static final String APPLICATION_NAME = "Drive Activity API Java Quickstart"; - - /** Directory to store authorization tokens for this application. */ - private static final java.io.File DATA_STORE_DIR = new java.io.File("tokens"); - - /** Global instance of the {@link FileDataStoreFactory}. */ - private static FileDataStoreFactory DATA_STORE_FACTORY; - - /** Global instance of the JSON factory. */ - private static final JsonFactory JSON_FACTORY = GsonFactory.getDefaultInstance(); - - /** Global instance of the HTTP transport. */ - private static HttpTransport HTTP_TRANSPORT; - - /** - * Global instance of the scopes required by this quickstart. - * - *

If modifying these scopes, delete your previously saved tokens/ folder. - */ - private static final List SCOPES = - Arrays.asList(DriveActivityScopes.DRIVE_ACTIVITY_READONLY); - private static final String CREDENTIALS_FILE_PATH = "/credentials.json"; - - static { - try { - HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport(); - DATA_STORE_FACTORY = new FileDataStoreFactory(DATA_STORE_DIR); - } catch (Throwable t) { - t.printStackTrace(); - System.exit(1); - } - } - - /** - * Creates an authorized Credential object. - * - * @return an authorized Credential object. - * @throws IOException - */ - public static Credential authorize() throws IOException { - // Load client secrets. - InputStream in = DriveActivityQuickstart.class.getResourceAsStream(CREDENTIALS_FILE_PATH); - if (in == null) { - throw new FileNotFoundException("Resource not found: " + CREDENTIALS_FILE_PATH); - } - GoogleClientSecrets clientSecrets = - GoogleClientSecrets.load(JSON_FACTORY, new InputStreamReader(in)); - - // Build flow and trigger user authorization request. - GoogleAuthorizationCodeFlow flow = - new GoogleAuthorizationCodeFlow.Builder( - HTTP_TRANSPORT, JSON_FACTORY, clientSecrets, SCOPES) - .setDataStoreFactory(DATA_STORE_FACTORY) - .setAccessType("offline") - .build(); - Credential credential = - new AuthorizationCodeInstalledApp(flow, new LocalServerReceiver()) - .authorize("user"); - System.out.println("Credentials saved to " + DATA_STORE_DIR.getAbsolutePath()); - return credential; + /** + * Application name. + */ + private static final String APPLICATION_NAME = "Drive Activity API Java Quickstart"; + + /** + * Directory to store authorization tokens for this application. + */ + private static final java.io.File DATA_STORE_DIR = new java.io.File("tokens"); + /** + * Global instance of the JSON factory. + */ + private static final JsonFactory JSON_FACTORY = GsonFactory.getDefaultInstance(); + /** + * Global instance of the scopes required by this quickstart. + * + *

If modifying these scopes, delete your previously saved tokens/ folder. + */ + private static final List SCOPES = + Arrays.asList(DriveActivityScopes.DRIVE_ACTIVITY_READONLY); + private static final String CREDENTIALS_FILE_PATH = "/credentials.json"; + /** + * Global instance of the {@link FileDataStoreFactory}. + */ + private static FileDataStoreFactory DATA_STORE_FACTORY; + /** + * Global instance of the HTTP transport. + */ + private static HttpTransport HTTP_TRANSPORT; + + static { + try { + HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport(); + DATA_STORE_FACTORY = new FileDataStoreFactory(DATA_STORE_DIR); + } catch (Throwable t) { + t.printStackTrace(); + System.exit(1); } - - /** - * Build and return an authorized Drive Activity client service. - * - * @return an authorized DriveActivity client service - * @throws IOException - */ - public static com.google.api.services.driveactivity.v2.DriveActivity getDriveActivityService() - throws IOException { - Credential credential = authorize(); - com.google.api.services.driveactivity.v2.DriveActivity service = new com.google.api.services.driveactivity.v2.DriveActivity.Builder( - HTTP_TRANSPORT, JSON_FACTORY, credential) - .setApplicationName(APPLICATION_NAME) - .build(); - return service; + } + + /** + * Creates an authorized Credential object. + * + * @return an authorized Credential object. + * @throws IOException + */ + public static Credential authorize() throws IOException { + // Load client secrets. + InputStream in = DriveActivityQuickstart.class.getResourceAsStream(CREDENTIALS_FILE_PATH); + if (in == null) { + throw new FileNotFoundException("Resource not found: " + CREDENTIALS_FILE_PATH); } - - public static void main(String[] args) throws IOException { - // Build a new authorized API client service. - com.google.api.services.driveactivity.v2.DriveActivity service = getDriveActivityService(); - - // Print the recent activity in your Google Drive. - QueryDriveActivityResponse result = - service.activity().query(new QueryDriveActivityRequest().setPageSize(10)).execute(); - List activities = result.getActivities(); - if (activities == null || activities.size() == 0) { - System.out.println("No activity."); - } else { - System.out.println("Recent activity:"); - for (DriveActivity activity : activities) { - String time = getTimeInfo(activity); - String action = getActionInfo(activity.getPrimaryActionDetail()); - List actors = - activity.getActors().stream() - .map(DriveActivityQuickstart::getActorInfo) - .collect(Collectors.toList()); - List targets = - activity.getTargets().stream() - .map(DriveActivityQuickstart::getTargetInfo) - .collect(Collectors.toList()); - System.out.printf( - "%s: %s, %s, %s\n", time, truncated(actors), action, truncated(targets)); - } - } - } - - /** Returns a string representation of the first elements in a list. */ - private static String truncated(List array) { - return truncatedTo(array, 2); + GoogleClientSecrets clientSecrets = + GoogleClientSecrets.load(JSON_FACTORY, new InputStreamReader(in)); + + // Build flow and trigger user authorization request. + GoogleAuthorizationCodeFlow flow = + new GoogleAuthorizationCodeFlow.Builder( + HTTP_TRANSPORT, JSON_FACTORY, clientSecrets, SCOPES) + .setDataStoreFactory(DATA_STORE_FACTORY) + .setAccessType("offline") + .build(); + Credential credential = + new AuthorizationCodeInstalledApp(flow, new LocalServerReceiver()) + .authorize("user"); + System.out.println("Credentials saved to " + DATA_STORE_DIR.getAbsolutePath()); + return credential; + } + + /** + * Build and return an authorized Drive Activity client service. + * + * @return an authorized DriveActivity client service + * @throws IOException + */ + public static com.google.api.services.driveactivity.v2.DriveActivity getDriveActivityService() + throws IOException { + Credential credential = authorize(); + com.google.api.services.driveactivity.v2.DriveActivity service = + new com.google.api.services.driveactivity.v2.DriveActivity.Builder( + HTTP_TRANSPORT, JSON_FACTORY, credential) + .setApplicationName(APPLICATION_NAME) + .build(); + return service; + } + + public static void main(String[] args) throws IOException { + // Build a new authorized API client service. + com.google.api.services.driveactivity.v2.DriveActivity service = getDriveActivityService(); + + // Print the recent activity in your Google Drive. + QueryDriveActivityResponse result = + service.activity().query(new QueryDriveActivityRequest().setPageSize(10)).execute(); + List activities = result.getActivities(); + if (activities == null || activities.size() == 0) { + System.out.println("No activity."); + } else { + System.out.println("Recent activity:"); + for (DriveActivity activity : activities) { + String time = getTimeInfo(activity); + String action = getActionInfo(activity.getPrimaryActionDetail()); + List actors = + activity.getActors().stream() + .map(DriveActivityQuickstart::getActorInfo) + .collect(Collectors.toList()); + List targets = + activity.getTargets().stream() + .map(DriveActivityQuickstart::getTargetInfo) + .collect(Collectors.toList()); + System.out.printf( + "%s: %s, %s, %s\n", time, truncated(actors), action, truncated(targets)); + } } - - /** Returns a string representation of the first elements in a list. */ - private static String truncatedTo(List array, int limit) { - String contents = array.stream().limit(limit).collect(Collectors.joining(", ")); - String more = array.size() > limit ? ", ..." : ""; - return "[" + contents + more + "]"; + } + + /** + * Returns a string representation of the first elements in a list. + */ + private static String truncated(List array) { + return truncatedTo(array, 2); + } + + /** + * Returns a string representation of the first elements in a list. + */ + private static String truncatedTo(List array, int limit) { + String contents = array.stream().limit(limit).collect(Collectors.joining(", ")); + String more = array.size() > limit ? ", ..." : ""; + return "[" + contents + more + "]"; + } + + /** + * Returns the name of a set property in an object, or else "unknown". + */ + private static String getOneOf(AbstractMap obj) { + Iterator iterator = obj.keySet().iterator(); + return iterator.hasNext() ? iterator.next() : "unknown"; + } + + /** + * Returns a time associated with an activity. + */ + private static String getTimeInfo(DriveActivity activity) { + if (activity.getTimestamp() != null) { + return activity.getTimestamp(); } - - /** Returns the name of a set property in an object, or else "unknown". */ - private static String getOneOf(AbstractMap obj) { - Iterator iterator = obj.keySet().iterator(); - return iterator.hasNext() ? iterator.next() : "unknown"; + if (activity.getTimeRange() != null) { + return activity.getTimeRange().getEndTime(); } - - /** Returns a time associated with an activity. */ - private static String getTimeInfo(DriveActivity activity) { - if (activity.getTimestamp() != null) { - return activity.getTimestamp(); - } - if (activity.getTimeRange() != null) { - return activity.getTimeRange().getEndTime(); - } - return "unknown"; + return "unknown"; + } + + /** + * Returns the type of action. + */ + private static String getActionInfo(ActionDetail actionDetail) { + return getOneOf(actionDetail); + } + + /** + * Returns user information, or the type of user if not a known user. + */ + private static String getUserInfo(User user) { + if (user.getKnownUser() != null) { + KnownUser knownUser = user.getKnownUser(); + Boolean isMe = knownUser.getIsCurrentUser(); + return (isMe != null && isMe) ? "people/me" : knownUser.getPersonName(); } - - /** Returns the type of action. */ - private static String getActionInfo(ActionDetail actionDetail) { - return getOneOf(actionDetail); + return getOneOf(user); + } + + /** + * Returns actor information, or the type of actor if not a user. + */ + private static String getActorInfo(Actor actor) { + if (actor.getUser() != null) { + return getUserInfo(actor.getUser()); } - - /** Returns user information, or the type of user if not a known user. */ - private static String getUserInfo(User user) { - if (user.getKnownUser() != null) { - KnownUser knownUser = user.getKnownUser(); - Boolean isMe = knownUser.getIsCurrentUser(); - return (isMe != null && isMe) ? "people/me" : knownUser.getPersonName(); - } - return getOneOf(user); + return getOneOf(actor); + } + + /** + * Returns the type of a target and an associated title. + */ + private static String getTargetInfo(Target target) { + if (target.getDriveItem() != null) { + return "driveItem:\"" + target.getDriveItem().getTitle() + "\""; } - - /** Returns actor information, or the type of actor if not a user. */ - private static String getActorInfo(Actor actor) { - if (actor.getUser() != null) { - return getUserInfo(actor.getUser()); - } - return getOneOf(actor); + if (target.getDrive() != null) { + return "drive:\"" + target.getDrive().getTitle() + "\""; } - - /** Returns the type of a target and an associated title. */ - private static String getTargetInfo(Target target) { - if (target.getDriveItem() != null) { - return "driveItem:\"" + target.getDriveItem().getTitle() + "\""; - } - if (target.getDrive() != null) { - return "drive:\"" + target.getDrive().getTitle() + "\""; - } - if (target.getFileComment() != null) { - DriveItem parent = target.getFileComment().getParent(); - if (parent != null) { - return "fileComment:\"" + parent.getTitle() + "\""; - } - return "fileComment:unknown"; - } - return getOneOf(target); + if (target.getFileComment() != null) { + DriveItem parent = target.getFileComment().getParent(); + if (parent != null) { + return "fileComment:\"" + parent.getTitle() + "\""; + } + return "fileComment:unknown"; } + return getOneOf(target); + } } // [END drive_activity_v2_quickstart] diff --git a/drive/activity/quickstart/src/main/java/DriveActivityQuickstart.java b/drive/activity/quickstart/src/main/java/DriveActivityQuickstart.java index c28cdd13..e72a2c24 100644 --- a/drive/activity/quickstart/src/main/java/DriveActivityQuickstart.java +++ b/drive/activity/quickstart/src/main/java/DriveActivityQuickstart.java @@ -13,6 +13,7 @@ // limitations under the License. // [START drive_activity_quickstart] + import com.google.api.client.auth.oauth2.Credential; import com.google.api.client.extensions.java6.auth.oauth2.AuthorizationCodeInstalledApp; import com.google.api.client.extensions.jetty.auth.oauth2.LocalServerReceiver; @@ -20,14 +21,12 @@ import com.google.api.client.googleapis.auth.oauth2.GoogleClientSecrets; import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport; import com.google.api.client.http.HttpTransport; -import com.google.api.client.json.gson.GsonFactory; import com.google.api.client.json.JsonFactory; +import com.google.api.client.json.gson.GsonFactory; import com.google.api.client.util.store.FileDataStoreFactory; - +import com.google.api.services.appsactivity.Appsactivity; import com.google.api.services.appsactivity.AppsactivityScopes; import com.google.api.services.appsactivity.model.*; -import com.google.api.services.appsactivity.Appsactivity; - import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; @@ -37,116 +36,125 @@ /* class to demonstarte use of Drive Activity list API */ public class DriveActivityQuickstart { - /** Application name. */ - private static final String APPLICATION_NAME = - "Drive Activity API Java Quickstart"; - - /** Directory to store authorization tokens for this application. */ - private static final java.io.File DATA_STORE_DIR = new java.io.File("tokens"); + /** + * Application name. + */ + private static final String APPLICATION_NAME = + "Drive Activity API Java Quickstart"; - /** Global instance of the {@link FileDataStoreFactory}. */ - private static FileDataStoreFactory DATA_STORE_FACTORY; + /** + * Directory to store authorization tokens for this application. + */ + private static final java.io.File DATA_STORE_DIR = new java.io.File("tokens"); + /** + * Global instance of the JSON factory. + */ + private static final JsonFactory JSON_FACTORY = + GsonFactory.getDefaultInstance(); + /** + * Global instance of the scopes required by this quickstart. + * + *

If modifying these scopes, delete your previously saved tokens/ folder. + */ + private static final List SCOPES = Arrays.asList(AppsactivityScopes.ACTIVITY); + private static final String CREDENTIALS_FILE_PATH = "/credentials.json"; + /** + * Global instance of the {@link FileDataStoreFactory}. + */ + private static FileDataStoreFactory DATA_STORE_FACTORY; + /** + * Global instance of the HTTP transport. + */ + private static HttpTransport HTTP_TRANSPORT; - /** Global instance of the JSON factory. */ - private static final JsonFactory JSON_FACTORY = - GsonFactory.getDefaultInstance(); - - /** Global instance of the HTTP transport. */ - private static HttpTransport HTTP_TRANSPORT; - - /** Global instance of the scopes required by this quickstart. - * - *

If modifying these scopes, delete your previously saved tokens/ folder. - */ - private static final List SCOPES = Arrays.asList(AppsactivityScopes.ACTIVITY); - private static final String CREDENTIALS_FILE_PATH = "/credentials.json"; - - static { - try { - HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport(); - DATA_STORE_FACTORY = new FileDataStoreFactory(DATA_STORE_DIR); - } catch (Throwable t) { - t.printStackTrace(); - System.exit(1); - } + static { + try { + HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport(); + DATA_STORE_FACTORY = new FileDataStoreFactory(DATA_STORE_DIR); + } catch (Throwable t) { + t.printStackTrace(); + System.exit(1); } + } - /** - * Creates an authorized Credential object. - * @return an authorized Credential object. - * @throws IOException - */ - public static Credential authorize() throws IOException { - // Load client secrets. - InputStream in = - DriveActivityQuickstart.class.getResourceAsStream(CREDENTIALS_FILE_PATH); - if (in == null) { - throw new FileNotFoundException("Resource not found: " + CREDENTIALS_FILE_PATH); - } - GoogleClientSecrets clientSecrets = - GoogleClientSecrets.load(JSON_FACTORY, new InputStreamReader(in)); - - // Build flow and trigger user authorization request. - GoogleAuthorizationCodeFlow flow = - new GoogleAuthorizationCodeFlow.Builder( - HTTP_TRANSPORT, JSON_FACTORY, clientSecrets, SCOPES) - .setDataStoreFactory(DATA_STORE_FACTORY) - .setAccessType("offline") - .build(); - Credential credential = new AuthorizationCodeInstalledApp( - flow, new LocalServerReceiver()).authorize("user"); - System.out.println( - "Credentials saved to " + DATA_STORE_DIR.getAbsolutePath()); - //returns an authorized Credential object. - return credential; + /** + * Creates an authorized Credential object. + * + * @return an authorized Credential object. + * @throws IOException + */ + public static Credential authorize() throws IOException { + // Load client secrets. + InputStream in = + DriveActivityQuickstart.class.getResourceAsStream(CREDENTIALS_FILE_PATH); + if (in == null) { + throw new FileNotFoundException("Resource not found: " + CREDENTIALS_FILE_PATH); } + GoogleClientSecrets clientSecrets = + GoogleClientSecrets.load(JSON_FACTORY, new InputStreamReader(in)); - /** - * Build and return an authorized Apps Activity client service. - * @return an authorized Appsactivity client service - * @throws IOException - */ - public static Appsactivity getAppsactivityService() throws IOException { - Credential credential = authorize(); - Appsactivity service = new Appsactivity.Builder( - HTTP_TRANSPORT, JSON_FACTORY, credential) - .setApplicationName(APPLICATION_NAME) - .build(); - return service; - } + // Build flow and trigger user authorization request. + GoogleAuthorizationCodeFlow flow = + new GoogleAuthorizationCodeFlow.Builder( + HTTP_TRANSPORT, JSON_FACTORY, clientSecrets, SCOPES) + .setDataStoreFactory(DATA_STORE_FACTORY) + .setAccessType("offline") + .build(); + Credential credential = new AuthorizationCodeInstalledApp( + flow, new LocalServerReceiver()).authorize("user"); + System.out.println( + "Credentials saved to " + DATA_STORE_DIR.getAbsolutePath()); + //returns an authorized Credential object. + return credential; + } + + /** + * Build and return an authorized Apps Activity client service. + * + * @return an authorized Appsactivity client service + * @throws IOException + */ + public static Appsactivity getAppsactivityService() throws IOException { + Credential credential = authorize(); + Appsactivity service = new Appsactivity.Builder( + HTTP_TRANSPORT, JSON_FACTORY, credential) + .setApplicationName(APPLICATION_NAME) + .build(); + return service; + } - public static void main(String[] args) throws IOException { - // Build a new authorized API client service. - Appsactivity service = getAppsactivityService(); + public static void main(String[] args) throws IOException { + // Build a new authorized API client service. + Appsactivity service = getAppsactivityService(); - // Print the recent activity in your Google Drive. - ListActivitiesResponse result = service.activities().list() - .setSource("drive.google.com") - .setDriveAncestorId("root") - .setPageSize(10) - .execute(); - List activities = result.getActivities(); - if (activities == null || activities.size() == 0) { - System.out.println("No activity."); - } else { - System.out.println("Recent activity:"); - for (Activity activity : activities) { - Event event = activity.getCombinedEvent(); - User user = event.getUser(); - Target target = event.getTarget(); - if (user == null || target == null ) { - continue; - } - String date = new java.text.SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ") - .format(new java.util.Date(event.getEventTimeMillis().longValue())); - System.out.printf("%s: %s, %s, %s (%s)\n", - date, - user.getName(), - event.getPrimaryEventType(), - target.getName(), - target.getMimeType()); - } + // Print the recent activity in your Google Drive. + ListActivitiesResponse result = service.activities().list() + .setSource("drive.google.com") + .setDriveAncestorId("root") + .setPageSize(10) + .execute(); + List activities = result.getActivities(); + if (activities == null || activities.size() == 0) { + System.out.println("No activity."); + } else { + System.out.println("Recent activity:"); + for (Activity activity : activities) { + Event event = activity.getCombinedEvent(); + User user = event.getUser(); + Target target = event.getTarget(); + if (user == null || target == null) { + continue; } + String date = new java.text.SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ") + .format(new java.util.Date(event.getEventTimeMillis().longValue())); + System.out.printf("%s: %s, %s, %s (%s)\n", + date, + user.getName(), + event.getPrimaryEventType(), + target.getName(), + target.getMimeType()); + } } + } } // [END drive_activity_quickstart] diff --git a/drive/quickstart/src/main/java/DriveQuickstart.java b/drive/quickstart/src/main/java/DriveQuickstart.java index b9df6ab6..c88f9063 100644 --- a/drive/quickstart/src/main/java/DriveQuickstart.java +++ b/drive/quickstart/src/main/java/DriveQuickstart.java @@ -13,6 +13,7 @@ // limitations under the License. // [START drive_quickstart] + import com.google.api.client.auth.oauth2.Credential; import com.google.api.client.extensions.java6.auth.oauth2.AuthorizationCodeInstalledApp; import com.google.api.client.extensions.jetty.auth.oauth2.LocalServerReceiver; @@ -27,7 +28,6 @@ import com.google.api.services.drive.DriveScopes; import com.google.api.services.drive.model.File; import com.google.api.services.drive.model.FileList; - import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; @@ -38,67 +38,77 @@ /* class to demonstarte use of Drive files list API */ public class DriveQuickstart { - /** Application name. */ - private static final String APPLICATION_NAME = "Google Drive API Java Quickstart"; - /** Global instance of the JSON factory. */ - private static final JsonFactory JSON_FACTORY = GsonFactory.getDefaultInstance(); - /** Directory to store authorization tokens for this application. */ - private static final String TOKENS_DIRECTORY_PATH = "tokens"; + /** + * Application name. + */ + private static final String APPLICATION_NAME = "Google Drive API Java Quickstart"; + /** + * Global instance of the JSON factory. + */ + private static final JsonFactory JSON_FACTORY = GsonFactory.getDefaultInstance(); + /** + * Directory to store authorization tokens for this application. + */ + private static final String TOKENS_DIRECTORY_PATH = "tokens"; - /** - * Global instance of the scopes required by this quickstart. - * If modifying these scopes, delete your previously saved tokens/ folder. - */ - private static final List SCOPES = Collections.singletonList(DriveScopes.DRIVE_METADATA_READONLY); - private static final String CREDENTIALS_FILE_PATH = "/credentials.json"; + /** + * Global instance of the scopes required by this quickstart. + * If modifying these scopes, delete your previously saved tokens/ folder. + */ + private static final List SCOPES = + Collections.singletonList(DriveScopes.DRIVE_METADATA_READONLY); + private static final String CREDENTIALS_FILE_PATH = "/credentials.json"; - /** - * Creates an authorized Credential object. - * @param HTTP_TRANSPORT The network HTTP Transport. - * @return An authorized Credential object. - * @throws IOException If the credentials.json file cannot be found. - */ - private static Credential getCredentials(final NetHttpTransport HTTP_TRANSPORT) throws IOException { - // Load client secrets. - InputStream in = DriveQuickstart.class.getResourceAsStream(CREDENTIALS_FILE_PATH); - if (in == null) { - throw new FileNotFoundException("Resource not found: " + CREDENTIALS_FILE_PATH); - } - GoogleClientSecrets clientSecrets = GoogleClientSecrets.load(JSON_FACTORY, new InputStreamReader(in)); - - // Build flow and trigger user authorization request. - GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow.Builder( - HTTP_TRANSPORT, JSON_FACTORY, clientSecrets, SCOPES) - .setDataStoreFactory(new FileDataStoreFactory(new java.io.File(TOKENS_DIRECTORY_PATH))) - .setAccessType("offline") - .build(); - LocalServerReceiver receiver = new LocalServerReceiver.Builder().setPort(8888).build(); - Credential credential = new AuthorizationCodeInstalledApp(flow, receiver).authorize("user"); - //returns an authorized Credential object. - return credential; + /** + * Creates an authorized Credential object. + * + * @param HTTP_TRANSPORT The network HTTP Transport. + * @return An authorized Credential object. + * @throws IOException If the credentials.json file cannot be found. + */ + private static Credential getCredentials(final NetHttpTransport HTTP_TRANSPORT) + throws IOException { + // Load client secrets. + InputStream in = DriveQuickstart.class.getResourceAsStream(CREDENTIALS_FILE_PATH); + if (in == null) { + throw new FileNotFoundException("Resource not found: " + CREDENTIALS_FILE_PATH); } + GoogleClientSecrets clientSecrets = + GoogleClientSecrets.load(JSON_FACTORY, new InputStreamReader(in)); + + // Build flow and trigger user authorization request. + GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow.Builder( + HTTP_TRANSPORT, JSON_FACTORY, clientSecrets, SCOPES) + .setDataStoreFactory(new FileDataStoreFactory(new java.io.File(TOKENS_DIRECTORY_PATH))) + .setAccessType("offline") + .build(); + LocalServerReceiver receiver = new LocalServerReceiver.Builder().setPort(8888).build(); + Credential credential = new AuthorizationCodeInstalledApp(flow, receiver).authorize("user"); + //returns an authorized Credential object. + return credential; + } - public static void main(String... args) throws IOException, GeneralSecurityException { - // Build a new authorized API client service. - final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport(); - Drive service = new Drive.Builder(HTTP_TRANSPORT, JSON_FACTORY, getCredentials(HTTP_TRANSPORT)) - .setApplicationName(APPLICATION_NAME) - .build(); + public static void main(String... args) throws IOException, GeneralSecurityException { + // Build a new authorized API client service. + final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport(); + Drive service = new Drive.Builder(HTTP_TRANSPORT, JSON_FACTORY, getCredentials(HTTP_TRANSPORT)) + .setApplicationName(APPLICATION_NAME) + .build(); - // Print the names and IDs for up to 10 files. - FileList result = service.files().list() - .setPageSize(10) - .setFields("nextPageToken, files(id, name)") - .execute(); - List files = result.getFiles(); - if (files == null || files.isEmpty()) { - System.out.println("No files found."); - } else { - System.out.println("Files:"); - for (File file : files) { - System.out.printf("%s (%s)\n", file.getName(), file.getId()); - } - } + // Print the names and IDs for up to 10 files. + FileList result = service.files().list() + .setPageSize(10) + .setFields("nextPageToken, files(id, name)") + .execute(); + List files = result.getFiles(); + if (files == null || files.isEmpty()) { + System.out.println("No files found."); + } else { + System.out.println("Files:"); + for (File file : files) { + System.out.printf("%s (%s)\n", file.getName(), file.getId()); + } } + } } // [END drive_quickstart] diff --git a/drive/snippets/drive_v2/files/config.json b/drive/snippets/drive_v2/files/config.json index 3d2519ed..b42f309e 100644 --- a/drive/snippets/drive_v2/files/config.json +++ b/drive/snippets/drive_v2/files/config.json @@ -1,3 +1,3 @@ { - "foo" : "bar" + "foo": "bar" } \ No newline at end of file diff --git a/drive/snippets/drive_v2/src/main/java/AppDataSnippets.java b/drive/snippets/drive_v2/src/main/java/AppDataSnippets.java index cee70b57..6d13d7a4 100644 --- a/drive/snippets/drive_v2/src/main/java/AppDataSnippets.java +++ b/drive/snippets/drive_v2/src/main/java/AppDataSnippets.java @@ -19,7 +19,6 @@ import com.google.api.services.drive.model.File; import com.google.api.services.drive.model.FileList; import com.google.api.services.drive.model.ParentReference; - import java.io.IOException; import java.util.Collections; diff --git a/drive/snippets/drive_v2/src/main/java/ChangeSnippets.java b/drive/snippets/drive_v2/src/main/java/ChangeSnippets.java index ae8d4558..b3999d88 100644 --- a/drive/snippets/drive_v2/src/main/java/ChangeSnippets.java +++ b/drive/snippets/drive_v2/src/main/java/ChangeSnippets.java @@ -18,7 +18,6 @@ import com.google.api.services.drive.model.Change; import com.google.api.services.drive.model.ChangeList; import com.google.api.services.drive.model.StartPageToken; - import java.io.IOException; public class ChangeSnippets { diff --git a/drive/snippets/drive_v2/src/main/java/CreateDrive.java b/drive/snippets/drive_v2/src/main/java/CreateDrive.java index 70da1fe3..31265b2e 100644 --- a/drive/snippets/drive_v2/src/main/java/CreateDrive.java +++ b/drive/snippets/drive_v2/src/main/java/CreateDrive.java @@ -17,12 +17,10 @@ import com.google.api.client.http.HttpRequestInitializer; import com.google.api.client.http.javanet.NetHttpTransport; import com.google.api.client.json.gson.GsonFactory; -//import com.google.api.services.drive.Drive; import com.google.api.services.drive.DriveScopes; import com.google.api.services.drive.model.Drive; import com.google.auth.http.HttpCredentialsAdapter; import com.google.auth.oauth2.GoogleCredentials; - import java.io.IOException; import java.util.Arrays; import java.util.UUID; @@ -30,42 +28,45 @@ /* class to demonstrate use-case of Drive's create drive. */ public class CreateDrive { - /** - * Create a drive. - * @return Newly created drive id. - * @throws IOException if service account credentials file not found. - */ - public static String createDrive() throws IOException { + /** + * Create a drive. + * + * @return Newly created drive id. + * @throws IOException if service account credentials file not found. + */ + public static String createDrive() throws IOException { /*Load pre-authorized user credentials from the environment. TODO(developer) - See https://developers.google.com/identity for guides on implementing OAuth2 for your application.*/ - GoogleCredentials credentials = GoogleCredentials.getApplicationDefault().createScoped(Arrays.asList(DriveScopes.DRIVE)); - HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( - credentials); + GoogleCredentials credentials = + GoogleCredentials.getApplicationDefault().createScoped(Arrays.asList(DriveScopes.DRIVE)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); - // Build a new authorized API client service. - com.google.api.services.drive.Drive service = new com.google.api.services.drive.Drive.Builder(new NetHttpTransport(), - GsonFactory.getDefaultInstance(), - requestInitializer) - .setApplicationName("Drive samples") - .build(); + // Build a new authorized API client service. + com.google.api.services.drive.Drive service = + new com.google.api.services.drive.Drive.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Drive samples") + .build(); - Drive driveMetadata = new Drive(); - driveMetadata.setName("Project Resources"); - String requestId = UUID.randomUUID().toString(); - try { - Drive drive = service.drives().insert(requestId, - driveMetadata) - .execute(); - System.out.println("Drive ID: " + drive.getId()); + Drive driveMetadata = new Drive(); + driveMetadata.setName("Project Resources"); + String requestId = UUID.randomUUID().toString(); + try { + Drive drive = service.drives().insert(requestId, + driveMetadata) + .execute(); + System.out.println("Drive ID: " + drive.getId()); - return drive.getId(); - } catch (GoogleJsonResponseException e) { - // TODO(developer) - handle error appropriately - System.err.println("Unable to create drive: " + e.getDetails()); - throw e; - } + return drive.getId(); + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + System.err.println("Unable to create drive: " + e.getDetails()); + throw e; } + } } // [END drive_create_drive] diff --git a/drive/snippets/drive_v2/src/main/java/CreateFolder.java b/drive/snippets/drive_v2/src/main/java/CreateFolder.java index 169c796d..ed909ecf 100644 --- a/drive/snippets/drive_v2/src/main/java/CreateFolder.java +++ b/drive/snippets/drive_v2/src/main/java/CreateFolder.java @@ -29,39 +29,41 @@ public class CreateFolder { - /** - * Create new folder. - * @return Inserted folder id if successful, {@code null} otherwise. - * @throws IOException if service account credentials file not found. - */ - public static String createFolder() throws IOException { - // Load pre-authorized user credentials from the environment. - // TODO(developer) - See https://developers.google.com/identity for - // guides on implementing OAuth2 for your application. - GoogleCredentials credentials = GoogleCredentials.getApplicationDefault().createScoped(Arrays.asList(DriveScopes.DRIVE_FILE)); - HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( - credentials); + /** + * Create new folder. + * + * @return Inserted folder id if successful, {@code null} otherwise. + * @throws IOException if service account credentials file not found. + */ + public static String createFolder() throws IOException { + // Load pre-authorized user credentials from the environment. + // TODO(developer) - See https://developers.google.com/identity for + // guides on implementing OAuth2 for your application. + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Arrays.asList(DriveScopes.DRIVE_FILE)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); - // Build a new authorized API client service. - Drive service = new Drive.Builder(new NetHttpTransport(), - GsonFactory.getDefaultInstance(), - requestInitializer) - .setApplicationName("Drive samples") - .build(); - // File's metadata. - File fileMetadata = new File(); - fileMetadata.setTitle("Test"); - fileMetadata.setMimeType("application/vnd.google-apps.folder"); - try { - File file = service.files().insert(fileMetadata) - .setFields("id") - .execute(); - System.out.println("Folder ID: " + file.getId()); - return file.getId(); - } catch (IOException e) { - System.out.println("An error occurred: " + e); - return null; - } + // Build a new authorized API client service. + Drive service = new Drive.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Drive samples") + .build(); + // File's metadata. + File fileMetadata = new File(); + fileMetadata.setTitle("Test"); + fileMetadata.setMimeType("application/vnd.google-apps.folder"); + try { + File file = service.files().insert(fileMetadata) + .setFields("id") + .execute(); + System.out.println("Folder ID: " + file.getId()); + return file.getId(); + } catch (IOException e) { + System.out.println("An error occurred: " + e); + return null; } + } } // [END drive_create_folder] diff --git a/drive/snippets/drive_v2/src/main/java/CreateShortcut.java b/drive/snippets/drive_v2/src/main/java/CreateShortcut.java index 35393483..0e4b817c 100644 --- a/drive/snippets/drive_v2/src/main/java/CreateShortcut.java +++ b/drive/snippets/drive_v2/src/main/java/CreateShortcut.java @@ -23,46 +23,47 @@ import com.google.api.services.drive.model.File; import com.google.auth.http.HttpCredentialsAdapter; import com.google.auth.oauth2.GoogleCredentials; - import java.io.IOException; import java.util.Arrays; /* Class to demonstrate Drive's create shortcut use-case */ public class CreateShortcut { - /** - * Creates shortcut for file. - * @throws IOException if service account credentials file not found. - */ - public static String createShortcut() throws IOException{ + /** + * Creates shortcut for file. + * + * @throws IOException if service account credentials file not found. + */ + public static String createShortcut() throws IOException { /* Load pre-authorized user credentials from the environment. TODO(developer) - See https://developers.google.com/identity for guides on implementing OAuth2 for your application.*/ - GoogleCredentials credentials = GoogleCredentials.getApplicationDefault().createScoped(Arrays.asList(DriveScopes.DRIVE_FILE)); - HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( - credentials); - // Build a new authorized API client service. - Drive service = new Drive.Builder(new NetHttpTransport(), - GsonFactory.getDefaultInstance(), - requestInitializer) - .setApplicationName("Drive samples") - .build(); - try { - // Create Shortcut for file. - File fileMetadata = new File(); - fileMetadata.setTitle("Project plan"); - fileMetadata.setMimeType("application/vnd.google-apps.drive-sdk"); + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Arrays.asList(DriveScopes.DRIVE_FILE)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + // Build a new authorized API client service. + Drive service = new Drive.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Drive samples") + .build(); + try { + // Create Shortcut for file. + File fileMetadata = new File(); + fileMetadata.setTitle("Project plan"); + fileMetadata.setMimeType("application/vnd.google-apps.drive-sdk"); - File file = service.files().insert(fileMetadata) - .setFields("id") - .execute(); - System.out.println("File ID: " + file.getId()); - return file.getId(); - }catch (GoogleJsonResponseException e) { - // TODO(developer) - handle error appropriately - System.err.println("Unable to create shortcut: " + e.getDetails()); - throw e; - } + File file = service.files().insert(fileMetadata) + .setFields("id") + .execute(); + System.out.println("File ID: " + file.getId()); + return file.getId(); + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + System.err.println("Unable to create shortcut: " + e.getDetails()); + throw e; } + } } // [END drive_create_shortcut] diff --git a/drive/snippets/drive_v2/src/main/java/CreateTeamDrive.java b/drive/snippets/drive_v2/src/main/java/CreateTeamDrive.java index 8dad2711..dff70011 100644 --- a/drive/snippets/drive_v2/src/main/java/CreateTeamDrive.java +++ b/drive/snippets/drive_v2/src/main/java/CreateTeamDrive.java @@ -17,12 +17,10 @@ import com.google.api.client.http.HttpRequestInitializer; import com.google.api.client.http.javanet.NetHttpTransport; import com.google.api.client.json.gson.GsonFactory; -//import com.google.api.services.drive.Drive; import com.google.api.services.drive.DriveScopes; import com.google.api.services.drive.model.TeamDrive; import com.google.auth.http.HttpCredentialsAdapter; import com.google.auth.oauth2.GoogleCredentials; - import java.io.IOException; import java.util.Arrays; import java.util.UUID; @@ -30,39 +28,42 @@ /* class to demonstrate use-case of Drive's create team drive. */ public class CreateTeamDrive { - /** - * Create a drive for team. - * @return Newly created drive id. - * @throws IOException if service account credentials file not found. - */ - public static String createTeamDrive() throws IOException { + /** + * Create a drive for team. + * + * @return Newly created drive id. + * @throws IOException if service account credentials file not found. + */ + public static String createTeamDrive() throws IOException { /*Load pre-authorized user credentials from the environment. TODO(developer) - See https://developers.google.com/identity for guides on implementing OAuth2 for your application.*/ - GoogleCredentials credentials = GoogleCredentials.getApplicationDefault().createScoped(Arrays.asList(DriveScopes.DRIVE)); - HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( - credentials); + GoogleCredentials credentials = + GoogleCredentials.getApplicationDefault().createScoped(Arrays.asList(DriveScopes.DRIVE)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); - // Build a new authorized API client service. - com.google.api.services.drive.Drive service = new com.google.api.services.drive.Drive.Builder(new NetHttpTransport(), - GsonFactory.getDefaultInstance(), - requestInitializer) - .setApplicationName("Drive samples") - .build(); - try { - TeamDrive teamDriveMetadata = new TeamDrive(); - teamDriveMetadata.setName("Project Resources"); - String requestId = UUID.randomUUID().toString(); - TeamDrive teamDrive = service.teamdrives().insert(requestId, teamDriveMetadata) - .execute(); - System.out.println("Team Drive ID: " + teamDrive.getId()); - return teamDrive.getId(); - } catch (GoogleJsonResponseException e) { - // TODO(developer) - handle error appropriately - System.err.println("Unable to create team drive: " + e.getDetails()); - throw e; - } + // Build a new authorized API client service. + com.google.api.services.drive.Drive service = + new com.google.api.services.drive.Drive.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Drive samples") + .build(); + try { + TeamDrive teamDriveMetadata = new TeamDrive(); + teamDriveMetadata.setName("Project Resources"); + String requestId = UUID.randomUUID().toString(); + TeamDrive teamDrive = service.teamdrives().insert(requestId, teamDriveMetadata) + .execute(); + System.out.println("Team Drive ID: " + teamDrive.getId()); + return teamDrive.getId(); + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + System.err.println("Unable to create team drive: " + e.getDetails()); + throw e; } + } } // [END drive_create_team_drive] diff --git a/drive/snippets/drive_v2/src/main/java/DownloadFile.java b/drive/snippets/drive_v2/src/main/java/DownloadFile.java index 0931acc5..2098d1a9 100644 --- a/drive/snippets/drive_v2/src/main/java/DownloadFile.java +++ b/drive/snippets/drive_v2/src/main/java/DownloadFile.java @@ -22,7 +22,6 @@ import com.google.api.services.drive.DriveScopes; import com.google.auth.http.HttpCredentialsAdapter; import com.google.auth.oauth2.GoogleCredentials; - import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.OutputStream; @@ -31,39 +30,41 @@ /* Class to demonstrate use-case of drive's download file. */ public class DownloadFile { - /** - * Download a Document file in PDF format. - * @param realFileId file ID of any workspace document format file. - * @return byte array stream if successful, {@code null} otherwise. - * @throws IOException if service account credentials file not found. - */ - public static ByteArrayOutputStream downloadFile(String realFileId) throws IOException{ + /** + * Download a Document file in PDF format. + * + * @param realFileId file ID of any workspace document format file. + * @return byte array stream if successful, {@code null} otherwise. + * @throws IOException if service account credentials file not found. + */ + public static ByteArrayOutputStream downloadFile(String realFileId) throws IOException { /* Load pre-authorized user credentials from the environment. TODO(developer) - See https://developers.google.com/identity for guides on implementing OAuth2 for your application.*/ - GoogleCredentials credentials = GoogleCredentials.getApplicationDefault().createScoped(Arrays.asList(DriveScopes.DRIVE_FILE)); - HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( - credentials); + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Arrays.asList(DriveScopes.DRIVE_FILE)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); - // Build a new authorized API client service. - Drive service = new Drive.Builder(new NetHttpTransport(), - GsonFactory.getDefaultInstance(), - requestInitializer) - .setApplicationName("Drive samples") - .build(); + // Build a new authorized API client service. + Drive service = new Drive.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Drive samples") + .build(); - try { - OutputStream outputStream = new ByteArrayOutputStream(); + try { + OutputStream outputStream = new ByteArrayOutputStream(); - service.files().get(realFileId) - .executeMediaAndDownloadTo(outputStream); + service.files().get(realFileId) + .executeMediaAndDownloadTo(outputStream); - return (ByteArrayOutputStream) outputStream; - }catch (GoogleJsonResponseException e) { - // TODO(developer) - handle error appropriately - System.err.println("Unable to move file: " + e.getDetails()); - throw e; - } + return (ByteArrayOutputStream) outputStream; + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + System.err.println("Unable to move file: " + e.getDetails()); + throw e; } + } } // [END drive_download_file] diff --git a/drive/snippets/drive_v2/src/main/java/DriveSnippets.java b/drive/snippets/drive_v2/src/main/java/DriveSnippets.java index 8c70c3da..a40483bc 100644 --- a/drive/snippets/drive_v2/src/main/java/DriveSnippets.java +++ b/drive/snippets/drive_v2/src/main/java/DriveSnippets.java @@ -17,7 +17,6 @@ import com.google.api.services.drive.model.Drive; import com.google.api.services.drive.model.DriveList; import com.google.api.services.drive.model.Permission; - import java.io.IOException; import java.util.ArrayList; import java.util.List; @@ -37,14 +36,14 @@ public String createDrive() throws IOException { driveMetadata.setName("Project Resources"); String requestId = UUID.randomUUID().toString(); Drive drive = driveService.drives().insert(requestId, driveMetadata) - .execute(); + .execute(); System.out.println("Drive ID: " + drive.getId()); // [END createDrive] return drive.getId(); } public List recoverDrives(String realUser) - throws IOException { + throws IOException { com.google.api.services.drive.Drive driveService = this.service; List drives = new ArrayList(); // [START recoverDrives] @@ -57,33 +56,33 @@ public List recoverDrives(String realUser) // organizer is assigned. String pageToken = null; Permission newOrganizerPermission = new Permission() - .setType("user") - .setRole("organizer") - .setValue("user@example.com"); + .setType("user") + .setRole("organizer") + .setValue("user@example.com"); // [START_EXCLUDE silent] newOrganizerPermission.setValue(realUser); // [END_EXCLUDE] do { DriveList result = driveService.drives().list() - .setQ("organizerCount = 0") - .setUseDomainAdminAccess(true) - .setFields("nextPageToken, items(id, name)") - .setPageToken(pageToken) - .execute(); + .setQ("organizerCount = 0") + .setUseDomainAdminAccess(true) + .setFields("nextPageToken, items(id, name)") + .setPageToken(pageToken) + .execute(); for (Drive drive : result.getItems()) { System.out.printf("Found drive without organizer: %s (%s)\n", - drive.getName(), drive.getId()); + drive.getName(), drive.getId()); // Note: For improved efficiency, consider batching // permission insert requests Permission permissionResult = driveService.permissions() - .insert(drive.getId(), newOrganizerPermission) - .setUseDomainAdminAccess(true) - .setSupportsAllDrives(true) - .setFields("id") - .execute(); + .insert(drive.getId(), newOrganizerPermission) + .setUseDomainAdminAccess(true) + .setSupportsAllDrives(true) + .setFields("id") + .execute(); System.out.printf("Added organizer permission: %s\n", - permissionResult.getId()); + permissionResult.getId()); } // [START_EXCLUDE silent] diff --git a/drive/snippets/drive_v2/src/main/java/ExportPdf.java b/drive/snippets/drive_v2/src/main/java/ExportPdf.java index 16d86539..789e232a 100644 --- a/drive/snippets/drive_v2/src/main/java/ExportPdf.java +++ b/drive/snippets/drive_v2/src/main/java/ExportPdf.java @@ -22,7 +22,6 @@ import com.google.api.services.drive.DriveScopes; import com.google.auth.http.HttpCredentialsAdapter; import com.google.auth.oauth2.GoogleCredentials; - import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.OutputStream; @@ -31,38 +30,40 @@ /* Class to demonstrate use-case of drive's export pdf. */ public class ExportPdf { - /** - * Download a Document file in PDF format. - * @param realFileId file ID of any workspace document format file. - * @return byte array stream if successful, {@code null} otherwise. - * @throws IOException if service account credentials file not found. - */ - public static ByteArrayOutputStream exportPdf(String realFileId) throws IOException{ - // Load pre-authorized user credentials from the environment. - // TODO(developer) - See https://developers.google.com/identity for - // guides on implementing OAuth2 for your application. - GoogleCredentials credentials = GoogleCredentials.getApplicationDefault().createScoped(Arrays.asList(DriveScopes.DRIVE_FILE)); - HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( - credentials); + /** + * Download a Document file in PDF format. + * + * @param realFileId file ID of any workspace document format file. + * @return byte array stream if successful, {@code null} otherwise. + * @throws IOException if service account credentials file not found. + */ + public static ByteArrayOutputStream exportPdf(String realFileId) throws IOException { + // Load pre-authorized user credentials from the environment. + // TODO(developer) - See https://developers.google.com/identity for + // guides on implementing OAuth2 for your application. + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Arrays.asList(DriveScopes.DRIVE_FILE)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); - // Build a new authorized API client service. - Drive service = new Drive.Builder(new NetHttpTransport(), - GsonFactory.getDefaultInstance(), - requestInitializer) - .setApplicationName("Drive samples") - .build(); + // Build a new authorized API client service. + Drive service = new Drive.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Drive samples") + .build(); - OutputStream outputStream = new ByteArrayOutputStream(); - try { - service.files().export(realFileId, "application/pdf") - .executeMediaAndDownloadTo(outputStream); + OutputStream outputStream = new ByteArrayOutputStream(); + try { + service.files().export(realFileId, "application/pdf") + .executeMediaAndDownloadTo(outputStream); - return (ByteArrayOutputStream) outputStream; - } catch (GoogleJsonResponseException e) { - // TODO(developer) - handle error appropriately - System.err.println("Unable to export file: " + e.getDetails()); - throw e; - } + return (ByteArrayOutputStream) outputStream; + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + System.err.println("Unable to export file: " + e.getDetails()); + throw e; } + } } // [END drive_export_pdf] diff --git a/drive/snippets/drive_v2/src/main/java/FetchAppDataFolder.java b/drive/snippets/drive_v2/src/main/java/FetchAppDataFolder.java index c402a18a..16c27b6f 100644 --- a/drive/snippets/drive_v2/src/main/java/FetchAppDataFolder.java +++ b/drive/snippets/drive_v2/src/main/java/FetchAppDataFolder.java @@ -14,61 +14,59 @@ // [START drive_fetch_appdata_folder] import com.google.api.client.googleapis.json.GoogleJsonResponseException; -import com.google.api.client.http.FileContent; import com.google.api.client.http.HttpRequestInitializer; import com.google.api.client.http.javanet.NetHttpTransport; import com.google.api.client.json.gson.GsonFactory; import com.google.api.services.drive.Drive; import com.google.api.services.drive.DriveScopes; import com.google.api.services.drive.model.File; -import com.google.api.services.drive.model.FileList; -import com.google.api.services.drive.model.ParentReference; import com.google.auth.http.HttpCredentialsAdapter; import com.google.auth.oauth2.GoogleCredentials; - import java.io.IOException; -import java.security.GeneralSecurityException; import java.util.Arrays; -import java.util.Collections; -/** Class to demonstrate use-case of list out application data folder and prints folder Id. */ +/** + * Class to demonstrate use-case of list out application data folder and prints folder Id. + */ public class FetchAppDataFolder { - /** - * Fetches appDataFolder and prints it's folder id. - * @return Application data folder's ID. - */ - public static String fetchAppDataFolder() throws IOException { + /** + * Fetches appDataFolder and prints it's folder id. + * + * @return Application data folder's ID. + */ + public static String fetchAppDataFolder() throws IOException { /*Load pre-authorized user credentials from the environment. TODO(developer) - See https://developers.google.com/identity for guides on implementing OAuth2 for your application.*/ - GoogleCredentials credentials = null; - try { - credentials = GoogleCredentials.getApplicationDefault().createScoped(Arrays.asList(DriveScopes.DRIVE_APPDATA)); - } catch (IOException e) { - e.printStackTrace(); - } - HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( - credentials); + GoogleCredentials credentials = null; + try { + credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Arrays.asList(DriveScopes.DRIVE_APPDATA)); + } catch (IOException e) { + e.printStackTrace(); + } + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); - // Build a new authorized API client service. - Drive service = new Drive.Builder(new NetHttpTransport(), - GsonFactory.getDefaultInstance(), - requestInitializer) - .setApplicationName("Drive samples") - .build(); - try { - File file = service.files().get("appDataFolder") - .setFields("id") - .execute(); - System.out.println("Folder ID: " + file.getId()); + // Build a new authorized API client service. + Drive service = new Drive.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Drive samples") + .build(); + try { + File file = service.files().get("appDataFolder") + .setFields("id") + .execute(); + System.out.println("Folder ID: " + file.getId()); - return file.getId(); - }catch (GoogleJsonResponseException e) { - // TODO(developer) - handle error appropriately - System.err.println("Unable to fetch appdata folder: " + e.getDetails()); - throw e; - } + return file.getId(); + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + System.err.println("Unable to fetch appdata folder: " + e.getDetails()); + throw e; } + } } // [END drive_fetch_appdata_folder] diff --git a/drive/snippets/drive_v2/src/main/java/FetchChanges.java b/drive/snippets/drive_v2/src/main/java/FetchChanges.java index 3ff6e584..d2154eaa 100644 --- a/drive/snippets/drive_v2/src/main/java/FetchChanges.java +++ b/drive/snippets/drive_v2/src/main/java/FetchChanges.java @@ -20,60 +20,60 @@ import com.google.api.services.drive.Drive; import com.google.api.services.drive.DriveScopes; import com.google.api.services.drive.model.ChangeList; -import com.google.api.services.drive.model.StartPageToken; import com.google.auth.http.HttpCredentialsAdapter; import com.google.auth.oauth2.GoogleCredentials; - import java.io.IOException; import java.util.Arrays; /* Class to demonstrate use-case of Drive's fetch changes in file. */ public class FetchChanges { - /** - * Retrieve the list of changes for the currently authenticated user. - * @param savedStartPageToken Last saved start token for this user. - * @return Saved token after last page. - * @throws IOException if file is not found - */ - public static String fetchChanges(String savedStartPageToken) throws IOException { + /** + * Retrieve the list of changes for the currently authenticated user. + * + * @param savedStartPageToken Last saved start token for this user. + * @return Saved token after last page. + * @throws IOException if file is not found + */ + public static String fetchChanges(String savedStartPageToken) throws IOException { /*Load pre-authorized user credentials from the environment. TODO(developer) - See https://developers.google.com/identity for guides on implementing OAuth2 for your application.*/ - GoogleCredentials credentials = GoogleCredentials.getApplicationDefault().createScoped(Arrays.asList(DriveScopes.DRIVE_FILE)); - HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( - credentials); - - // Build a new authorized API client service. - Drive service = new Drive.Builder(new NetHttpTransport(), - GsonFactory.getDefaultInstance(), - requestInitializer) - .setApplicationName("Drive samples") - .build(); - try { - // Begin with our last saved start token for this user or the - // current token from getStartPageToken() - String pageToken = savedStartPageToken; - while (pageToken != null) { - ChangeList changes = service.changes().list().setPageToken(pageToken) - .execute(); - for (com.google.api.services.drive.model.Change change : changes.getItems()) { - // Process change - System.out.println("Change found for file: " + change.getFileId()); - } - if (changes.getNewStartPageToken() != null) { - // Last page, save this token for the next polling interval - savedStartPageToken = changes.getNewStartPageToken(); - } - pageToken = changes.getNextPageToken(); - } + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Arrays.asList(DriveScopes.DRIVE_FILE)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); - return savedStartPageToken; - }catch (GoogleJsonResponseException e) { - // TODO(developer) - handle error appropriately - System.err.println("Unable to fetch changes: " + e.getDetails()); - throw e; + // Build a new authorized API client service. + Drive service = new Drive.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Drive samples") + .build(); + try { + // Begin with our last saved start token for this user or the + // current token from getStartPageToken() + String pageToken = savedStartPageToken; + while (pageToken != null) { + ChangeList changes = service.changes().list().setPageToken(pageToken) + .execute(); + for (com.google.api.services.drive.model.Change change : changes.getItems()) { + // Process change + System.out.println("Change found for file: " + change.getFileId()); } + if (changes.getNewStartPageToken() != null) { + // Last page, save this token for the next polling interval + savedStartPageToken = changes.getNewStartPageToken(); + } + pageToken = changes.getNextPageToken(); + } + + return savedStartPageToken; + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + System.err.println("Unable to fetch changes: " + e.getDetails()); + throw e; } + } } // [END drive_fetch_changes] diff --git a/drive/snippets/drive_v2/src/main/java/FetchStartPageToken.java b/drive/snippets/drive_v2/src/main/java/FetchStartPageToken.java index c77419a6..a3445c7a 100644 --- a/drive/snippets/drive_v2/src/main/java/FetchStartPageToken.java +++ b/drive/snippets/drive_v2/src/main/java/FetchStartPageToken.java @@ -19,49 +19,49 @@ import com.google.api.client.json.gson.GsonFactory; import com.google.api.services.drive.Drive; import com.google.api.services.drive.DriveScopes; -import com.google.api.services.drive.model.ChangeList; import com.google.api.services.drive.model.StartPageToken; import com.google.auth.http.HttpCredentialsAdapter; import com.google.auth.oauth2.GoogleCredentials; - import java.io.IOException; import java.util.Arrays; /* Class to demonstrate use-case of Drive's fetch start page token */ public class FetchStartPageToken { - /** - * Retrieve the start page token for the first time. - * @return Start page token as String. - * @throws IOException if file is not found - */ - public static String fetchStartPageToken() throws IOException { + /** + * Retrieve the start page token for the first time. + * + * @return Start page token as String. + * @throws IOException if file is not found + */ + public static String fetchStartPageToken() throws IOException { /*Load pre-authorized user credentials from the environment. TODO(developer) - See https://developers.google.com/identity for guides on implementing OAuth2 for your application. */ - GoogleCredentials credentials = GoogleCredentials.getApplicationDefault().createScoped(Arrays.asList(DriveScopes.DRIVE_FILE)); - HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( - credentials); + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Arrays.asList(DriveScopes.DRIVE_FILE)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); - // Build a new authorized API client service. - Drive service = new Drive.Builder(new NetHttpTransport(), - GsonFactory.getDefaultInstance(), - requestInitializer) - .setApplicationName("Drive samples") - .build(); - try { - StartPageToken response = service.changes() - .getStartPageToken().execute(); - System.out.println("Start token: " + response.getStartPageToken()); + // Build a new authorized API client service. + Drive service = new Drive.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Drive samples") + .build(); + try { + StartPageToken response = service.changes() + .getStartPageToken().execute(); + System.out.println("Start token: " + response.getStartPageToken()); - return response.getStartPageToken(); - }catch (GoogleJsonResponseException e) { - // TODO(developer) - handle error appropriately - System.err.println("Unable to fetch start page token: " + e.getDetails()); - throw e; - } + return response.getStartPageToken(); + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + System.err.println("Unable to fetch start page token: " + e.getDetails()); + throw e; } + } } // [END drive_fetch_start_page_token] diff --git a/drive/snippets/drive_v2/src/main/java/ListAppData.java b/drive/snippets/drive_v2/src/main/java/ListAppData.java index 7ed0782e..1628c42b 100644 --- a/drive/snippets/drive_v2/src/main/java/ListAppData.java +++ b/drive/snippets/drive_v2/src/main/java/ListAppData.java @@ -14,7 +14,6 @@ // [START drive_list_appdata] import com.google.api.client.googleapis.json.GoogleJsonResponseException; -import com.google.api.client.http.FileContent; import com.google.api.client.http.HttpRequestInitializer; import com.google.api.client.http.javanet.NetHttpTransport; import com.google.api.client.json.gson.GsonFactory; @@ -22,59 +21,59 @@ import com.google.api.services.drive.DriveScopes; import com.google.api.services.drive.model.File; import com.google.api.services.drive.model.FileList; -import com.google.api.services.drive.model.ParentReference; import com.google.auth.http.HttpCredentialsAdapter; import com.google.auth.oauth2.GoogleCredentials; - import java.io.IOException; -import java.security.GeneralSecurityException; import java.util.Arrays; -import java.util.Collections; -/** Class to demonstrate use-case of list 10 files in the application data folder. */ +/** + * Class to demonstrate use-case of list 10 files in the application data folder. + */ public class ListAppData { - /** - * list down files in the application data folder. - * @return list of 10 files. - */ - public static FileList listAppData() throws IOException { + /** + * list down files in the application data folder. + * + * @return list of 10 files. + */ + public static FileList listAppData() throws IOException { /*Load pre-authorized user credentials from the environment. TODO(developer) - See https://developers.google.com/identity for guides on implementing OAuth2 for your application.*/ - GoogleCredentials credentials = null; - try { - credentials = GoogleCredentials.getApplicationDefault().createScoped(Arrays.asList(DriveScopes.DRIVE_APPDATA)); - } catch (IOException e) { - e.printStackTrace(); - } - HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( - credentials); + GoogleCredentials credentials = null; + try { + credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Arrays.asList(DriveScopes.DRIVE_APPDATA)); + } catch (IOException e) { + e.printStackTrace(); + } + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); - // Build a new authorized API client service. - Drive service = new Drive.Builder(new NetHttpTransport(), - GsonFactory.getDefaultInstance(), - requestInitializer) - .setApplicationName("Drive samples") - .build(); - try { - FileList files = service.files().list() - .setSpaces("appDataFolder") - .setFields("nextPageToken, items(id, title)") - .setMaxResults(10) - .execute(); - for (File file : files.getItems()) { - System.out.printf("Found file: %s (%s)\n", - file.getTitle(), file.getId()); - } + // Build a new authorized API client service. + Drive service = new Drive.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Drive samples") + .build(); + try { + FileList files = service.files().list() + .setSpaces("appDataFolder") + .setFields("nextPageToken, items(id, title)") + .setMaxResults(10) + .execute(); + for (File file : files.getItems()) { + System.out.printf("Found file: %s (%s)\n", + file.getTitle(), file.getId()); + } - return files; - }catch (GoogleJsonResponseException e) { - // TODO(developer) - handle error appropriately - System.err.println("Unable to list files: " + e.getDetails()); - throw e; - } + return files; + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + System.err.println("Unable to list files: " + e.getDetails()); + throw e; } + } } // [END drive_list_appdata] \ No newline at end of file diff --git a/drive/snippets/drive_v2/src/main/java/MoveFileToFolder.java b/drive/snippets/drive_v2/src/main/java/MoveFileToFolder.java index c45ba0e2..15dcf2b9 100644 --- a/drive/snippets/drive_v2/src/main/java/MoveFileToFolder.java +++ b/drive/snippets/drive_v2/src/main/java/MoveFileToFolder.java @@ -16,7 +16,6 @@ import com.google.api.client.googleapis.json.GoogleJsonResponseException; -import com.google.api.client.http.FileContent; import com.google.api.client.http.HttpRequestInitializer; import com.google.api.client.http.javanet.NetHttpTransport; import com.google.api.client.json.gson.GsonFactory; @@ -26,65 +25,64 @@ import com.google.api.services.drive.model.ParentReference; import com.google.auth.http.HttpCredentialsAdapter; import com.google.auth.oauth2.GoogleCredentials; - import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; -import java.util.stream.Stream; /* Class to demonstrate use case for moving file to folder.*/ public class MoveFileToFolder { - /** - * @param fileId Id of file to be moved. - * @param folderId Id of folder where the fill will be moved. - * @return list of parent ids for the file. - * */ - public static List moveFileToFolder(String fileId, String folderId) - throws IOException { + /** + * @param fileId Id of file to be moved. + * @param folderId Id of folder where the fill will be moved. + * @return list of parent ids for the file. + */ + public static List moveFileToFolder(String fileId, String folderId) + throws IOException { /* Load pre-authorized user credentials from the environment. TODO(developer) - See https://developers.google.com/identity for guides on implementing OAuth2 for your application.*/ - GoogleCredentials credentials = GoogleCredentials.getApplicationDefault().createScoped(Arrays.asList(DriveScopes.DRIVE_FILE)); - HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( - credentials); - // Build a new authorized API client service. - Drive service = new Drive.Builder(new NetHttpTransport(), - GsonFactory.getDefaultInstance(), - requestInitializer) - .setApplicationName("Drive samples") - .build(); + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Arrays.asList(DriveScopes.DRIVE_FILE)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + // Build a new authorized API client service. + Drive service = new Drive.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Drive samples") + .build(); - // Retrieve the existing parents to remove - File file = service.files().get(fileId) - .setFields("parents") - .execute(); - List parentIds = file.getParents() - .stream() - .map(ParentReference::getId) - .collect(Collectors.toList()); - String previousParents = String.join(",", parentIds); - try { - // Move the file to the new folder - file = service.files().update(fileId, null) - .setAddParents(folderId) - .setRemoveParents(previousParents) - .setFields("id, parents") - .execute(); + // Retrieve the existing parents to remove + File file = service.files().get(fileId) + .setFields("parents") + .execute(); + List parentIds = file.getParents() + .stream() + .map(ParentReference::getId) + .collect(Collectors.toList()); + String previousParents = String.join(",", parentIds); + try { + // Move the file to the new folder + file = service.files().update(fileId, null) + .setAddParents(folderId) + .setRemoveParents(previousParents) + .setFields("id, parents") + .execute(); - List parents = new ArrayList<>(); - for (ParentReference parent : file.getParents()) { - parents.add(parent.getId()); - } - return parents; - }catch (GoogleJsonResponseException e) { - // TODO(developer) - handle error appropriately - System.err.println("Unable to move file: " + e.getDetails()); - throw e; - } + List parents = new ArrayList<>(); + for (ParentReference parent : file.getParents()) { + parents.add(parent.getId()); + } + return parents; + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + System.err.println("Unable to move file: " + e.getDetails()); + throw e; } + } } // [END drive_move_file_to_folder] diff --git a/drive/snippets/drive_v2/src/main/java/RecoverDrive.java b/drive/snippets/drive_v2/src/main/java/RecoverDrive.java index 038f1a57..d00de913 100644 --- a/drive/snippets/drive_v2/src/main/java/RecoverDrive.java +++ b/drive/snippets/drive_v2/src/main/java/RecoverDrive.java @@ -17,14 +17,12 @@ import com.google.api.client.http.HttpRequestInitializer; import com.google.api.client.http.javanet.NetHttpTransport; import com.google.api.client.json.gson.GsonFactory; -//import com.google.api.services.drive.Drive; import com.google.api.services.drive.DriveScopes; import com.google.api.services.drive.model.Drive; import com.google.api.services.drive.model.DriveList; import com.google.api.services.drive.model.Permission; import com.google.auth.http.HttpCredentialsAdapter; import com.google.auth.oauth2.GoogleCredentials; - import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; @@ -33,74 +31,77 @@ /* class to demonstrate use-case of Drive's shared drive without an organizer. */ public class RecoverDrive { - /** - * Find all shared drives without an organizer and add one. - * @param realUser User's email id. - * @return All shared drives without an organizer. - * @throws IOException if shared drive not found. - */ - public static List recoverDrives(String realUser) - throws IOException { + /** + * Find all shared drives without an organizer and add one. + * + * @param realUser User's email id. + * @return All shared drives without an organizer. + * @throws IOException if shared drive not found. + */ + public static List recoverDrives(String realUser) + throws IOException { /*Load pre-authorized user credentials from the environment. TODO(developer) - See https://developers.google.com/identity for guides on implementing OAuth2 for your application.*/ - GoogleCredentials credentials = GoogleCredentials.getApplicationDefault().createScoped(Arrays.asList(DriveScopes.DRIVE)); - HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( - credentials); + GoogleCredentials credentials = + GoogleCredentials.getApplicationDefault().createScoped(Arrays.asList(DriveScopes.DRIVE)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); - // Build a new authorized API client service. - com.google.api.services.drive.Drive service = new com.google.api.services.drive.Drive.Builder(new NetHttpTransport(), - GsonFactory.getDefaultInstance(), - requestInitializer) - .setApplicationName("Drive samples") - .build(); - List drives = new ArrayList(); + // Build a new authorized API client service. + com.google.api.services.drive.Drive service = + new com.google.api.services.drive.Drive.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Drive samples") + .build(); + List drives = new ArrayList(); - // Find all shared drives without an organizer and add one. - // Note: This example does not capture all cases. Shared drives - // that have an empty group as the sole organizer, or an - // organizer outside the organization are not captured. A - // more exhaustive approach would evaluate each shared drive - // and the associated permissions and groups to ensure an active - // organizer is assigned. - String pageToken = null; - Permission newOrganizerPermission = new Permission() - .setType("user") - .setRole("organizer") - .setValue("user@example.com"); + // Find all shared drives without an organizer and add one. + // Note: This example does not capture all cases. Shared drives + // that have an empty group as the sole organizer, or an + // organizer outside the organization are not captured. A + // more exhaustive approach would evaluate each shared drive + // and the associated permissions and groups to ensure an active + // organizer is assigned. + String pageToken = null; + Permission newOrganizerPermission = new Permission() + .setType("user") + .setRole("organizer") + .setValue("user@example.com"); - newOrganizerPermission.setValue(realUser); + newOrganizerPermission.setValue(realUser); - do { - DriveList result = service.drives().list() - .setQ("organizerCount = 0") - .setUseDomainAdminAccess(true) - .setFields("nextPageToken, items(id, name)") - .setPageToken(pageToken) - .execute(); - for (Drive drive : result.getItems()) { - System.out.printf("Found drive without organizer: %s (%s)\n", - drive.getName(), drive.getId()); - // Note: For improved efficiency, consider batching - // permission insert requests - Permission permissionResult = service.permissions() - .insert(drive.getId(), newOrganizerPermission) - .setUseDomainAdminAccess(true) - .setSupportsAllDrives(true) - .setFields("id") - .execute(); - System.out.printf("Added organizer permission: %s\n", - permissionResult.getId()); + do { + DriveList result = service.drives().list() + .setQ("organizerCount = 0") + .setUseDomainAdminAccess(true) + .setFields("nextPageToken, items(id, name)") + .setPageToken(pageToken) + .execute(); + for (Drive drive : result.getItems()) { + System.out.printf("Found drive without organizer: %s (%s)\n", + drive.getName(), drive.getId()); + // Note: For improved efficiency, consider batching + // permission insert requests + Permission permissionResult = service.permissions() + .insert(drive.getId(), newOrganizerPermission) + .setUseDomainAdminAccess(true) + .setSupportsAllDrives(true) + .setFields("id") + .execute(); + System.out.printf("Added organizer permission: %s\n", + permissionResult.getId()); - } - drives.addAll(result.getItems()); + } + drives.addAll(result.getItems()); - pageToken = result.getNextPageToken(); - } while (pageToken != null); + pageToken = result.getNextPageToken(); + } while (pageToken != null); - return drives; - } + return drives; + } } // [END drive_recover_drives] diff --git a/drive/snippets/drive_v2/src/main/java/RecoverTeamDrive.java b/drive/snippets/drive_v2/src/main/java/RecoverTeamDrive.java index a11d4a24..84705826 100644 --- a/drive/snippets/drive_v2/src/main/java/RecoverTeamDrive.java +++ b/drive/snippets/drive_v2/src/main/java/RecoverTeamDrive.java @@ -17,14 +17,12 @@ import com.google.api.client.http.HttpRequestInitializer; import com.google.api.client.http.javanet.NetHttpTransport; import com.google.api.client.json.gson.GsonFactory; -//import com.google.api.services.drive.Drive; import com.google.api.services.drive.DriveScopes; import com.google.api.services.drive.model.Permission; import com.google.api.services.drive.model.TeamDrive; import com.google.api.services.drive.model.TeamDriveList; import com.google.auth.http.HttpCredentialsAdapter; import com.google.auth.oauth2.GoogleCredentials; - import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; @@ -33,77 +31,80 @@ /* class to demonstrate use-case of Drive's recover all team drives without an organizer. */ public class RecoverTeamDrive { - /** - * Finds all Team Drives without an organizer and add one. - * @param realUser User ID for the new organizer. - * @return All team drives without an organizer. - * @throws IOException if service account credentials file not found. - */ - public static List recoverTeamDrives(String realUser) throws IOException { + /** + * Finds all Team Drives without an organizer and add one. + * + * @param realUser User ID for the new organizer. + * @return All team drives without an organizer. + * @throws IOException if service account credentials file not found. + */ + public static List recoverTeamDrives(String realUser) throws IOException { /*Load pre-authorized user credentials from the environment. TODO(developer) - See https://developers.google.com/identity for guides on implementing OAuth2 for your application.*/ - GoogleCredentials credentials = GoogleCredentials.getApplicationDefault().createScoped(Arrays.asList(DriveScopes.DRIVE)); - HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( - credentials); + GoogleCredentials credentials = + GoogleCredentials.getApplicationDefault().createScoped(Arrays.asList(DriveScopes.DRIVE)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); - // Build a new authorized API client service. - com.google.api.services.drive.Drive service = new com.google.api.services.drive.Drive.Builder(new NetHttpTransport(), - GsonFactory.getDefaultInstance(), - requestInitializer) - .setApplicationName("Drive samples") - .build(); - List teamDrives = new ArrayList(); + // Build a new authorized API client service. + com.google.api.services.drive.Drive service = + new com.google.api.services.drive.Drive.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Drive samples") + .build(); + List teamDrives = new ArrayList(); - // Find all Team Drives without an organizer and add one. - // Note: This example does not capture all cases. Team Drives - // that have an empty group as the sole organizer, or an - // organizer outside the organization are not captured. A - // more exhaustive approach would evaluate each Team Drive - // and the associated permissions and groups to ensure an active - // organizer is assigned. - String pageToken = null; - Permission newOrganizerPermission = new Permission() - .setType("user") - .setRole("organizer") - .setValue("user@example.com"); + // Find all Team Drives without an organizer and add one. + // Note: This example does not capture all cases. Team Drives + // that have an empty group as the sole organizer, or an + // organizer outside the organization are not captured. A + // more exhaustive approach would evaluate each Team Drive + // and the associated permissions and groups to ensure an active + // organizer is assigned. + String pageToken = null; + Permission newOrganizerPermission = new Permission() + .setType("user") + .setRole("organizer") + .setValue("user@example.com"); - newOrganizerPermission.setValue(realUser); - try { - do { - TeamDriveList result = service.teamdrives().list() - .setQ("organizerCount = 0") - .setUseDomainAdminAccess(true) - .setFields("nextPageToken, items(id, name)") - .setPageToken(pageToken) - .execute(); - for (TeamDrive teamDrive : result.getItems()) { - System.out.printf("Found Team Drive without organizer: %s (%s)\n", - teamDrive.getName(), teamDrive.getId()); - // Note: For improved efficiency, consider batching - // permission insert requests - Permission permissionResult = service.permissions() - .insert(teamDrive.getId(), newOrganizerPermission) - .setUseDomainAdminAccess(true) - .setSupportsTeamDrives(true) - .setFields("id") - .execute(); - System.out.printf("Added organizer permission: %s\n", - permissionResult.getId()); - } + newOrganizerPermission.setValue(realUser); + try { + do { + TeamDriveList result = service.teamdrives().list() + .setQ("organizerCount = 0") + .setUseDomainAdminAccess(true) + .setFields("nextPageToken, items(id, name)") + .setPageToken(pageToken) + .execute(); + for (TeamDrive teamDrive : result.getItems()) { + System.out.printf("Found Team Drive without organizer: %s (%s)\n", + teamDrive.getName(), teamDrive.getId()); + // Note: For improved efficiency, consider batching + // permission insert requests + Permission permissionResult = service.permissions() + .insert(teamDrive.getId(), newOrganizerPermission) + .setUseDomainAdminAccess(true) + .setSupportsTeamDrives(true) + .setFields("id") + .execute(); + System.out.printf("Added organizer permission: %s\n", + permissionResult.getId()); + } - teamDrives.addAll(result.getItems()); + teamDrives.addAll(result.getItems()); - pageToken = result.getNextPageToken(); - } while (pageToken != null); + pageToken = result.getNextPageToken(); + } while (pageToken != null); - return teamDrives; - } catch (GoogleJsonResponseException e) { - // TODO(developer) - handle error appropriately - System.err.println("Unable to recover team drive: " + e.getDetails()); - throw e; - } + return teamDrives; + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + System.err.println("Unable to recover team drive: " + e.getDetails()); + throw e; } + } } // [END drive_recover_team_drives] diff --git a/drive/snippets/drive_v2/src/main/java/SearchFile.java b/drive/snippets/drive_v2/src/main/java/SearchFile.java index 242c575b..f6543292 100644 --- a/drive/snippets/drive_v2/src/main/java/SearchFile.java +++ b/drive/snippets/drive_v2/src/main/java/SearchFile.java @@ -23,7 +23,6 @@ import com.google.api.services.drive.model.FileList; import com.google.auth.http.HttpCredentialsAdapter; import com.google.auth.oauth2.GoogleCredentials; - import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; @@ -32,47 +31,49 @@ /* Class to demonstrate use-case of search files. */ public class SearchFile { - /** - * Search for specific set of files. - * @return search result list. - * @throws IOException if service account credentials file not found. - */ - public static List searchFile() throws IOException{ + /** + * Search for specific set of files. + * + * @return search result list. + * @throws IOException if service account credentials file not found. + */ + public static List searchFile() throws IOException { /*Load pre-authorized user credentials from the environment. TODO(developer) - See https://developers.google.com/identity for guides on implementing OAuth2 for your application.*/ - GoogleCredentials credentials = GoogleCredentials.getApplicationDefault().createScoped(Arrays.asList(DriveScopes.DRIVE_FILE)); - HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( - credentials); + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Arrays.asList(DriveScopes.DRIVE_FILE)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); - // Build a new authorized API client service. - Drive service = new Drive.Builder(new NetHttpTransport(), - GsonFactory.getDefaultInstance(), - requestInitializer) - .setApplicationName("Drive samples") - .build(); + // Build a new authorized API client service. + Drive service = new Drive.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Drive samples") + .build(); - List files = new ArrayList(); + List files = new ArrayList(); - String pageToken = null; - do { - FileList result = service.files().list() - .setQ("mimeType='image/jpeg'") - .setSpaces("drive") - .setFields("nextPageToken, items(id, title)") - .setPageToken(pageToken) - .execute(); - for (File file : result.getItems()) { - System.out.printf("Found file: %s (%s)\n", - file.getTitle(), file.getId()); - } + String pageToken = null; + do { + FileList result = service.files().list() + .setQ("mimeType='image/jpeg'") + .setSpaces("drive") + .setFields("nextPageToken, items(id, title)") + .setPageToken(pageToken) + .execute(); + for (File file : result.getItems()) { + System.out.printf("Found file: %s (%s)\n", + file.getTitle(), file.getId()); + } - files.addAll(result.getItems()); + files.addAll(result.getItems()); - pageToken = result.getNextPageToken(); - } while (pageToken != null); + pageToken = result.getNextPageToken(); + } while (pageToken != null); - return files; - } + return files; + } } // [END drive_search_files] diff --git a/drive/snippets/drive_v2/src/main/java/ShareFile.java b/drive/snippets/drive_v2/src/main/java/ShareFile.java index 1b423722..ecbd3bf1 100644 --- a/drive/snippets/drive_v2/src/main/java/ShareFile.java +++ b/drive/snippets/drive_v2/src/main/java/ShareFile.java @@ -27,7 +27,6 @@ import com.google.api.services.drive.model.Permission; import com.google.auth.http.HttpCredentialsAdapter; import com.google.auth.oauth2.GoogleCredentials; - import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; @@ -36,80 +35,83 @@ /* Class to demonstrate use-case of modify permissions. */ public class ShareFile { - /** - * Batch permission modification. - * realFileId file Id. - * realUser User Id. - * realDomain Domain of the user ID. - * @return list of modified permissions if successful, {@code null} otherwise. - * @throws IOException if service account credentials file not found. - */ - public static List shareFile(String realFileId, String realUser, String realDomain) throws IOException{ + /** + * Batch permission modification. + * realFileId file Id. + * realUser User Id. + * realDomain Domain of the user ID. + * + * @return list of modified permissions if successful, {@code null} otherwise. + * @throws IOException if service account credentials file not found. + */ + public static List shareFile(String realFileId, String realUser, String realDomain) + throws IOException { /* Load pre-authorized user credentials from the environment. TODO(developer) - See https://developers.google.com/identity for guides on implementing OAuth2 for your application.application*/ - GoogleCredentials credentials = GoogleCredentials.getApplicationDefault().createScoped(Arrays.asList(DriveScopes.DRIVE_FILE)); - HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( - credentials); - - // Build a new authorized API client service. - Drive service = new Drive.Builder(new NetHttpTransport(), - GsonFactory.getDefaultInstance(), - requestInitializer) - .setApplicationName("Drive samples") - .build(); - - final List ids = new ArrayList(); - - - JsonBatchCallback callback = new JsonBatchCallback() { - @Override - public void onFailure(GoogleJsonError e, - HttpHeaders responseHeaders) - throws IOException { - // Handle error - System.err.println(e.getMessage()); - } - - @Override - public void onSuccess(Permission permission, - HttpHeaders responseHeaders) - throws IOException { - System.out.println("Permission ID: " + permission.getId()); - - ids.add(permission.getId()); - - } - }; - BatchRequest batch = service.batch(); - Permission userPermission = new Permission() - .setType("user") - .setRole("writer"); - - userPermission.setValue(realUser); - try { - service.permissions().insert(realFileId, userPermission) - .setFields("id") - .queue(batch, callback); - - Permission domainPermission = new Permission() - .setType("domain") - .setRole("reader"); - - domainPermission.setValue(realDomain); - - service.permissions().insert(realFileId, domainPermission) - .setFields("id") - .queue(batch, callback); - - batch.execute(); - - return ids; - }catch (GoogleJsonResponseException e) { - // TODO(developer) - handle error appropriately - System.err.println("Unable to modify permission: " + e.getDetails()); - throw e; - } + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Arrays.asList(DriveScopes.DRIVE_FILE)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + + // Build a new authorized API client service. + Drive service = new Drive.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Drive samples") + .build(); + + final List ids = new ArrayList(); + + + JsonBatchCallback callback = new JsonBatchCallback() { + @Override + public void onFailure(GoogleJsonError e, + HttpHeaders responseHeaders) + throws IOException { + // Handle error + System.err.println(e.getMessage()); + } + + @Override + public void onSuccess(Permission permission, + HttpHeaders responseHeaders) + throws IOException { + System.out.println("Permission ID: " + permission.getId()); + + ids.add(permission.getId()); + + } + }; + BatchRequest batch = service.batch(); + Permission userPermission = new Permission() + .setType("user") + .setRole("writer"); + + userPermission.setValue(realUser); + try { + service.permissions().insert(realFileId, userPermission) + .setFields("id") + .queue(batch, callback); + + Permission domainPermission = new Permission() + .setType("domain") + .setRole("reader"); + + domainPermission.setValue(realDomain); + + service.permissions().insert(realFileId, domainPermission) + .setFields("id") + .queue(batch, callback); + + batch.execute(); + + return ids; + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + System.err.println("Unable to modify permission: " + e.getDetails()); + throw e; } + } } // [END drive_share_file] diff --git a/drive/snippets/drive_v2/src/main/java/TouchFile.java b/drive/snippets/drive_v2/src/main/java/TouchFile.java index 31ee8f82..6875d862 100644 --- a/drive/snippets/drive_v2/src/main/java/TouchFile.java +++ b/drive/snippets/drive_v2/src/main/java/TouchFile.java @@ -24,7 +24,6 @@ import com.google.api.services.drive.model.File; import com.google.auth.http.HttpCredentialsAdapter; import com.google.auth.oauth2.GoogleCredentials; - import java.io.IOException; import java.util.Arrays; @@ -32,47 +31,48 @@ public class TouchFile { - /** - * @param realFileId Id of file to be modified. - * @param realTimestamp Timestamp in miliseconds. - * @return long file's latest modification date value. - * @throws IOException if service account credentials file not found. - * */ - public static long touchFile(String realFileId, long realTimestamp) - throws IOException { + /** + * @param realFileId Id of file to be modified. + * @param realTimestamp Timestamp in miliseconds. + * @return long file's latest modification date value. + * @throws IOException if service account credentials file not found. + */ + public static long touchFile(String realFileId, long realTimestamp) + throws IOException { /*Load pre-authorized user credentials from the environment. TODO(developer) - See https://developers.google.com/identity for guides on implementing OAuth2 for your application.*/ - GoogleCredentials credentials = GoogleCredentials.getApplicationDefault().createScoped(Arrays.asList(DriveScopes.DRIVE_FILE)); - HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( - credentials); + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Arrays.asList(DriveScopes.DRIVE_FILE)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); - // Build a new authorized API client service. - Drive service = new Drive.Builder(new NetHttpTransport(), - GsonFactory.getDefaultInstance(), - requestInitializer) - .setApplicationName("Drive samples") - .build(); - String fileId = "1sTWaJ_j7PkjzaBWtNc3IzovK5hQf21FbOw9yLeeLPNQ"; - File fileMetadata = new File(); - fileMetadata.setModifiedDate(new DateTime(System.currentTimeMillis())); + // Build a new authorized API client service. + Drive service = new Drive.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Drive samples") + .build(); + String fileId = "1sTWaJ_j7PkjzaBWtNc3IzovK5hQf21FbOw9yLeeLPNQ"; + File fileMetadata = new File(); + fileMetadata.setModifiedDate(new DateTime(System.currentTimeMillis())); - fileId = realFileId; - fileMetadata.setModifiedDate(new DateTime(realTimestamp)); + fileId = realFileId; + fileMetadata.setModifiedDate(new DateTime(realTimestamp)); - try { - File file = service.files().update(fileId, fileMetadata) - .setSetModifiedDate(true) - .setFields("id, modifiedDate") - .execute(); - System.out.println("Modified time: " + file.getModifiedDate()); - return file.getModifiedDate().getValue(); - }catch (GoogleJsonResponseException e) { - // TODO(developer) - handle error appropriately - System.err.println("Unable to move file: " + e.getDetails()); - throw e; - } + try { + File file = service.files().update(fileId, fileMetadata) + .setSetModifiedDate(true) + .setFields("id, modifiedDate") + .execute(); + System.out.println("Modified time: " + file.getModifiedDate()); + return file.getModifiedDate().getValue(); + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + System.err.println("Unable to move file: " + e.getDetails()); + throw e; } + } } // [END drive_touch_file] diff --git a/drive/snippets/drive_v2/src/main/java/UploadAppData.java b/drive/snippets/drive_v2/src/main/java/UploadAppData.java index 7731be4e..2bd4f557 100644 --- a/drive/snippets/drive_v2/src/main/java/UploadAppData.java +++ b/drive/snippets/drive_v2/src/main/java/UploadAppData.java @@ -21,62 +21,64 @@ import com.google.api.services.drive.Drive; import com.google.api.services.drive.DriveScopes; import com.google.api.services.drive.model.File; -import com.google.api.services.drive.model.FileList; import com.google.api.services.drive.model.ParentReference; import com.google.auth.http.HttpCredentialsAdapter; import com.google.auth.oauth2.GoogleCredentials; - import java.io.IOException; import java.util.Arrays; import java.util.Collections; -/** Class to demonstrate use-case of create file in the application data folder. */ +/** + * Class to demonstrate use-case of create file in the application data folder. + */ public class UploadAppData { - /** - * Creates a file in the application data folder. - * @return Created file's Id. - */ - public static String uploadAppData() throws IOException { + /** + * Creates a file in the application data folder. + * + * @return Created file's Id. + */ + public static String uploadAppData() throws IOException { /*Load pre-authorized user credentials from the environment. TODO(developer) - See https://developers.google.com/identity for guides on implementing OAuth2 for your application.*/ - GoogleCredentials credentials = null; - try { - credentials = GoogleCredentials.getApplicationDefault().createScoped(Arrays.asList(DriveScopes.DRIVE_APPDATA)); - } catch (IOException e) { - e.printStackTrace(); - } - HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( - credentials); + GoogleCredentials credentials = null; + try { + credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Arrays.asList(DriveScopes.DRIVE_APPDATA)); + } catch (IOException e) { + e.printStackTrace(); + } + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); - // Build a new authorized API client service. - Drive service = new Drive.Builder(new NetHttpTransport(), - GsonFactory.getDefaultInstance(), - requestInitializer) - .setApplicationName("Drive samples") - .build(); - try { - // File's metadata. - File fileMetadata = new File(); - fileMetadata.setTitle("config.json"); - fileMetadata.setParents(Collections.singletonList( - new ParentReference().setId("appDataFolder"))); - java.io.File filePath = new java.io.File("files/config.json"); - // Specify media type and file-path for file. - FileContent mediaContent = new FileContent("application/json", filePath); - File file = service.files().insert(fileMetadata, mediaContent) - .setFields("id") - .execute(); - System.out.println("File ID: " + file.getId()); + // Build a new authorized API client service. + Drive service = new Drive.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Drive samples") + .build(); + try { + // File's metadata. + File fileMetadata = new File(); + fileMetadata.setTitle("config.json"); + fileMetadata.setParents(Collections.singletonList( + new ParentReference().setId("appDataFolder"))); + java.io.File filePath = new java.io.File("files/config.json"); + // Specify media type and file-path for file. + FileContent mediaContent = new FileContent("application/json", filePath); + File file = service.files().insert(fileMetadata, mediaContent) + .setFields("id") + .execute(); + System.out.println("File ID: " + file.getId()); - return file.getId(); - }catch (GoogleJsonResponseException e) { - // TODO(developer) - handle error appropriately - System.err.println("Unable to create file: " + e.getDetails()); - throw e; - } + return file.getId(); + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + System.err.println("Unable to create file: " + e.getDetails()); + throw e; } + } } // [END drive_upload_appdata] \ No newline at end of file diff --git a/drive/snippets/drive_v2/src/main/java/UploadBasic.java b/drive/snippets/drive_v2/src/main/java/UploadBasic.java index dc99bb5b..374f240b 100644 --- a/drive/snippets/drive_v2/src/main/java/UploadBasic.java +++ b/drive/snippets/drive_v2/src/main/java/UploadBasic.java @@ -23,49 +23,50 @@ import com.google.api.services.drive.model.File; import com.google.auth.http.HttpCredentialsAdapter; import com.google.auth.oauth2.GoogleCredentials; - import java.io.IOException; import java.util.Arrays; /* Class to demonstrate use of Drive insert file API */ public class UploadBasic { - /** - * Upload new file. - * @return Inserted file metadata if successful, {@code null} otherwise. - * @throws IOException if service account credentials file not found. - */ - public static String uploadBasic() throws IOException{ - // Load pre-authorized user credentials from the environment. - // TODO(developer) - See https://developers.google.com/identity for - // guides on implementing OAuth2 for your application. - GoogleCredentials credentials = GoogleCredentials.getApplicationDefault().createScoped(Arrays.asList(DriveScopes.DRIVE_FILE)); - HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( - credentials); + /** + * Upload new file. + * + * @return Inserted file metadata if successful, {@code null} otherwise. + * @throws IOException if service account credentials file not found. + */ + public static String uploadBasic() throws IOException { + // Load pre-authorized user credentials from the environment. + // TODO(developer) - See https://developers.google.com/identity for + // guides on implementing OAuth2 for your application. + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Arrays.asList(DriveScopes.DRIVE_FILE)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); - // Build a new authorized API client service. - Drive service = new Drive.Builder(new NetHttpTransport(), - GsonFactory.getDefaultInstance(), - requestInitializer) - .setApplicationName("Drive samples") - .build(); - // Upload file photo.jpg on drive. - File fileMetadata = new File(); - fileMetadata.setTitle("photo.jpg"); - // File's content. - java.io.File filePath = new java.io.File("files/photo.jpg"); - // Specify media type and file-path for file. - FileContent mediaContent = new FileContent("image/jpeg", filePath); - try { - File file = service.files().insert(fileMetadata, mediaContent) - .setFields("id") - .execute(); - System.out.println("File ID: " + file.getId()); - return file.getId(); - } catch (IOException e) { - System.out.println("An error occurred: " + e); - return null; - } + // Build a new authorized API client service. + Drive service = new Drive.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Drive samples") + .build(); + // Upload file photo.jpg on drive. + File fileMetadata = new File(); + fileMetadata.setTitle("photo.jpg"); + // File's content. + java.io.File filePath = new java.io.File("files/photo.jpg"); + // Specify media type and file-path for file. + FileContent mediaContent = new FileContent("image/jpeg", filePath); + try { + File file = service.files().insert(fileMetadata, mediaContent) + .setFields("id") + .execute(); + System.out.println("File ID: " + file.getId()); + return file.getId(); + } catch (IOException e) { + System.out.println("An error occurred: " + e); + return null; } + } } // [END drive_upload_basic] diff --git a/drive/snippets/drive_v2/src/main/java/UploadRevision.java b/drive/snippets/drive_v2/src/main/java/UploadRevision.java index c9fccd93..460abe3b 100644 --- a/drive/snippets/drive_v2/src/main/java/UploadRevision.java +++ b/drive/snippets/drive_v2/src/main/java/UploadRevision.java @@ -24,49 +24,50 @@ import com.google.api.services.drive.model.File; import com.google.auth.http.HttpCredentialsAdapter; import com.google.auth.oauth2.GoogleCredentials; - import java.io.IOException; import java.util.Arrays; /* Class to demonstrate use-case of drive's upload revision */ public class UploadRevision { - /** - * Replace the old file with new one on same file ID. - * @param realFileId ID of the file to be replaced. - * @return Inserted file ID if successful, {@code null} otherwise. - * @throws IOException if service account credentials file not found. - */ - public static String uploadRevision(String realFileId) throws IOException{ - // Load pre-authorized user credentials from the environment. - // TODO(developer) - See https://developers.google.com/identity for - // guides on implementing OAuth2 for your application. - GoogleCredentials credentials = GoogleCredentials.getApplicationDefault().createScoped(Arrays.asList(DriveScopes.DRIVE_FILE)); - HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( - credentials); + /** + * Replace the old file with new one on same file ID. + * + * @param realFileId ID of the file to be replaced. + * @return Inserted file ID if successful, {@code null} otherwise. + * @throws IOException if service account credentials file not found. + */ + public static String uploadRevision(String realFileId) throws IOException { + // Load pre-authorized user credentials from the environment. + // TODO(developer) - See https://developers.google.com/identity for + // guides on implementing OAuth2 for your application. + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Arrays.asList(DriveScopes.DRIVE_FILE)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); - // Build a new authorized API client service. - Drive service = new Drive.Builder(new NetHttpTransport(), - GsonFactory.getDefaultInstance(), - requestInitializer) - .setApplicationName("Drive samples") - .build(); + // Build a new authorized API client service. + Drive service = new Drive.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Drive samples") + .build(); - java.io.File filePath = new java.io.File("files/photo.jpg"); - FileContent mediaContent = new FileContent("image/jpeg", filePath); - try { - Drive.Files.Update request = service.files().update(realFileId, new File(), mediaContent) - .setFields("id"); - request.getMediaHttpUploader().setDirectUploadEnabled(true); - File file = request.execute(); - System.out.println("File ID: " + file.getId()); - return file.getId(); - } catch (GoogleJsonResponseException e) { - // TODO(developer) - handle error appropriately - System.err.println("Unable to upload file: " + e.getDetails()); - throw e; - } + java.io.File filePath = new java.io.File("files/photo.jpg"); + FileContent mediaContent = new FileContent("image/jpeg", filePath); + try { + Drive.Files.Update request = service.files().update(realFileId, new File(), mediaContent) + .setFields("id"); + request.getMediaHttpUploader().setDirectUploadEnabled(true); + File file = request.execute(); + System.out.println("File ID: " + file.getId()); + return file.getId(); + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + System.err.println("Unable to upload file: " + e.getDetails()); + throw e; } + } } // [END drive_upload_revision] diff --git a/drive/snippets/drive_v2/src/main/java/UploadToFolder.java b/drive/snippets/drive_v2/src/main/java/UploadToFolder.java index ac0f156d..fead5537 100644 --- a/drive/snippets/drive_v2/src/main/java/UploadToFolder.java +++ b/drive/snippets/drive_v2/src/main/java/UploadToFolder.java @@ -32,45 +32,47 @@ /* Class to demonstrate Drive's upload to folder use-case. */ public class UploadToFolder { - /** - * Upload a file to the specified folder. - * @param realFolderId Id of the folder. - * @return Inserted file metadata if successful, {@code null} otherwise. - * @throws IOException if service account credentials file not found. - */ - public static File uploadToFolder(String realFolderId) throws IOException { - // Load pre-authorized user credentials from the environment. - // TODO(developer) - See https://developers.google.com/identity for - // guides on implementing OAuth2 for your application. - GoogleCredentials credentials = GoogleCredentials.getApplicationDefault().createScoped(Arrays.asList(DriveScopes.DRIVE_FILE)); - HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( - credentials); + /** + * Upload a file to the specified folder. + * + * @param realFolderId Id of the folder. + * @return Inserted file metadata if successful, {@code null} otherwise. + * @throws IOException if service account credentials file not found. + */ + public static File uploadToFolder(String realFolderId) throws IOException { + // Load pre-authorized user credentials from the environment. + // TODO(developer) - See https://developers.google.com/identity for + // guides on implementing OAuth2 for your application. + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Arrays.asList(DriveScopes.DRIVE_FILE)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); - // Build a new authorized API client service. - Drive service = new Drive.Builder(new NetHttpTransport(), - GsonFactory.getDefaultInstance(), - requestInitializer) - .setApplicationName("Drive samples") - .build(); + // Build a new authorized API client service. + Drive service = new Drive.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Drive samples") + .build(); - // File's metadata. - File fileMetadata = new File(); - fileMetadata.setTitle("photo.jpg"); - fileMetadata.setParents(Collections.singletonList( - new ParentReference().setId(realFolderId))); - java.io.File filePath = new java.io.File("files/photo.jpg"); - FileContent mediaContent = new FileContent("image/jpeg", filePath); - try { - File file = service.files().insert(fileMetadata, mediaContent) - .setFields("id, parents") - .execute(); - System.out.println("File ID: " + file.getId()); - return file; - }catch (GoogleJsonResponseException e) { - // TODO(developer) - handle error appropriately - System.err.println("Unable to move file: " + e.getDetails()); - throw e; - } + // File's metadata. + File fileMetadata = new File(); + fileMetadata.setTitle("photo.jpg"); + fileMetadata.setParents(Collections.singletonList( + new ParentReference().setId(realFolderId))); + java.io.File filePath = new java.io.File("files/photo.jpg"); + FileContent mediaContent = new FileContent("image/jpeg", filePath); + try { + File file = service.files().insert(fileMetadata, mediaContent) + .setFields("id, parents") + .execute(); + System.out.println("File ID: " + file.getId()); + return file; + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + System.err.println("Unable to move file: " + e.getDetails()); + throw e; } + } } // [END drive_upload_to_folder] diff --git a/drive/snippets/drive_v2/src/main/java/UploadWithConversion.java b/drive/snippets/drive_v2/src/main/java/UploadWithConversion.java index 36602e10..da62bf44 100644 --- a/drive/snippets/drive_v2/src/main/java/UploadWithConversion.java +++ b/drive/snippets/drive_v2/src/main/java/UploadWithConversion.java @@ -22,54 +22,54 @@ import com.google.api.services.drive.Drive; import com.google.api.services.drive.DriveScopes; import com.google.api.services.drive.model.File; -import com.google.api.services.drive.model.ParentReference; import com.google.auth.http.HttpCredentialsAdapter; import com.google.auth.oauth2.GoogleCredentials; import java.io.IOException; import java.util.Arrays; -import java.util.Collections; /* Class to demonstrate Drive's upload with conversion use-case. */ public class UploadWithConversion { - /** - * Upload file with conversion. - * @return Inserted file id if successful, {@code null} otherwise. - * @throws IOException if service account credentials file not found. - */ - public static String uploadWithConversion() throws IOException { - // Load pre-authorized user credentials from the environment. - // TODO(developer) - See https://developers.google.com/identity for - // guides on implementing OAuth2 for your application. - GoogleCredentials credentials = GoogleCredentials.getApplicationDefault().createScoped(Arrays.asList(DriveScopes.DRIVE_FILE)); - HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( - credentials); + /** + * Upload file with conversion. + * + * @return Inserted file id if successful, {@code null} otherwise. + * @throws IOException if service account credentials file not found. + */ + public static String uploadWithConversion() throws IOException { + // Load pre-authorized user credentials from the environment. + // TODO(developer) - See https://developers.google.com/identity for + // guides on implementing OAuth2 for your application. + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Arrays.asList(DriveScopes.DRIVE_FILE)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); - // Build a new authorized API client service. - Drive service = new Drive.Builder(new NetHttpTransport(), - GsonFactory.getDefaultInstance(), - requestInitializer) - .setApplicationName("Drive samples") - .build(); + // Build a new authorized API client service. + Drive service = new Drive.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Drive samples") + .build(); - // File's metadata. - File fileMetadata = new File(); - fileMetadata.setTitle("My Report"); - fileMetadata.setMimeType("application/vnd.google-apps.spreadsheet"); + // File's metadata. + File fileMetadata = new File(); + fileMetadata.setTitle("My Report"); + fileMetadata.setMimeType("application/vnd.google-apps.spreadsheet"); - java.io.File filePath = new java.io.File("files/report.csv"); - FileContent mediaContent = new FileContent("text/csv", filePath); - try { - File file = service.files().insert(fileMetadata, mediaContent) - .setFields("id") - .execute(); - System.out.println("File ID: " + file.getId()); - return file.getId(); - }catch (GoogleJsonResponseException e) { - // TODO(developer) - handle error appropriately - System.err.println("Unable to move file: " + e.getDetails()); - throw e; - } + java.io.File filePath = new java.io.File("files/report.csv"); + FileContent mediaContent = new FileContent("text/csv", filePath); + try { + File file = service.files().insert(fileMetadata, mediaContent) + .setFields("id") + .execute(); + System.out.println("File ID: " + file.getId()); + return file.getId(); + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + System.err.println("Unable to move file: " + e.getDetails()); + throw e; } + } } // [END drive_upload_with_conversion] diff --git a/drive/snippets/drive_v2/src/test/java/AppDataSnippetsTest.java b/drive/snippets/drive_v2/src/test/java/AppDataSnippetsTest.java index b4237983..31726d4e 100644 --- a/drive/snippets/drive_v2/src/test/java/AppDataSnippetsTest.java +++ b/drive/snippets/drive_v2/src/test/java/AppDataSnippetsTest.java @@ -14,15 +14,13 @@ * limitations under the License. */ -import com.google.api.services.drive.model.File; -import com.google.api.services.drive.model.FileList; -import org.junit.Before; -import org.junit.Test; +import static org.junit.Assert.assertNotNull; +import com.google.api.services.drive.model.FileList; import java.io.IOException; import java.security.GeneralSecurityException; - -import static org.junit.Assert.*; +import org.junit.Before; +import org.junit.Test; public class AppDataSnippetsTest extends BaseTest { diff --git a/drive/snippets/drive_v2/src/test/java/BaseTest.java b/drive/snippets/drive_v2/src/test/java/BaseTest.java index 1bbf6e2e..1bf73c68 100644 --- a/drive/snippets/drive_v2/src/test/java/BaseTest.java +++ b/drive/snippets/drive_v2/src/test/java/BaseTest.java @@ -14,26 +14,27 @@ * limitations under the License. */ -import com.google.api.client.http.HttpRequestInitializer; -import com.google.auth.http.HttpCredentialsAdapter; -import com.google.auth.oauth2.GoogleCredentials; import com.google.api.client.http.FileContent; +import com.google.api.client.http.HttpRequestInitializer; import com.google.api.client.http.HttpTransport; import com.google.api.client.http.javanet.NetHttpTransport; import com.google.api.client.json.gson.GsonFactory; import com.google.api.services.drive.Drive; import com.google.api.services.drive.DriveScopes; import com.google.api.services.drive.model.File; -import org.junit.After; -import org.junit.Before; - +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; import java.io.IOException; import java.security.GeneralSecurityException; -import java.util.*; +import java.util.Arrays; +import java.util.HashSet; +import java.util.Set; import java.util.logging.Handler; import java.util.logging.Level; import java.util.logging.LogRecord; import java.util.logging.Logger; +import org.junit.After; +import org.junit.Before; public class BaseTest { static { @@ -69,7 +70,8 @@ public void publish(LogRecord record) { public GoogleCredentials getCredential() throws IOException { return GoogleCredentials.getApplicationDefault() - .createScoped(Arrays.asList(DriveScopes.DRIVE, DriveScopes.DRIVE_APPDATA,DriveScopes.DRIVE_FILE)); + .createScoped( + Arrays.asList(DriveScopes.DRIVE, DriveScopes.DRIVE_APPDATA, DriveScopes.DRIVE_FILE)); } /** @@ -84,14 +86,14 @@ protected Drive buildService() throws IOException { guides on implementing OAuth2 for your application. */ GoogleCredentials credentials = getCredential(); HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( - credentials); + credentials); // Create the classroom API client Drive service = new Drive.Builder(new NetHttpTransport(), - GsonFactory.getDefaultInstance(), - requestInitializer) - .setApplicationName("Drive Snippets") - .build(); + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Drive Snippets") + .build(); return service; } diff --git a/drive/snippets/drive_v2/src/test/java/ChangeSnippetsTest.java b/drive/snippets/drive_v2/src/test/java/ChangeSnippetsTest.java index 4323cc7d..7ad14676 100644 --- a/drive/snippets/drive_v2/src/test/java/ChangeSnippetsTest.java +++ b/drive/snippets/drive_v2/src/test/java/ChangeSnippetsTest.java @@ -14,14 +14,13 @@ * limitations under the License. */ -import org.junit.Before; -import org.junit.Test; - -import java.io.IOException; - import static org.junit.Assert.assertNotEquals; import static org.junit.Assert.assertNotNull; +import java.io.IOException; +import org.junit.Before; +import org.junit.Test; + public class ChangeSnippetsTest extends BaseTest { private ChangeSnippets snippets; diff --git a/drive/snippets/drive_v2/src/test/java/DriveSnippetsTest.java b/drive/snippets/drive_v2/src/test/java/DriveSnippetsTest.java index 42bbaf53..ebe24d24 100644 --- a/drive/snippets/drive_v2/src/test/java/DriveSnippetsTest.java +++ b/drive/snippets/drive_v2/src/test/java/DriveSnippetsTest.java @@ -14,18 +14,17 @@ * limitations under the License. */ +import static org.junit.Assert.assertNotEquals; +import static org.junit.Assert.assertNotNull; + import com.google.api.services.drive.model.Drive; import com.google.api.services.drive.model.Permission; import com.google.api.services.drive.model.PermissionList; -import org.junit.Before; -import org.junit.Test; - import java.io.IOException; import java.security.GeneralSecurityException; import java.util.List; - -import static org.junit.Assert.assertNotEquals; -import static org.junit.Assert.assertNotNull; +import org.junit.Before; +import org.junit.Test; public class DriveSnippetsTest extends BaseTest { diff --git a/drive/snippets/drive_v2/src/test/java/FileSnippetsTest.java b/drive/snippets/drive_v2/src/test/java/FileSnippetsTest.java index 1efd149b..7703c464 100644 --- a/drive/snippets/drive_v2/src/test/java/FileSnippetsTest.java +++ b/drive/snippets/drive_v2/src/test/java/FileSnippetsTest.java @@ -14,17 +14,18 @@ * limitations under the License. */ -import com.google.api.services.drive.model.File; -import com.google.api.services.drive.model.FileList; -import org.junit.Before; -import org.junit.Test; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; +import com.google.api.services.drive.model.File; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.security.GeneralSecurityException; import java.util.List; - -import static org.junit.Assert.*; +import org.junit.Before; +import org.junit.Test; public class FileSnippetsTest extends BaseTest { diff --git a/drive/snippets/drive_v2/src/test/java/TeamDriveSnippetsTest.java b/drive/snippets/drive_v2/src/test/java/TeamDriveSnippetsTest.java index bfed9e79..a0f53e9c 100644 --- a/drive/snippets/drive_v2/src/test/java/TeamDriveSnippetsTest.java +++ b/drive/snippets/drive_v2/src/test/java/TeamDriveSnippetsTest.java @@ -14,18 +14,17 @@ * limitations under the License. */ -import com.google.api.services.drive.model.TeamDrive; +import static org.junit.Assert.assertNotEquals; +import static org.junit.Assert.assertNotNull; + import com.google.api.services.drive.model.Permission; import com.google.api.services.drive.model.PermissionList; -import org.junit.Before; -import org.junit.Test; - +import com.google.api.services.drive.model.TeamDrive; import java.io.IOException; import java.security.GeneralSecurityException; import java.util.List; - -import static org.junit.Assert.assertNotEquals; -import static org.junit.Assert.assertNotNull; +import org.junit.Before; +import org.junit.Test; public class TeamDriveSnippetsTest extends BaseTest { diff --git a/drive/snippets/drive_v2/src/test/java/TestCreateDrive.java b/drive/snippets/drive_v2/src/test/java/TestCreateDrive.java index 4db53c7b..9bd04c2c 100644 --- a/drive/snippets/drive_v2/src/test/java/TestCreateDrive.java +++ b/drive/snippets/drive_v2/src/test/java/TestCreateDrive.java @@ -14,18 +14,17 @@ * limitations under the License. */ -import org.junit.Test; +import static org.junit.Assert.assertNotNull; import java.io.IOException; import java.security.GeneralSecurityException; +import org.junit.Test; -import static org.junit.Assert.assertNotNull; - -public class TestCreateDrive extends BaseTest{ - @Test - public void createDrive() throws IOException, GeneralSecurityException { - String id = CreateDrive.createDrive(); - assertNotNull(id); - this.service.drives().delete(id); - } +public class TestCreateDrive extends BaseTest { + @Test + public void createDrive() throws IOException, GeneralSecurityException { + String id = CreateDrive.createDrive(); + assertNotNull(id); + this.service.drives().delete(id); + } } diff --git a/drive/snippets/drive_v2/src/test/java/TestCreateFolder.java b/drive/snippets/drive_v2/src/test/java/TestCreateFolder.java index 0c7a25af..1c4cffb7 100644 --- a/drive/snippets/drive_v2/src/test/java/TestCreateFolder.java +++ b/drive/snippets/drive_v2/src/test/java/TestCreateFolder.java @@ -14,17 +14,16 @@ * limitations under the License. */ -import org.junit.Test; +import static org.junit.Assert.assertNotNull; import java.io.IOException; import java.security.GeneralSecurityException; - -import static org.junit.Assert.assertNotNull; +import org.junit.Test; public class TestCreateFolder { - @Test - public void createFolder() throws IOException, GeneralSecurityException { - String id = CreateFolder.createFolder(); - assertNotNull(id); - } + @Test + public void createFolder() throws IOException, GeneralSecurityException { + String id = CreateFolder.createFolder(); + assertNotNull(id); + } } diff --git a/drive/snippets/drive_v2/src/test/java/TestCreateShortcut.java b/drive/snippets/drive_v2/src/test/java/TestCreateShortcut.java index 1853773d..ab3e0f2f 100644 --- a/drive/snippets/drive_v2/src/test/java/TestCreateShortcut.java +++ b/drive/snippets/drive_v2/src/test/java/TestCreateShortcut.java @@ -14,18 +14,17 @@ * limitations under the License. */ -import org.junit.Test; +import static org.junit.Assert.assertNotNull; import java.io.IOException; import java.security.GeneralSecurityException; +import org.junit.Test; -import static org.junit.Assert.assertNotNull; - -public class TestCreateShortcut extends BaseTest{ - @Test - public void createShortcut() throws IOException, GeneralSecurityException { - String id = CreateShortcut.createShortcut(); - assertNotNull(id); - deleteFileOnCleanup(id); - } +public class TestCreateShortcut extends BaseTest { + @Test + public void createShortcut() throws IOException, GeneralSecurityException { + String id = CreateShortcut.createShortcut(); + assertNotNull(id); + deleteFileOnCleanup(id); + } } diff --git a/drive/snippets/drive_v2/src/test/java/TestCreateTeamDrive.java b/drive/snippets/drive_v2/src/test/java/TestCreateTeamDrive.java index 72695b33..daccae50 100644 --- a/drive/snippets/drive_v2/src/test/java/TestCreateTeamDrive.java +++ b/drive/snippets/drive_v2/src/test/java/TestCreateTeamDrive.java @@ -14,18 +14,17 @@ * limitations under the License. */ -import org.junit.Test; +import static org.junit.Assert.assertNotNull; import java.io.IOException; import java.security.GeneralSecurityException; +import org.junit.Test; -import static org.junit.Assert.assertNotNull; - -public class TestCreateTeamDrive extends BaseTest{ - @Test - public void createTeamDrive() throws IOException, GeneralSecurityException { - String id = CreateTeamDrive.createTeamDrive(); - assertNotNull(id); - this.service.teamdrives().delete(id); - } +public class TestCreateTeamDrive extends BaseTest { + @Test + public void createTeamDrive() throws IOException, GeneralSecurityException { + String id = CreateTeamDrive.createTeamDrive(); + assertNotNull(id); + this.service.teamdrives().delete(id); + } } diff --git a/drive/snippets/drive_v2/src/test/java/TestDownloadFile.java b/drive/snippets/drive_v2/src/test/java/TestDownloadFile.java index ce285417..526dea94 100644 --- a/drive/snippets/drive_v2/src/test/java/TestDownloadFile.java +++ b/drive/snippets/drive_v2/src/test/java/TestDownloadFile.java @@ -14,21 +14,20 @@ * limitations under the License. */ -import org.junit.Test; +import static org.junit.Assert.assertEquals; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.security.GeneralSecurityException; +import org.junit.Test; -import static org.junit.Assert.assertEquals; - -public class TestDownloadFile extends BaseTest{ - @Test - public void downloadFile() throws IOException, GeneralSecurityException { - String id = createTestBlob(); - ByteArrayOutputStream out = DownloadFile.downloadFile(id); - byte[] bytes = out.toByteArray(); - assertEquals((byte) 0xFF, bytes[0]); - assertEquals((byte) 0xD8, bytes[1]); - } +public class TestDownloadFile extends BaseTest { + @Test + public void downloadFile() throws IOException, GeneralSecurityException { + String id = createTestBlob(); + ByteArrayOutputStream out = DownloadFile.downloadFile(id); + byte[] bytes = out.toByteArray(); + assertEquals((byte) 0xFF, bytes[0]); + assertEquals((byte) 0xD8, bytes[1]); + } } diff --git a/drive/snippets/drive_v2/src/test/java/TestExportPdf.java b/drive/snippets/drive_v2/src/test/java/TestExportPdf.java index fc6deabb..16ede7b4 100644 --- a/drive/snippets/drive_v2/src/test/java/TestExportPdf.java +++ b/drive/snippets/drive_v2/src/test/java/TestExportPdf.java @@ -14,19 +14,18 @@ * limitations under the License. */ -import org.junit.Test; +import static org.junit.Assert.assertEquals; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.security.GeneralSecurityException; +import org.junit.Test; -import static org.junit.Assert.assertEquals; - -public class TestExportPdf extends BaseTest{ - @Test - public void exportPdf() throws IOException, GeneralSecurityException { - String id = createTestDocument(); - ByteArrayOutputStream out = ExportPdf.exportPdf(id); - assertEquals("%PDF", out.toString("UTF-8").substring(0, 4)); - } +public class TestExportPdf extends BaseTest { + @Test + public void exportPdf() throws IOException, GeneralSecurityException { + String id = createTestDocument(); + ByteArrayOutputStream out = ExportPdf.exportPdf(id); + assertEquals("%PDF", out.toString("UTF-8").substring(0, 4)); + } } diff --git a/drive/snippets/drive_v2/src/test/java/TestFetchAppdataFolder.java b/drive/snippets/drive_v2/src/test/java/TestFetchAppdataFolder.java index f53dcd75..8a2ed14b 100644 --- a/drive/snippets/drive_v2/src/test/java/TestFetchAppdataFolder.java +++ b/drive/snippets/drive_v2/src/test/java/TestFetchAppdataFolder.java @@ -12,18 +12,17 @@ // See the License for the specific language governing permissions and // limitations under the License. -import org.junit.Test; +import static org.junit.Assert.assertNotNull; import java.io.IOException; import java.security.GeneralSecurityException; - -import static org.junit.Assert.assertNotNull; +import org.junit.Test; // Unit test class for testing of FetchAppDataFolder snippet public class TestFetchAppdataFolder { - @Test - public void fetchAppDataFolder() throws IOException, GeneralSecurityException { - String id = FetchAppDataFolder.fetchAppDataFolder(); - assertNotNull(id); - } + @Test + public void fetchAppDataFolder() throws IOException, GeneralSecurityException { + String id = FetchAppDataFolder.fetchAppDataFolder(); + assertNotNull(id); + } } diff --git a/drive/snippets/drive_v2/src/test/java/TestFetchChanges.java b/drive/snippets/drive_v2/src/test/java/TestFetchChanges.java index 751c47ec..353d1186 100644 --- a/drive/snippets/drive_v2/src/test/java/TestFetchChanges.java +++ b/drive/snippets/drive_v2/src/test/java/TestFetchChanges.java @@ -14,20 +14,19 @@ * limitations under the License. */ -import org.junit.Test; - -import java.io.IOException; - import static org.junit.Assert.assertNotEquals; import static org.junit.Assert.assertNotNull; -public class TestFetchChanges extends BaseTest{ - @Test - public void fetchChanges() throws IOException { - String startPageToken = FetchStartPageToken.fetchStartPageToken(); - this.createTestBlob(); - String newStartPageToken = FetchChanges.fetchChanges(startPageToken); - assertNotNull(newStartPageToken); - assertNotEquals(startPageToken, newStartPageToken); - } +import java.io.IOException; +import org.junit.Test; + +public class TestFetchChanges extends BaseTest { + @Test + public void fetchChanges() throws IOException { + String startPageToken = FetchStartPageToken.fetchStartPageToken(); + this.createTestBlob(); + String newStartPageToken = FetchChanges.fetchChanges(startPageToken); + assertNotNull(newStartPageToken); + assertNotEquals(startPageToken, newStartPageToken); + } } diff --git a/drive/snippets/drive_v2/src/test/java/TestFetchStartPageToken.java b/drive/snippets/drive_v2/src/test/java/TestFetchStartPageToken.java index 270d09a1..ec781a28 100644 --- a/drive/snippets/drive_v2/src/test/java/TestFetchStartPageToken.java +++ b/drive/snippets/drive_v2/src/test/java/TestFetchStartPageToken.java @@ -14,16 +14,15 @@ * limitations under the License. */ -import org.junit.Test; +import static org.junit.Assert.assertNotNull; import java.io.IOException; +import org.junit.Test; -import static org.junit.Assert.assertNotNull; - -public class TestFetchStartPageToken extends BaseTest{ - @Test - public void fetchStartPageToken() throws IOException { - String token = FetchStartPageToken.fetchStartPageToken(); - assertNotNull(token); - } +public class TestFetchStartPageToken extends BaseTest { + @Test + public void fetchStartPageToken() throws IOException { + String token = FetchStartPageToken.fetchStartPageToken(); + assertNotNull(token); + } } diff --git a/drive/snippets/drive_v2/src/test/java/TestListAppdata.java b/drive/snippets/drive_v2/src/test/java/TestListAppdata.java index fe137a43..3aa6558b 100644 --- a/drive/snippets/drive_v2/src/test/java/TestListAppdata.java +++ b/drive/snippets/drive_v2/src/test/java/TestListAppdata.java @@ -13,20 +13,17 @@ // limitations under the License. import com.google.api.services.drive.model.FileList; -import org.junit.Test; - import java.io.IOException; import java.security.GeneralSecurityException; - -import static org.junit.Assert.assertNotEquals; +import org.junit.Test; // Unit test class for testing of ListAppData snippet -public class TestListAppdata extends BaseTest{ - @Test - public void listAppData() throws IOException, GeneralSecurityException { - String id = UploadAppData.uploadAppData(); - deleteFileOnCleanup(id); - FileList files = ListAppData.listAppData(); - assertNotEquals(0, files.getItems().size()); - } +public class TestListAppdata extends BaseTest { + @Test + public void listAppData() throws IOException, GeneralSecurityException { + String id = UploadAppData.uploadAppData(); + deleteFileOnCleanup(id); + FileList files = ListAppData.listAppData(); + assertNotEquals(0, files.getItems().size()); + } } diff --git a/drive/snippets/drive_v2/src/test/java/TestMoveFileToFolder.java b/drive/snippets/drive_v2/src/test/java/TestMoveFileToFolder.java index 7ad8f1bf..7e914647 100644 --- a/drive/snippets/drive_v2/src/test/java/TestMoveFileToFolder.java +++ b/drive/snippets/drive_v2/src/test/java/TestMoveFileToFolder.java @@ -14,25 +14,24 @@ * limitations under the License. */ -import org.junit.Test; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; import java.io.IOException; import java.security.GeneralSecurityException; import java.util.List; +import org.junit.Test; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertTrue; - -public class TestMoveFileToFolder extends BaseTest{ - @Test - public void moveFileToFolder() - throws IOException, GeneralSecurityException { - String folderId = CreateFolder.createFolder(); - deleteFileOnCleanup(folderId); - String fileId = this.createTestBlob(); - List parents = MoveFileToFolder.moveFileToFolder(fileId, folderId); - assertEquals(1, parents.size()); - assertTrue(parents.contains(folderId)); - } +public class TestMoveFileToFolder extends BaseTest { + @Test + public void moveFileToFolder() + throws IOException, GeneralSecurityException { + String folderId = CreateFolder.createFolder(); + deleteFileOnCleanup(folderId); + String fileId = this.createTestBlob(); + List parents = MoveFileToFolder.moveFileToFolder(fileId, folderId); + assertEquals(1, parents.size()); + assertTrue(parents.contains(folderId)); + } } diff --git a/drive/snippets/drive_v2/src/test/java/TestRecoverDrives.java b/drive/snippets/drive_v2/src/test/java/TestRecoverDrives.java index c214234e..731f3f18 100644 --- a/drive/snippets/drive_v2/src/test/java/TestRecoverDrives.java +++ b/drive/snippets/drive_v2/src/test/java/TestRecoverDrives.java @@ -14,36 +14,35 @@ * limitations under the License. */ +import static org.junit.Assert.assertNotEquals; + import com.google.api.services.drive.model.Drive; import com.google.api.services.drive.model.Permission; import com.google.api.services.drive.model.PermissionList; -import org.junit.Test; - import java.io.IOException; import java.util.List; +import org.junit.Test; -import static org.junit.Assert.assertNotEquals; - -public class TestRecoverDrives extends BaseTest{ - @Test - public void recoverDrives() throws IOException { - String id = this.createOrphanedDrive(); - List results = RecoverDrive.recoverDrives( - "sbazyl@test.appsdevtesting.com"); - assertNotEquals(0, results.size()); - this.service.drives().delete(id).execute(); - } +public class TestRecoverDrives extends BaseTest { + @Test + public void recoverDrives() throws IOException { + String id = this.createOrphanedDrive(); + List results = RecoverDrive.recoverDrives( + "sbazyl@test.appsdevtesting.com"); + assertNotEquals(0, results.size()); + this.service.drives().delete(id).execute(); + } - private String createOrphanedDrive() throws IOException { - String driveId = CreateDrive.createDrive(); - PermissionList response = this.service.permissions().list(driveId) - .setSupportsAllDrives(true) - .execute(); - for (Permission permission : response.getItems()) { - this.service.permissions().delete(driveId, permission.getId()) - .setSupportsAllDrives(true) - .execute(); - } - return driveId; + private String createOrphanedDrive() throws IOException { + String driveId = CreateDrive.createDrive(); + PermissionList response = this.service.permissions().list(driveId) + .setSupportsAllDrives(true) + .execute(); + for (Permission permission : response.getItems()) { + this.service.permissions().delete(driveId, permission.getId()) + .setSupportsAllDrives(true) + .execute(); } + return driveId; + } } diff --git a/drive/snippets/drive_v2/src/test/java/TestRecoverTeamDrives.java b/drive/snippets/drive_v2/src/test/java/TestRecoverTeamDrives.java index 9b1a7892..c9b9a07f 100644 --- a/drive/snippets/drive_v2/src/test/java/TestRecoverTeamDrives.java +++ b/drive/snippets/drive_v2/src/test/java/TestRecoverTeamDrives.java @@ -14,35 +14,35 @@ * limitations under the License. */ +import static org.junit.Assert.assertNotEquals; + import com.google.api.services.drive.model.Permission; import com.google.api.services.drive.model.PermissionList; import com.google.api.services.drive.model.TeamDrive; -import org.junit.Test; - import java.io.IOException; import java.util.List; +import org.junit.Test; -import static org.junit.Assert.assertNotEquals; +public class TestRecoverTeamDrives extends BaseTest { + @Test + public void recoverTeamDrives() throws IOException { + String id = this.createOrphanedTeamDrive(); + List results = RecoverTeamDrive.recoverTeamDrives( + "sbazyl@test.appsdevtesting.com"); + assertNotEquals(0, results.size()); + this.service.teamdrives().delete(id).execute(); + } -public class TestRecoverTeamDrives extends BaseTest{ - @Test - public void recoverTeamDrives() throws IOException { - String id = this.createOrphanedTeamDrive(); - List results = RecoverTeamDrive.recoverTeamDrives( - "sbazyl@test.appsdevtesting.com"); - assertNotEquals(0, results.size()); - this.service.teamdrives().delete(id).execute(); - } - private String createOrphanedTeamDrive() throws IOException { - String teamDriveId = CreateTeamDrive.createTeamDrive(); - PermissionList response = this.service.permissions().list(teamDriveId) - .setSupportsTeamDrives(true) - .execute(); - for (Permission permission : response.getItems()) { - this.service.permissions().delete(teamDriveId, permission.getId()) - .setSupportsTeamDrives(true) - .execute(); - } - return teamDriveId; + private String createOrphanedTeamDrive() throws IOException { + String teamDriveId = CreateTeamDrive.createTeamDrive(); + PermissionList response = this.service.permissions().list(teamDriveId) + .setSupportsTeamDrives(true) + .execute(); + for (Permission permission : response.getItems()) { + this.service.permissions().delete(teamDriveId, permission.getId()) + .setSupportsTeamDrives(true) + .execute(); } + return teamDriveId; + } } diff --git a/drive/snippets/drive_v2/src/test/java/TestSearchFiles.java b/drive/snippets/drive_v2/src/test/java/TestSearchFiles.java index 6772cb40..280c6b9c 100644 --- a/drive/snippets/drive_v2/src/test/java/TestSearchFiles.java +++ b/drive/snippets/drive_v2/src/test/java/TestSearchFiles.java @@ -14,21 +14,20 @@ * limitations under the License. */ -import com.google.api.services.drive.model.File; -import org.junit.Test; +import static org.junit.Assert.assertNotEquals; +import com.google.api.services.drive.model.File; import java.io.IOException; import java.security.GeneralSecurityException; import java.util.List; +import org.junit.Test; -import static org.junit.Assert.assertNotEquals; - -public class TestSearchFiles extends BaseTest{ - @Test - public void searchFiles() - throws IOException, GeneralSecurityException { - this.createTestBlob(); - List files = SearchFile.searchFile(); - assertNotEquals(0, files.size()); - } +public class TestSearchFiles extends BaseTest { + @Test + public void searchFiles() + throws IOException, GeneralSecurityException { + this.createTestBlob(); + List files = SearchFile.searchFile(); + assertNotEquals(0, files.size()); + } } diff --git a/drive/snippets/drive_v2/src/test/java/TestShareFile.java b/drive/snippets/drive_v2/src/test/java/TestShareFile.java index c47ec72c..167a7ec7 100644 --- a/drive/snippets/drive_v2/src/test/java/TestShareFile.java +++ b/drive/snippets/drive_v2/src/test/java/TestShareFile.java @@ -14,20 +14,19 @@ * limitations under the License. */ -import org.junit.Test; +import static org.junit.Assert.assertEquals; import java.io.IOException; import java.util.List; +import org.junit.Test; -import static org.junit.Assert.assertEquals; - -public class TestShareFile extends BaseTest{ - @Test - public void shareFile() throws IOException { - String fileId = this.createTestBlob(); - List ids = ShareFile.shareFile(fileId, - "user@test.appsdevtesting.com", - "test.appsdevtesting.com"); - assertEquals(2, ids.size()); - } +public class TestShareFile extends BaseTest { + @Test + public void shareFile() throws IOException { + String fileId = this.createTestBlob(); + List ids = ShareFile.shareFile(fileId, + "user@test.appsdevtesting.com", + "test.appsdevtesting.com"); + assertEquals(2, ids.size()); + } } diff --git a/drive/snippets/drive_v2/src/test/java/TestTouchFile.java b/drive/snippets/drive_v2/src/test/java/TestTouchFile.java index aecfabf4..9d7d80b8 100644 --- a/drive/snippets/drive_v2/src/test/java/TestTouchFile.java +++ b/drive/snippets/drive_v2/src/test/java/TestTouchFile.java @@ -14,19 +14,18 @@ * limitations under the License. */ -import org.junit.Test; +import static org.junit.Assert.assertEquals; import java.io.IOException; import java.security.GeneralSecurityException; +import org.junit.Test; -import static org.junit.Assert.assertEquals; - -public class TestTouchFile extends BaseTest{ - @Test - public void touchFile() throws IOException, GeneralSecurityException { - String id = this.createTestBlob(); - long now = System.currentTimeMillis(); - long modifiedTime = TouchFile.touchFile(id, now); - assertEquals(now, modifiedTime); - } +public class TestTouchFile extends BaseTest { + @Test + public void touchFile() throws IOException, GeneralSecurityException { + String id = this.createTestBlob(); + long now = System.currentTimeMillis(); + long modifiedTime = TouchFile.touchFile(id, now); + assertEquals(now, modifiedTime); + } } diff --git a/drive/snippets/drive_v2/src/test/java/TestUploadAppdata.java b/drive/snippets/drive_v2/src/test/java/TestUploadAppdata.java index d5cd5e9e..c9c13961 100644 --- a/drive/snippets/drive_v2/src/test/java/TestUploadAppdata.java +++ b/drive/snippets/drive_v2/src/test/java/TestUploadAppdata.java @@ -12,20 +12,19 @@ // See the License for the specific language governing permissions and // limitations under the License. -import org.junit.Test; +import static org.junit.Assert.assertNotNull; import java.io.IOException; import java.security.GeneralSecurityException; - -import static org.junit.Assert.assertNotNull; +import org.junit.Test; // Unit test class for testing of UploadAppData snippet -public class TestUploadAppdata extends BaseTest{ - @Test - public void uploadAppData() - throws IOException, GeneralSecurityException { - String id = UploadAppData.uploadAppData(); - assertNotNull(id); - deleteFileOnCleanup(id); - } +public class TestUploadAppdata extends BaseTest { + @Test + public void uploadAppData() + throws IOException, GeneralSecurityException { + String id = UploadAppData.uploadAppData(); + assertNotNull(id); + deleteFileOnCleanup(id); + } } diff --git a/drive/snippets/drive_v2/src/test/java/TestUploadBasic.java b/drive/snippets/drive_v2/src/test/java/TestUploadBasic.java index 79617d8d..f083eb65 100644 --- a/drive/snippets/drive_v2/src/test/java/TestUploadBasic.java +++ b/drive/snippets/drive_v2/src/test/java/TestUploadBasic.java @@ -14,18 +14,17 @@ * limitations under the License. */ -import org.junit.Test; +import static org.junit.Assert.assertNotNull; import java.io.IOException; import java.security.GeneralSecurityException; - -import static org.junit.Assert.assertNotNull; +import org.junit.Test; public class TestUploadBasic { - @Test - public void uploadBasic() throws IOException, GeneralSecurityException { - String id = UploadBasic.uploadBasic(); - assertNotNull(id); - } + @Test + public void uploadBasic() throws IOException, GeneralSecurityException { + String id = UploadBasic.uploadBasic(); + assertNotNull(id); + } } diff --git a/drive/snippets/drive_v2/src/test/java/TestUploadRevision.java b/drive/snippets/drive_v2/src/test/java/TestUploadRevision.java index de932e4f..ea7e7eea 100644 --- a/drive/snippets/drive_v2/src/test/java/TestUploadRevision.java +++ b/drive/snippets/drive_v2/src/test/java/TestUploadRevision.java @@ -14,21 +14,20 @@ * limitations under the License. */ -import org.junit.Test; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; import java.io.IOException; import java.security.GeneralSecurityException; +import org.junit.Test; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; - -public class TestUploadRevision extends BaseTest{ - @Test - public void uploadRevision() throws IOException, GeneralSecurityException { - String id = UploadBasic.uploadBasic(); - assertNotNull(id); - deleteFileOnCleanup(id); - String id2 = UploadRevision.uploadRevision(id); - assertEquals(id, id2); - } +public class TestUploadRevision extends BaseTest { + @Test + public void uploadRevision() throws IOException, GeneralSecurityException { + String id = UploadBasic.uploadBasic(); + assertNotNull(id); + deleteFileOnCleanup(id); + String id2 = UploadRevision.uploadRevision(id); + assertEquals(id, id2); + } } diff --git a/drive/snippets/drive_v2/src/test/java/TestUploadToFolder.java b/drive/snippets/drive_v2/src/test/java/TestUploadToFolder.java index 815982d9..fcec0691 100644 --- a/drive/snippets/drive_v2/src/test/java/TestUploadToFolder.java +++ b/drive/snippets/drive_v2/src/test/java/TestUploadToFolder.java @@ -14,21 +14,20 @@ * limitations under the License. */ -import com.google.api.services.drive.model.File; -import org.junit.Test; +import static org.junit.Assert.assertTrue; +import com.google.api.services.drive.model.File; import java.io.IOException; import java.security.GeneralSecurityException; - -import static org.junit.Assert.assertTrue; +import org.junit.Test; public class TestUploadToFolder extends BaseTest { - @Test - public void uploadToFolder() throws IOException, GeneralSecurityException { - String folderId = CreateFolder.createFolder(); - File file = UploadToFolder.uploadToFolder(folderId); - assertTrue(file.getParents().get(0).getId().equals(folderId)); - deleteFileOnCleanup(file.getId()); - deleteFileOnCleanup(folderId); - } + @Test + public void uploadToFolder() throws IOException, GeneralSecurityException { + String folderId = CreateFolder.createFolder(); + File file = UploadToFolder.uploadToFolder(folderId); + assertTrue(file.getParents().get(0).getId().equals(folderId)); + deleteFileOnCleanup(file.getId()); + deleteFileOnCleanup(folderId); + } } diff --git a/drive/snippets/drive_v2/src/test/java/TestUploadWithConversion.java b/drive/snippets/drive_v2/src/test/java/TestUploadWithConversion.java index ae3a889c..11b5f2f9 100644 --- a/drive/snippets/drive_v2/src/test/java/TestUploadWithConversion.java +++ b/drive/snippets/drive_v2/src/test/java/TestUploadWithConversion.java @@ -14,19 +14,18 @@ * limitations under the License. */ -import org.junit.Test; +import static org.junit.Assert.assertNotNull; import java.io.IOException; import java.security.GeneralSecurityException; +import org.junit.Test; -import static org.junit.Assert.assertNotNull; - -public class TestUploadWithConversion extends BaseTest{ - @Test - public void uploadWithConversion() - throws IOException, GeneralSecurityException { - String id = UploadWithConversion.uploadWithConversion(); - assertNotNull(id); - deleteFileOnCleanup(id); - } +public class TestUploadWithConversion extends BaseTest { + @Test + public void uploadWithConversion() + throws IOException, GeneralSecurityException { + String id = UploadWithConversion.uploadWithConversion(); + assertNotNull(id); + deleteFileOnCleanup(id); + } } diff --git a/drive/snippets/drive_v3/src/main/java/AppDataSnippets.java b/drive/snippets/drive_v3/src/main/java/AppDataSnippets.java index 975aafb6..5f75f5c4 100644 --- a/drive/snippets/drive_v3/src/main/java/AppDataSnippets.java +++ b/drive/snippets/drive_v3/src/main/java/AppDataSnippets.java @@ -18,7 +18,6 @@ import com.google.api.services.drive.Drive; import com.google.api.services.drive.model.File; import com.google.api.services.drive.model.FileList; - import java.io.IOException; import java.util.Collections; diff --git a/drive/snippets/drive_v3/src/main/java/ChangeSnippets.java b/drive/snippets/drive_v3/src/main/java/ChangeSnippets.java index 5710478b..141991bc 100644 --- a/drive/snippets/drive_v3/src/main/java/ChangeSnippets.java +++ b/drive/snippets/drive_v3/src/main/java/ChangeSnippets.java @@ -18,7 +18,6 @@ import com.google.api.services.drive.model.Change; import com.google.api.services.drive.model.ChangeList; import com.google.api.services.drive.model.StartPageToken; - import java.io.IOException; public class ChangeSnippets { diff --git a/drive/snippets/drive_v3/src/main/java/CreateDrive.java b/drive/snippets/drive_v3/src/main/java/CreateDrive.java index be69cbec..ceb53f9b 100644 --- a/drive/snippets/drive_v3/src/main/java/CreateDrive.java +++ b/drive/snippets/drive_v3/src/main/java/CreateDrive.java @@ -21,7 +21,6 @@ import com.google.api.services.drive.model.Drive; import com.google.auth.http.HttpCredentialsAdapter; import com.google.auth.oauth2.GoogleCredentials; - import java.io.IOException; import java.util.Arrays; import java.util.UUID; @@ -29,42 +28,45 @@ /* class to demonstrate use-case of Drive's create drive. */ public class CreateDrive { - /** - * Create a drive. - * @return Newly created drive id. - * @throws IOException if service account credentials file not found. - */ - public static String createDrive() throws IOException { + /** + * Create a drive. + * + * @return Newly created drive id. + * @throws IOException if service account credentials file not found. + */ + public static String createDrive() throws IOException { /*Load pre-authorized user credentials from the environment. TODO(developer) - See https://developers.google.com/identity for guides on implementing OAuth2 for your application.*/ - GoogleCredentials credentials = GoogleCredentials.getApplicationDefault().createScoped(Arrays.asList(DriveScopes.DRIVE)); - HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( - credentials); + GoogleCredentials credentials = + GoogleCredentials.getApplicationDefault().createScoped(Arrays.asList(DriveScopes.DRIVE)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); - // Build a new authorized API client service. - com.google.api.services.drive.Drive service = new com.google.api.services.drive.Drive.Builder(new NetHttpTransport(), - GsonFactory.getDefaultInstance(), - requestInitializer) - .setApplicationName("Drive samples") - .build(); + // Build a new authorized API client service. + com.google.api.services.drive.Drive service = + new com.google.api.services.drive.Drive.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Drive samples") + .build(); - Drive driveMetadata = new Drive(); - driveMetadata.setName("Project Resources"); - String requestId = UUID.randomUUID().toString(); - try { - Drive drive = service.drives().create(requestId, - driveMetadata) - .execute(); - System.out.println("Drive ID: " + drive.getId()); + Drive driveMetadata = new Drive(); + driveMetadata.setName("Project Resources"); + String requestId = UUID.randomUUID().toString(); + try { + Drive drive = service.drives().create(requestId, + driveMetadata) + .execute(); + System.out.println("Drive ID: " + drive.getId()); - return drive.getId(); - } catch (GoogleJsonResponseException e) { - // TODO(developer) - handle error appropriately - System.err.println("Unable to create drive: " + e.getDetails()); - throw e; - } + return drive.getId(); + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + System.err.println("Unable to create drive: " + e.getDetails()); + throw e; } + } } // [END drive_create_drive] diff --git a/drive/snippets/drive_v3/src/main/java/CreateFolder.java b/drive/snippets/drive_v3/src/main/java/CreateFolder.java index c9ee24b8..e907cb7d 100644 --- a/drive/snippets/drive_v3/src/main/java/CreateFolder.java +++ b/drive/snippets/drive_v3/src/main/java/CreateFolder.java @@ -23,7 +23,6 @@ import com.google.api.services.drive.model.File; import com.google.auth.http.HttpCredentialsAdapter; import com.google.auth.oauth2.GoogleCredentials; - import java.io.IOException; import java.util.Arrays; @@ -31,40 +30,42 @@ public class CreateFolder { - /** - * Create new folder. - * @return Inserted folder id if successful, {@code null} otherwise. - * @throws IOException if service account credentials file not found. - */ - public static String createFolder() throws IOException { - // Load pre-authorized user credentials from the environment. - // TODO(developer) - See https://developers.google.com/identity for - // guides on implementing OAuth2 for your application. - GoogleCredentials credentials = GoogleCredentials.getApplicationDefault().createScoped(Arrays.asList(DriveScopes.DRIVE_FILE)); - HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( - credentials); + /** + * Create new folder. + * + * @return Inserted folder id if successful, {@code null} otherwise. + * @throws IOException if service account credentials file not found. + */ + public static String createFolder() throws IOException { + // Load pre-authorized user credentials from the environment. + // TODO(developer) - See https://developers.google.com/identity for + // guides on implementing OAuth2 for your application. + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Arrays.asList(DriveScopes.DRIVE_FILE)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); - // Build a new authorized API client service. - Drive service = new Drive.Builder(new NetHttpTransport(), - GsonFactory.getDefaultInstance(), - requestInitializer) - .setApplicationName("Drive samples") - .build(); - // File's metadata. - File fileMetadata = new File(); - fileMetadata.setName("Test"); - fileMetadata.setMimeType("application/vnd.google-apps.folder"); - try { - File file = service.files().create(fileMetadata) - .setFields("id") - .execute(); - System.out.println("Folder ID: " + file.getId()); - return file.getId(); - }catch (GoogleJsonResponseException e) { - // TODO(developer) - handle error appropriately - System.err.println("Unable to create folder: " + e.getDetails()); - throw e; - } + // Build a new authorized API client service. + Drive service = new Drive.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Drive samples") + .build(); + // File's metadata. + File fileMetadata = new File(); + fileMetadata.setName("Test"); + fileMetadata.setMimeType("application/vnd.google-apps.folder"); + try { + File file = service.files().create(fileMetadata) + .setFields("id") + .execute(); + System.out.println("Folder ID: " + file.getId()); + return file.getId(); + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + System.err.println("Unable to create folder: " + e.getDetails()); + throw e; } + } } // [END drive_create_folder] diff --git a/drive/snippets/drive_v3/src/main/java/CreateShortcut.java b/drive/snippets/drive_v3/src/main/java/CreateShortcut.java index d75f104e..12acc6e7 100644 --- a/drive/snippets/drive_v3/src/main/java/CreateShortcut.java +++ b/drive/snippets/drive_v3/src/main/java/CreateShortcut.java @@ -23,46 +23,47 @@ import com.google.api.services.drive.model.File; import com.google.auth.http.HttpCredentialsAdapter; import com.google.auth.oauth2.GoogleCredentials; - import java.io.IOException; import java.util.Arrays; /* Class to demonstrate Drive's create shortcut use-case */ public class CreateShortcut { - /** - * Creates shortcut for file. - * @throws IOException if service account credentials file not found. - */ - public static String createShortcut() throws IOException{ + /** + * Creates shortcut for file. + * + * @throws IOException if service account credentials file not found. + */ + public static String createShortcut() throws IOException { /* Load pre-authorized user credentials from the environment. TODO(developer) - See https://developers.google.com/identity for guides on implementing OAuth2 for your application.*/ - GoogleCredentials credentials = GoogleCredentials.getApplicationDefault().createScoped(Arrays.asList(DriveScopes.DRIVE_FILE)); - HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( - credentials); - // Build a new authorized API client service. - Drive service = new Drive.Builder(new NetHttpTransport(), - GsonFactory.getDefaultInstance(), - requestInitializer) - .setApplicationName("Drive samples") - .build(); - try { - // Create Shortcut for file. - File fileMetadata = new File(); - fileMetadata.setName("Project plan"); - fileMetadata.setMimeType("application/vnd.google-apps.drive-sdk"); + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Arrays.asList(DriveScopes.DRIVE_FILE)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + // Build a new authorized API client service. + Drive service = new Drive.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Drive samples") + .build(); + try { + // Create Shortcut for file. + File fileMetadata = new File(); + fileMetadata.setName("Project plan"); + fileMetadata.setMimeType("application/vnd.google-apps.drive-sdk"); - File file = service.files().create(fileMetadata) - .setFields("id") - .execute(); - System.out.println("File ID: " + file.getId()); - return file.getId(); - }catch (GoogleJsonResponseException e) { - // TODO(developer) - handle error appropriately - System.err.println("Unable to create shortcut: " + e.getDetails()); - throw e; - } + File file = service.files().create(fileMetadata) + .setFields("id") + .execute(); + System.out.println("File ID: " + file.getId()); + return file.getId(); + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + System.err.println("Unable to create shortcut: " + e.getDetails()); + throw e; } + } } // [END drive_create_shortcut] diff --git a/drive/snippets/drive_v3/src/main/java/DownloadFile.java b/drive/snippets/drive_v3/src/main/java/DownloadFile.java index 0931acc5..2098d1a9 100644 --- a/drive/snippets/drive_v3/src/main/java/DownloadFile.java +++ b/drive/snippets/drive_v3/src/main/java/DownloadFile.java @@ -22,7 +22,6 @@ import com.google.api.services.drive.DriveScopes; import com.google.auth.http.HttpCredentialsAdapter; import com.google.auth.oauth2.GoogleCredentials; - import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.OutputStream; @@ -31,39 +30,41 @@ /* Class to demonstrate use-case of drive's download file. */ public class DownloadFile { - /** - * Download a Document file in PDF format. - * @param realFileId file ID of any workspace document format file. - * @return byte array stream if successful, {@code null} otherwise. - * @throws IOException if service account credentials file not found. - */ - public static ByteArrayOutputStream downloadFile(String realFileId) throws IOException{ + /** + * Download a Document file in PDF format. + * + * @param realFileId file ID of any workspace document format file. + * @return byte array stream if successful, {@code null} otherwise. + * @throws IOException if service account credentials file not found. + */ + public static ByteArrayOutputStream downloadFile(String realFileId) throws IOException { /* Load pre-authorized user credentials from the environment. TODO(developer) - See https://developers.google.com/identity for guides on implementing OAuth2 for your application.*/ - GoogleCredentials credentials = GoogleCredentials.getApplicationDefault().createScoped(Arrays.asList(DriveScopes.DRIVE_FILE)); - HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( - credentials); + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Arrays.asList(DriveScopes.DRIVE_FILE)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); - // Build a new authorized API client service. - Drive service = new Drive.Builder(new NetHttpTransport(), - GsonFactory.getDefaultInstance(), - requestInitializer) - .setApplicationName("Drive samples") - .build(); + // Build a new authorized API client service. + Drive service = new Drive.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Drive samples") + .build(); - try { - OutputStream outputStream = new ByteArrayOutputStream(); + try { + OutputStream outputStream = new ByteArrayOutputStream(); - service.files().get(realFileId) - .executeMediaAndDownloadTo(outputStream); + service.files().get(realFileId) + .executeMediaAndDownloadTo(outputStream); - return (ByteArrayOutputStream) outputStream; - }catch (GoogleJsonResponseException e) { - // TODO(developer) - handle error appropriately - System.err.println("Unable to move file: " + e.getDetails()); - throw e; - } + return (ByteArrayOutputStream) outputStream; + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + System.err.println("Unable to move file: " + e.getDetails()); + throw e; } + } } // [END drive_download_file] diff --git a/drive/snippets/drive_v3/src/main/java/DriveSnippets.java b/drive/snippets/drive_v3/src/main/java/DriveSnippets.java index 3bedd15e..9fa22647 100644 --- a/drive/snippets/drive_v3/src/main/java/DriveSnippets.java +++ b/drive/snippets/drive_v3/src/main/java/DriveSnippets.java @@ -14,12 +14,9 @@ * limitations under the License. */ -import com.google.api.client.http.FileContent; -//import com.google.api.services.drive.Drive; import com.google.api.services.drive.model.Drive; import com.google.api.services.drive.model.DriveList; import com.google.api.services.drive.model.Permission; - import java.io.IOException; import java.util.ArrayList; import java.util.List; @@ -39,7 +36,7 @@ public String createDrive() throws IOException { driveMetadata.setName("Project Resources"); String requestId = UUID.randomUUID().toString(); Drive drive = driveService.drives().create(requestId, - driveMetadata) + driveMetadata) .execute(); System.out.println("Drive ID: " + drive.getId()); // [END createDrive] diff --git a/drive/snippets/drive_v3/src/main/java/ExportPdf.java b/drive/snippets/drive_v3/src/main/java/ExportPdf.java index 16d86539..789e232a 100644 --- a/drive/snippets/drive_v3/src/main/java/ExportPdf.java +++ b/drive/snippets/drive_v3/src/main/java/ExportPdf.java @@ -22,7 +22,6 @@ import com.google.api.services.drive.DriveScopes; import com.google.auth.http.HttpCredentialsAdapter; import com.google.auth.oauth2.GoogleCredentials; - import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.OutputStream; @@ -31,38 +30,40 @@ /* Class to demonstrate use-case of drive's export pdf. */ public class ExportPdf { - /** - * Download a Document file in PDF format. - * @param realFileId file ID of any workspace document format file. - * @return byte array stream if successful, {@code null} otherwise. - * @throws IOException if service account credentials file not found. - */ - public static ByteArrayOutputStream exportPdf(String realFileId) throws IOException{ - // Load pre-authorized user credentials from the environment. - // TODO(developer) - See https://developers.google.com/identity for - // guides on implementing OAuth2 for your application. - GoogleCredentials credentials = GoogleCredentials.getApplicationDefault().createScoped(Arrays.asList(DriveScopes.DRIVE_FILE)); - HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( - credentials); + /** + * Download a Document file in PDF format. + * + * @param realFileId file ID of any workspace document format file. + * @return byte array stream if successful, {@code null} otherwise. + * @throws IOException if service account credentials file not found. + */ + public static ByteArrayOutputStream exportPdf(String realFileId) throws IOException { + // Load pre-authorized user credentials from the environment. + // TODO(developer) - See https://developers.google.com/identity for + // guides on implementing OAuth2 for your application. + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Arrays.asList(DriveScopes.DRIVE_FILE)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); - // Build a new authorized API client service. - Drive service = new Drive.Builder(new NetHttpTransport(), - GsonFactory.getDefaultInstance(), - requestInitializer) - .setApplicationName("Drive samples") - .build(); + // Build a new authorized API client service. + Drive service = new Drive.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Drive samples") + .build(); - OutputStream outputStream = new ByteArrayOutputStream(); - try { - service.files().export(realFileId, "application/pdf") - .executeMediaAndDownloadTo(outputStream); + OutputStream outputStream = new ByteArrayOutputStream(); + try { + service.files().export(realFileId, "application/pdf") + .executeMediaAndDownloadTo(outputStream); - return (ByteArrayOutputStream) outputStream; - } catch (GoogleJsonResponseException e) { - // TODO(developer) - handle error appropriately - System.err.println("Unable to export file: " + e.getDetails()); - throw e; - } + return (ByteArrayOutputStream) outputStream; + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + System.err.println("Unable to export file: " + e.getDetails()); + throw e; } + } } // [END drive_export_pdf] diff --git a/drive/snippets/drive_v3/src/main/java/FetchAppDataFolder.java b/drive/snippets/drive_v3/src/main/java/FetchAppDataFolder.java index dd00bdf4..d80db884 100644 --- a/drive/snippets/drive_v3/src/main/java/FetchAppDataFolder.java +++ b/drive/snippets/drive_v3/src/main/java/FetchAppDataFolder.java @@ -22,47 +22,50 @@ import com.google.api.services.drive.model.File; import com.google.auth.http.HttpCredentialsAdapter; import com.google.auth.oauth2.GoogleCredentials; - import java.io.IOException; import java.util.Arrays; -/** Class to demonstrate use-case of list out application data folder and prints folder Id. */ +/** + * Class to demonstrate use-case of list out application data folder and prints folder Id. + */ public class FetchAppDataFolder { - /** - * Fetches appDataFolder and prints it's folder id. - * @return Application data folder's ID. - */ - public static String fetchAppDataFolder() throws IOException { + /** + * Fetches appDataFolder and prints it's folder id. + * + * @return Application data folder's ID. + */ + public static String fetchAppDataFolder() throws IOException { /*Load pre-authorized user credentials from the environment. TODO(developer) - See https://developers.google.com/identity for guides on implementing OAuth2 for your application.*/ - GoogleCredentials credentials = null; - try { - credentials = GoogleCredentials.getApplicationDefault().createScoped(Arrays.asList(DriveScopes.DRIVE_APPDATA)); - } catch (IOException e) { - e.printStackTrace(); - } - HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( - credentials); + GoogleCredentials credentials = null; + try { + credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Arrays.asList(DriveScopes.DRIVE_APPDATA)); + } catch (IOException e) { + e.printStackTrace(); + } + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); - // Build a new authorized API client service. - Drive service = new Drive.Builder(new NetHttpTransport(), - GsonFactory.getDefaultInstance(), - requestInitializer) - .setApplicationName("Drive samples") - .build(); - try { - File file = service.files().get("appDataFolder") - .setFields("id") - .execute(); - System.out.println("Folder ID: " + file.getId()); - return file.getId(); - }catch (GoogleJsonResponseException e) { - // TODO(developer) - handle error appropriately - System.err.println("Unable to fetch appdata folder: " + e.getDetails()); - throw e; - } + // Build a new authorized API client service. + Drive service = new Drive.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Drive samples") + .build(); + try { + File file = service.files().get("appDataFolder") + .setFields("id") + .execute(); + System.out.println("Folder ID: " + file.getId()); + return file.getId(); + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + System.err.println("Unable to fetch appdata folder: " + e.getDetails()); + throw e; } + } } // [END drive_fetch_appdata_folder] diff --git a/drive/snippets/drive_v3/src/main/java/FetchChanges.java b/drive/snippets/drive_v3/src/main/java/FetchChanges.java index aa921837..49a2319e 100644 --- a/drive/snippets/drive_v3/src/main/java/FetchChanges.java +++ b/drive/snippets/drive_v3/src/main/java/FetchChanges.java @@ -22,57 +22,58 @@ import com.google.api.services.drive.model.ChangeList; import com.google.auth.http.HttpCredentialsAdapter; import com.google.auth.oauth2.GoogleCredentials; - import java.io.IOException; import java.util.Arrays; /* Class to demonstrate use-case of Drive's fetch changes in file. */ public class FetchChanges { - /** - * Retrieve the list of changes for the currently authenticated user. - * @param savedStartPageToken Last saved start token for this user. - * @return Saved token after last page. - * @throws IOException if file is not found - */ - public static String fetchChanges(String savedStartPageToken) throws IOException { + /** + * Retrieve the list of changes for the currently authenticated user. + * + * @param savedStartPageToken Last saved start token for this user. + * @return Saved token after last page. + * @throws IOException if file is not found + */ + public static String fetchChanges(String savedStartPageToken) throws IOException { /*Load pre-authorized user credentials from the environment. TODO(developer) - See https://developers.google.com/identity for guides on implementing OAuth2 for your application.*/ - GoogleCredentials credentials = GoogleCredentials.getApplicationDefault().createScoped(Arrays.asList(DriveScopes.DRIVE_FILE)); - HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( - credentials); - - // Build a new authorized API client service. - Drive service = new Drive.Builder(new NetHttpTransport(), - GsonFactory.getDefaultInstance(), - requestInitializer) - .setApplicationName("Drive samples") - .build(); - try { - // Begin with our last saved start token for this user or the - // current token from getStartPageToken() - String pageToken = savedStartPageToken; - while (pageToken != null) { - ChangeList changes = service.changes().list(pageToken) - .execute(); - for (com.google.api.services.drive.model.Change change : changes.getChanges()) { - // Process change - System.out.println("Change found for file: " + change.getFileId()); - } - if (changes.getNewStartPageToken() != null) { - // Last page, save this token for the next polling interval - savedStartPageToken = changes.getNewStartPageToken(); - } - pageToken = changes.getNextPageToken(); - } + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Arrays.asList(DriveScopes.DRIVE_FILE)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); - return savedStartPageToken; - }catch (GoogleJsonResponseException e) { - // TODO(developer) - handle error appropriately - System.err.println("Unable to fetch changes: " + e.getDetails()); - throw e; + // Build a new authorized API client service. + Drive service = new Drive.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Drive samples") + .build(); + try { + // Begin with our last saved start token for this user or the + // current token from getStartPageToken() + String pageToken = savedStartPageToken; + while (pageToken != null) { + ChangeList changes = service.changes().list(pageToken) + .execute(); + for (com.google.api.services.drive.model.Change change : changes.getChanges()) { + // Process change + System.out.println("Change found for file: " + change.getFileId()); } + if (changes.getNewStartPageToken() != null) { + // Last page, save this token for the next polling interval + savedStartPageToken = changes.getNewStartPageToken(); + } + pageToken = changes.getNextPageToken(); + } + + return savedStartPageToken; + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + System.err.println("Unable to fetch changes: " + e.getDetails()); + throw e; } + } } // [END drive_fetch_changes] diff --git a/drive/snippets/drive_v3/src/main/java/FetchStartPageToken.java b/drive/snippets/drive_v3/src/main/java/FetchStartPageToken.java index de8a2da3..a3445c7a 100644 --- a/drive/snippets/drive_v3/src/main/java/FetchStartPageToken.java +++ b/drive/snippets/drive_v3/src/main/java/FetchStartPageToken.java @@ -22,45 +22,46 @@ import com.google.api.services.drive.model.StartPageToken; import com.google.auth.http.HttpCredentialsAdapter; import com.google.auth.oauth2.GoogleCredentials; - import java.io.IOException; import java.util.Arrays; /* Class to demonstrate use-case of Drive's fetch start page token */ public class FetchStartPageToken { - /** - * Retrieve the start page token for the first time. - * @return Start page token as String. - * @throws IOException if file is not found - */ - public static String fetchStartPageToken() throws IOException { + /** + * Retrieve the start page token for the first time. + * + * @return Start page token as String. + * @throws IOException if file is not found + */ + public static String fetchStartPageToken() throws IOException { /*Load pre-authorized user credentials from the environment. TODO(developer) - See https://developers.google.com/identity for guides on implementing OAuth2 for your application. */ - GoogleCredentials credentials = GoogleCredentials.getApplicationDefault().createScoped(Arrays.asList(DriveScopes.DRIVE_FILE)); - HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( - credentials); + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Arrays.asList(DriveScopes.DRIVE_FILE)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); - // Build a new authorized API client service. - Drive service = new Drive.Builder(new NetHttpTransport(), - GsonFactory.getDefaultInstance(), - requestInitializer) - .setApplicationName("Drive samples") - .build(); - try { - StartPageToken response = service.changes() - .getStartPageToken().execute(); - System.out.println("Start token: " + response.getStartPageToken()); + // Build a new authorized API client service. + Drive service = new Drive.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Drive samples") + .build(); + try { + StartPageToken response = service.changes() + .getStartPageToken().execute(); + System.out.println("Start token: " + response.getStartPageToken()); - return response.getStartPageToken(); - }catch (GoogleJsonResponseException e) { - // TODO(developer) - handle error appropriately - System.err.println("Unable to fetch start page token: " + e.getDetails()); - throw e; - } + return response.getStartPageToken(); + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + System.err.println("Unable to fetch start page token: " + e.getDetails()); + throw e; } + } } // [END drive_fetch_start_page_token] diff --git a/drive/snippets/drive_v3/src/main/java/ListAppData.java b/drive/snippets/drive_v3/src/main/java/ListAppData.java index 1f611d3c..96192020 100644 --- a/drive/snippets/drive_v3/src/main/java/ListAppData.java +++ b/drive/snippets/drive_v3/src/main/java/ListAppData.java @@ -23,54 +23,57 @@ import com.google.api.services.drive.model.FileList; import com.google.auth.http.HttpCredentialsAdapter; import com.google.auth.oauth2.GoogleCredentials; - import java.io.IOException; import java.util.Arrays; -/** Class to demonstrate use-case of list 10 files in the application data folder. */ +/** + * Class to demonstrate use-case of list 10 files in the application data folder. + */ public class ListAppData { - /** - * list down files in the application data folder. - * @return list of 10 files. - */ - public static FileList listAppData() throws IOException { + /** + * list down files in the application data folder. + * + * @return list of 10 files. + */ + public static FileList listAppData() throws IOException { /*Load pre-authorized user credentials from the environment. TODO(developer) - See https://developers.google.com/identity for guides on implementing OAuth2 for your application.*/ - GoogleCredentials credentials = null; - try { - credentials = GoogleCredentials.getApplicationDefault().createScoped(Arrays.asList(DriveScopes.DRIVE_APPDATA)); - } catch (IOException e) { - e.printStackTrace(); - } - HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( - credentials); + GoogleCredentials credentials = null; + try { + credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Arrays.asList(DriveScopes.DRIVE_APPDATA)); + } catch (IOException e) { + e.printStackTrace(); + } + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); - // Build a new authorized API client service. - Drive service = new Drive.Builder(new NetHttpTransport(), - GsonFactory.getDefaultInstance(), - requestInitializer) - .setApplicationName("Drive samples") - .build(); - try { - FileList files = service.files().list() - .setSpaces("appDataFolder") - .setFields("nextPageToken, files(id, name)") - .setPageSize(10) - .execute(); - for (File file : files.getFiles()) { - System.out.printf("Found file: %s (%s)\n", - file.getName(), file.getId()); - } + // Build a new authorized API client service. + Drive service = new Drive.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Drive samples") + .build(); + try { + FileList files = service.files().list() + .setSpaces("appDataFolder") + .setFields("nextPageToken, files(id, name)") + .setPageSize(10) + .execute(); + for (File file : files.getFiles()) { + System.out.printf("Found file: %s (%s)\n", + file.getName(), file.getId()); + } - return files; - }catch (GoogleJsonResponseException e) { - // TODO(developer) - handle error appropriately - System.err.println("Unable to list files: " + e.getDetails()); - throw e; - } + return files; + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + System.err.println("Unable to list files: " + e.getDetails()); + throw e; } + } } // [END drive_list_appdata] \ No newline at end of file diff --git a/drive/snippets/drive_v3/src/main/java/MoveFileToFolder.java b/drive/snippets/drive_v3/src/main/java/MoveFileToFolder.java index 4b5603e8..bba31a82 100644 --- a/drive/snippets/drive_v3/src/main/java/MoveFileToFolder.java +++ b/drive/snippets/drive_v3/src/main/java/MoveFileToFolder.java @@ -24,7 +24,6 @@ import com.google.api.services.drive.model.File; import com.google.auth.http.HttpCredentialsAdapter; import com.google.auth.oauth2.GoogleCredentials; - import java.io.IOException; import java.util.Arrays; import java.util.List; @@ -33,49 +32,50 @@ public class MoveFileToFolder { - /** - * @param fileId Id of file to be moved. - * @param folderId Id of folder where the fill will be moved. - * @return list of parent ids for the file. - * */ - public static List moveFileToFolder(String fileId, String folderId) - throws IOException { + /** + * @param fileId Id of file to be moved. + * @param folderId Id of folder where the fill will be moved. + * @return list of parent ids for the file. + */ + public static List moveFileToFolder(String fileId, String folderId) + throws IOException { /* Load pre-authorized user credentials from the environment. TODO(developer) - See https://developers.google.com/identity for guides on implementing OAuth2 for your application.*/ - GoogleCredentials credentials = GoogleCredentials.getApplicationDefault().createScoped(Arrays.asList(DriveScopes.DRIVE_FILE)); - HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( - credentials); - // Build a new authorized API client service. - Drive service = new Drive.Builder(new NetHttpTransport(), - GsonFactory.getDefaultInstance(), - requestInitializer) - .setApplicationName("Drive samples") - .build(); + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Arrays.asList(DriveScopes.DRIVE_FILE)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + // Build a new authorized API client service. + Drive service = new Drive.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Drive samples") + .build(); - // Retrieve the existing parents to remove - File file = service.files().get(fileId) - .setFields("parents") - .execute(); - StringBuilder previousParents = new StringBuilder(); - for (String parent : file.getParents()) { - previousParents.append(parent); - previousParents.append(','); - } - try{ - // Move the file to the new folder - file = service.files().update(fileId, null) - .setAddParents(folderId) - .setRemoveParents(previousParents.toString()) - .setFields("id, parents") - .execute(); + // Retrieve the existing parents to remove + File file = service.files().get(fileId) + .setFields("parents") + .execute(); + StringBuilder previousParents = new StringBuilder(); + for (String parent : file.getParents()) { + previousParents.append(parent); + previousParents.append(','); + } + try { + // Move the file to the new folder + file = service.files().update(fileId, null) + .setAddParents(folderId) + .setRemoveParents(previousParents.toString()) + .setFields("id, parents") + .execute(); - return file.getParents(); - }catch (GoogleJsonResponseException e) { - // TODO(developer) - handle error appropriately - System.err.println("Unable to move file: " + e.getDetails()); - throw e; - } + return file.getParents(); + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + System.err.println("Unable to move file: " + e.getDetails()); + throw e; } + } } // [END drive_move_file_to_folder] diff --git a/drive/snippets/drive_v3/src/main/java/RecoverDrive.java b/drive/snippets/drive_v3/src/main/java/RecoverDrive.java index adf8162e..87fd32a8 100644 --- a/drive/snippets/drive_v3/src/main/java/RecoverDrive.java +++ b/drive/snippets/drive_v3/src/main/java/RecoverDrive.java @@ -23,7 +23,6 @@ import com.google.api.services.drive.model.Permission; import com.google.auth.http.HttpCredentialsAdapter; import com.google.auth.oauth2.GoogleCredentials; - import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; @@ -32,74 +31,77 @@ /* class to demonstrate use-case of Drive's shared drive without an organizer. */ public class RecoverDrive { - /** - * Find all shared drives without an organizer and add one. - * @param realUser User's email id. - * @return All shared drives without an organizer. - * @throws IOException if shared drive not found. - */ - public static List recoverDrives(String realUser) - throws IOException { + /** + * Find all shared drives without an organizer and add one. + * + * @param realUser User's email id. + * @return All shared drives without an organizer. + * @throws IOException if shared drive not found. + */ + public static List recoverDrives(String realUser) + throws IOException { /*Load pre-authorized user credentials from the environment. TODO(developer) - See https://developers.google.com/identity for guides on implementing OAuth2 for your application.*/ - GoogleCredentials credentials = GoogleCredentials.getApplicationDefault().createScoped(Arrays.asList(DriveScopes.DRIVE)); - HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( - credentials); + GoogleCredentials credentials = + GoogleCredentials.getApplicationDefault().createScoped(Arrays.asList(DriveScopes.DRIVE)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); - // Build a new authorized API client service. - com.google.api.services.drive.Drive service = new com.google.api.services.drive.Drive.Builder(new NetHttpTransport(), - GsonFactory.getDefaultInstance(), - requestInitializer) - .setApplicationName("Drive samples") - .build(); - List drives = new ArrayList(); + // Build a new authorized API client service. + com.google.api.services.drive.Drive service = + new com.google.api.services.drive.Drive.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Drive samples") + .build(); + List drives = new ArrayList(); - // Find all shared drives without an organizer and add one. - // Note: This example does not capture all cases. Shared drives - // that have an empty group as the sole organizer, or an - // organizer outside the organization are not captured. A - // more exhaustive approach would evaluate each shared drive - // and the associated permissions and groups to ensure an active - // organizer is assigned. - String pageToken = null; - Permission newOrganizerPermission = new Permission() - .setType("user") - .setRole("organizer"); + // Find all shared drives without an organizer and add one. + // Note: This example does not capture all cases. Shared drives + // that have an empty group as the sole organizer, or an + // organizer outside the organization are not captured. A + // more exhaustive approach would evaluate each shared drive + // and the associated permissions and groups to ensure an active + // organizer is assigned. + String pageToken = null; + Permission newOrganizerPermission = new Permission() + .setType("user") + .setRole("organizer"); - newOrganizerPermission.setEmailAddress(realUser); + newOrganizerPermission.setEmailAddress(realUser); - do { - DriveList result = service.drives().list() - .setQ("organizerCount = 0") - .setFields("nextPageToken, drives(id, name)") - .setUseDomainAdminAccess(true) - .setPageToken(pageToken) - .execute(); - for (Drive drive : result.getDrives()) { - System.out.printf("Found drive without organizer: %s (%s)\n", - drive.getName(), drive.getId()); - // Note: For improved efficiency, consider batching - // permission insert requests - Permission permissionResult = service.permissions() - .create(drive.getId(), newOrganizerPermission) - .setUseDomainAdminAccess(true) - .setSupportsAllDrives(true) - .setFields("id") - .execute(); - System.out.printf("Added organizer permission: %s\n", - permissionResult.getId()); + do { + DriveList result = service.drives().list() + .setQ("organizerCount = 0") + .setFields("nextPageToken, drives(id, name)") + .setUseDomainAdminAccess(true) + .setPageToken(pageToken) + .execute(); + for (Drive drive : result.getDrives()) { + System.out.printf("Found drive without organizer: %s (%s)\n", + drive.getName(), drive.getId()); + // Note: For improved efficiency, consider batching + // permission insert requests + Permission permissionResult = service.permissions() + .create(drive.getId(), newOrganizerPermission) + .setUseDomainAdminAccess(true) + .setSupportsAllDrives(true) + .setFields("id") + .execute(); + System.out.printf("Added organizer permission: %s\n", + permissionResult.getId()); - } + } - drives.addAll(result.getDrives()); + drives.addAll(result.getDrives()); - pageToken = result.getNextPageToken(); - } while (pageToken != null); + pageToken = result.getNextPageToken(); + } while (pageToken != null); - return drives; - } + return drives; + } } // [END drive_recover_drives] diff --git a/drive/snippets/drive_v3/src/main/java/SearchFile.java b/drive/snippets/drive_v3/src/main/java/SearchFile.java index 632bf4ae..08f574b1 100644 --- a/drive/snippets/drive_v3/src/main/java/SearchFile.java +++ b/drive/snippets/drive_v3/src/main/java/SearchFile.java @@ -23,7 +23,6 @@ import com.google.api.services.drive.model.FileList; import com.google.auth.http.HttpCredentialsAdapter; import com.google.auth.oauth2.GoogleCredentials; - import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; @@ -32,47 +31,49 @@ /* Class to demonstrate use-case of search files. */ public class SearchFile { - /** - * Search for specific set of files. - * @return search result list. - * @throws IOException if service account credentials file not found. - */ - public static List searchFile() throws IOException{ + /** + * Search for specific set of files. + * + * @return search result list. + * @throws IOException if service account credentials file not found. + */ + public static List searchFile() throws IOException { /*Load pre-authorized user credentials from the environment. TODO(developer) - See https://developers.google.com/identity for guides on implementing OAuth2 for your application.*/ - GoogleCredentials credentials = GoogleCredentials.getApplicationDefault().createScoped(Arrays.asList(DriveScopes.DRIVE_FILE)); - HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( - credentials); + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Arrays.asList(DriveScopes.DRIVE_FILE)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); - // Build a new authorized API client service. - Drive service = new Drive.Builder(new NetHttpTransport(), - GsonFactory.getDefaultInstance(), - requestInitializer) - .setApplicationName("Drive samples") - .build(); + // Build a new authorized API client service. + Drive service = new Drive.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Drive samples") + .build(); - List files = new ArrayList(); + List files = new ArrayList(); - String pageToken = null; - do { - FileList result = service.files().list() - .setQ("mimeType='image/jpeg'") - .setSpaces("drive") - .setFields("nextPageToken, items(id, title)") - .setPageToken(pageToken) - .execute(); - for (File file : result.getFiles()) { - System.out.printf("Found file: %s (%s)\n", - file.getName(), file.getId()); - } + String pageToken = null; + do { + FileList result = service.files().list() + .setQ("mimeType='image/jpeg'") + .setSpaces("drive") + .setFields("nextPageToken, items(id, title)") + .setPageToken(pageToken) + .execute(); + for (File file : result.getFiles()) { + System.out.printf("Found file: %s (%s)\n", + file.getName(), file.getId()); + } - files.addAll(result.getFiles()); + files.addAll(result.getFiles()); - pageToken = result.getNextPageToken(); - } while (pageToken != null); + pageToken = result.getNextPageToken(); + } while (pageToken != null); - return files; - } + return files; + } } // [END drive_search_files] diff --git a/drive/snippets/drive_v3/src/main/java/ShareFile.java b/drive/snippets/drive_v3/src/main/java/ShareFile.java index 899edfef..438440df 100644 --- a/drive/snippets/drive_v3/src/main/java/ShareFile.java +++ b/drive/snippets/drive_v3/src/main/java/ShareFile.java @@ -27,7 +27,6 @@ import com.google.api.services.drive.model.Permission; import com.google.auth.http.HttpCredentialsAdapter; import com.google.auth.oauth2.GoogleCredentials; - import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; @@ -36,80 +35,83 @@ /* Class to demonstrate use-case of modify permissions. */ public class ShareFile { - /** - * Batch permission modification. - * realFileId file Id. - * realUser User Id. - * realDomain Domain of the user ID. - * @return list of modified permissions if successful, {@code null} otherwise. - * @throws IOException if service account credentials file not found. - */ - public static List shareFile(String realFileId, String realUser, String realDomain) throws IOException{ + /** + * Batch permission modification. + * realFileId file Id. + * realUser User Id. + * realDomain Domain of the user ID. + * + * @return list of modified permissions if successful, {@code null} otherwise. + * @throws IOException if service account credentials file not found. + */ + public static List shareFile(String realFileId, String realUser, String realDomain) + throws IOException { /* Load pre-authorized user credentials from the environment. TODO(developer) - See https://developers.google.com/identity for guides on implementing OAuth2 for your application.application*/ - GoogleCredentials credentials = GoogleCredentials.getApplicationDefault().createScoped(Arrays.asList(DriveScopes.DRIVE_FILE)); - HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( - credentials); - - // Build a new authorized API client service. - Drive service = new Drive.Builder(new NetHttpTransport(), - GsonFactory.getDefaultInstance(), - requestInitializer) - .setApplicationName("Drive samples") - .build(); - - final List ids = new ArrayList(); - - - JsonBatchCallback callback = new JsonBatchCallback() { - @Override - public void onFailure(GoogleJsonError e, - HttpHeaders responseHeaders) - throws IOException { - // Handle error - System.err.println(e.getMessage()); - } - - @Override - public void onSuccess(Permission permission, - HttpHeaders responseHeaders) - throws IOException { - System.out.println("Permission ID: " + permission.getId()); - - ids.add(permission.getId()); - - } - }; - BatchRequest batch = service.batch(); - Permission userPermission = new Permission() - .setType("user") - .setRole("writer"); - - userPermission.setEmailAddress(realUser); - try { - service.permissions().create(realFileId, userPermission) - .setFields("id") - .queue(batch, callback); - - Permission domainPermission = new Permission() - .setType("domain") - .setRole("reader"); - - domainPermission.setDomain(realDomain); - - service.permissions().create(realFileId, domainPermission) - .setFields("id") - .queue(batch, callback); - - batch.execute(); - - return ids; - }catch (GoogleJsonResponseException e) { - // TODO(developer) - handle error appropriately - System.err.println("Unable to modify permission: " + e.getDetails()); - throw e; - } + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Arrays.asList(DriveScopes.DRIVE_FILE)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + + // Build a new authorized API client service. + Drive service = new Drive.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Drive samples") + .build(); + + final List ids = new ArrayList(); + + + JsonBatchCallback callback = new JsonBatchCallback() { + @Override + public void onFailure(GoogleJsonError e, + HttpHeaders responseHeaders) + throws IOException { + // Handle error + System.err.println(e.getMessage()); + } + + @Override + public void onSuccess(Permission permission, + HttpHeaders responseHeaders) + throws IOException { + System.out.println("Permission ID: " + permission.getId()); + + ids.add(permission.getId()); + + } + }; + BatchRequest batch = service.batch(); + Permission userPermission = new Permission() + .setType("user") + .setRole("writer"); + + userPermission.setEmailAddress(realUser); + try { + service.permissions().create(realFileId, userPermission) + .setFields("id") + .queue(batch, callback); + + Permission domainPermission = new Permission() + .setType("domain") + .setRole("reader"); + + domainPermission.setDomain(realDomain); + + service.permissions().create(realFileId, domainPermission) + .setFields("id") + .queue(batch, callback); + + batch.execute(); + + return ids; + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + System.err.println("Unable to modify permission: " + e.getDetails()); + throw e; } + } } // [END drive_share_file] diff --git a/drive/snippets/drive_v3/src/main/java/TouchFile.java b/drive/snippets/drive_v3/src/main/java/TouchFile.java index 2729133c..138a7e18 100644 --- a/drive/snippets/drive_v3/src/main/java/TouchFile.java +++ b/drive/snippets/drive_v3/src/main/java/TouchFile.java @@ -24,7 +24,6 @@ import com.google.api.services.drive.model.File; import com.google.auth.http.HttpCredentialsAdapter; import com.google.auth.oauth2.GoogleCredentials; - import java.io.IOException; import java.util.Arrays; @@ -32,46 +31,47 @@ public class TouchFile { - /** - * @param realFileId Id of file to be modified. - * @param realTimestamp Timestamp in miliseconds. - * @return long file's latest modification date value. - * @throws IOException if service account credentials file not found. - * */ - public static long touchFile(String realFileId, long realTimestamp) - throws IOException { + /** + * @param realFileId Id of file to be modified. + * @param realTimestamp Timestamp in miliseconds. + * @return long file's latest modification date value. + * @throws IOException if service account credentials file not found. + */ + public static long touchFile(String realFileId, long realTimestamp) + throws IOException { /*Load pre-authorized user credentials from the environment. TODO(developer) - See https://developers.google.com/identity for guides on implementing OAuth2 for your application.*/ - GoogleCredentials credentials = GoogleCredentials.getApplicationDefault().createScoped(Arrays.asList(DriveScopes.DRIVE_FILE)); - HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( - credentials); + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Arrays.asList(DriveScopes.DRIVE_FILE)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); - // Build a new authorized API client service. - Drive service = new Drive.Builder(new NetHttpTransport(), - GsonFactory.getDefaultInstance(), - requestInitializer) - .setApplicationName("Drive samples") - .build(); - String fileId = "1sTWaJ_j7PkjzaBWtNc3IzovK5hQf21FbOw9yLeeLPNQ"; - File fileMetadata = new File(); - fileMetadata.setModifiedTime(new DateTime(System.currentTimeMillis())); + // Build a new authorized API client service. + Drive service = new Drive.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Drive samples") + .build(); + String fileId = "1sTWaJ_j7PkjzaBWtNc3IzovK5hQf21FbOw9yLeeLPNQ"; + File fileMetadata = new File(); + fileMetadata.setModifiedTime(new DateTime(System.currentTimeMillis())); - fileId = realFileId; - fileMetadata.setModifiedTime(new DateTime(realTimestamp)); + fileId = realFileId; + fileMetadata.setModifiedTime(new DateTime(realTimestamp)); - try { - File file = service.files().update(fileId, fileMetadata) - .setFields("id, modifiedDate") - .execute(); - System.out.println("Modified time: " + file.getModifiedTime()); - return file.getModifiedTime().getValue(); - }catch (GoogleJsonResponseException e) { - // TODO(developer) - handle error appropriately - System.err.println("Unable to move file: " + e.getDetails()); - throw e; - } + try { + File file = service.files().update(fileId, fileMetadata) + .setFields("id, modifiedDate") + .execute(); + System.out.println("Modified time: " + file.getModifiedTime()); + return file.getModifiedTime().getValue(); + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + System.err.println("Unable to move file: " + e.getDetails()); + throw e; } + } } // [END drive_touch_file] diff --git a/drive/snippets/drive_v3/src/main/java/UploadAppData.java b/drive/snippets/drive_v3/src/main/java/UploadAppData.java index 8192f009..4ed8e934 100644 --- a/drive/snippets/drive_v3/src/main/java/UploadAppData.java +++ b/drive/snippets/drive_v3/src/main/java/UploadAppData.java @@ -23,55 +23,58 @@ import com.google.api.services.drive.model.File; import com.google.auth.http.HttpCredentialsAdapter; import com.google.auth.oauth2.GoogleCredentials; - import java.io.IOException; import java.util.Arrays; import java.util.Collections; -/** Class to demonstrate use-case of create file in the application data folder. */ +/** + * Class to demonstrate use-case of create file in the application data folder. + */ public class UploadAppData { - /** - * Creates a file in the application data folder. - * @return Created file's Id. - */ - public static String uploadAppData() throws IOException { + /** + * Creates a file in the application data folder. + * + * @return Created file's Id. + */ + public static String uploadAppData() throws IOException { /*Load pre-authorized user credentials from the environment. TODO(developer) - See https://developers.google.com/identity for guides on implementing OAuth2 for your application.*/ - GoogleCredentials credentials = null; - try { - credentials = GoogleCredentials.getApplicationDefault().createScoped(Arrays.asList(DriveScopes.DRIVE_APPDATA)); - } catch (IOException e) { - e.printStackTrace(); - } - HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( - credentials); + GoogleCredentials credentials = null; + try { + credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Arrays.asList(DriveScopes.DRIVE_APPDATA)); + } catch (IOException e) { + e.printStackTrace(); + } + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); - // Build a new authorized API client service. - Drive service = new Drive.Builder(new NetHttpTransport(), - GsonFactory.getDefaultInstance(), - requestInitializer) - .setApplicationName("Drive samples") - .build(); - try { - // File's metadata. - File fileMetadata = new File(); - fileMetadata.setName("config.json"); - fileMetadata.setParents(Collections.singletonList("appDataFolder")); - java.io.File filePath = new java.io.File("files/config.json"); - FileContent mediaContent = new FileContent("application/json", filePath); - File file = service.files().create(fileMetadata, mediaContent) - .setFields("id") - .execute(); - System.out.println("File ID: " + file.getId()); - return file.getId(); - }catch (GoogleJsonResponseException e) { - // TODO(developer) - handle error appropriately - System.err.println("Unable to create file: " + e.getDetails()); - throw e; - } + // Build a new authorized API client service. + Drive service = new Drive.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Drive samples") + .build(); + try { + // File's metadata. + File fileMetadata = new File(); + fileMetadata.setName("config.json"); + fileMetadata.setParents(Collections.singletonList("appDataFolder")); + java.io.File filePath = new java.io.File("files/config.json"); + FileContent mediaContent = new FileContent("application/json", filePath); + File file = service.files().create(fileMetadata, mediaContent) + .setFields("id") + .execute(); + System.out.println("File ID: " + file.getId()); + return file.getId(); + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + System.err.println("Unable to create file: " + e.getDetails()); + throw e; } + } } // [END drive_upload_appdata] \ No newline at end of file diff --git a/drive/snippets/drive_v3/src/main/java/UploadBasic.java b/drive/snippets/drive_v3/src/main/java/UploadBasic.java index 65b30ad3..a39a696c 100644 --- a/drive/snippets/drive_v3/src/main/java/UploadBasic.java +++ b/drive/snippets/drive_v3/src/main/java/UploadBasic.java @@ -24,50 +24,51 @@ import com.google.api.services.drive.model.File; import com.google.auth.http.HttpCredentialsAdapter; import com.google.auth.oauth2.GoogleCredentials; - import java.io.IOException; import java.util.Arrays; /* Class to demonstrate use of Drive insert file API */ public class UploadBasic { - /** - * Upload new file. - * @return Inserted file metadata if successful, {@code null} otherwise. - * @throws IOException if service account credentials file not found. - */ - public static String uploadBasic() throws IOException{ - // Load pre-authorized user credentials from the environment. - // TODO(developer) - See https://developers.google.com/identity for - // guides on implementing OAuth2 for your application. - GoogleCredentials credentials = GoogleCredentials.getApplicationDefault().createScoped(Arrays.asList(DriveScopes.DRIVE_FILE)); - HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( - credentials); + /** + * Upload new file. + * + * @return Inserted file metadata if successful, {@code null} otherwise. + * @throws IOException if service account credentials file not found. + */ + public static String uploadBasic() throws IOException { + // Load pre-authorized user credentials from the environment. + // TODO(developer) - See https://developers.google.com/identity for + // guides on implementing OAuth2 for your application. + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Arrays.asList(DriveScopes.DRIVE_FILE)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); - // Build a new authorized API client service. - Drive service = new Drive.Builder(new NetHttpTransport(), - GsonFactory.getDefaultInstance(), - requestInitializer) - .setApplicationName("Drive samples") - .build(); - // Upload file photo.jpg on drive. - File fileMetadata = new File(); - fileMetadata.setName("photo.jpg"); - // File's content. - java.io.File filePath = new java.io.File("files/photo.jpg"); - // Specify media type and file-path for file. - FileContent mediaContent = new FileContent("image/jpeg", filePath); - try { - File file = service.files().create(fileMetadata, mediaContent) - .setFields("id") - .execute(); - System.out.println("File ID: " + file.getId()); - return file.getId(); - }catch (GoogleJsonResponseException e) { - // TODO(developer) - handle error appropriately - System.err.println("Unable to upload file: " + e.getDetails()); - throw e; - } + // Build a new authorized API client service. + Drive service = new Drive.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Drive samples") + .build(); + // Upload file photo.jpg on drive. + File fileMetadata = new File(); + fileMetadata.setName("photo.jpg"); + // File's content. + java.io.File filePath = new java.io.File("files/photo.jpg"); + // Specify media type and file-path for file. + FileContent mediaContent = new FileContent("image/jpeg", filePath); + try { + File file = service.files().create(fileMetadata, mediaContent) + .setFields("id") + .execute(); + System.out.println("File ID: " + file.getId()); + return file.getId(); + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + System.err.println("Unable to upload file: " + e.getDetails()); + throw e; } + } } // [END drive_upload_basic] diff --git a/drive/snippets/drive_v3/src/main/java/UploadRevision.java b/drive/snippets/drive_v3/src/main/java/UploadRevision.java index 93e1c4f5..7ed2acac 100644 --- a/drive/snippets/drive_v3/src/main/java/UploadRevision.java +++ b/drive/snippets/drive_v3/src/main/java/UploadRevision.java @@ -24,49 +24,50 @@ import com.google.api.services.drive.model.File; import com.google.auth.http.HttpCredentialsAdapter; import com.google.auth.oauth2.GoogleCredentials; - import java.io.IOException; import java.util.Arrays; /* Class to demonstrate use-case of drive's upload revision */ public class UploadRevision { - /** - * Replace the old file with new one on same file ID. - * @param realFileId ID of the file to be replaced. - * @return Inserted file ID if successful, {@code null} otherwise. - * @throws IOException if service account credentials file not found. - */ - public static String uploadRevision(String realFileId) throws IOException{ - // Load pre-authorized user credentials from the environment. - // TODO(developer) - See https://developers.google.com/identity for - // guides on implementing OAuth2 for your application. - GoogleCredentials credentials = GoogleCredentials.getApplicationDefault().createScoped(Arrays.asList(DriveScopes.DRIVE_FILE)); - HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( - credentials); + /** + * Replace the old file with new one on same file ID. + * + * @param realFileId ID of the file to be replaced. + * @return Inserted file ID if successful, {@code null} otherwise. + * @throws IOException if service account credentials file not found. + */ + public static String uploadRevision(String realFileId) throws IOException { + // Load pre-authorized user credentials from the environment. + // TODO(developer) - See https://developers.google.com/identity for + // guides on implementing OAuth2 for your application. + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Arrays.asList(DriveScopes.DRIVE_FILE)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); - // Build a new authorized API client service. - Drive service = new Drive.Builder(new NetHttpTransport(), - GsonFactory.getDefaultInstance(), - requestInitializer) - .setApplicationName("Drive samples") - .build(); + // Build a new authorized API client service. + Drive service = new Drive.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Drive samples") + .build(); - java.io.File filePath = new java.io.File("files/photo.jpg"); - FileContent mediaContent = new FileContent("image/jpeg", filePath); - try { - Drive.Files.Update request = service.files().update(realFileId, new File(), mediaContent) - .setFields("id"); - request.getMediaHttpUploader().setDirectUploadEnabled(true); - File file = request.execute(); - System.out.println("File ID: " + file.getId()); - return file.getId(); - } catch (GoogleJsonResponseException e) { - // TODO(developer) - handle error appropriately - System.err.println("Unable to upload new file: " + e.getDetails()); - throw e; - } + java.io.File filePath = new java.io.File("files/photo.jpg"); + FileContent mediaContent = new FileContent("image/jpeg", filePath); + try { + Drive.Files.Update request = service.files().update(realFileId, new File(), mediaContent) + .setFields("id"); + request.getMediaHttpUploader().setDirectUploadEnabled(true); + File file = request.execute(); + System.out.println("File ID: " + file.getId()); + return file.getId(); + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + System.err.println("Unable to upload new file: " + e.getDetails()); + throw e; } + } } // [END drive_upload_revision] diff --git a/drive/snippets/drive_v3/src/main/java/UploadToFolder.java b/drive/snippets/drive_v3/src/main/java/UploadToFolder.java index db2be62f..b6bd86ad 100644 --- a/drive/snippets/drive_v3/src/main/java/UploadToFolder.java +++ b/drive/snippets/drive_v3/src/main/java/UploadToFolder.java @@ -24,7 +24,6 @@ import com.google.api.services.drive.model.File; import com.google.auth.http.HttpCredentialsAdapter; import com.google.auth.oauth2.GoogleCredentials; - import java.io.IOException; import java.util.Arrays; import java.util.Collections; @@ -32,44 +31,46 @@ /* Class to demonstrate Drive's upload to folder use-case. */ public class UploadToFolder { - /** - * Upload a file to the specified folder. - * @param realFolderId Id of the folder. - * @return Inserted file metadata if successful, {@code null} otherwise. - * @throws IOException if service account credentials file not found. - */ - public static File uploadToFolder(String realFolderId) throws IOException { - // Load pre-authorized user credentials from the environment. - // TODO(developer) - See https://developers.google.com/identity for - // guides on implementing OAuth2 for your application. - GoogleCredentials credentials = GoogleCredentials.getApplicationDefault().createScoped(Arrays.asList(DriveScopes.DRIVE_FILE)); - HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( - credentials); + /** + * Upload a file to the specified folder. + * + * @param realFolderId Id of the folder. + * @return Inserted file metadata if successful, {@code null} otherwise. + * @throws IOException if service account credentials file not found. + */ + public static File uploadToFolder(String realFolderId) throws IOException { + // Load pre-authorized user credentials from the environment. + // TODO(developer) - See https://developers.google.com/identity for + // guides on implementing OAuth2 for your application. + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Arrays.asList(DriveScopes.DRIVE_FILE)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); - // Build a new authorized API client service. - Drive service = new Drive.Builder(new NetHttpTransport(), - GsonFactory.getDefaultInstance(), - requestInitializer) - .setApplicationName("Drive samples") - .build(); + // Build a new authorized API client service. + Drive service = new Drive.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Drive samples") + .build(); - // File's metadata. - File fileMetadata = new File(); - fileMetadata.setName("photo.jpg"); - fileMetadata.setParents(Collections.singletonList(realFolderId)); - java.io.File filePath = new java.io.File("files/photo.jpg"); - FileContent mediaContent = new FileContent("image/jpeg", filePath); - try { - File file = service.files().create(fileMetadata, mediaContent) - .setFields("id, parents") - .execute(); - System.out.println("File ID: " + file.getId()); - return file; - }catch (GoogleJsonResponseException e) { - // TODO(developer) - handle error appropriately - System.err.println("Unable to upload file: " + e.getDetails()); - throw e; - } + // File's metadata. + File fileMetadata = new File(); + fileMetadata.setName("photo.jpg"); + fileMetadata.setParents(Collections.singletonList(realFolderId)); + java.io.File filePath = new java.io.File("files/photo.jpg"); + FileContent mediaContent = new FileContent("image/jpeg", filePath); + try { + File file = service.files().create(fileMetadata, mediaContent) + .setFields("id, parents") + .execute(); + System.out.println("File ID: " + file.getId()); + return file; + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + System.err.println("Unable to upload file: " + e.getDetails()); + throw e; } + } } // [END drive_upload_to_folder] diff --git a/drive/snippets/drive_v3/src/main/java/UploadWithConversion.java b/drive/snippets/drive_v3/src/main/java/UploadWithConversion.java index 21d871b5..114e1b94 100644 --- a/drive/snippets/drive_v3/src/main/java/UploadWithConversion.java +++ b/drive/snippets/drive_v3/src/main/java/UploadWithConversion.java @@ -24,51 +24,52 @@ import com.google.api.services.drive.model.File; import com.google.auth.http.HttpCredentialsAdapter; import com.google.auth.oauth2.GoogleCredentials; - import java.io.IOException; import java.util.Arrays; /* Class to demonstrate Drive's upload with conversion use-case. */ public class UploadWithConversion { - /** - * Upload file with conversion. - * @return Inserted file id if successful, {@code null} otherwise. - * @throws IOException if service account credentials file not found. - */ - public static String uploadWithConversion() throws IOException { - // Load pre-authorized user credentials from the environment. - // TODO(developer) - See https://developers.google.com/identity for - // guides on implementing OAuth2 for your application. - GoogleCredentials credentials = GoogleCredentials.getApplicationDefault().createScoped(Arrays.asList(DriveScopes.DRIVE_FILE)); - HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( - credentials); + /** + * Upload file with conversion. + * + * @return Inserted file id if successful, {@code null} otherwise. + * @throws IOException if service account credentials file not found. + */ + public static String uploadWithConversion() throws IOException { + // Load pre-authorized user credentials from the environment. + // TODO(developer) - See https://developers.google.com/identity for + // guides on implementing OAuth2 for your application. + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Arrays.asList(DriveScopes.DRIVE_FILE)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); - // Build a new authorized API client service. - Drive service = new Drive.Builder(new NetHttpTransport(), - GsonFactory.getDefaultInstance(), - requestInitializer) - .setApplicationName("Drive samples") - .build(); + // Build a new authorized API client service. + Drive service = new Drive.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Drive samples") + .build(); - // File's metadata. - File fileMetadata = new File(); - fileMetadata.setName("My Report"); - fileMetadata.setMimeType("application/vnd.google-apps.spreadsheet"); + // File's metadata. + File fileMetadata = new File(); + fileMetadata.setName("My Report"); + fileMetadata.setMimeType("application/vnd.google-apps.spreadsheet"); - java.io.File filePath = new java.io.File("files/report.csv"); - FileContent mediaContent = new FileContent("text/csv", filePath); - try { - File file = service.files().create(fileMetadata, mediaContent) - .setFields("id") - .execute(); - System.out.println("File ID: " + file.getId()); - return file.getId(); - }catch (GoogleJsonResponseException e) { - // TODO(developer) - handle error appropriately - System.err.println("Unable to move file: " + e.getDetails()); - throw e; - } + java.io.File filePath = new java.io.File("files/report.csv"); + FileContent mediaContent = new FileContent("text/csv", filePath); + try { + File file = service.files().create(fileMetadata, mediaContent) + .setFields("id") + .execute(); + System.out.println("File ID: " + file.getId()); + return file.getId(); + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + System.err.println("Unable to move file: " + e.getDetails()); + throw e; } + } } // [END drive_upload_with_conversion] diff --git a/drive/snippets/drive_v3/src/test/java/AppDataSnippetsTest.java b/drive/snippets/drive_v3/src/test/java/AppDataSnippetsTest.java index cab4ed28..446af287 100644 --- a/drive/snippets/drive_v3/src/test/java/AppDataSnippetsTest.java +++ b/drive/snippets/drive_v3/src/test/java/AppDataSnippetsTest.java @@ -14,15 +14,14 @@ * limitations under the License. */ -import com.google.api.services.drive.model.File; -import com.google.api.services.drive.model.FileList; -import org.junit.Before; -import org.junit.Test; +import static org.junit.Assert.assertNotEquals; +import static org.junit.Assert.assertNotNull; +import com.google.api.services.drive.model.FileList; import java.io.IOException; import java.security.GeneralSecurityException; - -import static org.junit.Assert.*; +import org.junit.Before; +import org.junit.Test; public class AppDataSnippetsTest extends BaseTest { diff --git a/drive/snippets/drive_v3/src/test/java/BaseTest.java b/drive/snippets/drive_v3/src/test/java/BaseTest.java index 75e636f3..7e4252fb 100644 --- a/drive/snippets/drive_v3/src/test/java/BaseTest.java +++ b/drive/snippets/drive_v3/src/test/java/BaseTest.java @@ -17,7 +17,6 @@ import com.google.api.client.http.FileContent; import com.google.api.client.http.HttpRequestInitializer; import com.google.api.client.http.HttpTransport; -import com.google.api.client.http.apache.ApacheHttpTransport; import com.google.api.client.http.javanet.NetHttpTransport; import com.google.api.client.json.gson.GsonFactory; import com.google.api.services.drive.Drive; @@ -25,16 +24,17 @@ import com.google.api.services.drive.model.File; import com.google.auth.http.HttpCredentialsAdapter; import com.google.auth.oauth2.GoogleCredentials; -import org.junit.After; -import org.junit.Before; - import java.io.IOException; import java.security.GeneralSecurityException; -import java.util.*; +import java.util.Arrays; +import java.util.HashSet; +import java.util.Set; import java.util.logging.Handler; import java.util.logging.Level; import java.util.logging.LogRecord; import java.util.logging.Logger; +import org.junit.After; +import org.junit.Before; public class BaseTest { static { @@ -70,7 +70,8 @@ public void publish(LogRecord record) { public GoogleCredentials getCredential() throws IOException { return GoogleCredentials.getApplicationDefault() - .createScoped(Arrays.asList(DriveScopes.DRIVE, DriveScopes.DRIVE_APPDATA,DriveScopes.DRIVE_FILE)); + .createScoped( + Arrays.asList(DriveScopes.DRIVE, DriveScopes.DRIVE_APPDATA, DriveScopes.DRIVE_FILE)); } /** @@ -85,14 +86,14 @@ protected Drive buildService() throws IOException { guides on implementing OAuth2 for your application. */ GoogleCredentials credentials = getCredential(); HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( - credentials); + credentials); // Create the classroom API client Drive service = new Drive.Builder(new NetHttpTransport(), - GsonFactory.getDefaultInstance(), - requestInitializer) - .setApplicationName("Drive Snippets") - .build(); + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Drive Snippets") + .build(); return service; } diff --git a/drive/snippets/drive_v3/src/test/java/ChangeSnippetsTest.java b/drive/snippets/drive_v3/src/test/java/ChangeSnippetsTest.java index 4323cc7d..7ad14676 100644 --- a/drive/snippets/drive_v3/src/test/java/ChangeSnippetsTest.java +++ b/drive/snippets/drive_v3/src/test/java/ChangeSnippetsTest.java @@ -14,14 +14,13 @@ * limitations under the License. */ -import org.junit.Before; -import org.junit.Test; - -import java.io.IOException; - import static org.junit.Assert.assertNotEquals; import static org.junit.Assert.assertNotNull; +import java.io.IOException; +import org.junit.Before; +import org.junit.Test; + public class ChangeSnippetsTest extends BaseTest { private ChangeSnippets snippets; diff --git a/drive/snippets/drive_v3/src/test/java/DriveSnippetsTest.java b/drive/snippets/drive_v3/src/test/java/DriveSnippetsTest.java index 71ec6b25..e32dc904 100644 --- a/drive/snippets/drive_v3/src/test/java/DriveSnippetsTest.java +++ b/drive/snippets/drive_v3/src/test/java/DriveSnippetsTest.java @@ -14,18 +14,17 @@ * limitations under the License. */ +import static org.junit.Assert.assertNotEquals; +import static org.junit.Assert.assertNotNull; + import com.google.api.services.drive.model.Drive; import com.google.api.services.drive.model.Permission; import com.google.api.services.drive.model.PermissionList; -import org.junit.Before; -import org.junit.Test; - import java.io.IOException; import java.security.GeneralSecurityException; import java.util.List; - -import static org.junit.Assert.assertNotEquals; -import static org.junit.Assert.assertNotNull; +import org.junit.Before; +import org.junit.Test; public class DriveSnippetsTest extends BaseTest { diff --git a/drive/snippets/drive_v3/src/test/java/FileSnippetsTest.java b/drive/snippets/drive_v3/src/test/java/FileSnippetsTest.java index a9641861..383a7935 100644 --- a/drive/snippets/drive_v3/src/test/java/FileSnippetsTest.java +++ b/drive/snippets/drive_v3/src/test/java/FileSnippetsTest.java @@ -14,17 +14,18 @@ * limitations under the License. */ -import com.google.api.services.drive.model.File; -import com.google.api.services.drive.model.FileList; -import org.junit.Before; -import org.junit.Test; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; +import com.google.api.services.drive.model.File; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.security.GeneralSecurityException; import java.util.List; - -import static org.junit.Assert.*; +import org.junit.Before; +import org.junit.Test; public class FileSnippetsTest extends BaseTest { diff --git a/drive/snippets/drive_v3/src/test/java/TeamDriveSnippetsTest.java b/drive/snippets/drive_v3/src/test/java/TeamDriveSnippetsTest.java index 43447b4d..b59b235a 100644 --- a/drive/snippets/drive_v3/src/test/java/TeamDriveSnippetsTest.java +++ b/drive/snippets/drive_v3/src/test/java/TeamDriveSnippetsTest.java @@ -14,18 +14,17 @@ * limitations under the License. */ -import com.google.api.services.drive.model.TeamDrive; +import static org.junit.Assert.assertNotEquals; +import static org.junit.Assert.assertNotNull; + import com.google.api.services.drive.model.Permission; import com.google.api.services.drive.model.PermissionList; -import org.junit.Before; -import org.junit.Test; - +import com.google.api.services.drive.model.TeamDrive; import java.io.IOException; import java.security.GeneralSecurityException; import java.util.List; - -import static org.junit.Assert.assertNotEquals; -import static org.junit.Assert.assertNotNull; +import org.junit.Before; +import org.junit.Test; public class TeamDriveSnippetsTest extends BaseTest { diff --git a/drive/snippets/drive_v3/src/test/java/TestCreateDrive.java b/drive/snippets/drive_v3/src/test/java/TestCreateDrive.java index c8937fa4..37e3b23f 100644 --- a/drive/snippets/drive_v3/src/test/java/TestCreateDrive.java +++ b/drive/snippets/drive_v3/src/test/java/TestCreateDrive.java @@ -12,19 +12,18 @@ // See the License for the specific language governing permissions and // limitations under the License. -import org.junit.Test; +import static org.junit.Assert.assertNotNull; import java.io.IOException; import java.security.GeneralSecurityException; - -import static org.junit.Assert.assertNotNull; +import org.junit.Test; // Unit test class for create-drive Drive snippet -public class TestCreateDrive extends BaseTest{ - @Test - public void createDrive() throws IOException, GeneralSecurityException { - String id = CreateDrive.createDrive(); - assertNotNull(id); - this.service.drives().delete(id); - } +public class TestCreateDrive extends BaseTest { + @Test + public void createDrive() throws IOException, GeneralSecurityException { + String id = CreateDrive.createDrive(); + assertNotNull(id); + this.service.drives().delete(id); + } } diff --git a/drive/snippets/drive_v3/src/test/java/TestCreateFolder.java b/drive/snippets/drive_v3/src/test/java/TestCreateFolder.java index 9c12f12f..d8492a08 100644 --- a/drive/snippets/drive_v3/src/test/java/TestCreateFolder.java +++ b/drive/snippets/drive_v3/src/test/java/TestCreateFolder.java @@ -14,18 +14,17 @@ * limitations under the License. */ -import org.junit.Test; +import static org.junit.Assert.assertNotNull; import java.io.IOException; import java.security.GeneralSecurityException; +import org.junit.Test; -import static org.junit.Assert.assertNotNull; - -public class TestCreateFolder extends BaseTest{ - @Test - public void createFolder() throws IOException, GeneralSecurityException { - String id = CreateFolder.createFolder(); - assertNotNull(id); - deleteFileOnCleanup(id); - } +public class TestCreateFolder extends BaseTest { + @Test + public void createFolder() throws IOException, GeneralSecurityException { + String id = CreateFolder.createFolder(); + assertNotNull(id); + deleteFileOnCleanup(id); + } } diff --git a/drive/snippets/drive_v3/src/test/java/TestCreateShortcut.java b/drive/snippets/drive_v3/src/test/java/TestCreateShortcut.java index 1853773d..ab3e0f2f 100644 --- a/drive/snippets/drive_v3/src/test/java/TestCreateShortcut.java +++ b/drive/snippets/drive_v3/src/test/java/TestCreateShortcut.java @@ -14,18 +14,17 @@ * limitations under the License. */ -import org.junit.Test; +import static org.junit.Assert.assertNotNull; import java.io.IOException; import java.security.GeneralSecurityException; +import org.junit.Test; -import static org.junit.Assert.assertNotNull; - -public class TestCreateShortcut extends BaseTest{ - @Test - public void createShortcut() throws IOException, GeneralSecurityException { - String id = CreateShortcut.createShortcut(); - assertNotNull(id); - deleteFileOnCleanup(id); - } +public class TestCreateShortcut extends BaseTest { + @Test + public void createShortcut() throws IOException, GeneralSecurityException { + String id = CreateShortcut.createShortcut(); + assertNotNull(id); + deleteFileOnCleanup(id); + } } diff --git a/drive/snippets/drive_v3/src/test/java/TestDownloadFile.java b/drive/snippets/drive_v3/src/test/java/TestDownloadFile.java index ce285417..526dea94 100644 --- a/drive/snippets/drive_v3/src/test/java/TestDownloadFile.java +++ b/drive/snippets/drive_v3/src/test/java/TestDownloadFile.java @@ -14,21 +14,20 @@ * limitations under the License. */ -import org.junit.Test; +import static org.junit.Assert.assertEquals; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.security.GeneralSecurityException; +import org.junit.Test; -import static org.junit.Assert.assertEquals; - -public class TestDownloadFile extends BaseTest{ - @Test - public void downloadFile() throws IOException, GeneralSecurityException { - String id = createTestBlob(); - ByteArrayOutputStream out = DownloadFile.downloadFile(id); - byte[] bytes = out.toByteArray(); - assertEquals((byte) 0xFF, bytes[0]); - assertEquals((byte) 0xD8, bytes[1]); - } +public class TestDownloadFile extends BaseTest { + @Test + public void downloadFile() throws IOException, GeneralSecurityException { + String id = createTestBlob(); + ByteArrayOutputStream out = DownloadFile.downloadFile(id); + byte[] bytes = out.toByteArray(); + assertEquals((byte) 0xFF, bytes[0]); + assertEquals((byte) 0xD8, bytes[1]); + } } diff --git a/drive/snippets/drive_v3/src/test/java/TestExportPdf.java b/drive/snippets/drive_v3/src/test/java/TestExportPdf.java index fc6deabb..16ede7b4 100644 --- a/drive/snippets/drive_v3/src/test/java/TestExportPdf.java +++ b/drive/snippets/drive_v3/src/test/java/TestExportPdf.java @@ -14,19 +14,18 @@ * limitations under the License. */ -import org.junit.Test; +import static org.junit.Assert.assertEquals; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.security.GeneralSecurityException; +import org.junit.Test; -import static org.junit.Assert.assertEquals; - -public class TestExportPdf extends BaseTest{ - @Test - public void exportPdf() throws IOException, GeneralSecurityException { - String id = createTestDocument(); - ByteArrayOutputStream out = ExportPdf.exportPdf(id); - assertEquals("%PDF", out.toString("UTF-8").substring(0, 4)); - } +public class TestExportPdf extends BaseTest { + @Test + public void exportPdf() throws IOException, GeneralSecurityException { + String id = createTestDocument(); + ByteArrayOutputStream out = ExportPdf.exportPdf(id); + assertEquals("%PDF", out.toString("UTF-8").substring(0, 4)); + } } diff --git a/drive/snippets/drive_v3/src/test/java/TestFetchAppDataFolder.java b/drive/snippets/drive_v3/src/test/java/TestFetchAppDataFolder.java index 95c69b6c..791e0480 100644 --- a/drive/snippets/drive_v3/src/test/java/TestFetchAppDataFolder.java +++ b/drive/snippets/drive_v3/src/test/java/TestFetchAppDataFolder.java @@ -14,17 +14,16 @@ * limitations under the License. */ -import org.junit.Test; +import static org.junit.Assert.assertNotNull; import java.io.IOException; import java.security.GeneralSecurityException; - -import static org.junit.Assert.assertNotNull; +import org.junit.Test; public class TestFetchAppDataFolder { - @Test - public void fetchAppDataFolder() throws IOException, GeneralSecurityException { - String id = FetchAppDataFolder.fetchAppDataFolder(); - assertNotNull(id); - } + @Test + public void fetchAppDataFolder() throws IOException, GeneralSecurityException { + String id = FetchAppDataFolder.fetchAppDataFolder(); + assertNotNull(id); + } } diff --git a/drive/snippets/drive_v3/src/test/java/TestFetchChanges.java b/drive/snippets/drive_v3/src/test/java/TestFetchChanges.java index 7df7821a..aed15304 100644 --- a/drive/snippets/drive_v3/src/test/java/TestFetchChanges.java +++ b/drive/snippets/drive_v3/src/test/java/TestFetchChanges.java @@ -12,21 +12,20 @@ // See the License for the specific language governing permissions and // limitations under the License. -import org.junit.Test; - -import java.io.IOException; - import static org.junit.Assert.assertNotEquals; import static org.junit.Assert.assertNotNull; +import java.io.IOException; +import org.junit.Test; + // Unit test class for fetchChanges change snippet -public class TestFetchChanges extends BaseTest{ - @Test - public void fetchChanges() throws IOException { - String startPageToken = FetchStartPageToken.fetchStartPageToken(); - this.createTestBlob(); - String newStartPageToken = FetchChanges.fetchChanges(startPageToken); - assertNotNull(newStartPageToken); - assertNotEquals(startPageToken, newStartPageToken); - } +public class TestFetchChanges extends BaseTest { + @Test + public void fetchChanges() throws IOException { + String startPageToken = FetchStartPageToken.fetchStartPageToken(); + this.createTestBlob(); + String newStartPageToken = FetchChanges.fetchChanges(startPageToken); + assertNotNull(newStartPageToken); + assertNotEquals(startPageToken, newStartPageToken); + } } diff --git a/drive/snippets/drive_v3/src/test/java/TestFetchStartPageToken.java b/drive/snippets/drive_v3/src/test/java/TestFetchStartPageToken.java index fd4be2ad..1d334a1e 100644 --- a/drive/snippets/drive_v3/src/test/java/TestFetchStartPageToken.java +++ b/drive/snippets/drive_v3/src/test/java/TestFetchStartPageToken.java @@ -12,17 +12,16 @@ // See the License for the specific language governing permissions and // limitations under the License. -import org.junit.Test; +import static org.junit.Assert.assertNotNull; import java.io.IOException; - -import static org.junit.Assert.assertNotNull; +import org.junit.Test; // Unit test class for fetchStartPageToken change snippet -public class TestFetchStartPageToken extends BaseTest{ - @Test - public void fetchStartPageToken() throws IOException { - String token = FetchStartPageToken.fetchStartPageToken(); - assertNotNull(token); - } +public class TestFetchStartPageToken extends BaseTest { + @Test + public void fetchStartPageToken() throws IOException { + String token = FetchStartPageToken.fetchStartPageToken(); + assertNotNull(token); + } } diff --git a/drive/snippets/drive_v3/src/test/java/TestListAppData.java b/drive/snippets/drive_v3/src/test/java/TestListAppData.java index fe67a1f2..c747f7ee 100644 --- a/drive/snippets/drive_v3/src/test/java/TestListAppData.java +++ b/drive/snippets/drive_v3/src/test/java/TestListAppData.java @@ -14,20 +14,19 @@ * limitations under the License. */ -import com.google.api.services.drive.model.FileList; -import org.junit.Test; +import static org.junit.Assert.assertNotEquals; +import com.google.api.services.drive.model.FileList; import java.io.IOException; import java.security.GeneralSecurityException; +import org.junit.Test; -import static org.junit.Assert.assertNotEquals; - -public class TestListAppData extends BaseTest{ - @Test - public void listAppData() throws IOException, GeneralSecurityException { - String id = UploadAppData.uploadAppData(); - deleteFileOnCleanup(id); - FileList files = ListAppData.listAppData(); - assertNotEquals(0, files.getFiles().size()); - } +public class TestListAppData extends BaseTest { + @Test + public void listAppData() throws IOException, GeneralSecurityException { + String id = UploadAppData.uploadAppData(); + deleteFileOnCleanup(id); + FileList files = ListAppData.listAppData(); + assertNotEquals(0, files.getFiles().size()); + } } diff --git a/drive/snippets/drive_v3/src/test/java/TestMoveFileToFolder.java b/drive/snippets/drive_v3/src/test/java/TestMoveFileToFolder.java index 7e4b2b8d..2c5aa74c 100644 --- a/drive/snippets/drive_v3/src/test/java/TestMoveFileToFolder.java +++ b/drive/snippets/drive_v3/src/test/java/TestMoveFileToFolder.java @@ -14,25 +14,23 @@ * limitations under the License. */ -import org.junit.Test; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; -import javax.annotation.CheckReturnValue; import java.io.IOException; import java.security.GeneralSecurityException; import java.util.List; +import org.junit.Test; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertTrue; - -public class TestMoveFileToFolder extends BaseTest{ - @Test - public void moveFileToFolder() - throws IOException, GeneralSecurityException { - String folderId = CreateFolder.createFolder(); - deleteFileOnCleanup(folderId); - String fileId = this.createTestBlob(); - List parents = MoveFileToFolder.moveFileToFolder(fileId, folderId); - assertTrue(parents.contains(folderId)); - assertEquals(1, parents.size()); - } +public class TestMoveFileToFolder extends BaseTest { + @Test + public void moveFileToFolder() + throws IOException, GeneralSecurityException { + String folderId = CreateFolder.createFolder(); + deleteFileOnCleanup(folderId); + String fileId = this.createTestBlob(); + List parents = MoveFileToFolder.moveFileToFolder(fileId, folderId); + assertTrue(parents.contains(folderId)); + assertEquals(1, parents.size()); + } } diff --git a/drive/snippets/drive_v3/src/test/java/TestRecoverDrives.java b/drive/snippets/drive_v3/src/test/java/TestRecoverDrives.java index a638f0e6..28e92433 100644 --- a/drive/snippets/drive_v3/src/test/java/TestRecoverDrives.java +++ b/drive/snippets/drive_v3/src/test/java/TestRecoverDrives.java @@ -12,37 +12,36 @@ // See the License for the specific language governing permissions and // limitations under the License. +import static org.junit.Assert.assertNotEquals; + import com.google.api.services.drive.model.Drive; import com.google.api.services.drive.model.Permission; import com.google.api.services.drive.model.PermissionList; -import org.junit.Test; - import java.io.IOException; import java.util.List; - -import static org.junit.Assert.assertNotEquals; +import org.junit.Test; // Unit test class for recover-drives Drive snippet -public class TestRecoverDrives extends BaseTest{ - @Test - public void recoverDrives() throws IOException { - String id = this.createOrphanedDrive(); - List results = RecoverDrive.recoverDrives( - "sbazyl@test.appsdevtesting.com"); - assertNotEquals(0, results.size()); - this.service.drives().delete(id).execute(); - } +public class TestRecoverDrives extends BaseTest { + @Test + public void recoverDrives() throws IOException { + String id = this.createOrphanedDrive(); + List results = RecoverDrive.recoverDrives( + "sbazyl@test.appsdevtesting.com"); + assertNotEquals(0, results.size()); + this.service.drives().delete(id).execute(); + } - private String createOrphanedDrive() throws IOException { - String driveId = CreateDrive.createDrive(); - PermissionList response = this.service.permissions().list(driveId) - .setSupportsAllDrives(true) - .execute(); - for (Permission permission : response.getPermissions()) { - this.service.permissions().delete(driveId, permission.getId()) - .setSupportsAllDrives(true) - .execute(); - } - return driveId; + private String createOrphanedDrive() throws IOException { + String driveId = CreateDrive.createDrive(); + PermissionList response = this.service.permissions().list(driveId) + .setSupportsAllDrives(true) + .execute(); + for (Permission permission : response.getPermissions()) { + this.service.permissions().delete(driveId, permission.getId()) + .setSupportsAllDrives(true) + .execute(); } + return driveId; + } } diff --git a/drive/snippets/drive_v3/src/test/java/TestSearchFiles.java b/drive/snippets/drive_v3/src/test/java/TestSearchFiles.java index 6772cb40..280c6b9c 100644 --- a/drive/snippets/drive_v3/src/test/java/TestSearchFiles.java +++ b/drive/snippets/drive_v3/src/test/java/TestSearchFiles.java @@ -14,21 +14,20 @@ * limitations under the License. */ -import com.google.api.services.drive.model.File; -import org.junit.Test; +import static org.junit.Assert.assertNotEquals; +import com.google.api.services.drive.model.File; import java.io.IOException; import java.security.GeneralSecurityException; import java.util.List; +import org.junit.Test; -import static org.junit.Assert.assertNotEquals; - -public class TestSearchFiles extends BaseTest{ - @Test - public void searchFiles() - throws IOException, GeneralSecurityException { - this.createTestBlob(); - List files = SearchFile.searchFile(); - assertNotEquals(0, files.size()); - } +public class TestSearchFiles extends BaseTest { + @Test + public void searchFiles() + throws IOException, GeneralSecurityException { + this.createTestBlob(); + List files = SearchFile.searchFile(); + assertNotEquals(0, files.size()); + } } diff --git a/drive/snippets/drive_v3/src/test/java/TestShareFile.java b/drive/snippets/drive_v3/src/test/java/TestShareFile.java index c47ec72c..167a7ec7 100644 --- a/drive/snippets/drive_v3/src/test/java/TestShareFile.java +++ b/drive/snippets/drive_v3/src/test/java/TestShareFile.java @@ -14,20 +14,19 @@ * limitations under the License. */ -import org.junit.Test; +import static org.junit.Assert.assertEquals; import java.io.IOException; import java.util.List; +import org.junit.Test; -import static org.junit.Assert.assertEquals; - -public class TestShareFile extends BaseTest{ - @Test - public void shareFile() throws IOException { - String fileId = this.createTestBlob(); - List ids = ShareFile.shareFile(fileId, - "user@test.appsdevtesting.com", - "test.appsdevtesting.com"); - assertEquals(2, ids.size()); - } +public class TestShareFile extends BaseTest { + @Test + public void shareFile() throws IOException { + String fileId = this.createTestBlob(); + List ids = ShareFile.shareFile(fileId, + "user@test.appsdevtesting.com", + "test.appsdevtesting.com"); + assertEquals(2, ids.size()); + } } diff --git a/drive/snippets/drive_v3/src/test/java/TestTouchFile.java b/drive/snippets/drive_v3/src/test/java/TestTouchFile.java index aecfabf4..9d7d80b8 100644 --- a/drive/snippets/drive_v3/src/test/java/TestTouchFile.java +++ b/drive/snippets/drive_v3/src/test/java/TestTouchFile.java @@ -14,19 +14,18 @@ * limitations under the License. */ -import org.junit.Test; +import static org.junit.Assert.assertEquals; import java.io.IOException; import java.security.GeneralSecurityException; +import org.junit.Test; -import static org.junit.Assert.assertEquals; - -public class TestTouchFile extends BaseTest{ - @Test - public void touchFile() throws IOException, GeneralSecurityException { - String id = this.createTestBlob(); - long now = System.currentTimeMillis(); - long modifiedTime = TouchFile.touchFile(id, now); - assertEquals(now, modifiedTime); - } +public class TestTouchFile extends BaseTest { + @Test + public void touchFile() throws IOException, GeneralSecurityException { + String id = this.createTestBlob(); + long now = System.currentTimeMillis(); + long modifiedTime = TouchFile.touchFile(id, now); + assertEquals(now, modifiedTime); + } } diff --git a/drive/snippets/drive_v3/src/test/java/TestUploadAppdata.java b/drive/snippets/drive_v3/src/test/java/TestUploadAppdata.java index a8dbd5be..69608a87 100644 --- a/drive/snippets/drive_v3/src/test/java/TestUploadAppdata.java +++ b/drive/snippets/drive_v3/src/test/java/TestUploadAppdata.java @@ -14,19 +14,18 @@ * limitations under the License. */ -import org.junit.Test; +import static org.junit.Assert.assertNotNull; import java.io.IOException; import java.security.GeneralSecurityException; +import org.junit.Test; -import static org.junit.Assert.assertNotNull; - -public class TestUploadAppdata extends BaseTest{ - @Test - public void uploadAppData() - throws IOException, GeneralSecurityException { - String id = UploadAppData.uploadAppData(); - assertNotNull(id); - deleteFileOnCleanup(id); - } +public class TestUploadAppdata extends BaseTest { + @Test + public void uploadAppData() + throws IOException, GeneralSecurityException { + String id = UploadAppData.uploadAppData(); + assertNotNull(id); + deleteFileOnCleanup(id); + } } diff --git a/drive/snippets/drive_v3/src/test/java/TestUploadBasic.java b/drive/snippets/drive_v3/src/test/java/TestUploadBasic.java index b33b7866..fa53f4ff 100644 --- a/drive/snippets/drive_v3/src/test/java/TestUploadBasic.java +++ b/drive/snippets/drive_v3/src/test/java/TestUploadBasic.java @@ -14,18 +14,17 @@ * limitations under the License. */ -import org.junit.Test; +import static org.junit.Assert.assertNotNull; import java.io.IOException; import java.security.GeneralSecurityException; +import org.junit.Test; -import static org.junit.Assert.assertNotNull; - -public class TestUploadBasic extends BaseTest{ - @Test - public void uploadBasic() throws IOException, GeneralSecurityException { - String id = UploadBasic.uploadBasic(); - assertNotNull(id); - deleteFileOnCleanup(id); - } +public class TestUploadBasic extends BaseTest { + @Test + public void uploadBasic() throws IOException, GeneralSecurityException { + String id = UploadBasic.uploadBasic(); + assertNotNull(id); + deleteFileOnCleanup(id); + } } diff --git a/drive/snippets/drive_v3/src/test/java/TestUploadRevision.java b/drive/snippets/drive_v3/src/test/java/TestUploadRevision.java index de932e4f..ea7e7eea 100644 --- a/drive/snippets/drive_v3/src/test/java/TestUploadRevision.java +++ b/drive/snippets/drive_v3/src/test/java/TestUploadRevision.java @@ -14,21 +14,20 @@ * limitations under the License. */ -import org.junit.Test; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; import java.io.IOException; import java.security.GeneralSecurityException; +import org.junit.Test; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; - -public class TestUploadRevision extends BaseTest{ - @Test - public void uploadRevision() throws IOException, GeneralSecurityException { - String id = UploadBasic.uploadBasic(); - assertNotNull(id); - deleteFileOnCleanup(id); - String id2 = UploadRevision.uploadRevision(id); - assertEquals(id, id2); - } +public class TestUploadRevision extends BaseTest { + @Test + public void uploadRevision() throws IOException, GeneralSecurityException { + String id = UploadBasic.uploadBasic(); + assertNotNull(id); + deleteFileOnCleanup(id); + String id2 = UploadRevision.uploadRevision(id); + assertEquals(id, id2); + } } diff --git a/drive/snippets/drive_v3/src/test/java/TestUploadToFolder.java b/drive/snippets/drive_v3/src/test/java/TestUploadToFolder.java index c328994e..feee6a6a 100644 --- a/drive/snippets/drive_v3/src/test/java/TestUploadToFolder.java +++ b/drive/snippets/drive_v3/src/test/java/TestUploadToFolder.java @@ -14,21 +14,20 @@ * limitations under the License. */ -import com.google.api.services.drive.model.File; -import org.junit.Test; +import static org.junit.Assert.assertTrue; +import com.google.api.services.drive.model.File; import java.io.IOException; import java.security.GeneralSecurityException; +import org.junit.Test; -import static org.junit.Assert.assertTrue; - -public class TestUploadToFolder extends BaseTest{ - @Test - public void uploadToFolder() throws IOException, GeneralSecurityException { - String folderId = CreateFolder.createFolder(); - File file = UploadToFolder.uploadToFolder(folderId); - assertTrue(file.getParents().contains(folderId)); - deleteFileOnCleanup(file.getId()); - deleteFileOnCleanup(folderId); - } +public class TestUploadToFolder extends BaseTest { + @Test + public void uploadToFolder() throws IOException, GeneralSecurityException { + String folderId = CreateFolder.createFolder(); + File file = UploadToFolder.uploadToFolder(folderId); + assertTrue(file.getParents().contains(folderId)); + deleteFileOnCleanup(file.getId()); + deleteFileOnCleanup(folderId); + } } diff --git a/drive/snippets/drive_v3/src/test/java/TestUploadWithConversion.java b/drive/snippets/drive_v3/src/test/java/TestUploadWithConversion.java index ae3a889c..11b5f2f9 100644 --- a/drive/snippets/drive_v3/src/test/java/TestUploadWithConversion.java +++ b/drive/snippets/drive_v3/src/test/java/TestUploadWithConversion.java @@ -14,19 +14,18 @@ * limitations under the License. */ -import org.junit.Test; +import static org.junit.Assert.assertNotNull; import java.io.IOException; import java.security.GeneralSecurityException; +import org.junit.Test; -import static org.junit.Assert.assertNotNull; - -public class TestUploadWithConversion extends BaseTest{ - @Test - public void uploadWithConversion() - throws IOException, GeneralSecurityException { - String id = UploadWithConversion.uploadWithConversion(); - assertNotNull(id); - deleteFileOnCleanup(id); - } +public class TestUploadWithConversion extends BaseTest { + @Test + public void uploadWithConversion() + throws IOException, GeneralSecurityException { + String id = UploadWithConversion.uploadWithConversion(); + assertNotNull(id); + deleteFileOnCleanup(id); + } } diff --git a/gmail/quickstart/src/main/java/GmailQuickstart.java b/gmail/quickstart/src/main/java/GmailQuickstart.java index 650ba0b7..56ebd1dd 100644 --- a/gmail/quickstart/src/main/java/GmailQuickstart.java +++ b/gmail/quickstart/src/main/java/GmailQuickstart.java @@ -13,6 +13,7 @@ // limitations under the License. // [START gmail_quickstart] + import com.google.api.client.auth.oauth2.Credential; import com.google.api.client.extensions.java6.auth.oauth2.AuthorizationCodeInstalledApp; import com.google.api.client.extensions.jetty.auth.oauth2.LocalServerReceiver; @@ -27,7 +28,6 @@ import com.google.api.services.gmail.GmailScopes; import com.google.api.services.gmail.model.Label; import com.google.api.services.gmail.model.ListLabelsResponse; - import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; @@ -38,65 +38,74 @@ /* class to demonstrate use of Gmail list labels API */ public class GmailQuickstart { - /** Application name. */ - private static final String APPLICATION_NAME = "Gmail API Java Quickstart"; - /** Global instance of the JSON factory. */ - private static final JsonFactory JSON_FACTORY = GsonFactory.getDefaultInstance(); - /** Directory to store authorization tokens for this application. */ - private static final String TOKENS_DIRECTORY_PATH = "tokens"; + /** + * Application name. + */ + private static final String APPLICATION_NAME = "Gmail API Java Quickstart"; + /** + * Global instance of the JSON factory. + */ + private static final JsonFactory JSON_FACTORY = GsonFactory.getDefaultInstance(); + /** + * Directory to store authorization tokens for this application. + */ + private static final String TOKENS_DIRECTORY_PATH = "tokens"; - /** - * Global instance of the scopes required by this quickstart. - * If modifying these scopes, delete your previously saved tokens/ folder. - */ - private static final List SCOPES = Collections.singletonList(GmailScopes.GMAIL_LABELS); - private static final String CREDENTIALS_FILE_PATH = "/credentials.json"; + /** + * Global instance of the scopes required by this quickstart. + * If modifying these scopes, delete your previously saved tokens/ folder. + */ + private static final List SCOPES = Collections.singletonList(GmailScopes.GMAIL_LABELS); + private static final String CREDENTIALS_FILE_PATH = "/credentials.json"; - /** - * Creates an authorized Credential object. - * @param HTTP_TRANSPORT The network HTTP Transport. - * @return An authorized Credential object. - * @throws IOException If the credentials.json file cannot be found. - */ - private static Credential getCredentials(final NetHttpTransport HTTP_TRANSPORT) throws IOException { - // Load client secrets. - InputStream in = GmailQuickstart.class.getResourceAsStream(CREDENTIALS_FILE_PATH); - if (in == null) { - throw new FileNotFoundException("Resource not found: " + CREDENTIALS_FILE_PATH); - } - GoogleClientSecrets clientSecrets = GoogleClientSecrets.load(JSON_FACTORY, new InputStreamReader(in)); - - // Build flow and trigger user authorization request. - GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow.Builder( - HTTP_TRANSPORT, JSON_FACTORY, clientSecrets, SCOPES) - .setDataStoreFactory(new FileDataStoreFactory(new java.io.File(TOKENS_DIRECTORY_PATH))) - .setAccessType("offline") - .build(); - LocalServerReceiver receiver = new LocalServerReceiver.Builder().setPort(8888).build(); - Credential credential = new AuthorizationCodeInstalledApp(flow, receiver).authorize("user"); - //returns an authorized Credential object. - return credential; + /** + * Creates an authorized Credential object. + * + * @param HTTP_TRANSPORT The network HTTP Transport. + * @return An authorized Credential object. + * @throws IOException If the credentials.json file cannot be found. + */ + private static Credential getCredentials(final NetHttpTransport HTTP_TRANSPORT) + throws IOException { + // Load client secrets. + InputStream in = GmailQuickstart.class.getResourceAsStream(CREDENTIALS_FILE_PATH); + if (in == null) { + throw new FileNotFoundException("Resource not found: " + CREDENTIALS_FILE_PATH); } + GoogleClientSecrets clientSecrets = + GoogleClientSecrets.load(JSON_FACTORY, new InputStreamReader(in)); + + // Build flow and trigger user authorization request. + GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow.Builder( + HTTP_TRANSPORT, JSON_FACTORY, clientSecrets, SCOPES) + .setDataStoreFactory(new FileDataStoreFactory(new java.io.File(TOKENS_DIRECTORY_PATH))) + .setAccessType("offline") + .build(); + LocalServerReceiver receiver = new LocalServerReceiver.Builder().setPort(8888).build(); + Credential credential = new AuthorizationCodeInstalledApp(flow, receiver).authorize("user"); + //returns an authorized Credential object. + return credential; + } - public static void main(String... args) throws IOException, GeneralSecurityException { - // Build a new authorized API client service. - final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport(); - Gmail service = new Gmail.Builder(HTTP_TRANSPORT, JSON_FACTORY, getCredentials(HTTP_TRANSPORT)) - .setApplicationName(APPLICATION_NAME) - .build(); + public static void main(String... args) throws IOException, GeneralSecurityException { + // Build a new authorized API client service. + final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport(); + Gmail service = new Gmail.Builder(HTTP_TRANSPORT, JSON_FACTORY, getCredentials(HTTP_TRANSPORT)) + .setApplicationName(APPLICATION_NAME) + .build(); - // Print the labels in the user's account. - String user = "me"; - ListLabelsResponse listResponse = service.users().labels().list(user).execute(); - List

Each row of the CSV file should contain a user ID, path to the certificate, and the - * certificate password. - * - * @param csvFilename Name of the CSV file. - */ - public static void insertCertFromCsv(String csvFilename) { - try { - File csvFile = new File(csvFilename); - CSVParser parser = - CSVParser.parse(csvFile, java.nio.charset.StandardCharsets.UTF_8, CSVFormat.DEFAULT); - for (CSVRecord record : parser) { - String userId = record.get(0); - String certFilename = record.get(1); - String certPassword = record.get(2); - SmimeInfo smimeInfo = CreateSmimeInfo.createSmimeInfo(certFilename, - certPassword); - if (smimeInfo != null) { - InsertSmimeInfo.insertSmimeInfo(userId, - userId, - smimeInfo); - } else { - System.err.printf("Unable to read certificate file for userId: %s\n", userId); - } - } - } catch (Exception e) { - System.err.printf("An error occured while reading the CSV file: %s", e); + /** + * Upload S/MIME certificates based on the contents of a CSV file. + * + *

Each row of the CSV file should contain a user ID, path to the certificate, and the + * certificate password. + * + * @param csvFilename Name of the CSV file. + */ + public static void insertCertFromCsv(String csvFilename) { + try { + File csvFile = new File(csvFilename); + CSVParser parser = + CSVParser.parse(csvFile, java.nio.charset.StandardCharsets.UTF_8, CSVFormat.DEFAULT); + for (CSVRecord record : parser) { + String userId = record.get(0); + String certFilename = record.get(1); + String certPassword = record.get(2); + SmimeInfo smimeInfo = CreateSmimeInfo.createSmimeInfo(certFilename, + certPassword); + if (smimeInfo != null) { + InsertSmimeInfo.insertSmimeInfo(userId, + userId, + smimeInfo); + } else { + System.err.printf("Unable to read certificate file for userId: %s\n", userId); } + } + } catch (Exception e) { + System.err.printf("An error occured while reading the CSV file: %s", e); } + } } // [END gmail_insert_cert_from_csv] \ No newline at end of file diff --git a/gmail/snippets/src/main/java/InsertSmimeInfo.java b/gmail/snippets/src/main/java/InsertSmimeInfo.java index e686126d..25af7f83 100644 --- a/gmail/snippets/src/main/java/InsertSmimeInfo.java +++ b/gmail/snippets/src/main/java/InsertSmimeInfo.java @@ -14,8 +14,7 @@ // [START gmail_insert_smime_info] -import com.google.api.client.googleapis.json.GoogleJsonError; -import com.google.api.client.googleapis.json.GoogleJsonResponseException; + import com.google.api.client.http.HttpRequestInitializer; import com.google.api.client.http.javanet.NetHttpTransport; import com.google.api.client.json.gson.GsonFactory; @@ -24,54 +23,52 @@ import com.google.api.services.gmail.model.SmimeInfo; import com.google.auth.http.HttpCredentialsAdapter; import com.google.auth.oauth2.GoogleCredentials; - import java.io.IOException; -import java.util.Collections; /* Class to demonstrate the use of Gmail Insert Smime Certificate API*/ public class InsertSmimeInfo { - /** - * Upload an S/MIME certificate for the user. - * - * @param userId User's email address. - * @param sendAsEmail The "send as" email address, or null if it should be the same as userId. - * @param smimeInfo The SmimeInfo object containing the user's S/MIME certificate. - * @return An SmimeInfo object with details about the uploaded certificate, {@code null} otherwise. - * @throws IOException - if service account credentials file not found. - */ - public static SmimeInfo insertSmimeInfo(String userId, - String sendAsEmail, - SmimeInfo smimeInfo) - throws IOException { + /** + * Upload an S/MIME certificate for the user. + * + * @param userId User's email address. + * @param sendAsEmail The "send as" email address, or null if it should be the same as userId. + * @param smimeInfo The SmimeInfo object containing the user's S/MIME certificate. + * @return An SmimeInfo object with details about the uploaded certificate, {@code null} otherwise. + * @throws IOException - if service account credentials file not found. + */ + public static SmimeInfo insertSmimeInfo(String userId, + String sendAsEmail, + SmimeInfo smimeInfo) + throws IOException { /* Load pre-authorized user credentials from the environment. TODO(developer) - See https://developers.google.com/identity for guides on implementing OAuth2 for your application. */ - GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() - .createScoped(GmailScopes.GMAIL_SETTINGS_SHARING); - HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( - credentials); + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(GmailScopes.GMAIL_SETTINGS_SHARING); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); - // Create the gmail API client - Gmail service = new Gmail.Builder(new NetHttpTransport(), - GsonFactory.getDefaultInstance(), - requestInitializer) - .setApplicationName("Gmail samples") - .build(); + // Create the gmail API client + Gmail service = new Gmail.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Gmail samples") + .build(); - if (sendAsEmail == null) { - sendAsEmail = userId; - } + if (sendAsEmail == null) { + sendAsEmail = userId; + } - try { - SmimeInfo results = service.users().settings().sendAs().smimeInfo() - .insert(userId, sendAsEmail, smimeInfo) - .execute(); - System.out.printf("Inserted certificate, id: %s\n", results.getId()); - return results; - } catch (IOException e) { - System.err.printf("An error occured: %s", e); - } - return null; + try { + SmimeInfo results = service.users().settings().sendAs().smimeInfo() + .insert(userId, sendAsEmail, smimeInfo) + .execute(); + System.out.printf("Inserted certificate, id: %s\n", results.getId()); + return results; + } catch (IOException e) { + System.err.printf("An error occured: %s", e); } + return null; + } } // [END gmail_insert_smime_info] \ No newline at end of file diff --git a/gmail/snippets/src/main/java/SendEmail.java b/gmail/snippets/src/main/java/SendEmail.java deleted file mode 100644 index 9b671f32..00000000 --- a/gmail/snippets/src/main/java/SendEmail.java +++ /dev/null @@ -1,199 +0,0 @@ -/* - * Copyright 2022 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import com.google.api.services.gmail.Gmail; -import com.google.api.services.gmail.model.Draft; -import com.google.api.services.gmail.model.Message; -import org.apache.commons.codec.binary.Base64; - -import java.io.ByteArrayOutputStream; -import java.io.File; -import java.io.IOException; -import java.util.Properties; - -import javax.activation.DataHandler; -import javax.activation.DataSource; -import javax.activation.FileDataSource; -import javax.mail.MessagingException; -import javax.mail.Multipart; -import javax.mail.Session; -import javax.mail.internet.InternetAddress; -import javax.mail.internet.MimeBodyPart; -import javax.mail.internet.MimeMessage; -import javax.mail.internet.MimeMultipart; - -// ... - -public class SendEmail { - - // ... - - // [START create_draft] - /** - * Create draft email. - * - * @param service an authorized Gmail API instance - * @param userId user's email address. The special value "me" - * can be used to indicate the authenticated user - * @param emailContent the MimeMessage used as email within the draft - * @return the created draft - * @throws MessagingException - * @throws IOException - */ - public static Draft createDraft(Gmail service, - String userId, - MimeMessage emailContent) - throws MessagingException, IOException { - Message message = createMessageWithEmail(emailContent); - Draft draft = new Draft(); - draft.setMessage(message); - draft = service.users().drafts().create(userId, draft).execute(); - - System.out.println("Draft id: " + draft.getId()); - System.out.println(draft.toPrettyString()); - return draft; - } - // [END create_draft] - - - // [START send_email] - /** - * Send an email from the user's mailbox to its recipient. - * - * @param service Authorized Gmail API instance. - * @param userId User's email address. The special value "me" - * can be used to indicate the authenticated user. - * @param emailContent Email to be sent. - * @return The sent message - * @throws MessagingException - * @throws IOException - */ - public static Message sendMessage(Gmail service, - String userId, - MimeMessage emailContent) - throws MessagingException, IOException { - Message message = createMessageWithEmail(emailContent); - message = service.users().messages().send(userId, message).execute(); - - System.out.println("Message id: " + message.getId()); - System.out.println(message.toPrettyString()); - return message; - } - // [END send_email] - - - // [START create_message] - /** - * Create a message from an email. - * - * @param emailContent Email to be set to raw of message - * @return a message containing a base64url encoded email - * @throws IOException - * @throws MessagingException - */ - public static Message createMessageWithEmail(MimeMessage emailContent) - throws MessagingException, IOException { - ByteArrayOutputStream buffer = new ByteArrayOutputStream(); - emailContent.writeTo(buffer); - byte[] bytes = buffer.toByteArray(); - String encodedEmail = Base64.encodeBase64URLSafeString(bytes); - Message message = new Message(); - message.setRaw(encodedEmail); - return message; - } - // [END create_message] - - // [START create_email] - /** - * Create a MimeMessage using the parameters provided. - * - * @param to email address of the receiver - * @param from email address of the sender, the mailbox account - * @param subject subject of the email - * @param bodyText body text of the email - * @return the MimeMessage to be used to send email - * @throws MessagingException - */ - public static MimeMessage createEmail(String to, - String from, - String subject, - String bodyText) - throws MessagingException { - Properties props = new Properties(); - Session session = Session.getDefaultInstance(props, null); - - MimeMessage email = new MimeMessage(session); - - email.setFrom(new InternetAddress(from)); - email.addRecipient(javax.mail.Message.RecipientType.TO, - new InternetAddress(to)); - email.setSubject(subject); - email.setText(bodyText); - return email; - } - // [END create_email] - - - // [START create_email_attachment] - /** - * Create a MimeMessage using the parameters provided. - * - * @param to Email address of the receiver. - * @param from Email address of the sender, the mailbox account. - * @param subject Subject of the email. - * @param bodyText Body text of the email. - * @param file Path to the file to be attached. - * @return MimeMessage to be used to send email. - * @throws MessagingException - */ - public static MimeMessage createEmailWithAttachment(String to, - String from, - String subject, - String bodyText, - File file) - throws MessagingException, IOException { - Properties props = new Properties(); - Session session = Session.getDefaultInstance(props, null); - - MimeMessage email = new MimeMessage(session); - - email.setFrom(new InternetAddress(from)); - email.addRecipient(javax.mail.Message.RecipientType.TO, - new InternetAddress(to)); - email.setSubject(subject); - - MimeBodyPart mimeBodyPart = new MimeBodyPart(); - mimeBodyPart.setContent(bodyText, "text/plain"); - - Multipart multipart = new MimeMultipart(); - multipart.addBodyPart(mimeBodyPart); - - mimeBodyPart = new MimeBodyPart(); - DataSource source = new FileDataSource(file); - - mimeBodyPart.setDataHandler(new DataHandler(source)); - mimeBodyPart.setFileName(file.getName()); - - multipart.addBodyPart(mimeBodyPart); - email.setContent(multipart); - - return email; - } - // [END create_email_attachment] - - // ... - -} diff --git a/gmail/snippets/src/main/java/SendMessage.java b/gmail/snippets/src/main/java/SendMessage.java index 9e0ec4b7..de989866 100644 --- a/gmail/snippets/src/main/java/SendMessage.java +++ b/gmail/snippets/src/main/java/SendMessage.java @@ -14,94 +14,92 @@ // [START gmail_send_message] + import com.google.api.client.googleapis.json.GoogleJsonError; import com.google.api.client.googleapis.json.GoogleJsonResponseException; import com.google.api.client.http.HttpRequestInitializer; import com.google.api.client.http.javanet.NetHttpTransport; import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.gmail.Gmail; import com.google.api.services.gmail.GmailScopes; +import com.google.api.services.gmail.model.Message; import com.google.auth.http.HttpCredentialsAdapter; import com.google.auth.oauth2.GoogleCredentials; -import org.apache.commons.codec.binary.Base64; -import com.google.api.services.gmail.Gmail; -import com.google.api.services.gmail.model.Message; - import java.io.ByteArrayOutputStream; import java.io.IOException; -import java.util.Collections; import java.util.Properties; - import javax.mail.MessagingException; import javax.mail.Session; import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeMessage; +import org.apache.commons.codec.binary.Base64; /* Class to demonstrate the use of Gmail Send Message API */ public class SendMessage { - /** - * Send an email from the user's mailbox to its recipient. - * - * @param fromEmailAddress - Email address to appear in the from: header - * @param toEmailAddress - Email address of the recipient - * @return the sent message, {@code null} otherwise. - * @throws MessagingException - if a wrongly formatted address is encountered. - * @throws IOException - if service account credentials file not found. - */ - public static Message sendEmail(String fromEmailAddress, - String toEmailAddress) - throws MessagingException, IOException { + /** + * Send an email from the user's mailbox to its recipient. + * + * @param fromEmailAddress - Email address to appear in the from: header + * @param toEmailAddress - Email address of the recipient + * @return the sent message, {@code null} otherwise. + * @throws MessagingException - if a wrongly formatted address is encountered. + * @throws IOException - if service account credentials file not found. + */ + public static Message sendEmail(String fromEmailAddress, + String toEmailAddress) + throws MessagingException, IOException { /* Load pre-authorized user credentials from the environment. TODO(developer) - See https://developers.google.com/identity for guides on implementing OAuth2 for your application.*/ - GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() - .createScoped(GmailScopes.GMAIL_SEND); - HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter(credentials); + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(GmailScopes.GMAIL_SEND); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter(credentials); - // Create the gmail API client - Gmail service = new Gmail.Builder(new NetHttpTransport(), - GsonFactory.getDefaultInstance(), - requestInitializer) - .setApplicationName("Gmail samples") - .build(); + // Create the gmail API client + Gmail service = new Gmail.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Gmail samples") + .build(); - // Create the email content - String messageSubject = "Test message"; - String bodyText = "lorem ipsum."; + // Create the email content + String messageSubject = "Test message"; + String bodyText = "lorem ipsum."; - // Encode as MIME message - Properties props = new Properties(); - Session session = Session.getDefaultInstance(props, null); - MimeMessage email = new MimeMessage(session); - email.setFrom(new InternetAddress(fromEmailAddress)); - email.addRecipient(javax.mail.Message.RecipientType.TO, - new InternetAddress(toEmailAddress)); - email.setSubject(messageSubject); - email.setText(bodyText); + // Encode as MIME message + Properties props = new Properties(); + Session session = Session.getDefaultInstance(props, null); + MimeMessage email = new MimeMessage(session); + email.setFrom(new InternetAddress(fromEmailAddress)); + email.addRecipient(javax.mail.Message.RecipientType.TO, + new InternetAddress(toEmailAddress)); + email.setSubject(messageSubject); + email.setText(bodyText); - // Encode and wrap the MIME message into a gmail message - ByteArrayOutputStream buffer = new ByteArrayOutputStream(); - email.writeTo(buffer); - byte[] rawMessageBytes = buffer.toByteArray(); - String encodedEmail = Base64.encodeBase64URLSafeString(rawMessageBytes); - Message message = new Message(); - message.setRaw(encodedEmail); + // Encode and wrap the MIME message into a gmail message + ByteArrayOutputStream buffer = new ByteArrayOutputStream(); + email.writeTo(buffer); + byte[] rawMessageBytes = buffer.toByteArray(); + String encodedEmail = Base64.encodeBase64URLSafeString(rawMessageBytes); + Message message = new Message(); + message.setRaw(encodedEmail); - try { - // Create send message - message = service.users().messages().send("me", message).execute(); - System.out.println("Message id: " + message.getId()); - System.out.println(message.toPrettyString()); - return message; - } catch (GoogleJsonResponseException e) { - // TODO(developer) - handle error appropriately - GoogleJsonError error = e.getDetails(); - if (error.getCode() == 403) { - System.err.println("Unable to send message: " + e.getDetails()); - } else { - throw e; - } - } - return null; + try { + // Create send message + message = service.users().messages().send("me", message).execute(); + System.out.println("Message id: " + message.getId()); + System.out.println(message.toPrettyString()); + return message; + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + GoogleJsonError error = e.getDetails(); + if (error.getCode() == 403) { + System.err.println("Unable to send message: " + e.getDetails()); + } else { + throw e; + } } + return null; + } } // [END gmail_send_message] \ No newline at end of file diff --git a/gmail/snippets/src/main/java/SendMessageWithAttachment.java b/gmail/snippets/src/main/java/SendMessageWithAttachment.java index 29c28ec4..2a9903f0 100644 --- a/gmail/snippets/src/main/java/SendMessageWithAttachment.java +++ b/gmail/snippets/src/main/java/SendMessageWithAttachment.java @@ -14,23 +14,21 @@ // [START gmail_send_message_with_attachment] + import com.google.api.client.googleapis.json.GoogleJsonError; import com.google.api.client.googleapis.json.GoogleJsonResponseException; import com.google.api.client.http.HttpRequestInitializer; import com.google.api.client.http.javanet.NetHttpTransport; import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.gmail.Gmail; import com.google.api.services.gmail.GmailScopes; +import com.google.api.services.gmail.model.Message; import com.google.auth.http.HttpCredentialsAdapter; import com.google.auth.oauth2.GoogleCredentials; -import org.apache.commons.codec.binary.Base64; -import com.google.api.services.gmail.Gmail; -import com.google.api.services.gmail.model.Message; - import java.io.ByteArrayOutputStream; import java.io.File; import java.io.IOException; import java.util.Properties; - import javax.activation.DataHandler; import javax.activation.DataSource; import javax.activation.FileDataSource; @@ -41,85 +39,86 @@ import javax.mail.internet.MimeBodyPart; import javax.mail.internet.MimeMessage; import javax.mail.internet.MimeMultipart; +import org.apache.commons.codec.binary.Base64; /* Class to demonstrate the use of Gmail Send Message with attachment API */ -public class SendMessageWithAttachment{ - /** - * Send an email with attachment from the user's mailbox to its recipient. - * - * @param fromEmailAddress - Email address to appear in the from: header. - * @param toEmailAddress - Email address of the recipient. - * @param file - Path to the file to be attached. - * @return the sent message, {@code null} otherwise. - * @throws MessagingException - if a wrongly formatted address is encountered. - * @throws IOException - if service account credentials file not found. - */ - public static Message sendEmailWithAttachment(String fromEmailAddress, - String toEmailAddress, - File file) - throws MessagingException, IOException { +public class SendMessageWithAttachment { + /** + * Send an email with attachment from the user's mailbox to its recipient. + * + * @param fromEmailAddress - Email address to appear in the from: header. + * @param toEmailAddress - Email address of the recipient. + * @param file - Path to the file to be attached. + * @return the sent message, {@code null} otherwise. + * @throws MessagingException - if a wrongly formatted address is encountered. + * @throws IOException - if service account credentials file not found. + */ + public static Message sendEmailWithAttachment(String fromEmailAddress, + String toEmailAddress, + File file) + throws MessagingException, IOException { /* Load pre-authorized user credentials from the environment. TODO(developer) - See https://developers.google.com/identity for guides on implementing OAuth2 for your application.*/ - GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() - .createScoped(GmailScopes.GMAIL_SEND); - HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter(credentials); + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(GmailScopes.GMAIL_SEND); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter(credentials); - // Create the gmail API client - Gmail service = new Gmail.Builder(new NetHttpTransport(), - GsonFactory.getDefaultInstance(), - requestInitializer) - .setApplicationName("Gmail samples") - .build(); + // Create the gmail API client + Gmail service = new Gmail.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Gmail samples") + .build(); - // Create the email content - String messageSubject = "Test message"; - String bodyText = "lorem ipsum."; + // Create the email content + String messageSubject = "Test message"; + String bodyText = "lorem ipsum."; - // Encode as MIME message - Properties props = new Properties(); - Session session = Session.getDefaultInstance(props, null); - MimeMessage email = new MimeMessage(session); - email.setFrom(new InternetAddress(fromEmailAddress)); - email.addRecipient(javax.mail.Message.RecipientType.TO, - new InternetAddress(toEmailAddress)); - email.setSubject(messageSubject); + // Encode as MIME message + Properties props = new Properties(); + Session session = Session.getDefaultInstance(props, null); + MimeMessage email = new MimeMessage(session); + email.setFrom(new InternetAddress(fromEmailAddress)); + email.addRecipient(javax.mail.Message.RecipientType.TO, + new InternetAddress(toEmailAddress)); + email.setSubject(messageSubject); - MimeBodyPart mimeBodyPart = new MimeBodyPart(); - mimeBodyPart.setContent(bodyText, "text/plain"); - Multipart multipart = new MimeMultipart(); - multipart.addBodyPart(mimeBodyPart); - mimeBodyPart = new MimeBodyPart(); - DataSource source = new FileDataSource(file); - mimeBodyPart.setDataHandler(new DataHandler(source)); - mimeBodyPart.setFileName(file.getName()); - multipart.addBodyPart(mimeBodyPart); - email.setContent(multipart); + MimeBodyPart mimeBodyPart = new MimeBodyPart(); + mimeBodyPart.setContent(bodyText, "text/plain"); + Multipart multipart = new MimeMultipart(); + multipart.addBodyPart(mimeBodyPart); + mimeBodyPart = new MimeBodyPart(); + DataSource source = new FileDataSource(file); + mimeBodyPart.setDataHandler(new DataHandler(source)); + mimeBodyPart.setFileName(file.getName()); + multipart.addBodyPart(mimeBodyPart); + email.setContent(multipart); - // Encode and wrap the MIME message into a gmail message - ByteArrayOutputStream buffer = new ByteArrayOutputStream(); - email.writeTo(buffer); - byte[] rawMessageBytes = buffer.toByteArray(); - String encodedEmail = Base64.encodeBase64URLSafeString(rawMessageBytes); - Message message = new Message(); - message.setRaw(encodedEmail); + // Encode and wrap the MIME message into a gmail message + ByteArrayOutputStream buffer = new ByteArrayOutputStream(); + email.writeTo(buffer); + byte[] rawMessageBytes = buffer.toByteArray(); + String encodedEmail = Base64.encodeBase64URLSafeString(rawMessageBytes); + Message message = new Message(); + message.setRaw(encodedEmail); - try { - // Create send message - message = service.users().messages().send("me", message).execute(); - System.out.println("Message id: " + message.getId()); - System.out.println(message.toPrettyString()); - return message; - } catch (GoogleJsonResponseException e) { - // TODO(developer) - handle error appropriately - GoogleJsonError error = e.getDetails(); - if (error.getCode() == 403) { - System.err.println("Unable to send message: " + e.getDetails()); - } else { - throw e; - } - } - return null; + try { + // Create send message + message = service.users().messages().send("me", message).execute(); + System.out.println("Message id: " + message.getId()); + System.out.println(message.toPrettyString()); + return message; + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + GoogleJsonError error = e.getDetails(); + if (error.getCode() == 403) { + System.err.println("Unable to send message: " + e.getDetails()); + } else { + throw e; + } } + return null; + } } // [END gmail_send_message_with_attachment] \ No newline at end of file diff --git a/gmail/snippets/src/main/java/UpdateSignature.java b/gmail/snippets/src/main/java/UpdateSignature.java index ca21e77e..3f5bf92e 100644 --- a/gmail/snippets/src/main/java/UpdateSignature.java +++ b/gmail/snippets/src/main/java/UpdateSignature.java @@ -14,6 +14,7 @@ // [START gmail_update_signature] + import com.google.api.client.googleapis.json.GoogleJsonError; import com.google.api.client.googleapis.json.GoogleJsonResponseException; import com.google.api.client.http.HttpRequestInitializer; @@ -21,64 +22,64 @@ import com.google.api.client.json.gson.GsonFactory; import com.google.api.services.gmail.Gmail; import com.google.api.services.gmail.GmailScopes; -import com.google.api.services.gmail.model.SendAs; import com.google.api.services.gmail.model.ListSendAsResponse; +import com.google.api.services.gmail.model.SendAs; import com.google.auth.http.HttpCredentialsAdapter; import com.google.auth.oauth2.GoogleCredentials; import java.io.IOException; /* Class to demonstrate the use of Gmail Update Signature API */ public class UpdateSignature { - /** - * Update the gmail signature. - * - * @return the updated signature id , {@code null} otherwise. - * @throws IOException - if service account credentials file not found. - */ - public static String updateGmailSignature() throws IOException { + /** + * Update the gmail signature. + * + * @return the updated signature id , {@code null} otherwise. + * @throws IOException - if service account credentials file not found. + */ + public static String updateGmailSignature() throws IOException { /* Load pre-authorized user credentials from the environment. TODO(developer) - See https://developers.google.com/identity for guides on implementing OAuth2 for your application. */ - GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() - .createScoped(GmailScopes.GMAIL_SETTINGS_BASIC); - HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter(credentials); + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(GmailScopes.GMAIL_SETTINGS_BASIC); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter(credentials); - // Create the gmail API client - Gmail service = new Gmail.Builder(new NetHttpTransport(), - GsonFactory.getDefaultInstance(), - requestInitializer) - .setApplicationName("Gmail samples") - .build(); + // Create the gmail API client + Gmail service = new Gmail.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Gmail samples") + .build(); - try { - SendAs primaryAlias = null; - ListSendAsResponse aliases = service.users().settings().sendAs().list("me").execute(); - for (SendAs alias : aliases.getSendAs()) { - if (alias.getIsPrimary()) { - primaryAlias = alias; - break; - } - } - // Updating a new signature - SendAs aliasSettings = new SendAs().setSignature("Automated Signature"); - SendAs result = service.users().settings().sendAs().patch( - "me", - primaryAlias.getSendAsEmail(), - aliasSettings) - .execute(); - //Prints the updated signature - System.out.println("Updated signature - " + result.getSignature()); - return result.getSignature(); - } catch (GoogleJsonResponseException e) { - // TODO(developer) - handle error appropriately - GoogleJsonError error = e.getDetails(); - if (error.getCode() == 403) { - System.err.println("Unable to update signature: " + e.getDetails()); - } else { - throw e; - } + try { + SendAs primaryAlias = null; + ListSendAsResponse aliases = service.users().settings().sendAs().list("me").execute(); + for (SendAs alias : aliases.getSendAs()) { + if (alias.getIsPrimary()) { + primaryAlias = alias; + break; } - return null; + } + // Updating a new signature + SendAs aliasSettings = new SendAs().setSignature("Automated Signature"); + SendAs result = service.users().settings().sendAs().patch( + "me", + primaryAlias.getSendAsEmail(), + aliasSettings) + .execute(); + //Prints the updated signature + System.out.println("Updated signature - " + result.getSignature()); + return result.getSignature(); + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + GoogleJsonError error = e.getDetails(); + if (error.getCode() == 403) { + System.err.println("Unable to update signature: " + e.getDetails()); + } else { + throw e; + } } + return null; + } } // [END gmail_update_signature] \ No newline at end of file diff --git a/gmail/snippets/src/main/java/UpdateSmimeCerts.java b/gmail/snippets/src/main/java/UpdateSmimeCerts.java index cd9ccb2c..0a92ce8a 100644 --- a/gmail/snippets/src/main/java/UpdateSmimeCerts.java +++ b/gmail/snippets/src/main/java/UpdateSmimeCerts.java @@ -14,6 +14,7 @@ // [START gmail_update_smime_certs] + import com.google.api.client.http.HttpRequestInitializer; import com.google.api.client.http.javanet.NetHttpTransport; import com.google.api.client.json.gson.GsonFactory; @@ -23,121 +24,121 @@ import com.google.api.services.gmail.model.SmimeInfo; import com.google.auth.http.HttpCredentialsAdapter; import com.google.auth.oauth2.GoogleCredentials; - import java.io.IOException; import java.time.Instant; import java.time.LocalDateTime; import java.time.ZoneId; -import java.util.Collections; /* Class to demonstrate the use of Gmail Update Smime Certificate API*/ public class UpdateSmimeCerts { - /** - * Update S/MIME certificates for the user. - * - *

First performs a lookup of all certificates for a user. If there are no certificates, or - * they all expire before the specified date/time, uploads the certificate in the specified file. - * If the default certificate is expired or there was no default set, chooses the certificate with - * the expiration furthest into the future and sets it as default. - * - * @param userId User's email address. - * @param sendAsEmail The "send as" email address, or None if it should be the same as user_id. - * @param certFilename Name of the file containing the S/MIME certificate. - * @param certPassword Password for the certificate file, or None if the file is not - * password-protected. - * @param expireTime DateTime object against which the certificate expiration is compared. If - * None, uses the current time. @ returns: The ID of the default certificate. - * @return The ID of the default certificate, {@code null} otherwise. - * @throws IOException - if service account credentials file not found. - */ - public static String updateSmimeCerts(String userId, - String sendAsEmail, - String certFilename, - String certPassword, - LocalDateTime expireTime) - throws IOException { + /** + * Update S/MIME certificates for the user. + * + *

First performs a lookup of all certificates for a user. If there are no certificates, or + * they all expire before the specified date/time, uploads the certificate in the specified file. + * If the default certificate is expired or there was no default set, chooses the certificate with + * the expiration furthest into the future and sets it as default. + * + * @param userId User's email address. + * @param sendAsEmail The "send as" email address, or None if it should be the same as user_id. + * @param certFilename Name of the file containing the S/MIME certificate. + * @param certPassword Password for the certificate file, or None if the file is not + * password-protected. + * @param expireTime DateTime object against which the certificate expiration is compared. If + * None, uses the current time. @ returns: The ID of the default certificate. + * @return The ID of the default certificate, {@code null} otherwise. + * @throws IOException - if service account credentials file not found. + */ + public static String updateSmimeCerts(String userId, + String sendAsEmail, + String certFilename, + String certPassword, + LocalDateTime expireTime) + throws IOException { /* Load pre-authorized user credentials from the environment. TODO(developer) - See https://developers.google.com/identity for guides on implementing OAuth2 for your application. */ - GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() - .createScoped(GmailScopes.GMAIL_SETTINGS_SHARING); - HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( - credentials); + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(GmailScopes.GMAIL_SETTINGS_SHARING); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); - // Create the gmail API client - Gmail service = new Gmail.Builder(new NetHttpTransport(), - GsonFactory.getDefaultInstance(), - requestInitializer) - .setApplicationName("Gmail samples") - .build(); + // Create the gmail API client + Gmail service = new Gmail.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Gmail samples") + .build(); - if (sendAsEmail == null) { - sendAsEmail = userId; - } + if (sendAsEmail == null) { + sendAsEmail = userId; + } - ListSmimeInfoResponse listResults; - try { - listResults = service.users().settings().sendAs().smimeInfo().list(userId, sendAsEmail).execute(); - } catch (IOException e) { - System.err.printf("An error occurred during list: %s\n", e); - return null; - } + ListSmimeInfoResponse listResults; + try { + listResults = + service.users().settings().sendAs().smimeInfo().list(userId, sendAsEmail).execute(); + } catch (IOException e) { + System.err.printf("An error occurred during list: %s\n", e); + return null; + } - String defaultCertId = null; - String bestCertId = null; - LocalDateTime bestCertExpire = LocalDateTime.MIN; + String defaultCertId = null; + String bestCertId = null; + LocalDateTime bestCertExpire = LocalDateTime.MIN; - if (expireTime == null) { - expireTime = LocalDateTime.now(); - } - if (listResults != null && listResults.getSmimeInfo() != null) { - for (SmimeInfo smimeInfo : listResults.getSmimeInfo()) { - String certId = smimeInfo.getId(); - boolean isDefaultCert = smimeInfo.getIsDefault(); - if (isDefaultCert) { - defaultCertId = certId; - } - LocalDateTime exp = - LocalDateTime.ofInstant( - Instant.ofEpochMilli(smimeInfo.getExpiration()), ZoneId.systemDefault()); - if (exp.isAfter(expireTime)) { - if (exp.isAfter(bestCertExpire)) { - bestCertId = certId; - bestCertExpire = exp; - } - } else { - if (isDefaultCert) { - defaultCertId = null; - } - } - } + if (expireTime == null) { + expireTime = LocalDateTime.now(); + } + if (listResults != null && listResults.getSmimeInfo() != null) { + for (SmimeInfo smimeInfo : listResults.getSmimeInfo()) { + String certId = smimeInfo.getId(); + boolean isDefaultCert = smimeInfo.getIsDefault(); + if (isDefaultCert) { + defaultCertId = certId; } - if (defaultCertId == null) { - String defaultId = bestCertId; - if (defaultId == null && certFilename != null) { - SmimeInfo smimeInfo = CreateSmimeInfo.createSmimeInfo(certFilename, - certPassword); - SmimeInfo insertResults = InsertSmimeInfo.insertSmimeInfo(userId, - sendAsEmail, - smimeInfo); - if (insertResults != null) { - defaultId = insertResults.getId(); - } - } - - if (defaultId != null) { - try { - service.users().settings().sendAs().smimeInfo().setDefault(userId, sendAsEmail, defaultId).execute(); - return defaultId; - } catch (IOException e) { - System.err.printf("An error occured during setDefault: %s", e); - } - } + LocalDateTime exp = + LocalDateTime.ofInstant( + Instant.ofEpochMilli(smimeInfo.getExpiration()), ZoneId.systemDefault()); + if (exp.isAfter(expireTime)) { + if (exp.isAfter(bestCertExpire)) { + bestCertId = certId; + bestCertExpire = exp; + } } else { - return defaultCertId; + if (isDefaultCert) { + defaultCertId = null; + } + } + } + } + if (defaultCertId == null) { + String defaultId = bestCertId; + if (defaultId == null && certFilename != null) { + SmimeInfo smimeInfo = CreateSmimeInfo.createSmimeInfo(certFilename, + certPassword); + SmimeInfo insertResults = InsertSmimeInfo.insertSmimeInfo(userId, + sendAsEmail, + smimeInfo); + if (insertResults != null) { + defaultId = insertResults.getId(); } + } - return null; + if (defaultId != null) { + try { + service.users().settings().sendAs().smimeInfo().setDefault(userId, sendAsEmail, defaultId) + .execute(); + return defaultId; + } catch (IOException e) { + System.err.printf("An error occured during setDefault: %s", e); + } + } + } else { + return defaultCertId; } + + return null; + } } // [END gmail_update_smime_certs] \ No newline at end of file diff --git a/gmail/snippets/src/main/java/UpdateSmimeFromCsv.java b/gmail/snippets/src/main/java/UpdateSmimeFromCsv.java index efe3052b..70932b7a 100644 --- a/gmail/snippets/src/main/java/UpdateSmimeFromCsv.java +++ b/gmail/snippets/src/main/java/UpdateSmimeFromCsv.java @@ -14,44 +14,44 @@ // [START gmail_update_smime_from_csv] -import org.apache.commons.csv.CSVFormat; -import org.apache.commons.csv.CSVParser; -import org.apache.commons.csv.CSVRecord; import java.io.File; import java.time.LocalDateTime; +import org.apache.commons.csv.CSVFormat; +import org.apache.commons.csv.CSVParser; +import org.apache.commons.csv.CSVRecord; /* Class to demonstrate the use of Gmail Update Certificate from CSV File */ public class UpdateSmimeFromCsv { - /** - * Update S/MIME certificates based on the contents of a CSV file. - * - *

Each row of the CSV file should contain a user ID, path to the certificate, and the - * certificate password. - * - * @param csvFilename Name of the CSV file. - * @param expireTime DateTime object against which the certificate expiration is compared. If - * None, uses the current time. - */ - public static void updateSmimeFromCsv(String csvFilename, LocalDateTime expireTime) { - try { - File csvFile = new File(csvFilename); - CSVParser parser = CSVParser.parse( csvFile, - java.nio.charset.StandardCharsets.UTF_8, - CSVFormat.DEFAULT.withHeader().withSkipHeaderRecord()); - for (CSVRecord record : parser) { - String userId = record.get(0); - String certFilename = record.get(1); - String certPassword = record.get(2); - UpdateSmimeCerts.updateSmimeCerts(userId, - userId, - certFilename, - certPassword, - expireTime); - } - } catch (Exception e) { - System.err.printf("An error occured while reading the CSV file: %s", e); - } + /** + * Update S/MIME certificates based on the contents of a CSV file. + * + *

Each row of the CSV file should contain a user ID, path to the certificate, and the + * certificate password. + * + * @param csvFilename Name of the CSV file. + * @param expireTime DateTime object against which the certificate expiration is compared. If + * None, uses the current time. + */ + public static void updateSmimeFromCsv(String csvFilename, LocalDateTime expireTime) { + try { + File csvFile = new File(csvFilename); + CSVParser parser = CSVParser.parse(csvFile, + java.nio.charset.StandardCharsets.UTF_8, + CSVFormat.DEFAULT.withHeader().withSkipHeaderRecord()); + for (CSVRecord record : parser) { + String userId = record.get(0); + String certFilename = record.get(1); + String certPassword = record.get(2); + UpdateSmimeCerts.updateSmimeCerts(userId, + userId, + certFilename, + certPassword, + expireTime); + } + } catch (Exception e) { + System.err.printf("An error occured while reading the CSV file: %s", e); } + } } // [END gmail_update_smime_from_csv] \ No newline at end of file diff --git a/gmail/snippets/src/test/java/BaseTest.java b/gmail/snippets/src/test/java/BaseTest.java index 3fc90c8b..fbba7f1c 100644 --- a/gmail/snippets/src/test/java/BaseTest.java +++ b/gmail/snippets/src/test/java/BaseTest.java @@ -21,45 +21,45 @@ import com.google.api.services.gmail.GmailScopes; import com.google.auth.http.HttpCredentialsAdapter; import com.google.auth.oauth2.GoogleCredentials; -import org.junit.Before; import java.io.IOException; +import org.junit.Before; public class BaseTest { - public static final String TEST_USER = "ci-test01@workspacesamples.dev"; - public static final String RECIPIENT = "gduser1@workspacesamples.dev"; - public static final String FORWARDING_ADDRESS = "gduser1@workspacesamples.dev"; + public static final String TEST_USER = "ci-test01@workspacesamples.dev"; + public static final String RECIPIENT = "gduser1@workspacesamples.dev"; + public static final String FORWARDING_ADDRESS = "gduser1@workspacesamples.dev"; - protected Gmail service; + protected Gmail service; - /** - * Create a default authorization Gmail client service. - * - * @return an authorized Gmail client service - * @throws IOException - if credentials file not found. - */ - public Gmail buildService() throws IOException { + /** + * Create a default authorization Gmail client service. + * + * @return an authorized Gmail client service + * @throws IOException - if credentials file not found. + */ + public Gmail buildService() throws IOException { /* Load pre-authorized user credentials from the environment. TODO(developer) - See https://developers.google.com/identity for guides on implementing OAuth2 for your application.*/ - GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() - .createScoped(GmailScopes.GMAIL_SETTINGS_BASIC, - GmailScopes.GMAIL_COMPOSE, - GmailScopes.GMAIL_SETTINGS_SHARING, - GmailScopes.GMAIL_LABELS); - HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter(credentials); + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(GmailScopes.GMAIL_SETTINGS_BASIC, + GmailScopes.GMAIL_COMPOSE, + GmailScopes.GMAIL_SETTINGS_SHARING, + GmailScopes.GMAIL_LABELS); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter(credentials); - // Create the Gmail API client - Gmail service = new Gmail.Builder(new NetHttpTransport(), - GsonFactory.getDefaultInstance(), - requestInitializer) - .setApplicationName("Gmail API Snippets") - .build(); - return service; - } + // Create the Gmail API client + Gmail service = new Gmail.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Gmail API Snippets") + .build(); + return service; + } - @Before - public void setupService() throws IOException { - this.service = buildService(); - } + @Before + public void setupService() throws IOException { + this.service = buildService(); + } } diff --git a/gmail/snippets/src/test/java/TestCreateDraft.java b/gmail/snippets/src/test/java/TestCreateDraft.java index e3eb2fb2..71e56eb9 100644 --- a/gmail/snippets/src/test/java/TestCreateDraft.java +++ b/gmail/snippets/src/test/java/TestCreateDraft.java @@ -13,19 +13,20 @@ // limitations under the License. +import static org.junit.Assert.assertNotNull; + import com.google.api.services.gmail.model.Draft; -import org.junit.Test; -import javax.mail.MessagingException; import java.io.IOException; -import static org.junit.Assert.assertNotNull; +import javax.mail.MessagingException; +import org.junit.Test; // Unit testcase for gmail create draft snippet -public class TestCreateDraft extends BaseTest{ +public class TestCreateDraft extends BaseTest { - @Test - public void testCreateDraft() throws MessagingException, IOException { - Draft draft = CreateDraft.createDraftMessage(RECIPIENT,TEST_USER); - assertNotNull(draft); - this.service.users().drafts().delete("me", draft.getId()).execute(); - } + @Test + public void testCreateDraft() throws MessagingException, IOException { + Draft draft = CreateDraft.createDraftMessage(RECIPIENT, TEST_USER); + assertNotNull(draft); + this.service.users().drafts().delete("me", draft.getId()).execute(); + } } diff --git a/gmail/snippets/src/test/java/TestCreateDraftWithAttachment.java b/gmail/snippets/src/test/java/TestCreateDraftWithAttachment.java index d0031682..065c64c6 100644 --- a/gmail/snippets/src/test/java/TestCreateDraftWithAttachment.java +++ b/gmail/snippets/src/test/java/TestCreateDraftWithAttachment.java @@ -13,21 +13,22 @@ // limitations under the License. +import static org.junit.Assert.assertNotNull; + import com.google.api.services.gmail.model.Draft; -import org.junit.Test; -import javax.mail.MessagingException; import java.io.IOException; -import static org.junit.Assert.assertNotNull; +import javax.mail.MessagingException; +import org.junit.Test; // Unit testcase for gmail create draft with attachment snippet -public class TestCreateDraftWithAttachment extends BaseTest{ +public class TestCreateDraftWithAttachment extends BaseTest { - @Test - public void testCreateDraftWithAttachment() throws MessagingException, IOException { - Draft draft = CreateDraftWithAttachment.createDraftMessageWithAttachment(RECIPIENT, - TEST_USER, - new java.io.File("files/photo.jpg")); - assertNotNull(draft); - this.service.users().drafts().delete(TEST_USER, draft.getId()).execute(); - } + @Test + public void testCreateDraftWithAttachment() throws MessagingException, IOException { + Draft draft = CreateDraftWithAttachment.createDraftMessageWithAttachment(RECIPIENT, + TEST_USER, + new java.io.File("files/photo.jpg")); + assertNotNull(draft); + this.service.users().drafts().delete(TEST_USER, draft.getId()).execute(); + } } diff --git a/gmail/snippets/src/test/java/TestCreateEmail.java b/gmail/snippets/src/test/java/TestCreateEmail.java index 1248aa35..043397a0 100644 --- a/gmail/snippets/src/test/java/TestCreateEmail.java +++ b/gmail/snippets/src/test/java/TestCreateEmail.java @@ -13,25 +13,26 @@ // limitations under the License. -import org.junit.Test; +import static org.junit.Assert.assertEquals; + +import java.io.IOException; import javax.mail.Message; import javax.mail.MessagingException; import javax.mail.internet.MimeMessage; -import java.io.IOException; -import static org.junit.Assert.assertEquals; +import org.junit.Test; // Unit testcase for gmail create email snippet -public class TestCreateEmail extends BaseTest{ +public class TestCreateEmail extends BaseTest { - @Test - public void createEmail() throws MessagingException, IOException { - MimeMessage mimeMessage = CreateEmail.createEmail(RECIPIENT, - TEST_USER, - "test", - "Hello!"); - assertEquals("test", mimeMessage.getSubject()); - assertEquals("Hello!", mimeMessage.getContent()); - assertEquals(RECIPIENT, mimeMessage.getRecipients(Message.RecipientType.TO)[0].toString()); - assertEquals(TEST_USER, mimeMessage.getFrom()[0].toString()); - } + @Test + public void createEmail() throws MessagingException, IOException { + MimeMessage mimeMessage = CreateEmail.createEmail(RECIPIENT, + TEST_USER, + "test", + "Hello!"); + assertEquals("test", mimeMessage.getSubject()); + assertEquals("Hello!", mimeMessage.getContent()); + assertEquals(RECIPIENT, mimeMessage.getRecipients(Message.RecipientType.TO)[0].toString()); + assertEquals(TEST_USER, mimeMessage.getFrom()[0].toString()); + } } diff --git a/gmail/snippets/src/test/java/TestCreateFilter.java b/gmail/snippets/src/test/java/TestCreateFilter.java index b345afa1..fbf72c2b 100644 --- a/gmail/snippets/src/test/java/TestCreateFilter.java +++ b/gmail/snippets/src/test/java/TestCreateFilter.java @@ -13,48 +13,49 @@ // limitations under the License. +import static org.junit.Assert.assertNotNull; + import com.google.api.services.gmail.model.Label; import com.google.api.services.gmail.model.ListLabelsResponse; +import java.io.IOException; import org.junit.After; import org.junit.Before; import org.junit.Test; -import java.io.IOException; -import static org.junit.Assert.assertNotNull; // Unit testcase for gmail create filter snippet public class TestCreateFilter extends BaseTest { - private Label testLabel = null; - - @Before - public void createLabel() throws IOException { - ListLabelsResponse response = this.service.users().labels().list("me").execute(); - for (Label l : response.getLabels()) { - if (l.getName().equals("testLabel")) { - testLabel = l; - } - } - if (testLabel == null) { - Label label = new Label() - .setName("testLabel") - .setLabelListVisibility("labelShow") - .setMessageListVisibility("show"); - testLabel = this.service.users().labels().create("me", label).execute(); - } - } + private Label testLabel = null; - @After - public void deleteLabel() throws IOException { - if (testLabel != null) { - this.service.users().labels().delete("me", testLabel.getId()).execute(); - testLabel = null; - } + @Before + public void createLabel() throws IOException { + ListLabelsResponse response = this.service.users().labels().list("me").execute(); + for (Label l : response.getLabels()) { + if (l.getName().equals("testLabel")) { + testLabel = l; + } } + if (testLabel == null) { + Label label = new Label() + .setName("testLabel") + .setLabelListVisibility("labelShow") + .setMessageListVisibility("show"); + testLabel = this.service.users().labels().create("me", label).execute(); + } + } - @Test - public void testCreateNewFilter() throws IOException { - String id = CreateFilter.createNewFilter(testLabel.getId()); - assertNotNull(id); - this.service.users().settings().filters().delete("me", id).execute(); + @After + public void deleteLabel() throws IOException { + if (testLabel != null) { + this.service.users().labels().delete("me", testLabel.getId()).execute(); + testLabel = null; } + } + + @Test + public void testCreateNewFilter() throws IOException { + String id = CreateFilter.createNewFilter(testLabel.getId()); + assertNotNull(id); + this.service.users().settings().filters().delete("me", id).execute(); + } } diff --git a/gmail/snippets/src/test/java/TestCreateMessage.java b/gmail/snippets/src/test/java/TestCreateMessage.java index 775e7c1f..d31bd75e 100644 --- a/gmail/snippets/src/test/java/TestCreateMessage.java +++ b/gmail/snippets/src/test/java/TestCreateMessage.java @@ -12,24 +12,26 @@ // See the License for the specific language governing permissions and // limitations under the License. -import org.junit.Test; +import static org.junit.Assert.assertNotNull; + +import java.io.IOException; import javax.mail.MessagingException; import javax.mail.internet.MimeMessage; -import java.io.IOException; -import static org.junit.Assert.assertNotNull; +import org.junit.Test; // Unit testcase for gmail create message snippet -public class TestCreateMessage extends BaseTest{ +public class TestCreateMessage extends BaseTest { - @Test - public void testCreateMessageWithEmail() throws MessagingException, - IOException { - MimeMessage mimeMessage = CreateEmail.createEmail(RECIPIENT, - TEST_USER, - "test", - "Hello!"); + @Test + public void testCreateMessageWithEmail() throws MessagingException, + IOException { + MimeMessage mimeMessage = CreateEmail.createEmail(RECIPIENT, + TEST_USER, + "test", + "Hello!"); - com.google.api.services.gmail.model.Message message = CreateMessage.createMessageWithEmail(mimeMessage); - assertNotNull(message.getRaw()); // Weak assertion... - } + com.google.api.services.gmail.model.Message message = + CreateMessage.createMessageWithEmail(mimeMessage); + assertNotNull(message.getRaw()); // Weak assertion... + } } diff --git a/gmail/snippets/src/test/java/TestCreateSmimeInfo.java b/gmail/snippets/src/test/java/TestCreateSmimeInfo.java index 5357536e..6e304814 100644 --- a/gmail/snippets/src/test/java/TestCreateSmimeInfo.java +++ b/gmail/snippets/src/test/java/TestCreateSmimeInfo.java @@ -13,54 +13,54 @@ // limitations under the License. -import com.google.api.services.gmail.model.SmimeInfo; -import org.junit.Test; -import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.greaterThan; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; +import com.google.api.services.gmail.model.SmimeInfo; +import org.junit.Test; + // Unit testcase for gmail create smime info snippet public class TestCreateSmimeInfo { - @Test - public void testCreateSmimeInfo() { - SmimeInfo smimeInfo = CreateSmimeInfo.createSmimeInfo( - "files/cert.p12", - null /* password */); + @Test + public void testCreateSmimeInfo() { + SmimeInfo smimeInfo = CreateSmimeInfo.createSmimeInfo( + "files/cert.p12", + null /* password */); - assertNotNull(smimeInfo); - assertNull(smimeInfo.getEncryptedKeyPassword()); - assertNull(smimeInfo.getExpiration()); - assertNull(smimeInfo.getId()); - assertNull(smimeInfo.getIsDefault()); - assertNull(smimeInfo.getIssuerCn()); - assertNull(smimeInfo.getPem()); - assertThat(smimeInfo.getPkcs12().length(), greaterThan(0)); - } + assertNotNull(smimeInfo); + assertNull(smimeInfo.getEncryptedKeyPassword()); + assertNull(smimeInfo.getExpiration()); + assertNull(smimeInfo.getId()); + assertNull(smimeInfo.getIsDefault()); + assertNull(smimeInfo.getIssuerCn()); + assertNull(smimeInfo.getPem()); + assertThat(smimeInfo.getPkcs12().length(), greaterThan(0)); + } - @Test - public void testCreateSmimeInfoWithPassword() { - SmimeInfo smimeInfo = CreateSmimeInfo.createSmimeInfo( - "files/cert.p12", - "certpass"); + @Test + public void testCreateSmimeInfoWithPassword() { + SmimeInfo smimeInfo = CreateSmimeInfo.createSmimeInfo( + "files/cert.p12", + "certpass"); - assertNotNull(smimeInfo); - assertEquals(smimeInfo.getEncryptedKeyPassword(), "certpass"); - assertNull(smimeInfo.getExpiration()); - assertNull(smimeInfo.getId()); - assertNull(smimeInfo.getIsDefault()); - assertNull(smimeInfo.getIssuerCn()); - assertNull(smimeInfo.getPem()); - assertThat(smimeInfo.getPkcs12().length(), greaterThan(0)); - } + assertNotNull(smimeInfo); + assertEquals(smimeInfo.getEncryptedKeyPassword(), "certpass"); + assertNull(smimeInfo.getExpiration()); + assertNull(smimeInfo.getId()); + assertNull(smimeInfo.getIsDefault()); + assertNull(smimeInfo.getIssuerCn()); + assertNull(smimeInfo.getPem()); + assertThat(smimeInfo.getPkcs12().length(), greaterThan(0)); + } - @Test - public void testCreateSmimeInfoFileNotFound() { - SmimeInfo smimeInfo = CreateSmimeInfo.createSmimeInfo( - "files/notfound.p12", - null /* password */); - assertNull(smimeInfo); - } + @Test + public void testCreateSmimeInfoFileNotFound() { + SmimeInfo smimeInfo = CreateSmimeInfo.createSmimeInfo( + "files/notfound.p12", + null /* password */); + assertNull(smimeInfo); + } } diff --git a/gmail/snippets/src/test/java/TestEnableAutoReply.java b/gmail/snippets/src/test/java/TestEnableAutoReply.java index c961b734..829e4c6d 100644 --- a/gmail/snippets/src/test/java/TestEnableAutoReply.java +++ b/gmail/snippets/src/test/java/TestEnableAutoReply.java @@ -12,17 +12,18 @@ // See the License for the specific language governing permissions and // limitations under the License. +import static org.junit.Assert.assertNotNull; + import com.google.api.services.gmail.model.VacationSettings; -import org.junit.Test; import java.io.IOException; -import static org.junit.Assert.assertNotNull; +import org.junit.Test; // Unit testcase for gmail enable auto reply snippet public class TestEnableAutoReply extends BaseTest { - @Test - public void testAutoReply() throws IOException { - VacationSettings settings = EnableAutoReply.autoReply(); - assertNotNull(settings); - } + @Test + public void testAutoReply() throws IOException { + VacationSettings settings = EnableAutoReply.autoReply(); + assertNotNull(settings); + } } \ No newline at end of file diff --git a/gmail/snippets/src/test/java/TestEnableForwarding.java b/gmail/snippets/src/test/java/TestEnableForwarding.java index 6250c13c..b7719fc3 100644 --- a/gmail/snippets/src/test/java/TestEnableForwarding.java +++ b/gmail/snippets/src/test/java/TestEnableForwarding.java @@ -13,30 +13,32 @@ // limitations under the License. +import static org.junit.Assert.assertNotNull; + import com.google.api.services.gmail.model.AutoForwarding; +import java.io.IOException; import org.junit.Before; import org.junit.Test; -import java.io.IOException; -import static org.junit.Assert.assertNotNull; // Unit testcase for gmail enable forwarding snippet public class TestEnableForwarding extends BaseTest { - @Test - public void TestEnableAutoForwarding() throws IOException { - AutoForwarding forwarding = EnableForwarding.enableAutoForwarding(FORWARDING_ADDRESS); - assertNotNull(forwarding); - } + @Test + public void TestEnableAutoForwarding() throws IOException { + AutoForwarding forwarding = EnableForwarding.enableAutoForwarding(FORWARDING_ADDRESS); + assertNotNull(forwarding); + } - @Before - public void cleanup() { - try { - AutoForwarding forwarding = new AutoForwarding().setEnabled(false); - this.service.users().settings().updateAutoForwarding("me", forwarding).execute(); - this.service.users().settings().forwardingAddresses().delete("me", FORWARDING_ADDRESS).execute(); - } catch (Exception e) { - // Ignore -- resources might not exist - e.printStackTrace(); - } + @Before + public void cleanup() { + try { + AutoForwarding forwarding = new AutoForwarding().setEnabled(false); + this.service.users().settings().updateAutoForwarding("me", forwarding).execute(); + this.service.users().settings().forwardingAddresses().delete("me", FORWARDING_ADDRESS) + .execute(); + } catch (Exception e) { + // Ignore -- resources might not exist + e.printStackTrace(); } + } } diff --git a/gmail/snippets/src/test/java/TestInsertCertFromCsv.java b/gmail/snippets/src/test/java/TestInsertCertFromCsv.java index 2853cc2e..2a1ccc60 100644 --- a/gmail/snippets/src/test/java/TestInsertCertFromCsv.java +++ b/gmail/snippets/src/test/java/TestInsertCertFromCsv.java @@ -12,91 +12,100 @@ // See the License for the specific language governing permissions and // limitations under the License. +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + import com.google.api.services.gmail.Gmail; import com.google.api.services.gmail.model.SmimeInfo; +import java.io.IOException; import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.mockito.Mock; import org.mockito.junit.MockitoJUnit; import org.mockito.junit.MockitoRule; -import java.io.IOException; - -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.ArgumentMatchers.eq; -import static org.mockito.Mockito.*; // Unit testcase for gmail insert cert from csv snippet -public class TestInsertCertFromCsv extends BaseTest{ - - private static final long CURRENT_TIME_MS = 1234567890; - public static final String TEST_USER1 = "gduser1@workspacesamples.dev"; - public static final String TEST_USER2 = "gduser2@workspacesamples.dev"; - - @Mock - private Gmail mockService; - @Mock private Gmail.Users mockUsers; - @Mock private Gmail.Users.Settings mockSettings; - @Mock private Gmail.Users.Settings.SendAs mockSendAs; - @Mock private Gmail.Users.Settings.SendAs.SmimeInfo mockSmimeInfo; - @Mock private Gmail.Users.Settings.SendAs.SmimeInfo.Delete mockDelete; - @Mock private Gmail.Users.Settings.SendAs.SmimeInfo.Get mockGet; - @Mock private Gmail.Users.Settings.SendAs.SmimeInfo.Insert mockInsert; - @Mock private Gmail.Users.Settings.SendAs.SmimeInfo.List mockList; - @Mock private Gmail.Users.Settings.SendAs.SmimeInfo.SetDefault mockSetDefault; - - @Rule - public MockitoRule mockitoRule = MockitoJUnit.rule(); - - @Before - public void setup() throws IOException { - when(mockService.users()).thenReturn(mockUsers); - when(mockUsers.settings()).thenReturn(mockSettings); - when(mockSettings.sendAs()).thenReturn(mockSendAs); - when(mockSendAs.smimeInfo()).thenReturn(mockSmimeInfo); - - when(mockSmimeInfo.delete(any(), any(), any())).thenReturn(mockDelete); - when(mockSmimeInfo.get(any(), any(), any())).thenReturn(mockGet); - when(mockSmimeInfo.insert(any(), any(), any())).thenReturn(mockInsert); - when(mockSmimeInfo.list(any(), any())).thenReturn(mockList); - when(mockSmimeInfo.setDefault(any(), any(), any())).thenReturn(mockSetDefault); - } - - @Test - public void testInsertSmimeFromCsv() throws IOException { - when(mockInsert.execute()).thenReturn(makeFakeInsertResult()); - InsertCertFromCsv.insertCertFromCsv("files/certs.csv"); - - verifySmimeApiCalled(2); - verify(mockSmimeInfo).insert(eq(TEST_USER1), eq(TEST_USER1), any()); - verify(mockSmimeInfo).insert(eq(TEST_USER2), eq(TEST_USER2), any()); - verify(mockInsert, times(2)).execute(); - } - - @Test - public void testInsertSmimeFromCsvFails() throws IOException { - when(mockInsert.execute()).thenReturn(makeFakeInsertResult()); - - InsertCertFromCsv.insertCertFromCsv("files/notfound.csv"); - } - - private void verifySmimeApiCalled(int numCalls) { - verify(mockService, times(numCalls)).users(); - verify(mockUsers, times(numCalls)).settings(); - verify(mockSettings, times(numCalls)).sendAs(); - verify(mockSendAs, times(numCalls)).smimeInfo(); - } - - private SmimeInfo makeFakeInsertResult(String id, boolean isDefault, long expiration) { - SmimeInfo insertResult = new SmimeInfo(); - insertResult.setId(id); - insertResult.setIsDefault(isDefault); - insertResult.setExpiration(expiration); - - return insertResult; - } - - private SmimeInfo makeFakeInsertResult() { - return makeFakeInsertResult("new_certificate_id", false, CURRENT_TIME_MS + 1); - } +public class TestInsertCertFromCsv extends BaseTest { + + public static final String TEST_USER1 = "gduser1@workspacesamples.dev"; + public static final String TEST_USER2 = "gduser2@workspacesamples.dev"; + private static final long CURRENT_TIME_MS = 1234567890; + @Rule + public MockitoRule mockitoRule = MockitoJUnit.rule(); + @Mock + private Gmail mockService; + @Mock + private Gmail.Users mockUsers; + @Mock + private Gmail.Users.Settings mockSettings; + @Mock + private Gmail.Users.Settings.SendAs mockSendAs; + @Mock + private Gmail.Users.Settings.SendAs.SmimeInfo mockSmimeInfo; + @Mock + private Gmail.Users.Settings.SendAs.SmimeInfo.Delete mockDelete; + @Mock + private Gmail.Users.Settings.SendAs.SmimeInfo.Get mockGet; + @Mock + private Gmail.Users.Settings.SendAs.SmimeInfo.Insert mockInsert; + @Mock + private Gmail.Users.Settings.SendAs.SmimeInfo.List mockList; + @Mock + private Gmail.Users.Settings.SendAs.SmimeInfo.SetDefault mockSetDefault; + + @Before + public void setup() throws IOException { + when(mockService.users()).thenReturn(mockUsers); + when(mockUsers.settings()).thenReturn(mockSettings); + when(mockSettings.sendAs()).thenReturn(mockSendAs); + when(mockSendAs.smimeInfo()).thenReturn(mockSmimeInfo); + + when(mockSmimeInfo.delete(any(), any(), any())).thenReturn(mockDelete); + when(mockSmimeInfo.get(any(), any(), any())).thenReturn(mockGet); + when(mockSmimeInfo.insert(any(), any(), any())).thenReturn(mockInsert); + when(mockSmimeInfo.list(any(), any())).thenReturn(mockList); + when(mockSmimeInfo.setDefault(any(), any(), any())).thenReturn(mockSetDefault); + } + + @Test + public void testInsertSmimeFromCsv() throws IOException { + when(mockInsert.execute()).thenReturn(makeFakeInsertResult()); + InsertCertFromCsv.insertCertFromCsv("files/certs.csv"); + + verifySmimeApiCalled(2); + verify(mockSmimeInfo).insert(eq(TEST_USER1), eq(TEST_USER1), any()); + verify(mockSmimeInfo).insert(eq(TEST_USER2), eq(TEST_USER2), any()); + verify(mockInsert, times(2)).execute(); + } + + @Test + public void testInsertSmimeFromCsvFails() throws IOException { + when(mockInsert.execute()).thenReturn(makeFakeInsertResult()); + + InsertCertFromCsv.insertCertFromCsv("files/notfound.csv"); + } + + private void verifySmimeApiCalled(int numCalls) { + verify(mockService, times(numCalls)).users(); + verify(mockUsers, times(numCalls)).settings(); + verify(mockSettings, times(numCalls)).sendAs(); + verify(mockSendAs, times(numCalls)).smimeInfo(); + } + + private SmimeInfo makeFakeInsertResult(String id, boolean isDefault, long expiration) { + SmimeInfo insertResult = new SmimeInfo(); + insertResult.setId(id); + insertResult.setIsDefault(isDefault); + insertResult.setExpiration(expiration); + + return insertResult; + } + + private SmimeInfo makeFakeInsertResult() { + return makeFakeInsertResult("new_certificate_id", false, CURRENT_TIME_MS + 1); + } } diff --git a/gmail/snippets/src/test/java/TestInsertSmimeInfo.java b/gmail/snippets/src/test/java/TestInsertSmimeInfo.java index 3c70b89a..360174e7 100644 --- a/gmail/snippets/src/test/java/TestInsertSmimeInfo.java +++ b/gmail/snippets/src/test/java/TestInsertSmimeInfo.java @@ -12,106 +12,115 @@ // See the License for the specific language governing permissions and // limitations under the License. +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNull; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + import com.google.api.services.gmail.Gmail; import com.google.api.services.gmail.model.SmimeInfo; +import java.io.IOException; import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.mockito.Mock; import org.mockito.junit.MockitoJUnit; import org.mockito.junit.MockitoRule; -import java.io.IOException; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNull; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.ArgumentMatchers.eq; -import static org.mockito.Mockito.*; -import static org.mockito.Mockito.times; // Unit testcase for gmail insert smime info snippet -public class TestInsertSmimeInfo extends BaseTest{ - - private static final long CURRENT_TIME_MS = 1234567890; - - @Mock private Gmail mockService; - @Mock private Gmail.Users mockUsers; - @Mock private Gmail.Users.Settings mockSettings; - @Mock private Gmail.Users.Settings.SendAs mockSendAs; - @Mock private Gmail.Users.Settings.SendAs.SmimeInfo mockSmimeInfo; - @Mock private Gmail.Users.Settings.SendAs.SmimeInfo.Delete mockDelete; - @Mock private Gmail.Users.Settings.SendAs.SmimeInfo.Get mockGet; - @Mock private Gmail.Users.Settings.SendAs.SmimeInfo.Insert mockInsert; - @Mock private Gmail.Users.Settings.SendAs.SmimeInfo.List mockList; - @Mock private Gmail.Users.Settings.SendAs.SmimeInfo.SetDefault mockSetDefault; - - @Rule - public MockitoRule mockitoRule = MockitoJUnit.rule(); - - @Before - public void setup() throws IOException { - when(mockService.users()).thenReturn(mockUsers); - when(mockUsers.settings()).thenReturn(mockSettings); - when(mockSettings.sendAs()).thenReturn(mockSendAs); - when(mockSendAs.smimeInfo()).thenReturn(mockSmimeInfo); - - when(mockSmimeInfo.delete(any(), any(), any())).thenReturn(mockDelete); - when(mockSmimeInfo.get(any(), any(), any())).thenReturn(mockGet); - when(mockSmimeInfo.insert(any(), any(), any())).thenReturn(mockInsert); - when(mockSmimeInfo.list(any(), any())).thenReturn(mockList); - when(mockSmimeInfo.setDefault(any(), any(), any())).thenReturn(mockSetDefault); - } - - @Test - public void testInsertSmimeInfo() throws IOException { - SmimeInfo insertResult = makeFakeInsertResult(); - when(mockInsert.execute()).thenReturn(insertResult); - - SmimeInfo smimeInfo = CreateSmimeInfo.createSmimeInfo("files/cert.p12", - null /* password */); - SmimeInfo result = InsertSmimeInfo.insertSmimeInfo(TEST_USER, - TEST_USER, - smimeInfo); - verifySmimeApiCalled(1); - verify(mockSmimeInfo).insert(eq(TEST_USER), eq(TEST_USER), eq(smimeInfo)); - verify(mockInsert).execute(); - - assertEquals(insertResult, result); - } - - @Test - public void testInsertSmimeInfoError() throws IOException { - when(mockInsert.execute()).thenThrow(IOException.class); - - SmimeInfo smimeInfo = CreateSmimeInfo.createSmimeInfo("files/cert.p12", - null /* password */); - SmimeInfo result = InsertSmimeInfo.insertSmimeInfo(TEST_USER, - TEST_USER, smimeInfo); - - verifySmimeApiCalled(1); - verify(mockSmimeInfo).insert(eq(TEST_USER), eq(TEST_USER), eq(smimeInfo)); - verify(mockInsert).execute(); - - assertNull(result); - } - - private void verifySmimeApiCalled(int numCalls) { - verify(mockService, times(numCalls)).users(); - verify(mockUsers, times(numCalls)).settings(); - verify(mockSettings, times(numCalls)).sendAs(); - verify(mockSendAs, times(numCalls)).smimeInfo(); - } - - private SmimeInfo makeFakeInsertResult(String id, boolean isDefault, long expiration) { - SmimeInfo insertResult = new SmimeInfo(); - insertResult.setId(id); - insertResult.setIsDefault(isDefault); - insertResult.setExpiration(expiration); - - return insertResult; - } - - private SmimeInfo makeFakeInsertResult() { - return makeFakeInsertResult("new_certificate_id", false, CURRENT_TIME_MS + 1); - } +public class TestInsertSmimeInfo extends BaseTest { + + private static final long CURRENT_TIME_MS = 1234567890; + @Rule + public MockitoRule mockitoRule = MockitoJUnit.rule(); + @Mock + private Gmail mockService; + @Mock + private Gmail.Users mockUsers; + @Mock + private Gmail.Users.Settings mockSettings; + @Mock + private Gmail.Users.Settings.SendAs mockSendAs; + @Mock + private Gmail.Users.Settings.SendAs.SmimeInfo mockSmimeInfo; + @Mock + private Gmail.Users.Settings.SendAs.SmimeInfo.Delete mockDelete; + @Mock + private Gmail.Users.Settings.SendAs.SmimeInfo.Get mockGet; + @Mock + private Gmail.Users.Settings.SendAs.SmimeInfo.Insert mockInsert; + @Mock + private Gmail.Users.Settings.SendAs.SmimeInfo.List mockList; + @Mock + private Gmail.Users.Settings.SendAs.SmimeInfo.SetDefault mockSetDefault; + + @Before + public void setup() throws IOException { + when(mockService.users()).thenReturn(mockUsers); + when(mockUsers.settings()).thenReturn(mockSettings); + when(mockSettings.sendAs()).thenReturn(mockSendAs); + when(mockSendAs.smimeInfo()).thenReturn(mockSmimeInfo); + + when(mockSmimeInfo.delete(any(), any(), any())).thenReturn(mockDelete); + when(mockSmimeInfo.get(any(), any(), any())).thenReturn(mockGet); + when(mockSmimeInfo.insert(any(), any(), any())).thenReturn(mockInsert); + when(mockSmimeInfo.list(any(), any())).thenReturn(mockList); + when(mockSmimeInfo.setDefault(any(), any(), any())).thenReturn(mockSetDefault); + } + + @Test + public void testInsertSmimeInfo() throws IOException { + SmimeInfo insertResult = makeFakeInsertResult(); + when(mockInsert.execute()).thenReturn(insertResult); + + SmimeInfo smimeInfo = CreateSmimeInfo.createSmimeInfo("files/cert.p12", + null /* password */); + SmimeInfo result = InsertSmimeInfo.insertSmimeInfo(TEST_USER, + TEST_USER, + smimeInfo); + verifySmimeApiCalled(1); + verify(mockSmimeInfo).insert(eq(TEST_USER), eq(TEST_USER), eq(smimeInfo)); + verify(mockInsert).execute(); + + assertEquals(insertResult, result); + } + + @Test + public void testInsertSmimeInfoError() throws IOException { + when(mockInsert.execute()).thenThrow(IOException.class); + + SmimeInfo smimeInfo = CreateSmimeInfo.createSmimeInfo("files/cert.p12", + null /* password */); + SmimeInfo result = InsertSmimeInfo.insertSmimeInfo(TEST_USER, + TEST_USER, smimeInfo); + + verifySmimeApiCalled(1); + verify(mockSmimeInfo).insert(eq(TEST_USER), eq(TEST_USER), eq(smimeInfo)); + verify(mockInsert).execute(); + + assertNull(result); + } + + private void verifySmimeApiCalled(int numCalls) { + verify(mockService, times(numCalls)).users(); + verify(mockUsers, times(numCalls)).settings(); + verify(mockSettings, times(numCalls)).sendAs(); + verify(mockSendAs, times(numCalls)).smimeInfo(); + } + + private SmimeInfo makeFakeInsertResult(String id, boolean isDefault, long expiration) { + SmimeInfo insertResult = new SmimeInfo(); + insertResult.setId(id); + insertResult.setIsDefault(isDefault); + insertResult.setExpiration(expiration); + + return insertResult; + } + + private SmimeInfo makeFakeInsertResult() { + return makeFakeInsertResult("new_certificate_id", false, CURRENT_TIME_MS + 1); + } } diff --git a/gmail/snippets/src/test/java/TestSendMessage.java b/gmail/snippets/src/test/java/TestSendMessage.java index 2bde312c..e915a244 100644 --- a/gmail/snippets/src/test/java/TestSendMessage.java +++ b/gmail/snippets/src/test/java/TestSendMessage.java @@ -12,19 +12,20 @@ // See the License for the specific language governing permissions and // limitations under the License. +import static org.junit.Assert.assertNotNull; + import com.google.api.services.gmail.model.Message; -import org.junit.Test; -import javax.mail.MessagingException; import java.io.IOException; -import static org.junit.Assert.assertNotNull; +import javax.mail.MessagingException; +import org.junit.Test; // Unit testcase for gmail send email snippet -public class TestSendMessage extends BaseTest{ +public class TestSendMessage extends BaseTest { - @Test - public void testSendEmail() throws MessagingException, IOException { - Message message = SendMessage.sendEmail(RECIPIENT, TEST_USER); - assertNotNull(message); - this.service.users().messages().delete("me", message.getId()).execute(); - } + @Test + public void testSendEmail() throws MessagingException, IOException { + Message message = SendMessage.sendEmail(RECIPIENT, TEST_USER); + assertNotNull(message); + this.service.users().messages().delete("me", message.getId()).execute(); + } } diff --git a/gmail/snippets/src/test/java/TestSendMessageWithAttachment.java b/gmail/snippets/src/test/java/TestSendMessageWithAttachment.java index 56161969..8c428982 100644 --- a/gmail/snippets/src/test/java/TestSendMessageWithAttachment.java +++ b/gmail/snippets/src/test/java/TestSendMessageWithAttachment.java @@ -12,23 +12,24 @@ // See the License for the specific language governing permissions and // limitations under the License. +import static org.junit.Assert.assertNotNull; + import com.google.api.services.gmail.model.Message; -import org.junit.Test; -import javax.mail.MessagingException; import java.io.File; import java.io.IOException; -import static org.junit.Assert.assertNotNull; +import javax.mail.MessagingException; +import org.junit.Test; // Unit testcase for gmail send email with attachment snippet -public class TestSendMessageWithAttachment extends BaseTest{ +public class TestSendMessageWithAttachment extends BaseTest { - @Test - public void testSendEmailWithAttachment() throws MessagingException, - IOException{ - Message message = SendMessageWithAttachment.sendEmailWithAttachment(RECIPIENT, - TEST_USER, - new File("files/photo.jpg")); - assertNotNull(message); - this.service.users().messages().delete("me", message.getId()).execute(); - } + @Test + public void testSendEmailWithAttachment() throws MessagingException, + IOException { + Message message = SendMessageWithAttachment.sendEmailWithAttachment(RECIPIENT, + TEST_USER, + new File("files/photo.jpg")); + assertNotNull(message); + this.service.users().messages().delete("me", message.getId()).execute(); + } } diff --git a/gmail/snippets/src/test/java/TestUpdateSignature.java b/gmail/snippets/src/test/java/TestUpdateSignature.java index 43f0559e..809da2a8 100644 --- a/gmail/snippets/src/test/java/TestUpdateSignature.java +++ b/gmail/snippets/src/test/java/TestUpdateSignature.java @@ -13,16 +13,17 @@ // limitations under the License. -import org.junit.Test; -import java.io.IOException; import static org.junit.Assert.assertEquals; +import java.io.IOException; +import org.junit.Test; + // Unit testcase for gmail update signature snippet public class TestUpdateSignature extends BaseTest { - @Test - public void testUpdateGmailSignature() throws IOException { - String signature = UpdateSignature.updateGmailSignature(); - assertEquals("Automated Signature", signature); - } + @Test + public void testUpdateGmailSignature() throws IOException { + String signature = UpdateSignature.updateGmailSignature(); + assertEquals("Automated Signature", signature); + } } \ No newline at end of file diff --git a/gmail/snippets/src/test/java/TestUpdateSmimeCerts.java b/gmail/snippets/src/test/java/TestUpdateSmimeCerts.java index c66ebb57..0808062b 100644 --- a/gmail/snippets/src/test/java/TestUpdateSmimeCerts.java +++ b/gmail/snippets/src/test/java/TestUpdateSmimeCerts.java @@ -12,16 +12,17 @@ // See the License for the specific language governing permissions and // limitations under the License. +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNull; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + import com.google.api.services.gmail.Gmail; import com.google.api.services.gmail.model.ListSmimeInfoResponse; import com.google.api.services.gmail.model.SmimeInfo; -import org.junit.Before; -import org.junit.Rule; -import org.junit.Test; -import org.mockito.Mock; -import org.mockito.junit.MockitoJUnit; -import org.mockito.junit.MockitoRule; - import java.io.IOException; import java.time.Instant; import java.time.LocalDateTime; @@ -29,242 +30,250 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.List; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNull; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.ArgumentMatchers.eq; -import static org.mockito.Mockito.*; +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.mockito.Mock; +import org.mockito.junit.MockitoJUnit; +import org.mockito.junit.MockitoRule; // Unit testcase for gmail update smime certs snippet -public class TestUpdateSmimeCerts extends BaseTest{ - - private static final long CURRENT_TIME_MS = 1234567890; - private static final LocalDateTime CURRENT_TIME = - LocalDateTime.ofInstant(Instant.ofEpochMilli(CURRENT_TIME_MS), ZoneId.systemDefault()); - @Mock - private Gmail mockService; - @Mock private Gmail.Users mockUsers; - @Mock private Gmail.Users.Settings mockSettings; - @Mock private Gmail.Users.Settings.SendAs mockSendAs; - @Mock private Gmail.Users.Settings.SendAs.SmimeInfo mockSmimeInfo; - @Mock private Gmail.Users.Settings.SendAs.SmimeInfo.Delete mockDelete; - @Mock private Gmail.Users.Settings.SendAs.SmimeInfo.Get mockGet; - @Mock private Gmail.Users.Settings.SendAs.SmimeInfo.Insert mockInsert; - @Mock private Gmail.Users.Settings.SendAs.SmimeInfo.List mockList; - @Mock private Gmail.Users.Settings.SendAs.SmimeInfo.SetDefault mockSetDefault; - - @Rule - public MockitoRule mockitoRule = MockitoJUnit.rule(); - - @Before - public void setup() throws IOException { - when(mockService.users()).thenReturn(mockUsers); - when(mockUsers.settings()).thenReturn(mockSettings); - when(mockSettings.sendAs()).thenReturn(mockSendAs); - when(mockSendAs.smimeInfo()).thenReturn(mockSmimeInfo); - - when(mockSmimeInfo.delete(any(), any(), any())).thenReturn(mockDelete); - when(mockSmimeInfo.get(any(), any(), any())).thenReturn(mockGet); - when(mockSmimeInfo.insert(any(), any(), any())).thenReturn(mockInsert); - when(mockSmimeInfo.list(any(), any())).thenReturn(mockList); - when(mockSmimeInfo.setDefault(any(), any(), any())).thenReturn(mockSetDefault); +public class TestUpdateSmimeCerts extends BaseTest { + + private static final long CURRENT_TIME_MS = 1234567890; + private static final LocalDateTime CURRENT_TIME = + LocalDateTime.ofInstant(Instant.ofEpochMilli(CURRENT_TIME_MS), ZoneId.systemDefault()); + @Rule + public MockitoRule mockitoRule = MockitoJUnit.rule(); + @Mock + private Gmail mockService; + @Mock + private Gmail.Users mockUsers; + @Mock + private Gmail.Users.Settings mockSettings; + @Mock + private Gmail.Users.Settings.SendAs mockSendAs; + @Mock + private Gmail.Users.Settings.SendAs.SmimeInfo mockSmimeInfo; + @Mock + private Gmail.Users.Settings.SendAs.SmimeInfo.Delete mockDelete; + @Mock + private Gmail.Users.Settings.SendAs.SmimeInfo.Get mockGet; + @Mock + private Gmail.Users.Settings.SendAs.SmimeInfo.Insert mockInsert; + @Mock + private Gmail.Users.Settings.SendAs.SmimeInfo.List mockList; + @Mock + private Gmail.Users.Settings.SendAs.SmimeInfo.SetDefault mockSetDefault; + + @Before + public void setup() throws IOException { + when(mockService.users()).thenReturn(mockUsers); + when(mockUsers.settings()).thenReturn(mockSettings); + when(mockSettings.sendAs()).thenReturn(mockSendAs); + when(mockSendAs.smimeInfo()).thenReturn(mockSmimeInfo); + + when(mockSmimeInfo.delete(any(), any(), any())).thenReturn(mockDelete); + when(mockSmimeInfo.get(any(), any(), any())).thenReturn(mockGet); + when(mockSmimeInfo.insert(any(), any(), any())).thenReturn(mockInsert); + when(mockSmimeInfo.list(any(), any())).thenReturn(mockList); + when(mockSmimeInfo.setDefault(any(), any(), any())).thenReturn(mockSetDefault); + } + + @Test + public void testUpdateSmimeCertsNoCerts() throws IOException { + when(mockList.execute()).thenReturn(makeFakeListResult()); + + String defaultCertId = UpdateSmimeCerts.updateSmimeCerts(TEST_USER, + TEST_USER, + null /* certFilename */, + null /* certPassword */, + CURRENT_TIME); + + verifySmimeApiCalled(1); + verify(mockSmimeInfo).list(eq(TEST_USER), eq(TEST_USER)); + verify(mockList).execute(); + + assertNull(defaultCertId); + } + + @Test + public void testUpdateSmimeCertsNoCertsUploadNewCert() throws IOException { + when(mockList.execute()).thenReturn(makeFakeListResult()); + when(mockInsert.execute()).thenReturn(makeFakeInsertResult()); + + String defaultCertId = UpdateSmimeCerts.updateSmimeCerts(TEST_USER, + TEST_USER, + "files/cert.p12", + null /* certPassword */, + CURRENT_TIME); + + verifySmimeApiCalled(3); + verify(mockSmimeInfo).list(eq(TEST_USER), eq(TEST_USER)); + verify(mockSmimeInfo).insert(eq(TEST_USER), eq(TEST_USER), any()); + verify(mockSmimeInfo).setDefault(eq(TEST_USER), eq(TEST_USER), eq("new_certificate_id")); + verify(mockList).execute(); + verify(mockInsert).execute(); + verify(mockSetDefault).execute(); + + assertEquals(defaultCertId, "new_certificate_id"); + } + + @Test + public void testUpdateSmimeCertsValidDefaultCertNoUpload() throws IOException { + ListSmimeInfoResponse listResponse = + makeFakeListResult(Arrays.asList(true), Arrays.asList(CURRENT_TIME_MS + 1)); + when(mockList.execute()).thenReturn(listResponse); + + String defaultCertId = UpdateSmimeCerts.updateSmimeCerts(TEST_USER, + TEST_USER, + "files/cert.p12", + null /* certPassword */, + CURRENT_TIME); + + verifySmimeApiCalled(1); + verify(mockSmimeInfo).list(eq(TEST_USER), eq(TEST_USER)); + verify(mockList).execute(); + + assertEquals(defaultCertId, "existing_certificate_id0"); + } + + @Test + public void testUpdateSmimeCertsExpiredDefaultCertUploadNewCert() throws IOException { + LocalDateTime expireTime = + LocalDateTime.ofInstant(Instant.ofEpochMilli(CURRENT_TIME_MS + 2), ZoneId.systemDefault()); + ListSmimeInfoResponse listResponse = + makeFakeListResult(Arrays.asList(true), Arrays.asList(CURRENT_TIME_MS + 1)); + when(mockList.execute()).thenReturn(listResponse); + + when(mockInsert.execute()).thenReturn(makeFakeInsertResult()); + + String defaultCertId = UpdateSmimeCerts.updateSmimeCerts(TEST_USER, + TEST_USER, + "files/cert.p12", + null /* certPassword */, + expireTime); + + verifySmimeApiCalled(3); + verify(mockSmimeInfo).list(eq(TEST_USER), eq(TEST_USER)); + verify(mockSmimeInfo).insert(eq(TEST_USER), eq(TEST_USER), any()); + verify(mockSmimeInfo).setDefault(eq(TEST_USER), eq(TEST_USER), eq("new_certificate_id")); + verify(mockList).execute(); + verify(mockInsert).execute(); + verify(mockSetDefault).execute(); + + assertEquals(defaultCertId, "new_certificate_id"); + } + + @Test + public void testUpdateSmimeCertsExpiredDefaultCertOtherCertNewDefault() throws IOException { + ListSmimeInfoResponse listResponse = + makeFakeListResult( + Arrays.asList(true, false), Arrays.asList(CURRENT_TIME_MS - 1, CURRENT_TIME_MS + 1)); + when(mockList.execute()).thenReturn(listResponse); + + String defaultCertId = UpdateSmimeCerts.updateSmimeCerts(TEST_USER, + TEST_USER, + "files/cert.p12", + null /* certPassword */, + CURRENT_TIME); + + verifySmimeApiCalled(2); + verify(mockSmimeInfo).list(eq(TEST_USER), eq(TEST_USER)); + verify(mockSmimeInfo).setDefault(eq(TEST_USER), eq(TEST_USER), eq("existing_certificate_id1")); + verify(mockList).execute(); + verify(mockSetDefault).execute(); + + assertEquals(defaultCertId, "existing_certificate_id1"); + } + + @Test + public void testUpdateSmimeCertsNoCertsNoDefaultsChooseBestCertAsNewDefault() throws IOException { + ListSmimeInfoResponse listResponse = + makeFakeListResult( + Arrays.asList(false, false, false, false), + Arrays.asList( + CURRENT_TIME_MS + 2, + CURRENT_TIME_MS + 1, + CURRENT_TIME_MS + 4, + CURRENT_TIME_MS + 3)); + when(mockList.execute()).thenReturn(listResponse); + + String defaultCertId = UpdateSmimeCerts.updateSmimeCerts(TEST_USER, + TEST_USER, + "files/cert.p12", + null /* certPassword */, + CURRENT_TIME); + + verifySmimeApiCalled(2); + verify(mockSmimeInfo).list(eq(TEST_USER), eq(TEST_USER)); + verify(mockSmimeInfo).setDefault(eq(TEST_USER), eq(TEST_USER), eq("existing_certificate_id2")); + verify(mockList).execute(); + verify(mockSetDefault).execute(); + + assertEquals(defaultCertId, "existing_certificate_id2"); + } + + @Test + public void testUpdateSmimeCertsError() throws IOException { + when(mockList.execute()).thenThrow(IOException.class); + + String defaultCertId = + UpdateSmimeCerts.updateSmimeCerts(TEST_USER, + TEST_USER, + "files/cert.p12", + null /* certPassword */, + CURRENT_TIME); + + verifySmimeApiCalled(1); + verify(mockSmimeInfo).list(eq(TEST_USER), eq(TEST_USER)); + verify(mockList).execute(); + + assertNull(defaultCertId); + } + + private void verifySmimeApiCalled(int numCalls) { + verify(mockService, times(numCalls)).users(); + verify(mockUsers, times(numCalls)).settings(); + verify(mockSettings, times(numCalls)).sendAs(); + verify(mockSendAs, times(numCalls)).smimeInfo(); + } + + private ListSmimeInfoResponse makeFakeListResult(List isDefault, List expiration) { + ListSmimeInfoResponse listResponse = new ListSmimeInfoResponse(); + if (isDefault == null || expiration == null) { + return listResponse; } - @Test - public void testUpdateSmimeCertsNoCerts() throws IOException { - when(mockList.execute()).thenReturn(makeFakeListResult()); - - String defaultCertId = UpdateSmimeCerts.updateSmimeCerts(TEST_USER, - TEST_USER, - null /* certFilename */, - null /* certPassword */, - CURRENT_TIME); - - verifySmimeApiCalled(1); - verify(mockSmimeInfo).list(eq(TEST_USER), eq(TEST_USER)); - verify(mockList).execute(); + assertEquals(isDefault.size(), expiration.size()); - assertNull(defaultCertId); + List smimeInfoList = new ArrayList(); + for (int i = 0; i < isDefault.size(); i++) { + SmimeInfo smimeInfo = new SmimeInfo(); + smimeInfo.setId(String.format("existing_certificate_id%d", i)); + smimeInfo.setIsDefault(isDefault.get(i)); + smimeInfo.setExpiration(expiration.get(i)); + smimeInfoList.add(smimeInfo); } + listResponse.setSmimeInfo(smimeInfoList); - @Test - public void testUpdateSmimeCertsNoCertsUploadNewCert() throws IOException { - when(mockList.execute()).thenReturn(makeFakeListResult()); - when(mockInsert.execute()).thenReturn(makeFakeInsertResult()); - - String defaultCertId = UpdateSmimeCerts.updateSmimeCerts(TEST_USER, - TEST_USER, - "files/cert.p12", - null /* certPassword */, - CURRENT_TIME); - - verifySmimeApiCalled(3); - verify(mockSmimeInfo).list(eq(TEST_USER), eq(TEST_USER)); - verify(mockSmimeInfo).insert(eq(TEST_USER), eq(TEST_USER), any()); - verify(mockSmimeInfo).setDefault(eq(TEST_USER), eq(TEST_USER), eq("new_certificate_id")); - verify(mockList).execute(); - verify(mockInsert).execute(); - verify(mockSetDefault).execute(); - - assertEquals(defaultCertId, "new_certificate_id"); - } - - @Test - public void testUpdateSmimeCertsValidDefaultCertNoUpload() throws IOException { - ListSmimeInfoResponse listResponse = - makeFakeListResult(Arrays.asList(true), Arrays.asList(CURRENT_TIME_MS + 1)); - when(mockList.execute()).thenReturn(listResponse); - - String defaultCertId = UpdateSmimeCerts.updateSmimeCerts(TEST_USER, - TEST_USER, - "files/cert.p12", - null /* certPassword */, - CURRENT_TIME); - - verifySmimeApiCalled(1); - verify(mockSmimeInfo).list(eq(TEST_USER), eq(TEST_USER)); - verify(mockList).execute(); - - assertEquals(defaultCertId, "existing_certificate_id0"); - } - - @Test - public void testUpdateSmimeCertsExpiredDefaultCertUploadNewCert() throws IOException { - LocalDateTime expireTime = - LocalDateTime.ofInstant(Instant.ofEpochMilli(CURRENT_TIME_MS + 2), ZoneId.systemDefault()); - ListSmimeInfoResponse listResponse = - makeFakeListResult(Arrays.asList(true), Arrays.asList(CURRENT_TIME_MS + 1)); - when(mockList.execute()).thenReturn(listResponse); - - when(mockInsert.execute()).thenReturn(makeFakeInsertResult()); - - String defaultCertId = UpdateSmimeCerts.updateSmimeCerts(TEST_USER, - TEST_USER, - "files/cert.p12", - null /* certPassword */, - expireTime); - - verifySmimeApiCalled(3); - verify(mockSmimeInfo).list(eq(TEST_USER), eq(TEST_USER)); - verify(mockSmimeInfo).insert(eq(TEST_USER), eq(TEST_USER), any()); - verify(mockSmimeInfo).setDefault(eq(TEST_USER), eq(TEST_USER), eq("new_certificate_id")); - verify(mockList).execute(); - verify(mockInsert).execute(); - verify(mockSetDefault).execute(); - - assertEquals(defaultCertId, "new_certificate_id"); - } - - @Test - public void testUpdateSmimeCertsExpiredDefaultCertOtherCertNewDefault() throws IOException { - ListSmimeInfoResponse listResponse = - makeFakeListResult( - Arrays.asList(true, false), Arrays.asList(CURRENT_TIME_MS - 1, CURRENT_TIME_MS + 1)); - when(mockList.execute()).thenReturn(listResponse); - - String defaultCertId = UpdateSmimeCerts.updateSmimeCerts(TEST_USER, - TEST_USER, - "files/cert.p12", - null /* certPassword */, - CURRENT_TIME); - - verifySmimeApiCalled(2); - verify(mockSmimeInfo).list(eq(TEST_USER), eq(TEST_USER)); - verify(mockSmimeInfo).setDefault(eq(TEST_USER), eq(TEST_USER), eq("existing_certificate_id1")); - verify(mockList).execute(); - verify(mockSetDefault).execute(); - - assertEquals(defaultCertId, "existing_certificate_id1"); - } - - @Test - public void testUpdateSmimeCertsNoCertsNoDefaultsChooseBestCertAsNewDefault() throws IOException { - ListSmimeInfoResponse listResponse = - makeFakeListResult( - Arrays.asList(false, false, false, false), - Arrays.asList( - CURRENT_TIME_MS + 2, - CURRENT_TIME_MS + 1, - CURRENT_TIME_MS + 4, - CURRENT_TIME_MS + 3)); - when(mockList.execute()).thenReturn(listResponse); - - String defaultCertId = UpdateSmimeCerts.updateSmimeCerts(TEST_USER, - TEST_USER, - "files/cert.p12", - null /* certPassword */, - CURRENT_TIME); - - verifySmimeApiCalled(2); - verify(mockSmimeInfo).list(eq(TEST_USER), eq(TEST_USER)); - verify(mockSmimeInfo).setDefault(eq(TEST_USER), eq(TEST_USER), eq("existing_certificate_id2")); - verify(mockList).execute(); - verify(mockSetDefault).execute(); - - assertEquals(defaultCertId, "existing_certificate_id2"); - } + return listResponse; + } - @Test - public void testUpdateSmimeCertsError() throws IOException { - when(mockList.execute()).thenThrow(IOException.class); + private ListSmimeInfoResponse makeFakeListResult() { + return makeFakeListResult(null /* isDefault */, null /* expiration */); + } - String defaultCertId = - UpdateSmimeCerts.updateSmimeCerts(TEST_USER, - TEST_USER, - "files/cert.p12", - null /* certPassword */, - CURRENT_TIME); + private SmimeInfo makeFakeInsertResult(String id, boolean isDefault, long expiration) { + SmimeInfo insertResult = new SmimeInfo(); + insertResult.setId(id); + insertResult.setIsDefault(isDefault); + insertResult.setExpiration(expiration); - verifySmimeApiCalled(1); - verify(mockSmimeInfo).list(eq(TEST_USER), eq(TEST_USER)); - verify(mockList).execute(); + return insertResult; + } - assertNull(defaultCertId); - } - - private void verifySmimeApiCalled(int numCalls) { - verify(mockService, times(numCalls)).users(); - verify(mockUsers, times(numCalls)).settings(); - verify(mockSettings, times(numCalls)).sendAs(); - verify(mockSendAs, times(numCalls)).smimeInfo(); - } - - private ListSmimeInfoResponse makeFakeListResult(List isDefault, List expiration) { - ListSmimeInfoResponse listResponse = new ListSmimeInfoResponse(); - if (isDefault == null || expiration == null) { - return listResponse; - } - - assertEquals(isDefault.size(), expiration.size()); - - List smimeInfoList = new ArrayList(); - for (int i = 0; i < isDefault.size(); i++) { - SmimeInfo smimeInfo = new SmimeInfo(); - smimeInfo.setId(String.format("existing_certificate_id%d", i)); - smimeInfo.setIsDefault(isDefault.get(i)); - smimeInfo.setExpiration(expiration.get(i)); - smimeInfoList.add(smimeInfo); - } - listResponse.setSmimeInfo(smimeInfoList); - - return listResponse; - } - - private ListSmimeInfoResponse makeFakeListResult() { - return makeFakeListResult(null /* isDefault */, null /* expiration */); - } - - private SmimeInfo makeFakeInsertResult(String id, boolean isDefault, long expiration) { - SmimeInfo insertResult = new SmimeInfo(); - insertResult.setId(id); - insertResult.setIsDefault(isDefault); - insertResult.setExpiration(expiration); - - return insertResult; - } - - private SmimeInfo makeFakeInsertResult() { - return makeFakeInsertResult("new_certificate_id", false, CURRENT_TIME_MS + 1); - } + private SmimeInfo makeFakeInsertResult() { + return makeFakeInsertResult("new_certificate_id", false, CURRENT_TIME_MS + 1); + } } diff --git a/gmail/snippets/src/test/java/TestUpdateSmimeFromCsv.java b/gmail/snippets/src/test/java/TestUpdateSmimeFromCsv.java index 35bcee1e..6b89e455 100644 --- a/gmail/snippets/src/test/java/TestUpdateSmimeFromCsv.java +++ b/gmail/snippets/src/test/java/TestUpdateSmimeFromCsv.java @@ -12,129 +12,137 @@ // See the License for the specific language governing permissions and // limitations under the License. +import static org.junit.Assert.assertEquals; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + import com.google.api.services.gmail.Gmail; import com.google.api.services.gmail.model.ListSmimeInfoResponse; import com.google.api.services.gmail.model.SmimeInfo; -import org.junit.Before; -import org.junit.Rule; -import org.junit.Test; -import org.mockito.Mock; -import org.mockito.junit.MockitoJUnit; -import org.mockito.junit.MockitoRule; - import java.io.IOException; import java.time.Instant; import java.time.LocalDateTime; import java.time.ZoneId; import java.util.ArrayList; import java.util.List; - -import static org.junit.Assert.assertEquals; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.ArgumentMatchers.eq; -import static org.mockito.Mockito.*; +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.mockito.Mock; +import org.mockito.junit.MockitoJUnit; +import org.mockito.junit.MockitoRule; // Unit testcase for gmail update smime from csv snippet -public class TestUpdateSmimeFromCsv extends BaseTest{ - - private static final long CURRENT_TIME_MS = 1234567890; - private static final LocalDateTime CURRENT_TIME = - LocalDateTime.ofInstant(Instant.ofEpochMilli(CURRENT_TIME_MS), ZoneId.systemDefault()); - - @Mock - private Gmail mockService; - @Mock private Gmail.Users mockUsers; - @Mock private Gmail.Users.Settings mockSettings; - @Mock private Gmail.Users.Settings.SendAs mockSendAs; - @Mock private Gmail.Users.Settings.SendAs.SmimeInfo mockSmimeInfo; - @Mock private Gmail.Users.Settings.SendAs.SmimeInfo.Delete mockDelete; - @Mock private Gmail.Users.Settings.SendAs.SmimeInfo.Get mockGet; - @Mock private Gmail.Users.Settings.SendAs.SmimeInfo.Insert mockInsert; - @Mock private Gmail.Users.Settings.SendAs.SmimeInfo.List mockList; - @Mock private Gmail.Users.Settings.SendAs.SmimeInfo.SetDefault mockSetDefault; - - @Rule - public MockitoRule mockitoRule = MockitoJUnit.rule(); - - @Before - public void setup() throws IOException { - when(mockService.users()).thenReturn(mockUsers); - when(mockUsers.settings()).thenReturn(mockSettings); - when(mockSettings.sendAs()).thenReturn(mockSendAs); - when(mockSendAs.smimeInfo()).thenReturn(mockSmimeInfo); - - when(mockSmimeInfo.delete(any(), any(), any())).thenReturn(mockDelete); - when(mockSmimeInfo.get(any(), any(), any())).thenReturn(mockGet); - when(mockSmimeInfo.insert(any(), any(), any())).thenReturn(mockInsert); - when(mockSmimeInfo.list(any(), any())).thenReturn(mockList); - when(mockSmimeInfo.setDefault(any(), any(), any())).thenReturn(mockSetDefault); +public class TestUpdateSmimeFromCsv extends BaseTest { + + private static final long CURRENT_TIME_MS = 1234567890; + private static final LocalDateTime CURRENT_TIME = + LocalDateTime.ofInstant(Instant.ofEpochMilli(CURRENT_TIME_MS), ZoneId.systemDefault()); + @Rule + public MockitoRule mockitoRule = MockitoJUnit.rule(); + @Mock + private Gmail mockService; + @Mock + private Gmail.Users mockUsers; + @Mock + private Gmail.Users.Settings mockSettings; + @Mock + private Gmail.Users.Settings.SendAs mockSendAs; + @Mock + private Gmail.Users.Settings.SendAs.SmimeInfo mockSmimeInfo; + @Mock + private Gmail.Users.Settings.SendAs.SmimeInfo.Delete mockDelete; + @Mock + private Gmail.Users.Settings.SendAs.SmimeInfo.Get mockGet; + @Mock + private Gmail.Users.Settings.SendAs.SmimeInfo.Insert mockInsert; + @Mock + private Gmail.Users.Settings.SendAs.SmimeInfo.List mockList; + @Mock + private Gmail.Users.Settings.SendAs.SmimeInfo.SetDefault mockSetDefault; + + @Before + public void setup() throws IOException { + when(mockService.users()).thenReturn(mockUsers); + when(mockUsers.settings()).thenReturn(mockSettings); + when(mockSettings.sendAs()).thenReturn(mockSendAs); + when(mockSendAs.smimeInfo()).thenReturn(mockSmimeInfo); + + when(mockSmimeInfo.delete(any(), any(), any())).thenReturn(mockDelete); + when(mockSmimeInfo.get(any(), any(), any())).thenReturn(mockGet); + when(mockSmimeInfo.insert(any(), any(), any())).thenReturn(mockInsert); + when(mockSmimeInfo.list(any(), any())).thenReturn(mockList); + when(mockSmimeInfo.setDefault(any(), any(), any())).thenReturn(mockSetDefault); + } + + @Test + public void testUpdateSmimeFromCsv() throws IOException { + when(mockList.execute()).thenReturn(makeFakeListResult()); + when(mockInsert.execute()).thenReturn(makeFakeInsertResult()); + + UpdateSmimeFromCsv.updateSmimeFromCsv("files/certs.csv", CURRENT_TIME); + + verifySmimeApiCalled(6); + verify(mockSmimeInfo).list(eq(TEST_USER), eq(TEST_USER)); + verify(mockSmimeInfo).insert(eq(TEST_USER), eq(TEST_USER), any()); + verify(mockSmimeInfo) + .setDefault(eq(TEST_USER), eq(TEST_USER), eq("new_certificate_id")); + verify(mockList, times(2)).execute(); + verify(mockInsert, times(2)).execute(); + verify(mockSetDefault, times(2)).execute(); + } + + @Test + public void testUpdateSmimeFromCsvFails() { + InsertCertFromCsv.insertCertFromCsv("files/notfound.csv"); + // tearDown() verifies that there were no interactions with the API. + } + + private void verifySmimeApiCalled(int numCalls) { + verify(mockService, times(numCalls)).users(); + verify(mockUsers, times(numCalls)).settings(); + verify(mockSettings, times(numCalls)).sendAs(); + verify(mockSendAs, times(numCalls)).smimeInfo(); + } + + private ListSmimeInfoResponse makeFakeListResult(List isDefault, List expiration) { + ListSmimeInfoResponse listResponse = new ListSmimeInfoResponse(); + if (isDefault == null || expiration == null) { + return listResponse; } - @Test - public void testUpdateSmimeFromCsv() throws IOException { - when(mockList.execute()).thenReturn(makeFakeListResult()); - when(mockInsert.execute()).thenReturn(makeFakeInsertResult()); - - UpdateSmimeFromCsv.updateSmimeFromCsv("files/certs.csv", CURRENT_TIME); - - verifySmimeApiCalled(6); - verify(mockSmimeInfo).list(eq(TEST_USER), eq(TEST_USER)); - verify(mockSmimeInfo).insert(eq(TEST_USER), eq(TEST_USER), any()); - verify(mockSmimeInfo) - .setDefault(eq(TEST_USER), eq(TEST_USER), eq("new_certificate_id")); - verify(mockList, times(2)).execute(); - verify(mockInsert, times(2)).execute(); - verify(mockSetDefault, times(2)).execute(); - } + assertEquals(isDefault.size(), expiration.size()); - @Test - public void testUpdateSmimeFromCsvFails() { - InsertCertFromCsv.insertCertFromCsv("files/notfound.csv"); - // tearDown() verifies that there were no interactions with the API. + List smimeInfoList = new ArrayList<>(); + for (int i = 0; i < isDefault.size(); i++) { + SmimeInfo smimeInfo = new SmimeInfo(); + smimeInfo.setId(String.format("existing_certificate_id%d", i)); + smimeInfo.setIsDefault(isDefault.get(i)); + smimeInfo.setExpiration(expiration.get(i)); + smimeInfoList.add(smimeInfo); } + listResponse.setSmimeInfo(smimeInfoList); - private void verifySmimeApiCalled(int numCalls) { - verify(mockService, times(numCalls)).users(); - verify(mockUsers, times(numCalls)).settings(); - verify(mockSettings, times(numCalls)).sendAs(); - verify(mockSendAs, times(numCalls)).smimeInfo(); - } + return listResponse; + } - private ListSmimeInfoResponse makeFakeListResult(List isDefault, List expiration) { - ListSmimeInfoResponse listResponse = new ListSmimeInfoResponse(); - if (isDefault == null || expiration == null) { - return listResponse; - } - - assertEquals(isDefault.size(), expiration.size()); - - List smimeInfoList = new ArrayList<>(); - for (int i = 0; i < isDefault.size(); i++) { - SmimeInfo smimeInfo = new SmimeInfo(); - smimeInfo.setId(String.format("existing_certificate_id%d", i)); - smimeInfo.setIsDefault(isDefault.get(i)); - smimeInfo.setExpiration(expiration.get(i)); - smimeInfoList.add(smimeInfo); - } - listResponse.setSmimeInfo(smimeInfoList); - - return listResponse; - } + private ListSmimeInfoResponse makeFakeListResult() { + return makeFakeListResult(null /* isDefault */, null /* expiration */); + } - private ListSmimeInfoResponse makeFakeListResult() { - return makeFakeListResult(null /* isDefault */, null /* expiration */); - } + private SmimeInfo makeFakeInsertResult(String id, boolean isDefault, long expiration) { + SmimeInfo insertResult = new SmimeInfo(); + insertResult.setId(id); + insertResult.setIsDefault(isDefault); + insertResult.setExpiration(expiration); - private SmimeInfo makeFakeInsertResult(String id, boolean isDefault, long expiration) { - SmimeInfo insertResult = new SmimeInfo(); - insertResult.setId(id); - insertResult.setIsDefault(isDefault); - insertResult.setExpiration(expiration); + return insertResult; + } - return insertResult; - } - - private SmimeInfo makeFakeInsertResult() { - return makeFakeInsertResult("new_certificate_id", false, CURRENT_TIME_MS + 1); - } + private SmimeInfo makeFakeInsertResult() { + return makeFakeInsertResult("new_certificate_id", false, CURRENT_TIME_MS + 1); + } } diff --git a/people/quickstart/src/main/java/PeopleQuickstart.java b/people/quickstart/src/main/java/PeopleQuickstart.java index a0301f2d..dcbc81f9 100644 --- a/people/quickstart/src/main/java/PeopleQuickstart.java +++ b/people/quickstart/src/main/java/PeopleQuickstart.java @@ -13,6 +13,7 @@ // limitations under the License. // [START people_quickstart] + import com.google.api.client.auth.oauth2.Credential; import com.google.api.client.extensions.java6.auth.oauth2.AuthorizationCodeInstalledApp; import com.google.api.client.extensions.jetty.auth.oauth2.LocalServerReceiver; @@ -38,70 +39,74 @@ import java.util.List; public class PeopleQuickstart { - private static final String APPLICATION_NAME = "Google People API Java Quickstart"; - private static final JsonFactory JSON_FACTORY = GsonFactory.getDefaultInstance(); - private static final String TOKENS_DIRECTORY_PATH = "tokens"; - - /** - * Global instance of the scopes required by this quickstart. - * If modifying these scopes, delete your previously saved tokens/ folder. - */ - private static final List SCOPES = Arrays.asList(PeopleServiceScopes.CONTACTS_READONLY); - private static final String CREDENTIALS_FILE_PATH = "/credentials.json"; + private static final String APPLICATION_NAME = "Google People API Java Quickstart"; + private static final JsonFactory JSON_FACTORY = GsonFactory.getDefaultInstance(); + private static final String TOKENS_DIRECTORY_PATH = "tokens"; - /** - * Creates an authorized Credential object. - * @param HTTP_TRANSPORT The network HTTP Transport. - * @return An authorized Credential object. - * @throws IOException If the credentials.json file cannot be found. - */ - private static Credential getCredentials(final NetHttpTransport HTTP_TRANSPORT) throws IOException { - // Load client secrets. - InputStream in = PeopleQuickstart.class.getResourceAsStream(CREDENTIALS_FILE_PATH); - if (in == null) { - throw new FileNotFoundException("Resource not found: " + CREDENTIALS_FILE_PATH); - } - GoogleClientSecrets clientSecrets = GoogleClientSecrets.load(JSON_FACTORY, new InputStreamReader(in)); + /** + * Global instance of the scopes required by this quickstart. + * If modifying these scopes, delete your previously saved tokens/ folder. + */ + private static final List SCOPES = Arrays.asList(PeopleServiceScopes.CONTACTS_READONLY); + private static final String CREDENTIALS_FILE_PATH = "/credentials.json"; - // Build flow and trigger user authorization request. - GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow.Builder( - HTTP_TRANSPORT, JSON_FACTORY, clientSecrets, SCOPES) - .setDataStoreFactory(new FileDataStoreFactory(new java.io.File(TOKENS_DIRECTORY_PATH))) - .setAccessType("offline") - .build(); - LocalServerReceiver receiver = new LocalServerReceiver.Builder().setPort(8888).build(); - return new AuthorizationCodeInstalledApp(flow, receiver).authorize("user"); + /** + * Creates an authorized Credential object. + * + * @param HTTP_TRANSPORT The network HTTP Transport. + * @return An authorized Credential object. + * @throws IOException If the credentials.json file cannot be found. + */ + private static Credential getCredentials(final NetHttpTransport HTTP_TRANSPORT) + throws IOException { + // Load client secrets. + InputStream in = PeopleQuickstart.class.getResourceAsStream(CREDENTIALS_FILE_PATH); + if (in == null) { + throw new FileNotFoundException("Resource not found: " + CREDENTIALS_FILE_PATH); } + GoogleClientSecrets clientSecrets = + GoogleClientSecrets.load(JSON_FACTORY, new InputStreamReader(in)); + + // Build flow and trigger user authorization request. + GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow.Builder( + HTTP_TRANSPORT, JSON_FACTORY, clientSecrets, SCOPES) + .setDataStoreFactory(new FileDataStoreFactory(new java.io.File(TOKENS_DIRECTORY_PATH))) + .setAccessType("offline") + .build(); + LocalServerReceiver receiver = new LocalServerReceiver.Builder().setPort(8888).build(); + return new AuthorizationCodeInstalledApp(flow, receiver).authorize("user"); + } - public static void main(String... args) throws IOException, GeneralSecurityException { - // Build a new authorized API client service. - final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport(); - PeopleService service = new PeopleService.Builder(HTTP_TRANSPORT, JSON_FACTORY, getCredentials(HTTP_TRANSPORT)) - .setApplicationName(APPLICATION_NAME) - .build(); + public static void main(String... args) throws IOException, GeneralSecurityException { + // Build a new authorized API client service. + final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport(); + PeopleService service = + new PeopleService.Builder(HTTP_TRANSPORT, JSON_FACTORY, getCredentials(HTTP_TRANSPORT)) + .setApplicationName(APPLICATION_NAME) + .build(); - // Request 10 connections. - ListConnectionsResponse response = service.people().connections() - .list("people/me") - .setPageSize(10) - .setPersonFields("names,emailAddresses") - .execute(); + // Request 10 connections. + ListConnectionsResponse response = service.people().connections() + .list("people/me") + .setPageSize(10) + .setPersonFields("names,emailAddresses") + .execute(); - // Print display name of connections if available. - List connections = response.getConnections(); - if (connections != null && connections.size() > 0) { - for (Person person : connections) { - List names = person.getNames(); - if (names != null && names.size() > 0) { - System.out.println("Name: " + person.getNames().get(0) - .getDisplayName()); - } else { - System.out.println("No names available for connection."); - } - } + // Print display name of connections if available. + List connections = response.getConnections(); + if (connections != null && connections.size() > 0) { + for (Person person : connections) { + List names = person.getNames(); + if (names != null && names.size() > 0) { + System.out.println("Name: " + person.getNames().get(0) + .getDisplayName()); } else { - System.out.println("No connections found."); + System.out.println("No names available for connection."); } + } + } else { + System.out.println("No connections found."); } + } } // [END people_quickstart] diff --git a/sheets/quickstart/src/main/java/SheetsQuickstart.java b/sheets/quickstart/src/main/java/SheetsQuickstart.java index e7d04d4c..10eef669 100644 --- a/sheets/quickstart/src/main/java/SheetsQuickstart.java +++ b/sheets/quickstart/src/main/java/SheetsQuickstart.java @@ -13,6 +13,7 @@ // limitations under the License. // [START sheets_quickstart] + import com.google.api.client.auth.oauth2.Credential; import com.google.api.client.extensions.java6.auth.oauth2.AuthorizationCodeInstalledApp; import com.google.api.client.extensions.jetty.auth.oauth2.LocalServerReceiver; @@ -26,7 +27,6 @@ import com.google.api.services.sheets.v4.Sheets; import com.google.api.services.sheets.v4.SheetsScopes; import com.google.api.services.sheets.v4.model.ValueRange; - import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; @@ -36,66 +36,71 @@ import java.util.List; public class SheetsQuickstart { - private static final String APPLICATION_NAME = "Google Sheets API Java Quickstart"; - private static final JsonFactory JSON_FACTORY = GsonFactory.getDefaultInstance(); - private static final String TOKENS_DIRECTORY_PATH = "tokens"; + private static final String APPLICATION_NAME = "Google Sheets API Java Quickstart"; + private static final JsonFactory JSON_FACTORY = GsonFactory.getDefaultInstance(); + private static final String TOKENS_DIRECTORY_PATH = "tokens"; - /** - * Global instance of the scopes required by this quickstart. - * If modifying these scopes, delete your previously saved tokens/ folder. - */ - private static final List SCOPES = Collections.singletonList(SheetsScopes.SPREADSHEETS_READONLY); - private static final String CREDENTIALS_FILE_PATH = "/credentials.json"; + /** + * Global instance of the scopes required by this quickstart. + * If modifying these scopes, delete your previously saved tokens/ folder. + */ + private static final List SCOPES = + Collections.singletonList(SheetsScopes.SPREADSHEETS_READONLY); + private static final String CREDENTIALS_FILE_PATH = "/credentials.json"; - /** - * Creates an authorized Credential object. - * @param HTTP_TRANSPORT The network HTTP Transport. - * @return An authorized Credential object. - * @throws IOException If the credentials.json file cannot be found. - */ - private static Credential getCredentials(final NetHttpTransport HTTP_TRANSPORT) throws IOException { - // Load client secrets. - InputStream in = SheetsQuickstart.class.getResourceAsStream(CREDENTIALS_FILE_PATH); - if (in == null) { - throw new FileNotFoundException("Resource not found: " + CREDENTIALS_FILE_PATH); - } - GoogleClientSecrets clientSecrets = GoogleClientSecrets.load(JSON_FACTORY, new InputStreamReader(in)); - - // Build flow and trigger user authorization request. - GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow.Builder( - HTTP_TRANSPORT, JSON_FACTORY, clientSecrets, SCOPES) - .setDataStoreFactory(new FileDataStoreFactory(new java.io.File(TOKENS_DIRECTORY_PATH))) - .setAccessType("offline") - .build(); - LocalServerReceiver receiver = new LocalServerReceiver.Builder().setPort(8888).build(); - return new AuthorizationCodeInstalledApp(flow, receiver).authorize("user"); + /** + * Creates an authorized Credential object. + * + * @param HTTP_TRANSPORT The network HTTP Transport. + * @return An authorized Credential object. + * @throws IOException If the credentials.json file cannot be found. + */ + private static Credential getCredentials(final NetHttpTransport HTTP_TRANSPORT) + throws IOException { + // Load client secrets. + InputStream in = SheetsQuickstart.class.getResourceAsStream(CREDENTIALS_FILE_PATH); + if (in == null) { + throw new FileNotFoundException("Resource not found: " + CREDENTIALS_FILE_PATH); } + GoogleClientSecrets clientSecrets = + GoogleClientSecrets.load(JSON_FACTORY, new InputStreamReader(in)); + + // Build flow and trigger user authorization request. + GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow.Builder( + HTTP_TRANSPORT, JSON_FACTORY, clientSecrets, SCOPES) + .setDataStoreFactory(new FileDataStoreFactory(new java.io.File(TOKENS_DIRECTORY_PATH))) + .setAccessType("offline") + .build(); + LocalServerReceiver receiver = new LocalServerReceiver.Builder().setPort(8888).build(); + return new AuthorizationCodeInstalledApp(flow, receiver).authorize("user"); + } - /** - * Prints the names and majors of students in a sample spreadsheet: - * https://docs.google.com/spreadsheets/d/1BxiMVs0XRA5nFMdKvBdBZjgmUUqptlbs74OgvE2upms/edit - */ - public static void main(String... args) throws IOException, GeneralSecurityException { - // Build a new authorized API client service. - final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport(); - final String spreadsheetId = "1BxiMVs0XRA5nFMdKvBdBZjgmUUqptlbs74OgvE2upms"; - final String range = "Class Data!A2:E"; - Sheets service = new Sheets.Builder(HTTP_TRANSPORT, JSON_FACTORY, getCredentials(HTTP_TRANSPORT)) - .setApplicationName(APPLICATION_NAME) - .build(); - ValueRange response = service.spreadsheets().values() - .get(spreadsheetId, range) - .execute(); - List> values = response.getValues(); - if (values == null || values.isEmpty()) { - System.out.println("No data found."); - } else { - System.out.println("Name, Major"); - for (List row : values) { - // Print columns A and E, which correspond to indices 0 and 4. - System.out.printf("%s, %s\n", row.get(0), row.get(4)); - } - } + /** + * Prints the names and majors of students in a sample spreadsheet: + * https://docs.google.com/spreadsheets/d/1BxiMVs0XRA5nFMdKvBdBZjgmUUqptlbs74OgvE2upms/edit + */ + public static void main(String... args) throws IOException, GeneralSecurityException { + // Build a new authorized API client service. + final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport(); + final String spreadsheetId = "1BxiMVs0XRA5nFMdKvBdBZjgmUUqptlbs74OgvE2upms"; + final String range = "Class Data!A2:E"; + Sheets service = + new Sheets.Builder(HTTP_TRANSPORT, JSON_FACTORY, getCredentials(HTTP_TRANSPORT)) + .setApplicationName(APPLICATION_NAME) + .build(); + ValueRange response = service.spreadsheets().values() + .get(spreadsheetId, range) + .execute(); + List> values = response.getValues(); + if (values == null || values.isEmpty()) { + System.out.println("No data found."); + } else { + System.out.println("Name, Major"); + for (List row : values) { + // Print columns A and E, which correspond to indices 0 and 4. + System.out.printf("%s, %s\n", row.get(0), row.get(4)); + } } + } } // [END sheets_quickstart] diff --git a/sheets/snippets/src/main/java/AppendValues.java b/sheets/snippets/src/main/java/AppendValues.java index c5d023a0..5da38dd1 100644 --- a/sheets/snippets/src/main/java/AppendValues.java +++ b/sheets/snippets/src/main/java/AppendValues.java @@ -14,6 +14,7 @@ // [START sheets_append_values] + import com.google.api.client.googleapis.json.GoogleJsonError; import com.google.api.client.googleapis.json.GoogleJsonResponseException; import com.google.api.client.http.HttpRequestInitializer; @@ -25,63 +26,62 @@ import com.google.api.services.sheets.v4.model.ValueRange; import com.google.auth.http.HttpCredentialsAdapter; import com.google.auth.oauth2.GoogleCredentials; - import java.io.IOException; import java.util.Collections; import java.util.List; /* Class to demonstrate the use of Spreadsheet Append Values API */ public class AppendValues { - /** - * Appends values to a spreadsheet. - * - * @param spreadsheetId - Id of the spreadsheet. - * @param range - Range of cells of the spreadsheet. - * @param valueInputOption - Determines how input data should be interpreted. - * @param values - list of rows of values to input. - * @return spreadsheet with appended values - * @throws IOException - if credentials file not found. - */ - public static AppendValuesResponse appendValues(String spreadsheetId, - String range, - String valueInputOption, - List> values) - throws IOException { + /** + * Appends values to a spreadsheet. + * + * @param spreadsheetId - Id of the spreadsheet. + * @param range - Range of cells of the spreadsheet. + * @param valueInputOption - Determines how input data should be interpreted. + * @param values - list of rows of values to input. + * @return spreadsheet with appended values + * @throws IOException - if credentials file not found. + */ + public static AppendValuesResponse appendValues(String spreadsheetId, + String range, + String valueInputOption, + List> values) + throws IOException { /* Load pre-authorized user credentials from the environment. TODO(developer) - See https://developers.google.com/identity for guides on implementing OAuth2 for your application. */ - GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() - .createScoped(Collections.singleton(SheetsScopes.SPREADSHEETS)); - HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( - credentials); + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Collections.singleton(SheetsScopes.SPREADSHEETS)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); - // Create the sheets API client - Sheets service = new Sheets.Builder(new NetHttpTransport(), - GsonFactory.getDefaultInstance(), - requestInitializer) - .setApplicationName("Sheets samples") - .build(); + // Create the sheets API client + Sheets service = new Sheets.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Sheets samples") + .build(); - AppendValuesResponse result = null; - try { - // Append values to the specified range. - ValueRange body = new ValueRange() - .setValues(values); - result = service.spreadsheets().values().append(spreadsheetId, range, body) - .setValueInputOption(valueInputOption) - .execute(); - // Prints the spreadsheet with appended values. - System.out.printf("%d cells appended.", result.getUpdates().getUpdatedCells()); - } catch (GoogleJsonResponseException e) { - // TODO(developer) - handle error appropriately - GoogleJsonError error = e.getDetails(); - if (error.getCode() == 404) { - System.out.printf("Spreadsheet not found with id '%s'.\n",spreadsheetId); - } else { - throw e; - } - } - return result; + AppendValuesResponse result = null; + try { + // Append values to the specified range. + ValueRange body = new ValueRange() + .setValues(values); + result = service.spreadsheets().values().append(spreadsheetId, range, body) + .setValueInputOption(valueInputOption) + .execute(); + // Prints the spreadsheet with appended values. + System.out.printf("%d cells appended.", result.getUpdates().getUpdatedCells()); + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + GoogleJsonError error = e.getDetails(); + if (error.getCode() == 404) { + System.out.printf("Spreadsheet not found with id '%s'.\n", spreadsheetId); + } else { + throw e; + } } + return result; + } } // [END sheets_append_values] \ No newline at end of file diff --git a/sheets/snippets/src/main/java/BatchGetValues.java b/sheets/snippets/src/main/java/BatchGetValues.java index 21da22d9..1a79a213 100644 --- a/sheets/snippets/src/main/java/BatchGetValues.java +++ b/sheets/snippets/src/main/java/BatchGetValues.java @@ -14,6 +14,7 @@ // [START sheets_batch_get_values] + import com.google.api.client.googleapis.json.GoogleJsonError; import com.google.api.client.googleapis.json.GoogleJsonResponseException; import com.google.api.client.http.HttpRequestInitializer; @@ -24,55 +25,54 @@ import com.google.api.services.sheets.v4.model.BatchGetValuesResponse; import com.google.auth.http.HttpCredentialsAdapter; import com.google.auth.oauth2.GoogleCredentials; - import java.io.IOException; import java.util.Collections; import java.util.List; /* Class to demonstrate the use of Spreadsheet Batch Get Values API */ public class BatchGetValues { - /** - * Returns one or more ranges of values from a spreadsheet. - * - * @param spreadsheetId - Id of the spreadsheet. - * @param ranges - Range of cells of the spreadsheet. - * @return Values in the range - * @throws IOException - if credentials file not found. - */ - public static BatchGetValuesResponse batchGetValues(String spreadsheetId, - List ranges) - throws IOException { + /** + * Returns one or more ranges of values from a spreadsheet. + * + * @param spreadsheetId - Id of the spreadsheet. + * @param ranges - Range of cells of the spreadsheet. + * @return Values in the range + * @throws IOException - if credentials file not found. + */ + public static BatchGetValuesResponse batchGetValues(String spreadsheetId, + List ranges) + throws IOException { /* Load pre-authorized user credentials from the environment. TODO(developer) - See https://developers.google.com/identity for guides on implementing OAuth2 for your application. */ - GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() - .createScoped(Collections.singleton(SheetsScopes.SPREADSHEETS)); - HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( - credentials); + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Collections.singleton(SheetsScopes.SPREADSHEETS)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); - // Create the sheets API client - Sheets service = new Sheets.Builder(new NetHttpTransport(), - GsonFactory.getDefaultInstance(), - requestInitializer) - .setApplicationName("Sheets samples") - .build(); + // Create the sheets API client + Sheets service = new Sheets.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Sheets samples") + .build(); - BatchGetValuesResponse result = null; - try { - // Gets the values of the cells in the specified range. - result = service.spreadsheets().values().batchGet(spreadsheetId) - .setRanges(ranges).execute() ; - System.out.printf("%d ranges retrieved.", result.getValueRanges().size()); - } catch (GoogleJsonResponseException e) { - // TODO(developer) - handle error appropriately - GoogleJsonError error = e.getDetails(); - if (error.getCode() == 404) { - System.out.printf("Spreadsheet not found with id '%s'.\n",spreadsheetId); - } else { - throw e; - } - } - return result; + BatchGetValuesResponse result = null; + try { + // Gets the values of the cells in the specified range. + result = service.spreadsheets().values().batchGet(spreadsheetId) + .setRanges(ranges).execute(); + System.out.printf("%d ranges retrieved.", result.getValueRanges().size()); + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + GoogleJsonError error = e.getDetails(); + if (error.getCode() == 404) { + System.out.printf("Spreadsheet not found with id '%s'.\n", spreadsheetId); + } else { + throw e; + } } + return result; + } } // [END sheets_batch_get_values] \ No newline at end of file diff --git a/sheets/snippets/src/main/java/BatchUpdate.java b/sheets/snippets/src/main/java/BatchUpdate.java index 6e8ac069..5c742500 100644 --- a/sheets/snippets/src/main/java/BatchUpdate.java +++ b/sheets/snippets/src/main/java/BatchUpdate.java @@ -14,6 +14,7 @@ // [START sheets_batch_update] + import com.google.api.client.googleapis.json.GoogleJsonError; import com.google.api.client.googleapis.json.GoogleJsonResponseException; import com.google.api.client.http.HttpRequestInitializer; @@ -21,8 +22,8 @@ import com.google.api.client.json.gson.GsonFactory; import com.google.api.services.sheets.v4.Sheets; import com.google.api.services.sheets.v4.SheetsScopes; -import com.google.api.services.sheets.v4.model.BatchUpdateSpreadsheetResponse; import com.google.api.services.sheets.v4.model.BatchUpdateSpreadsheetRequest; +import com.google.api.services.sheets.v4.model.BatchUpdateSpreadsheetResponse; import com.google.api.services.sheets.v4.model.FindReplaceRequest; import com.google.api.services.sheets.v4.model.FindReplaceResponse; import com.google.api.services.sheets.v4.model.Request; @@ -30,7 +31,6 @@ import com.google.api.services.sheets.v4.model.UpdateSpreadsheetPropertiesRequest; import com.google.auth.http.HttpCredentialsAdapter; import com.google.auth.oauth2.GoogleCredentials; - import java.io.IOException; import java.util.ArrayList; import java.util.Collections; @@ -38,68 +38,68 @@ /* Class to demonstrate the use of Spreadsheet Batch Update API */ public class BatchUpdate { - /** - * Updates spreadsheet's title and cell values. - * - * @param spreadsheetId - Id of the spreadsheet. - * @param title - New title of the spreadsheet. - * @param find - Find cell values - * @param replacement - Replaced cell values - * @return response metadata - * @throws IOException - if credentials file not found. - */ - public static BatchUpdateSpreadsheetResponse batchUpdate(String spreadsheetId, - String title, - String find, - String replacement) - throws IOException { + /** + * Updates spreadsheet's title and cell values. + * + * @param spreadsheetId - Id of the spreadsheet. + * @param title - New title of the spreadsheet. + * @param find - Find cell values + * @param replacement - Replaced cell values + * @return response metadata + * @throws IOException - if credentials file not found. + */ + public static BatchUpdateSpreadsheetResponse batchUpdate(String spreadsheetId, + String title, + String find, + String replacement) + throws IOException { /* Load pre-authorized user credentials from the environment. TODO(developer) - See https://developers.google.com/identity for guides on implementing OAuth2 for your application. */ - GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() - .createScoped(Collections.singleton(SheetsScopes.SPREADSHEETS)); - HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( - credentials); + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Collections.singleton(SheetsScopes.SPREADSHEETS)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); - // Create the sheets API client - Sheets service = new Sheets.Builder(new NetHttpTransport(), - GsonFactory.getDefaultInstance(), - requestInitializer) - .setApplicationName("Sheets samples") - .build(); + // Create the sheets API client + Sheets service = new Sheets.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Sheets samples") + .build(); - List requests = new ArrayList<>(); - BatchUpdateSpreadsheetResponse response = null; - try { - // Change the spreadsheet's title. - requests.add(new Request() - .setUpdateSpreadsheetProperties(new UpdateSpreadsheetPropertiesRequest() - .setProperties(new SpreadsheetProperties() - .setTitle(title)) - .setFields("title"))); - // Find and replace text. - requests.add(new Request() - .setFindReplace(new FindReplaceRequest() - .setFind(find) - .setReplacement(replacement) - .setAllSheets(true))); + List requests = new ArrayList<>(); + BatchUpdateSpreadsheetResponse response = null; + try { + // Change the spreadsheet's title. + requests.add(new Request() + .setUpdateSpreadsheetProperties(new UpdateSpreadsheetPropertiesRequest() + .setProperties(new SpreadsheetProperties() + .setTitle(title)) + .setFields("title"))); + // Find and replace text. + requests.add(new Request() + .setFindReplace(new FindReplaceRequest() + .setFind(find) + .setReplacement(replacement) + .setAllSheets(true))); - BatchUpdateSpreadsheetRequest body = - new BatchUpdateSpreadsheetRequest().setRequests(requests); - response = service.spreadsheets().batchUpdate(spreadsheetId, body).execute(); - FindReplaceResponse findReplaceResponse = response.getReplies().get(1).getFindReplace(); + BatchUpdateSpreadsheetRequest body = + new BatchUpdateSpreadsheetRequest().setRequests(requests); + response = service.spreadsheets().batchUpdate(spreadsheetId, body).execute(); + FindReplaceResponse findReplaceResponse = response.getReplies().get(1).getFindReplace(); - System.out.printf("%d replacements made.", findReplaceResponse.getOccurrencesChanged()); - } catch (GoogleJsonResponseException e) { - // TODO(developer) - handle error appropriately - GoogleJsonError error = e.getDetails(); - if (error.getCode() == 404) { - System.out.printf("Spreadsheet not found with id '%s'.\n",spreadsheetId); - } else { - throw e; - } - } - return response; + System.out.printf("%d replacements made.", findReplaceResponse.getOccurrencesChanged()); + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + GoogleJsonError error = e.getDetails(); + if (error.getCode() == 404) { + System.out.printf("Spreadsheet not found with id '%s'.\n", spreadsheetId); + } else { + throw e; + } } + return response; + } } // [END sheets_batch_update] \ No newline at end of file diff --git a/sheets/snippets/src/main/java/BatchUpdateValues.java b/sheets/snippets/src/main/java/BatchUpdateValues.java index a2a1759c..7ce0306a 100644 --- a/sheets/snippets/src/main/java/BatchUpdateValues.java +++ b/sheets/snippets/src/main/java/BatchUpdateValues.java @@ -14,6 +14,7 @@ // [START sheets_batch_update_values] + import com.google.api.client.googleapis.json.GoogleJsonError; import com.google.api.client.googleapis.json.GoogleJsonResponseException; import com.google.api.client.http.HttpRequestInitializer; @@ -26,7 +27,6 @@ import com.google.api.services.sheets.v4.model.ValueRange; import com.google.auth.http.HttpCredentialsAdapter; import com.google.auth.oauth2.GoogleCredentials; - import java.io.IOException; import java.util.ArrayList; import java.util.Collections; @@ -34,59 +34,59 @@ /* Class to demonstrate the use of Spreadsheet Batch Update Values API */ public class BatchUpdateValues { - /** - * Set values in one or more ranges of spreadsheet. - * - * @param spreadsheetId - Id of the spreadsheet. - * @param range - Range of cells of the spreadsheet. - * @param valueInputOption - Determines how input data should be interpreted. - * @param values - list of rows of values to input. - * @return spreadsheet with updated values - * @throws IOException - if credentials file not found. - */ - public static BatchUpdateValuesResponse batchUpdateValues(String spreadsheetId, - String range, - String valueInputOption, - List> values) - throws IOException { + /** + * Set values in one or more ranges of spreadsheet. + * + * @param spreadsheetId - Id of the spreadsheet. + * @param range - Range of cells of the spreadsheet. + * @param valueInputOption - Determines how input data should be interpreted. + * @param values - list of rows of values to input. + * @return spreadsheet with updated values + * @throws IOException - if credentials file not found. + */ + public static BatchUpdateValuesResponse batchUpdateValues(String spreadsheetId, + String range, + String valueInputOption, + List> values) + throws IOException { /* Load pre-authorized user credentials from the environment. TODO(developer) - See https://developers.google.com/identity for guides on implementing OAuth2 for your application. */ - GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() - .createScoped(Collections.singleton(SheetsScopes.SPREADSHEETS)); - HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( - credentials); + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Collections.singleton(SheetsScopes.SPREADSHEETS)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); - // Create the sheets API client - Sheets service = new Sheets.Builder(new NetHttpTransport(), - GsonFactory.getDefaultInstance(), - requestInitializer) - .setApplicationName("Sheets samples") - .build(); + // Create the sheets API client + Sheets service = new Sheets.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Sheets samples") + .build(); - List data = new ArrayList<>(); - data.add(new ValueRange() - .setRange(range) - .setValues(values)); + List data = new ArrayList<>(); + data.add(new ValueRange() + .setRange(range) + .setValues(values)); - BatchUpdateValuesResponse result = null; - try { - // Updates the values in the specified range. - BatchUpdateValuesRequest body = new BatchUpdateValuesRequest() - .setValueInputOption(valueInputOption) - .setData(data); - result = service.spreadsheets().values().batchUpdate(spreadsheetId, body).execute(); - System.out.printf("%d cells updated.", result.getTotalUpdatedCells()); - } catch (GoogleJsonResponseException e) { - // TODO(developer) - handle error appropriately - GoogleJsonError error = e.getDetails(); - if (error.getCode() == 404) { - System.out.printf("Spreadsheet not found with id '%s'.\n",spreadsheetId); - } else { - throw e; - } - } - return result; + BatchUpdateValuesResponse result = null; + try { + // Updates the values in the specified range. + BatchUpdateValuesRequest body = new BatchUpdateValuesRequest() + .setValueInputOption(valueInputOption) + .setData(data); + result = service.spreadsheets().values().batchUpdate(spreadsheetId, body).execute(); + System.out.printf("%d cells updated.", result.getTotalUpdatedCells()); + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + GoogleJsonError error = e.getDetails(); + if (error.getCode() == 404) { + System.out.printf("Spreadsheet not found with id '%s'.\n", spreadsheetId); + } else { + throw e; + } } + return result; + } } // [END sheets_batch_update_values] \ No newline at end of file diff --git a/sheets/snippets/src/main/java/ConditionalFormatting.java b/sheets/snippets/src/main/java/ConditionalFormatting.java index bae8ef3b..4cecfc76 100644 --- a/sheets/snippets/src/main/java/ConditionalFormatting.java +++ b/sheets/snippets/src/main/java/ConditionalFormatting.java @@ -14,6 +14,7 @@ // [START sheets_conditional_formatting] + import com.google.api.client.googleapis.json.GoogleJsonError; import com.google.api.client.googleapis.json.GoogleJsonResponseException; import com.google.api.client.http.HttpRequestInitializer; @@ -21,10 +22,20 @@ import com.google.api.client.json.gson.GsonFactory; import com.google.api.services.sheets.v4.Sheets; import com.google.api.services.sheets.v4.SheetsScopes; -import com.google.api.services.sheets.v4.model.*; +import com.google.api.services.sheets.v4.model.AddConditionalFormatRuleRequest; +import com.google.api.services.sheets.v4.model.BatchUpdateSpreadsheetRequest; +import com.google.api.services.sheets.v4.model.BatchUpdateSpreadsheetResponse; +import com.google.api.services.sheets.v4.model.BooleanCondition; +import com.google.api.services.sheets.v4.model.BooleanRule; +import com.google.api.services.sheets.v4.model.CellFormat; +import com.google.api.services.sheets.v4.model.Color; +import com.google.api.services.sheets.v4.model.ConditionValue; +import com.google.api.services.sheets.v4.model.ConditionalFormatRule; +import com.google.api.services.sheets.v4.model.GridRange; +import com.google.api.services.sheets.v4.model.Request; +import com.google.api.services.sheets.v4.model.TextFormat; import com.google.auth.http.HttpCredentialsAdapter; import com.google.auth.oauth2.GoogleCredentials; - import java.io.IOException; import java.util.Arrays; import java.util.Collections; @@ -32,97 +43,97 @@ /* Class to demonstrate the use of Spreadsheet Conditional Formatting API */ public class ConditionalFormatting { - /** - * Create conditional formatting. - * - * @param spreadsheetId - Id of the spreadsheet. - * @return updated changes count. - * @throws IOException - if credentials file not found. - */ - public static BatchUpdateSpreadsheetResponse conditionalFormat(String spreadsheetId) - throws IOException { + /** + * Create conditional formatting. + * + * @param spreadsheetId - Id of the spreadsheet. + * @return updated changes count. + * @throws IOException - if credentials file not found. + */ + public static BatchUpdateSpreadsheetResponse conditionalFormat(String spreadsheetId) + throws IOException { /* Load pre-authorized user credentials from the environment. TODO(developer) - See https://developers.google.com/identity for guides on implementing OAuth2 for your application. */ - GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() - .createScoped(Collections.singleton(SheetsScopes.SPREADSHEETS)); - HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( - credentials); + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Collections.singleton(SheetsScopes.SPREADSHEETS)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); - // Create the sheets API client - Sheets service = new Sheets.Builder(new NetHttpTransport(), - GsonFactory.getDefaultInstance(), - requestInitializer) - .setApplicationName("Sheets samples") - .build(); + // Create the sheets API client + Sheets service = new Sheets.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Sheets samples") + .build(); - List ranges = Collections.singletonList(new GridRange() - .setSheetId(0) - .setStartRowIndex(1) - .setEndRowIndex(11) - .setStartColumnIndex(0) - .setEndColumnIndex(4) - ); - List requests = Arrays.asList( - new Request().setAddConditionalFormatRule(new AddConditionalFormatRuleRequest() - .setRule(new ConditionalFormatRule() - .setRanges(ranges) - .setBooleanRule(new BooleanRule() - .setCondition(new BooleanCondition() - .setType("CUSTOM_FORMULA") - .setValues(Collections.singletonList( - new ConditionValue().setUserEnteredValue( - "=GT($D2,median($D$2:$D$11))") - )) - ) - .setFormat(new CellFormat().setTextFormat( - new TextFormat().setForegroundColor( - new Color().setRed(0.8f)) - )) - ) - ) - .setIndex(0) - ), - new Request().setAddConditionalFormatRule(new AddConditionalFormatRuleRequest() - .setRule(new ConditionalFormatRule() - .setRanges(ranges) - .setBooleanRule(new BooleanRule() - .setCondition(new BooleanCondition() - .setType("CUSTOM_FORMULA") - .setValues(Collections.singletonList( - new ConditionValue().setUserEnteredValue( - "=LT($D2,median($D$2:$D$11))") - )) - ) - .setFormat(new CellFormat().setBackgroundColor( - new Color().setRed(1f).setGreen(0.4f).setBlue(0.4f) - )) - ) - ) - .setIndex(0) + List ranges = Collections.singletonList(new GridRange() + .setSheetId(0) + .setStartRowIndex(1) + .setEndRowIndex(11) + .setStartColumnIndex(0) + .setEndColumnIndex(4) + ); + List requests = Arrays.asList( + new Request().setAddConditionalFormatRule(new AddConditionalFormatRuleRequest() + .setRule(new ConditionalFormatRule() + .setRanges(ranges) + .setBooleanRule(new BooleanRule() + .setCondition(new BooleanCondition() + .setType("CUSTOM_FORMULA") + .setValues(Collections.singletonList( + new ConditionValue().setUserEnteredValue( + "=GT($D2,median($D$2:$D$11))") + )) + ) + .setFormat(new CellFormat().setTextFormat( + new TextFormat().setForegroundColor( + new Color().setRed(0.8f)) + )) + ) + ) + .setIndex(0) + ), + new Request().setAddConditionalFormatRule(new AddConditionalFormatRuleRequest() + .setRule(new ConditionalFormatRule() + .setRanges(ranges) + .setBooleanRule(new BooleanRule() + .setCondition(new BooleanCondition() + .setType("CUSTOM_FORMULA") + .setValues(Collections.singletonList( + new ConditionValue().setUserEnteredValue( + "=LT($D2,median($D$2:$D$11))") + )) + ) + .setFormat(new CellFormat().setBackgroundColor( + new Color().setRed(1f).setGreen(0.4f).setBlue(0.4f) + )) ) - ); + ) + .setIndex(0) + ) + ); - BatchUpdateSpreadsheetResponse result = null; - try { - // Execute the requests. - BatchUpdateSpreadsheetRequest body = - new BatchUpdateSpreadsheetRequest() - .setRequests(requests); - result = service.spreadsheets() - .batchUpdate(spreadsheetId, body) - .execute(); - System.out.printf("%d cells updated.", result.getReplies().size()); - } catch (GoogleJsonResponseException e) { - // TODO(developer) - handle error appropriately - GoogleJsonError error = e.getDetails(); - if (error.getCode() == 404) { - System.out.printf("Spreadsheet not found with id '%s'.\n",spreadsheetId); - } else { - throw e; - } - } - return result; + BatchUpdateSpreadsheetResponse result = null; + try { + // Execute the requests. + BatchUpdateSpreadsheetRequest body = + new BatchUpdateSpreadsheetRequest() + .setRequests(requests); + result = service.spreadsheets() + .batchUpdate(spreadsheetId, body) + .execute(); + System.out.printf("%d cells updated.", result.getReplies().size()); + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + GoogleJsonError error = e.getDetails(); + if (error.getCode() == 404) { + System.out.printf("Spreadsheet not found with id '%s'.\n", spreadsheetId); + } else { + throw e; + } } + return result; + } } // [END sheets_conditional_formatting] diff --git a/sheets/snippets/src/main/java/Create.java b/sheets/snippets/src/main/java/Create.java index bf4e0c6b..4d66e78c 100644 --- a/sheets/snippets/src/main/java/Create.java +++ b/sheets/snippets/src/main/java/Create.java @@ -14,6 +14,7 @@ // [START sheets_create] + import com.google.api.client.http.HttpRequestInitializer; import com.google.api.client.http.javanet.NetHttpTransport; import com.google.api.client.json.gson.GsonFactory; @@ -23,45 +24,44 @@ import com.google.api.services.sheets.v4.model.SpreadsheetProperties; import com.google.auth.http.HttpCredentialsAdapter; import com.google.auth.oauth2.GoogleCredentials; - import java.io.IOException; import java.util.Collections; /* Class to demonstrate the use of Spreadsheet Create API */ public class Create { - /** - * Create a new spreadsheet. - * - * @param title - the name of the sheet to be created. - * @return newly created spreadsheet id - * @throws IOException - if credentials file not found. - */ - public static String createSpreadsheet(String title) throws IOException { + /** + * Create a new spreadsheet. + * + * @param title - the name of the sheet to be created. + * @return newly created spreadsheet id + * @throws IOException - if credentials file not found. + */ + public static String createSpreadsheet(String title) throws IOException { /* Load pre-authorized user credentials from the environment. TODO(developer) - See https://developers.google.com/identity for guides on implementing OAuth2 for your application. */ - GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() - .createScoped(Collections.singleton(SheetsScopes.SPREADSHEETS)); - HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( - credentials); + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Collections.singleton(SheetsScopes.SPREADSHEETS)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); - // Create the sheets API client - Sheets service = new Sheets.Builder(new NetHttpTransport(), - GsonFactory.getDefaultInstance(), - requestInitializer) - .setApplicationName("Sheets samples") - .build(); + // Create the sheets API client + Sheets service = new Sheets.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Sheets samples") + .build(); - // Create new spreadsheet with a title - Spreadsheet spreadsheet = new Spreadsheet() - .setProperties(new SpreadsheetProperties() - .setTitle(title)); - spreadsheet = service.spreadsheets().create(spreadsheet) - .setFields("spreadsheetId") - .execute(); - // Prints the new spreadsheet id - System.out.println("Spreadsheet ID: " + spreadsheet.getSpreadsheetId()); - return spreadsheet.getSpreadsheetId(); - } + // Create new spreadsheet with a title + Spreadsheet spreadsheet = new Spreadsheet() + .setProperties(new SpreadsheetProperties() + .setTitle(title)); + spreadsheet = service.spreadsheets().create(spreadsheet) + .setFields("spreadsheetId") + .execute(); + // Prints the new spreadsheet id + System.out.println("Spreadsheet ID: " + spreadsheet.getSpreadsheetId()); + return spreadsheet.getSpreadsheetId(); + } } // [END sheets_create] \ No newline at end of file diff --git a/sheets/snippets/src/main/java/GetValues.java b/sheets/snippets/src/main/java/GetValues.java index 620e0577..157d6cdf 100644 --- a/sheets/snippets/src/main/java/GetValues.java +++ b/sheets/snippets/src/main/java/GetValues.java @@ -14,6 +14,7 @@ // [START sheets_get_values] + import com.google.api.client.googleapis.json.GoogleJsonError; import com.google.api.client.googleapis.json.GoogleJsonResponseException; import com.google.api.client.http.HttpRequestInitializer; @@ -24,52 +25,51 @@ import com.google.api.services.sheets.v4.model.ValueRange; import com.google.auth.http.HttpCredentialsAdapter; import com.google.auth.oauth2.GoogleCredentials; - import java.io.IOException; import java.util.Collections; /* Class to demonstrate the use of Spreadsheet Get Values API */ public class GetValues { - /** - * Returns a range of values from a spreadsheet. - * - * @param spreadsheetId - Id of the spreadsheet. - * @param range - Range of cells of the spreadsheet. - * @return Values in the range - * @throws IOException - if credentials file not found. - */ - public static ValueRange getValues(String spreadsheetId, String range) throws IOException { + /** + * Returns a range of values from a spreadsheet. + * + * @param spreadsheetId - Id of the spreadsheet. + * @param range - Range of cells of the spreadsheet. + * @return Values in the range + * @throws IOException - if credentials file not found. + */ + public static ValueRange getValues(String spreadsheetId, String range) throws IOException { /* Load pre-authorized user credentials from the environment. TODO(developer) - See https://developers.google.com/identity for guides on implementing OAuth2 for your application. */ - GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() - .createScoped(Collections.singleton(SheetsScopes.SPREADSHEETS)); - HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( - credentials); + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Collections.singleton(SheetsScopes.SPREADSHEETS)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); - // Create the sheets API client - Sheets service = new Sheets.Builder(new NetHttpTransport(), - GsonFactory.getDefaultInstance(), - requestInitializer) - .setApplicationName("Sheets samples") - .build(); + // Create the sheets API client + Sheets service = new Sheets.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Sheets samples") + .build(); - ValueRange result = null; - try { - // Gets the values of the cells in the specified range. - result = service.spreadsheets().values().get(spreadsheetId, range).execute(); - int numRows = result.getValues() != null ? result.getValues().size() : 0; - System.out.printf("%d rows retrieved.", numRows); - } catch (GoogleJsonResponseException e) { - // TODO(developer) - handle error appropriately - GoogleJsonError error = e.getDetails(); - if (error.getCode() == 404) { - System.out.printf("Spreadsheet not found with id '%s'.\n",spreadsheetId); - } else { - throw e; - } - } - return result; + ValueRange result = null; + try { + // Gets the values of the cells in the specified range. + result = service.spreadsheets().values().get(spreadsheetId, range).execute(); + int numRows = result.getValues() != null ? result.getValues().size() : 0; + System.out.printf("%d rows retrieved.", numRows); + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + GoogleJsonError error = e.getDetails(); + if (error.getCode() == 404) { + System.out.printf("Spreadsheet not found with id '%s'.\n", spreadsheetId); + } else { + throw e; + } } + return result; + } } // [END sheets_get_values] diff --git a/sheets/snippets/src/main/java/PivotTables.java b/sheets/snippets/src/main/java/PivotTables.java index a6de919b..8b56a058 100644 --- a/sheets/snippets/src/main/java/PivotTables.java +++ b/sheets/snippets/src/main/java/PivotTables.java @@ -14,6 +14,7 @@ // [START sheets_pivot_tables] + import com.google.api.client.googleapis.json.GoogleJsonError; import com.google.api.client.googleapis.json.GoogleJsonResponseException; import com.google.api.client.http.HttpRequestInitializer; @@ -36,7 +37,6 @@ import com.google.auth.http.HttpCredentialsAdapter; import com.google.auth.oauth2.GoogleCredentials; import com.google.common.collect.Lists; - import java.io.IOException; import java.util.ArrayList; import java.util.Collections; @@ -44,101 +44,102 @@ /* Class to demonstrate the use of Spreadsheet Create Pivot Tables API */ public class PivotTables { - /** - * Create pivot table. - * - * @param spreadsheetId - Id of the spreadsheet. - * @return pivot table's spreadsheet - * @throws IOException - if credentials file not found. - */ - public static BatchUpdateSpreadsheetResponse pivotTables(String spreadsheetId) throws IOException { + /** + * Create pivot table. + * + * @param spreadsheetId - Id of the spreadsheet. + * @return pivot table's spreadsheet + * @throws IOException - if credentials file not found. + */ + public static BatchUpdateSpreadsheetResponse pivotTables(String spreadsheetId) + throws IOException { /* Load pre-authorized user credentials from the environment. TODO(developer) - See https://developers.google.com/identity for guides on implementing OAuth2 for your application. */ - GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() - .createScoped(Collections.singleton(SheetsScopes.SPREADSHEETS)); - HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( - credentials); + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Collections.singleton(SheetsScopes.SPREADSHEETS)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); - // Create the sheets API client - Sheets service = new Sheets.Builder(new NetHttpTransport(), - GsonFactory.getDefaultInstance(), - requestInitializer) - .setApplicationName("Sheets samples") - .build(); + // Create the sheets API client + Sheets service = new Sheets.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Sheets samples") + .build(); - // Create two sheets for our pivot table. - List sheetsRequests = new ArrayList<>(); - BatchUpdateSpreadsheetResponse result = null; - try { - sheetsRequests.add(new Request().setAddSheet(new AddSheetRequest())); - sheetsRequests.add(new Request().setAddSheet(new AddSheetRequest())); + // Create two sheets for our pivot table. + List sheetsRequests = new ArrayList<>(); + BatchUpdateSpreadsheetResponse result = null; + try { + sheetsRequests.add(new Request().setAddSheet(new AddSheetRequest())); + sheetsRequests.add(new Request().setAddSheet(new AddSheetRequest())); - BatchUpdateSpreadsheetRequest createSheetsBody = new BatchUpdateSpreadsheetRequest() - .setRequests(sheetsRequests); - BatchUpdateSpreadsheetResponse createSheetsResponse = service.spreadsheets() - .batchUpdate(spreadsheetId, createSheetsBody).execute(); - int sourceSheetId = createSheetsResponse.getReplies().get(0).getAddSheet().getProperties() - .getSheetId(); - int targetSheetId = createSheetsResponse.getReplies().get(1).getAddSheet().getProperties() - .getSheetId(); + BatchUpdateSpreadsheetRequest createSheetsBody = new BatchUpdateSpreadsheetRequest() + .setRequests(sheetsRequests); + BatchUpdateSpreadsheetResponse createSheetsResponse = service.spreadsheets() + .batchUpdate(spreadsheetId, createSheetsBody).execute(); + int sourceSheetId = createSheetsResponse.getReplies().get(0).getAddSheet().getProperties() + .getSheetId(); + int targetSheetId = createSheetsResponse.getReplies().get(1).getAddSheet().getProperties() + .getSheetId(); - PivotTable pivotTable = new PivotTable() - .setSource( - new GridRange() - .setSheetId(sourceSheetId) - .setStartRowIndex(0) - .setStartColumnIndex(0) - .setEndRowIndex(20) - .setEndColumnIndex(7) - ) - .setRows(Collections.singletonList( - new PivotGroup() - .setSourceColumnOffset(1) - .setShowTotals(true) - .setSortOrder("ASCENDING") - )) - .setColumns(Collections.singletonList( - new PivotGroup() - .setSourceColumnOffset(4) - .setShowTotals(true) - .setSortOrder("ASCENDING") - )) - .setValues(Collections.singletonList( - new PivotValue() - .setSummarizeFunction("COUNTA") - .setSourceColumnOffset(4) - )); - List requests = Lists.newArrayList(); - Request updateCellsRequest = new Request().setUpdateCells(new UpdateCellsRequest() - .setFields("*") - .setRows(Collections.singletonList( - new RowData().setValues( - Collections.singletonList( - new CellData().setPivotTable(pivotTable)) - ) - )) - .setStart(new GridCoordinate() - .setSheetId(targetSheetId) - .setRowIndex(0) - .setColumnIndex(0) + PivotTable pivotTable = new PivotTable() + .setSource( + new GridRange() + .setSheetId(sourceSheetId) + .setStartRowIndex(0) + .setStartColumnIndex(0) + .setEndRowIndex(20) + .setEndColumnIndex(7) + ) + .setRows(Collections.singletonList( + new PivotGroup() + .setSourceColumnOffset(1) + .setShowTotals(true) + .setSortOrder("ASCENDING") + )) + .setColumns(Collections.singletonList( + new PivotGroup() + .setSourceColumnOffset(4) + .setShowTotals(true) + .setSortOrder("ASCENDING") + )) + .setValues(Collections.singletonList( + new PivotValue() + .setSummarizeFunction("COUNTA") + .setSourceColumnOffset(4) + )); + List requests = Lists.newArrayList(); + Request updateCellsRequest = new Request().setUpdateCells(new UpdateCellsRequest() + .setFields("*") + .setRows(Collections.singletonList( + new RowData().setValues( + Collections.singletonList( + new CellData().setPivotTable(pivotTable)) + ) + )) + .setStart(new GridCoordinate() + .setSheetId(targetSheetId) + .setRowIndex(0) + .setColumnIndex(0) - )); + )); - requests.add(updateCellsRequest); - BatchUpdateSpreadsheetRequest updateCellsBody = new BatchUpdateSpreadsheetRequest() - .setRequests(requests); - result = service.spreadsheets().batchUpdate(spreadsheetId, updateCellsBody).execute(); - } catch (GoogleJsonResponseException e) { - // TODO(developer) - handle error appropriately - GoogleJsonError error = e.getDetails(); - if (error.getCode() == 404) { - System.out.printf("Spreadsheet not found with id '%s'.\n",spreadsheetId); - } else { - throw e; - } - } - return result; + requests.add(updateCellsRequest); + BatchUpdateSpreadsheetRequest updateCellsBody = new BatchUpdateSpreadsheetRequest() + .setRequests(requests); + result = service.spreadsheets().batchUpdate(spreadsheetId, updateCellsBody).execute(); + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + GoogleJsonError error = e.getDetails(); + if (error.getCode() == 404) { + System.out.printf("Spreadsheet not found with id '%s'.\n", spreadsheetId); + } else { + throw e; + } } + return result; + } } // [END sheets_pivot_tables] \ No newline at end of file diff --git a/sheets/snippets/src/main/java/UpdateValues.java b/sheets/snippets/src/main/java/UpdateValues.java index 9183f752..21e23308 100644 --- a/sheets/snippets/src/main/java/UpdateValues.java +++ b/sheets/snippets/src/main/java/UpdateValues.java @@ -14,6 +14,7 @@ // [START sheets_update_values] + import com.google.api.client.googleapis.json.GoogleJsonError; import com.google.api.client.googleapis.json.GoogleJsonResponseException; import com.google.api.client.http.HttpRequestInitializer; @@ -25,62 +26,61 @@ import com.google.api.services.sheets.v4.model.ValueRange; import com.google.auth.http.HttpCredentialsAdapter; import com.google.auth.oauth2.GoogleCredentials; - import java.io.IOException; import java.util.Collections; import java.util.List; /* Class to demonstrate the use of Spreadsheet Update Values API */ public class UpdateValues { - /** - * Sets values in a range of a spreadsheet. - * - * @param spreadsheetId - Id of the spreadsheet. - * @param range - Range of cells of the spreadsheet. - * @param valueInputOption - Determines how input data should be interpreted. - * @param values - List of rows of values to input. - * @return spreadsheet with updated values - * @throws IOException - if credentials file not found. - */ - public static UpdateValuesResponse updateValues(String spreadsheetId, - String range, - String valueInputOption, - List> values) - throws IOException { + /** + * Sets values in a range of a spreadsheet. + * + * @param spreadsheetId - Id of the spreadsheet. + * @param range - Range of cells of the spreadsheet. + * @param valueInputOption - Determines how input data should be interpreted. + * @param values - List of rows of values to input. + * @return spreadsheet with updated values + * @throws IOException - if credentials file not found. + */ + public static UpdateValuesResponse updateValues(String spreadsheetId, + String range, + String valueInputOption, + List> values) + throws IOException { /* Load pre-authorized user credentials from the environment. TODO(developer) - See https://developers.google.com/identity for guides on implementing OAuth2 for your application. */ - GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() - .createScoped(Collections.singleton(SheetsScopes.SPREADSHEETS)); - HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( - credentials); + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Collections.singleton(SheetsScopes.SPREADSHEETS)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); - // Create the sheets API client - Sheets service = new Sheets.Builder(new NetHttpTransport(), - GsonFactory.getDefaultInstance(), - requestInitializer) - .setApplicationName("Sheets samples") - .build(); + // Create the sheets API client + Sheets service = new Sheets.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Sheets samples") + .build(); - UpdateValuesResponse result =null; - try { - // Updates the values in the specified range. - ValueRange body = new ValueRange() - .setValues(values); - result = service.spreadsheets().values().update(spreadsheetId, range, body) - .setValueInputOption(valueInputOption) - .execute(); - System.out.printf("%d cells updated.", result.getUpdatedCells()); - } catch (GoogleJsonResponseException e) { - // TODO(developer) - handle error appropriately - GoogleJsonError error = e.getDetails(); - if (error.getCode() == 404) { - System.out.printf("Spreadsheet not found with id '%s'.\n",spreadsheetId); - } else { - throw e; - } - } - return result; + UpdateValuesResponse result = null; + try { + // Updates the values in the specified range. + ValueRange body = new ValueRange() + .setValues(values); + result = service.spreadsheets().values().update(spreadsheetId, range, body) + .setValueInputOption(valueInputOption) + .execute(); + System.out.printf("%d cells updated.", result.getUpdatedCells()); + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + GoogleJsonError error = e.getDetails(); + if (error.getCode() == 404) { + System.out.printf("Spreadsheet not found with id '%s'.\n", spreadsheetId); + } else { + throw e; + } } + return result; + } } // [END sheets_update_values] \ No newline at end of file diff --git a/sheets/snippets/src/test/java/BaseTest.java b/sheets/snippets/src/test/java/BaseTest.java index b1f27a1a..6e815050 100644 --- a/sheets/snippets/src/test/java/BaseTest.java +++ b/sheets/snippets/src/test/java/BaseTest.java @@ -25,12 +25,11 @@ import com.google.api.services.sheets.v4.model.GridRange; import com.google.api.services.sheets.v4.model.RepeatCellRequest; import com.google.api.services.sheets.v4.model.Request; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; import java.io.IOException; import java.util.ArrayList; import java.util.List; - -import com.google.auth.http.HttpCredentialsAdapter; -import com.google.auth.oauth2.GoogleCredentials; import org.junit.Before; public class BaseTest { @@ -42,11 +41,11 @@ public GoogleCredentials getCredential() throws IOException { TODO(developer) - See https://developers.google.com/identity for guides on implementing OAuth2 for your application. */ GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() - .createScoped(SheetsScopes.SPREADSHEETS,SheetsScopes.DRIVE); + .createScoped(SheetsScopes.SPREADSHEETS, SheetsScopes.DRIVE); return credentials; } - public Sheets buildService(GoogleCredentials credentials){ + public Sheets buildService(GoogleCredentials credentials) { return new Sheets.Builder( new NetHttpTransport(), GsonFactory.getDefaultInstance(), diff --git a/sheets/snippets/src/test/java/TestAppendValues.java b/sheets/snippets/src/test/java/TestAppendValues.java index 489218f8..b0dd9551 100644 --- a/sheets/snippets/src/test/java/TestAppendValues.java +++ b/sheets/snippets/src/test/java/TestAppendValues.java @@ -12,31 +12,32 @@ // See the License for the specific language governing permissions and // limitations under the License. +import static org.junit.Assert.assertEquals; + import com.google.api.services.sheets.v4.model.AppendValuesResponse; import com.google.api.services.sheets.v4.model.UpdateValuesResponse; -import org.junit.Test; import java.io.IOException; import java.util.Arrays; import java.util.List; -import static org.junit.Assert.assertEquals; +import org.junit.Test; // Unit testcase for spreadsheet append values snippet -public class TestAppendValues extends BaseTest{ +public class TestAppendValues extends BaseTest { - @Test - public void testAppendValues() throws IOException { - String spreadsheetId = Create.createSpreadsheet("Test Spreadsheet"); - populateValuesWithStrings(spreadsheetId); - List> values = Arrays.asList( - Arrays.asList("A", "B"), - Arrays.asList("C", "D")); - AppendValuesResponse result = AppendValues.appendValues(spreadsheetId, "A1:B2", "USER_ENTERED", - values); - assertEquals("Sheet1!A1:J10", result.getTableRange()); - UpdateValuesResponse updates = result.getUpdates(); - assertEquals(2, updates.getUpdatedRows().intValue()); - assertEquals(2, updates.getUpdatedColumns().intValue()); - assertEquals(4, updates.getUpdatedCells().intValue()); - deleteFileOnCleanup(spreadsheetId); - } + @Test + public void testAppendValues() throws IOException { + String spreadsheetId = Create.createSpreadsheet("Test Spreadsheet"); + populateValuesWithStrings(spreadsheetId); + List> values = Arrays.asList( + Arrays.asList("A", "B"), + Arrays.asList("C", "D")); + AppendValuesResponse result = AppendValues.appendValues(spreadsheetId, "A1:B2", "USER_ENTERED", + values); + assertEquals("Sheet1!A1:J10", result.getTableRange()); + UpdateValuesResponse updates = result.getUpdates(); + assertEquals(2, updates.getUpdatedRows().intValue()); + assertEquals(2, updates.getUpdatedColumns().intValue()); + assertEquals(4, updates.getUpdatedCells().intValue()); + deleteFileOnCleanup(spreadsheetId); + } } diff --git a/sheets/snippets/src/test/java/TestBatchGetValues.java b/sheets/snippets/src/test/java/TestBatchGetValues.java index d23e5582..9833ddc4 100644 --- a/sheets/snippets/src/test/java/TestBatchGetValues.java +++ b/sheets/snippets/src/test/java/TestBatchGetValues.java @@ -12,28 +12,29 @@ // See the License for the specific language governing permissions and // limitations under the License. +import static org.junit.Assert.assertEquals; + import com.google.api.services.sheets.v4.model.BatchGetValuesResponse; import com.google.api.services.sheets.v4.model.ValueRange; -import org.junit.Test; import java.io.IOException; import java.util.Arrays; import java.util.List; -import static org.junit.Assert.assertEquals; +import org.junit.Test; // Unit testcase for spreadsheet batch get values snippet -public class TestBatchGetValues extends BaseTest{ +public class TestBatchGetValues extends BaseTest { - @Test - public void testBatchGetValues() throws IOException { - String spreadsheetId = Create.createSpreadsheet("Test Spreadsheet"); - populateValuesWithStrings(spreadsheetId); - List ranges = Arrays.asList("A1:A3", "B1:C1"); - BatchGetValuesResponse result = BatchGetValues.batchGetValues(spreadsheetId, - ranges); - List valueRanges = result.getValueRanges(); - assertEquals(2, valueRanges.size()); - List> values = valueRanges.get(0).getValues(); - assertEquals(3, values.size()); - deleteFileOnCleanup(spreadsheetId); - } + @Test + public void testBatchGetValues() throws IOException { + String spreadsheetId = Create.createSpreadsheet("Test Spreadsheet"); + populateValuesWithStrings(spreadsheetId); + List ranges = Arrays.asList("A1:A3", "B1:C1"); + BatchGetValuesResponse result = BatchGetValues.batchGetValues(spreadsheetId, + ranges); + List valueRanges = result.getValueRanges(); + assertEquals(2, valueRanges.size()); + List> values = valueRanges.get(0).getValues(); + assertEquals(3, values.size()); + deleteFileOnCleanup(spreadsheetId); + } } diff --git a/sheets/snippets/src/test/java/TestBatchUpdate.java b/sheets/snippets/src/test/java/TestBatchUpdate.java index 5dc5799f..24d78ca0 100644 --- a/sheets/snippets/src/test/java/TestBatchUpdate.java +++ b/sheets/snippets/src/test/java/TestBatchUpdate.java @@ -12,26 +12,28 @@ // See the License for the specific language governing permissions and // limitations under the License. +import static org.junit.Assert.assertEquals; + import com.google.api.services.sheets.v4.model.BatchUpdateSpreadsheetResponse; import com.google.api.services.sheets.v4.model.FindReplaceResponse; import com.google.api.services.sheets.v4.model.Response; -import org.junit.Test; import java.io.IOException; import java.util.List; -import static org.junit.Assert.assertEquals; +import org.junit.Test; // Unit testcase for spreadsheet batch update snippet -public class TestBatchUpdate extends BaseTest{ +public class TestBatchUpdate extends BaseTest { - @Test - public void testBatchUpdate() throws IOException { - String spreadsheetId = Create.createSpreadsheet("Test Spreadsheet"); - populateValuesWithStrings(spreadsheetId); - BatchUpdateSpreadsheetResponse response = BatchUpdate.batchUpdate(spreadsheetId, "New Title", "Hello", "Goodbye"); - List replies = response.getReplies(); - assertEquals(2, replies.size()); - FindReplaceResponse findReplaceResponse = replies.get(1).getFindReplace(); - assertEquals(100, findReplaceResponse.getOccurrencesChanged().intValue()); - deleteFileOnCleanup(spreadsheetId); - } + @Test + public void testBatchUpdate() throws IOException { + String spreadsheetId = Create.createSpreadsheet("Test Spreadsheet"); + populateValuesWithStrings(spreadsheetId); + BatchUpdateSpreadsheetResponse response = + BatchUpdate.batchUpdate(spreadsheetId, "New Title", "Hello", "Goodbye"); + List replies = response.getReplies(); + assertEquals(2, replies.size()); + FindReplaceResponse findReplaceResponse = replies.get(1).getFindReplace(); + assertEquals(100, findReplaceResponse.getOccurrencesChanged().intValue()); + deleteFileOnCleanup(spreadsheetId); + } } diff --git a/sheets/snippets/src/test/java/TestBatchUpdateValues.java b/sheets/snippets/src/test/java/TestBatchUpdateValues.java index e17646d2..21560d94 100644 --- a/sheets/snippets/src/test/java/TestBatchUpdateValues.java +++ b/sheets/snippets/src/test/java/TestBatchUpdateValues.java @@ -12,29 +12,30 @@ // See the License for the specific language governing permissions and // limitations under the License. +import static org.junit.Assert.assertEquals; + import com.google.api.services.sheets.v4.model.BatchUpdateValuesResponse; -import org.junit.Test; import java.io.IOException; import java.util.Arrays; import java.util.List; -import static org.junit.Assert.assertEquals; +import org.junit.Test; // Unit testcase for spreadsheet batch update values snippet public class TestBatchUpdateValues extends BaseTest { - @Test - public void testBatchUpdateValues() throws IOException { - String spreadsheetId = Create.createSpreadsheet("Test Spreadsheet"); - List> values = Arrays.asList( - Arrays.asList("A", "B"), - Arrays.asList("C", "D")); - BatchUpdateValuesResponse result = - BatchUpdateValues.batchUpdateValues(spreadsheetId, "A1:B2", "USER_ENTERED", - values); - assertEquals(1, result.getResponses().size()); - assertEquals(2, result.getTotalUpdatedRows().intValue()); - assertEquals(2, result.getTotalUpdatedColumns().intValue()); - assertEquals(4, result.getTotalUpdatedCells().intValue()); - deleteFileOnCleanup(spreadsheetId); - } + @Test + public void testBatchUpdateValues() throws IOException { + String spreadsheetId = Create.createSpreadsheet("Test Spreadsheet"); + List> values = Arrays.asList( + Arrays.asList("A", "B"), + Arrays.asList("C", "D")); + BatchUpdateValuesResponse result = + BatchUpdateValues.batchUpdateValues(spreadsheetId, "A1:B2", "USER_ENTERED", + values); + assertEquals(1, result.getResponses().size()); + assertEquals(2, result.getTotalUpdatedRows().intValue()); + assertEquals(2, result.getTotalUpdatedColumns().intValue()); + assertEquals(4, result.getTotalUpdatedCells().intValue()); + deleteFileOnCleanup(spreadsheetId); + } } diff --git a/sheets/snippets/src/test/java/TestConditionalFormatting.java b/sheets/snippets/src/test/java/TestConditionalFormatting.java index 5d094165..22173381 100644 --- a/sheets/snippets/src/test/java/TestConditionalFormatting.java +++ b/sheets/snippets/src/test/java/TestConditionalFormatting.java @@ -12,22 +12,23 @@ // See the License for the specific language governing permissions and // limitations under the License. +import static org.junit.Assert.assertEquals; + import com.google.api.services.sheets.v4.model.BatchUpdateSpreadsheetResponse; -import org.junit.Test; import java.io.IOException; -import static org.junit.Assert.assertEquals; +import org.junit.Test; // Unit testcase for spreadsheet conditional formatting snippet public class TestConditionalFormatting extends BaseTest { - @Test - public void testConditionalFormat() throws IOException { - String spreadsheetId = Create.createSpreadsheet("Test Spreadsheet"); - populateValuesWithNumbers(spreadsheetId); - BatchUpdateSpreadsheetResponse response = - ConditionalFormatting.conditionalFormat(spreadsheetId); - assertEquals(spreadsheetId, response.getSpreadsheetId()); - assertEquals(2, response.getReplies().size()); - deleteFileOnCleanup(spreadsheetId); - } + @Test + public void testConditionalFormat() throws IOException { + String spreadsheetId = Create.createSpreadsheet("Test Spreadsheet"); + populateValuesWithNumbers(spreadsheetId); + BatchUpdateSpreadsheetResponse response = + ConditionalFormatting.conditionalFormat(spreadsheetId); + assertEquals(spreadsheetId, response.getSpreadsheetId()); + assertEquals(2, response.getReplies().size()); + deleteFileOnCleanup(spreadsheetId); + } } diff --git a/sheets/snippets/src/test/java/TestCreate.java b/sheets/snippets/src/test/java/TestCreate.java index c75f0f4f..2fe55351 100644 --- a/sheets/snippets/src/test/java/TestCreate.java +++ b/sheets/snippets/src/test/java/TestCreate.java @@ -12,17 +12,18 @@ // See the License for the specific language governing permissions and // limitations under the License. -import org.junit.Test; -import java.io.IOException; import static org.junit.Assert.assertNotNull; +import java.io.IOException; +import org.junit.Test; + // Unit testcase for create spreadsheet snippet -public class TestCreate extends BaseTest{ +public class TestCreate extends BaseTest { - @Test - public void testCreate() throws IOException { - String id = Create.createSpreadsheet("Test Spreadsheet"); - assertNotNull(id); - deleteFileOnCleanup(id); - } + @Test + public void testCreate() throws IOException { + String id = Create.createSpreadsheet("Test Spreadsheet"); + assertNotNull(id); + deleteFileOnCleanup(id); + } } diff --git a/sheets/snippets/src/test/java/TestGetValues.java b/sheets/snippets/src/test/java/TestGetValues.java index ed640bfb..13bee226 100644 --- a/sheets/snippets/src/test/java/TestGetValues.java +++ b/sheets/snippets/src/test/java/TestGetValues.java @@ -12,23 +12,24 @@ // See the License for the specific language governing permissions and // limitations under the License. +import static org.junit.Assert.assertEquals; + import com.google.api.services.sheets.v4.model.ValueRange; -import org.junit.Test; import java.io.IOException; import java.util.List; -import static org.junit.Assert.assertEquals; +import org.junit.Test; // Unit testcase for spreadsheet get values snippet -public class TestGetValues extends BaseTest{ +public class TestGetValues extends BaseTest { - @Test - public void testGetValues() throws IOException { - String spreadsheetId = Create.createSpreadsheet("Test Spreadsheet"); - populateValuesWithStrings(spreadsheetId); - ValueRange result = GetValues.getValues(spreadsheetId, "A1:C2"); - List> values = result.getValues(); - assertEquals(2, values.size()); - assertEquals(3, values.get(0).size()); - deleteFileOnCleanup(spreadsheetId); - } + @Test + public void testGetValues() throws IOException { + String spreadsheetId = Create.createSpreadsheet("Test Spreadsheet"); + populateValuesWithStrings(spreadsheetId); + ValueRange result = GetValues.getValues(spreadsheetId, "A1:C2"); + List> values = result.getValues(); + assertEquals(2, values.size()); + assertEquals(3, values.get(0).size()); + deleteFileOnCleanup(spreadsheetId); + } } diff --git a/sheets/snippets/src/test/java/TestPivotTable.java b/sheets/snippets/src/test/java/TestPivotTable.java index 83d26883..91bd4f48 100644 --- a/sheets/snippets/src/test/java/TestPivotTable.java +++ b/sheets/snippets/src/test/java/TestPivotTable.java @@ -14,19 +14,20 @@ * limitations under the License. */ +import static org.junit.Assert.assertNotNull; + import com.google.api.services.sheets.v4.model.BatchUpdateSpreadsheetResponse; -import org.junit.Test; import java.io.IOException; -import static org.junit.Assert.assertNotNull; +import org.junit.Test; // Unit testcase for spreadsheet pivot table snippet -public class TestPivotTable extends BaseTest{ +public class TestPivotTable extends BaseTest { - @Test - public void testPivotTable() throws IOException { - String spreadsheetId = Create.createSpreadsheet("Test Spreadsheet"); - BatchUpdateSpreadsheetResponse result = PivotTables.pivotTables(spreadsheetId); - assertNotNull(result); - deleteFileOnCleanup(spreadsheetId); - } + @Test + public void testPivotTable() throws IOException { + String spreadsheetId = Create.createSpreadsheet("Test Spreadsheet"); + BatchUpdateSpreadsheetResponse result = PivotTables.pivotTables(spreadsheetId); + assertNotNull(result); + deleteFileOnCleanup(spreadsheetId); + } } diff --git a/sheets/snippets/src/test/java/TestUpdateValues.java b/sheets/snippets/src/test/java/TestUpdateValues.java index 133cb48d..8c8355a7 100644 --- a/sheets/snippets/src/test/java/TestUpdateValues.java +++ b/sheets/snippets/src/test/java/TestUpdateValues.java @@ -12,27 +12,28 @@ // See the License for the specific language governing permissions and // limitations under the License. +import static org.junit.Assert.assertEquals; + import com.google.api.services.sheets.v4.model.UpdateValuesResponse; -import org.junit.Test; import java.io.IOException; import java.util.Arrays; import java.util.List; -import static org.junit.Assert.assertEquals; +import org.junit.Test; // Unit testcase for spreadsheet update values snippet -public class TestUpdateValues extends BaseTest{ +public class TestUpdateValues extends BaseTest { - @Test - public void testUpdateValues() throws IOException { - String spreadsheetId = Create.createSpreadsheet("Test Spreadsheet"); - List> values = Arrays.asList( - Arrays.asList("A", "B"), - Arrays.asList("C", "D")); - UpdateValuesResponse result = UpdateValues.updateValues(spreadsheetId, - "A1:B2", "USER_ENTERED", values); - assertEquals(2, result.getUpdatedRows().intValue()); - assertEquals(2, result.getUpdatedColumns().intValue()); - assertEquals(4, result.getUpdatedCells().intValue()); - deleteFileOnCleanup(spreadsheetId); - } + @Test + public void testUpdateValues() throws IOException { + String spreadsheetId = Create.createSpreadsheet("Test Spreadsheet"); + List> values = Arrays.asList( + Arrays.asList("A", "B"), + Arrays.asList("C", "D")); + UpdateValuesResponse result = UpdateValues.updateValues(spreadsheetId, + "A1:B2", "USER_ENTERED", values); + assertEquals(2, result.getUpdatedRows().intValue()); + assertEquals(2, result.getUpdatedColumns().intValue()); + assertEquals(4, result.getUpdatedCells().intValue()); + deleteFileOnCleanup(spreadsheetId); + } } diff --git a/slides/quickstart/src/main/java/SlidesQuickstart.java b/slides/quickstart/src/main/java/SlidesQuickstart.java index dc776391..b404b3cb 100644 --- a/slides/quickstart/src/main/java/SlidesQuickstart.java +++ b/slides/quickstart/src/main/java/SlidesQuickstart.java @@ -13,6 +13,7 @@ // limitations under the License. // [START slides_quickstart] + import com.google.api.client.auth.oauth2.Credential; import com.google.api.client.extensions.java6.auth.oauth2.AuthorizationCodeInstalledApp; import com.google.api.client.extensions.jetty.auth.oauth2.LocalServerReceiver; @@ -27,7 +28,6 @@ import com.google.api.services.slides.v1.SlidesScopes; import com.google.api.services.slides.v1.model.Page; import com.google.api.services.slides.v1.model.Presentation; - import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; @@ -37,58 +37,64 @@ import java.util.List; public class SlidesQuickstart { - private static final String APPLICATION_NAME = "Google Slides API Java Quickstart"; - private static final JsonFactory JSON_FACTORY = GsonFactory.getDefaultInstance(); - private static final String TOKENS_DIRECTORY_PATH = "tokens"; + private static final String APPLICATION_NAME = "Google Slides API Java Quickstart"; + private static final JsonFactory JSON_FACTORY = GsonFactory.getDefaultInstance(); + private static final String TOKENS_DIRECTORY_PATH = "tokens"; - /** - * Global instance of the scopes required by this quickstart. - * If modifying these scopes, delete your previously saved tokens/ folder. - */ - private static final List SCOPES = Collections.singletonList(SlidesScopes.PRESENTATIONS_READONLY); - private static final String CREDENTIALS_FILE_PATH = "/credentials.json"; + /** + * Global instance of the scopes required by this quickstart. + * If modifying these scopes, delete your previously saved tokens/ folder. + */ + private static final List SCOPES = + Collections.singletonList(SlidesScopes.PRESENTATIONS_READONLY); + private static final String CREDENTIALS_FILE_PATH = "/credentials.json"; - /** - * Creates an authorized Credential object. - * @param HTTP_TRANSPORT The network HTTP Transport. - * @return An authorized Credential object. - * @throws IOException If the credentials.json file cannot be found. - */ - private static Credential getCredentials(final NetHttpTransport HTTP_TRANSPORT) throws IOException { - // Load client secrets. - InputStream in = SlidesQuickstart.class.getResourceAsStream(CREDENTIALS_FILE_PATH); - if (in == null) { - throw new FileNotFoundException("Resource not found: " + CREDENTIALS_FILE_PATH); - } - GoogleClientSecrets clientSecrets = GoogleClientSecrets.load(JSON_FACTORY, new InputStreamReader(in)); - - // Build flow and trigger user authorization request. - GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow.Builder( - HTTP_TRANSPORT, JSON_FACTORY, clientSecrets, SCOPES) - .setDataStoreFactory(new FileDataStoreFactory(new java.io.File(TOKENS_DIRECTORY_PATH))) - .setAccessType("offline") - .build(); - LocalServerReceiver receiver = new LocalServerReceiver.Builder().setPort(8888).build(); - return new AuthorizationCodeInstalledApp(flow, receiver).authorize("user"); + /** + * Creates an authorized Credential object. + * + * @param HTTP_TRANSPORT The network HTTP Transport. + * @return An authorized Credential object. + * @throws IOException If the credentials.json file cannot be found. + */ + private static Credential getCredentials(final NetHttpTransport HTTP_TRANSPORT) + throws IOException { + // Load client secrets. + InputStream in = SlidesQuickstart.class.getResourceAsStream(CREDENTIALS_FILE_PATH); + if (in == null) { + throw new FileNotFoundException("Resource not found: " + CREDENTIALS_FILE_PATH); } + GoogleClientSecrets clientSecrets = + GoogleClientSecrets.load(JSON_FACTORY, new InputStreamReader(in)); + + // Build flow and trigger user authorization request. + GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow.Builder( + HTTP_TRANSPORT, JSON_FACTORY, clientSecrets, SCOPES) + .setDataStoreFactory(new FileDataStoreFactory(new java.io.File(TOKENS_DIRECTORY_PATH))) + .setAccessType("offline") + .build(); + LocalServerReceiver receiver = new LocalServerReceiver.Builder().setPort(8888).build(); + return new AuthorizationCodeInstalledApp(flow, receiver).authorize("user"); + } - public static void main(String... args) throws IOException, GeneralSecurityException { - // Build a new authorized API client service. - final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport(); - Slides service = new Slides.Builder(HTTP_TRANSPORT, JSON_FACTORY, getCredentials(HTTP_TRANSPORT)) - .setApplicationName(APPLICATION_NAME) - .build(); + public static void main(String... args) throws IOException, GeneralSecurityException { + // Build a new authorized API client service. + final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport(); + Slides service = + new Slides.Builder(HTTP_TRANSPORT, JSON_FACTORY, getCredentials(HTTP_TRANSPORT)) + .setApplicationName(APPLICATION_NAME) + .build(); - // Prints the number of slides and elements in a sample presentation: - // https://docs.google.com/presentation/d/1EAYk18WDjIG-zp_0vLm3CsfQh_i8eXc67Jo2O9C6Vuc/edit - String presentationId = "1EAYk18WDjIG-zp_0vLm3CsfQh_i8eXc67Jo2O9C6Vuc"; - Presentation response = service.presentations().get(presentationId).execute(); - List slides = response.getSlides(); + // Prints the number of slides and elements in a sample presentation: + // https://docs.google.com/presentation/d/1EAYk18WDjIG-zp_0vLm3CsfQh_i8eXc67Jo2O9C6Vuc/edit + String presentationId = "1EAYk18WDjIG-zp_0vLm3CsfQh_i8eXc67Jo2O9C6Vuc"; + Presentation response = service.presentations().get(presentationId).execute(); + List slides = response.getSlides(); - System.out.printf("The presentation contains %s slides:\n", slides.size()); - for (int i = 0; i < slides.size(); ++i) { - System.out.printf("- Slide #%s contains %s elements.\n", i + 1, slides.get(i).getPageElements().size()); - } + System.out.printf("The presentation contains %s slides:\n", slides.size()); + for (int i = 0; i < slides.size(); ++i) { + System.out.printf("- Slide #%s contains %s elements.\n", i + 1, + slides.get(i).getPageElements().size()); } + } } // [END slides_quickstart] diff --git a/slides/snippets/src/main/java/CopyPresentation.java b/slides/snippets/src/main/java/CopyPresentation.java index b6534cde..6b1def55 100644 --- a/slides/snippets/src/main/java/CopyPresentation.java +++ b/slides/snippets/src/main/java/CopyPresentation.java @@ -14,6 +14,7 @@ // [START slides_copy_presentation] + import com.google.api.client.googleapis.json.GoogleJsonError; import com.google.api.client.googleapis.json.GoogleJsonResponseException; import com.google.api.client.http.HttpRequestInitializer; @@ -30,49 +31,50 @@ /* Class to demonstrate the use of Slides Copy Presentation API */ public class CopyPresentation { - /** - * Copy an existing presentation. - * - * @param presentationId - id of the presentation. - * @param copyTitle - New title of the presentation. - * @return presentation id - * @throws IOException - if credentials file not found. - */ - public static String copyPresentation(String presentationId, String copyTitle) throws IOException { + /** + * Copy an existing presentation. + * + * @param presentationId - id of the presentation. + * @param copyTitle - New title of the presentation. + * @return presentation id + * @throws IOException - if credentials file not found. + */ + public static String copyPresentation(String presentationId, String copyTitle) + throws IOException { /* Load pre-authorized user credentials from the environment. TODO(developer) - See https://developers.google.com/identity for guides on implementing OAuth2 for your application. */ - GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() - .createScoped(Collections.singleton(SlidesScopes.DRIVE)); - HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( - credentials); + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Collections.singleton(SlidesScopes.DRIVE)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); - // Create the drive API client - Drive driveService = new Drive.Builder(new NetHttpTransport(), - GsonFactory.getDefaultInstance(), - requestInitializer) - .setApplicationName("Slides samples") - .build(); + // Create the drive API client + Drive driveService = new Drive.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Slides samples") + .build(); - String presentationCopyId = null; - try { - // Copies an existing presentation using specified presentation title. - File copyMetadata = new File().setName(copyTitle); - File presentationCopyFile = - driveService.files().copy(presentationId, copyMetadata).execute(); - presentationCopyId = presentationCopyFile.getId(); - // Prints the new copied presentation id. - System.out.println("New copied presentation id "+presentationCopyId); - } catch (GoogleJsonResponseException e) { - // TODO(developer) - handle error appropriately - GoogleJsonError error = e.getDetails(); - if (error.getCode() == 404) { - System.out.printf("Presentation not found with id '%s'.\n", presentationId); - } else { - throw e; - } - } - return presentationCopyId; + String presentationCopyId = null; + try { + // Copies an existing presentation using specified presentation title. + File copyMetadata = new File().setName(copyTitle); + File presentationCopyFile = + driveService.files().copy(presentationId, copyMetadata).execute(); + presentationCopyId = presentationCopyFile.getId(); + // Prints the new copied presentation id. + System.out.println("New copied presentation id " + presentationCopyId); + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + GoogleJsonError error = e.getDetails(); + if (error.getCode() == 404) { + System.out.printf("Presentation not found with id '%s'.\n", presentationId); + } else { + throw e; + } } + return presentationCopyId; + } } // [END slides_copy_presentation] \ No newline at end of file diff --git a/slides/snippets/src/main/java/CreateBulletedText.java b/slides/snippets/src/main/java/CreateBulletedText.java index 412ed14b..89202f6a 100644 --- a/slides/snippets/src/main/java/CreateBulletedText.java +++ b/slides/snippets/src/main/java/CreateBulletedText.java @@ -14,6 +14,7 @@ // [START slides_create_bulleted_text] + import com.google.api.client.googleapis.json.GoogleJsonError; import com.google.api.client.googleapis.json.GoogleJsonResponseException; import com.google.api.client.http.HttpRequestInitializer; @@ -36,60 +37,60 @@ /* Class to demonstrate the use of Slide Create Bulleted Text API */ public class CreateBulletedText { - /** - * Add arrow-diamond-disc bullets to all text in the shape. - * - * @param presentationId - id of the presentation. - * @param shapeId - id of the shape. - * @return response - * @throws IOException - if credentials file not found. - */ - public static BatchUpdatePresentationResponse createBulletedText(String presentationId, - String shapeId) throws IOException { + /** + * Add arrow-diamond-disc bullets to all text in the shape. + * + * @param presentationId - id of the presentation. + * @param shapeId - id of the shape. + * @return response + * @throws IOException - if credentials file not found. + */ + public static BatchUpdatePresentationResponse createBulletedText(String presentationId, + String shapeId) + throws IOException { /* Load pre-authorized user credentials from the environment. TODO(developer) - See https://developers.google.com/identity for guides on implementing OAuth2 for your application. */ - GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() - .createScoped(Collections.singleton(SlidesScopes.PRESENTATIONS)); - HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( - credentials); + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Collections.singleton(SlidesScopes.PRESENTATIONS)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); - // Create the slides API client - Slides service = new Slides.Builder(new NetHttpTransport(), - GsonFactory.getDefaultInstance(), - requestInitializer) - .setApplicationName("Slides samples") - .build(); + // Create the slides API client + Slides service = new Slides.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Slides samples") + .build(); - // Add arrow-diamond-disc bullets to all text in the shape. - List requests = new ArrayList<>(); - requests.add(new Request() - .setCreateParagraphBullets(new CreateParagraphBulletsRequest() - .setObjectId(shapeId) - .setTextRange(new Range() - .setType("ALL")) - .setBulletPreset("BULLET_ARROW_DIAMOND_DISC"))); + // Add arrow-diamond-disc bullets to all text in the shape. + List requests = new ArrayList<>(); + requests.add(new Request() + .setCreateParagraphBullets(new CreateParagraphBulletsRequest() + .setObjectId(shapeId) + .setTextRange(new Range() + .setType("ALL")) + .setBulletPreset("BULLET_ARROW_DIAMOND_DISC"))); - BatchUpdatePresentationResponse response =null; - try { - // Execute the request. - BatchUpdatePresentationRequest body = - new BatchUpdatePresentationRequest().setRequests(requests); - response = service.presentations().batchUpdate(presentationId, body).execute(); - System.out.println("Added bullets to text in shape with ID: " + shapeId); - } catch (GoogleJsonResponseException e) { - // TODO(developer) - handle error appropriately - GoogleJsonError error = e.getDetails(); - if (error.getCode() == 400) { - System.out.printf("Shape not found with id '%s'.\n", shapeId); - } else if (error.getCode() == 404) { - System.out.printf("Presentation not found with id '%s'.\n", presentationId); - } - else { - throw e; - } - } - return response; + BatchUpdatePresentationResponse response = null; + try { + // Execute the request. + BatchUpdatePresentationRequest body = + new BatchUpdatePresentationRequest().setRequests(requests); + response = service.presentations().batchUpdate(presentationId, body).execute(); + System.out.println("Added bullets to text in shape with ID: " + shapeId); + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + GoogleJsonError error = e.getDetails(); + if (error.getCode() == 400) { + System.out.printf("Shape not found with id '%s'.\n", shapeId); + } else if (error.getCode() == 404) { + System.out.printf("Presentation not found with id '%s'.\n", presentationId); + } else { + throw e; + } } + return response; + } } // [END slides_create_bulleted_text] \ No newline at end of file diff --git a/slides/snippets/src/main/java/CreateImage.java b/slides/snippets/src/main/java/CreateImage.java index 132b3493..55ec3534 100644 --- a/slides/snippets/src/main/java/CreateImage.java +++ b/slides/snippets/src/main/java/CreateImage.java @@ -14,6 +14,7 @@ // [START slides_create_image] + import com.google.api.client.googleapis.json.GoogleJsonError; import com.google.api.client.googleapis.json.GoogleJsonResponseException; import com.google.api.client.http.HttpRequestInitializer; @@ -40,75 +41,74 @@ /* Class to demonstrate the use of Slides Create Image API */ public class CreateImage { - /** - * Create a new image, using the supplied object ID, with content - * downloaded from imageUrl. - * - * @param presentationId - id of the presentation. - * @param slideId - id of the shape. - * @param imageUrl - Url of the image. - * @return image id - * @throws IOException - if credentials file not found. - */ - public static BatchUpdatePresentationResponse createImage(String presentationId, - String slideId, - String imageUrl) - throws IOException { + /** + * Create a new image, using the supplied object ID, with content + * downloaded from imageUrl. + * + * @param presentationId - id of the presentation. + * @param slideId - id of the shape. + * @param imageUrl - Url of the image. + * @return image id + * @throws IOException - if credentials file not found. + */ + public static BatchUpdatePresentationResponse createImage(String presentationId, + String slideId, + String imageUrl) + throws IOException { /* Load pre-authorized user credentials from the environment. TODO(developer) - See https://developers.google.com/identity for guides on implementing OAuth2 for your application. */ - GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() - .createScoped(Collections.singleton(SlidesScopes.PRESENTATIONS)); - HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( - credentials); + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Collections.singleton(SlidesScopes.PRESENTATIONS)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); - // Create the slides API client - Slides service = new Slides.Builder(new NetHttpTransport(), - GsonFactory.getDefaultInstance(), - requestInitializer) - .setApplicationName("Slides samples") - .build(); + // Create the slides API client + Slides service = new Slides.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Slides samples") + .build(); - // Create a new image, using the supplied object ID, with content downloaded from imageUrl. - List requests = new ArrayList<>(); - String imageId = "MyImageId_01"; - Dimension emu4M = new Dimension().setMagnitude(4000000.0).setUnit("EMU"); - requests.add(new Request() - .setCreateImage(new CreateImageRequest() - .setObjectId(imageId) - .setUrl(imageUrl) - .setElementProperties(new PageElementProperties() - .setPageObjectId(slideId) - .setSize(new Size() - .setHeight(emu4M) - .setWidth(emu4M)) - .setTransform(new AffineTransform() - .setScaleX(1.0) - .setScaleY(1.0) - .setTranslateX(100000.0) - .setTranslateY(100000.0) - .setUnit("EMU"))))); + // Create a new image, using the supplied object ID, with content downloaded from imageUrl. + List requests = new ArrayList<>(); + String imageId = "MyImageId_01"; + Dimension emu4M = new Dimension().setMagnitude(4000000.0).setUnit("EMU"); + requests.add(new Request() + .setCreateImage(new CreateImageRequest() + .setObjectId(imageId) + .setUrl(imageUrl) + .setElementProperties(new PageElementProperties() + .setPageObjectId(slideId) + .setSize(new Size() + .setHeight(emu4M) + .setWidth(emu4M)) + .setTransform(new AffineTransform() + .setScaleX(1.0) + .setScaleY(1.0) + .setTranslateX(100000.0) + .setTranslateY(100000.0) + .setUnit("EMU"))))); - BatchUpdatePresentationResponse response = null; - try { - // Execute the request. - BatchUpdatePresentationRequest body = - new BatchUpdatePresentationRequest().setRequests(requests); - response = service.presentations().batchUpdate(presentationId, body).execute(); - CreateImageResponse createImageResponse = response.getReplies().get(0).getCreateImage(); - // Prints the created image id. - System.out.println("Created image with ID: " + createImageResponse.getObjectId()); - } catch (GoogleJsonResponseException e) { - // TODO(developer) - handle error appropriately - GoogleJsonError error = e.getDetails(); - if (error.getCode() == 404) { - System.out.printf("Presentation not found with id '%s'.\n", presentationId); - } - else { - throw e; - } - } - return response; + BatchUpdatePresentationResponse response = null; + try { + // Execute the request. + BatchUpdatePresentationRequest body = + new BatchUpdatePresentationRequest().setRequests(requests); + response = service.presentations().batchUpdate(presentationId, body).execute(); + CreateImageResponse createImageResponse = response.getReplies().get(0).getCreateImage(); + // Prints the created image id. + System.out.println("Created image with ID: " + createImageResponse.getObjectId()); + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + GoogleJsonError error = e.getDetails(); + if (error.getCode() == 404) { + System.out.printf("Presentation not found with id '%s'.\n", presentationId); + } else { + throw e; + } } + return response; + } } // [END slides_create_image] \ No newline at end of file diff --git a/slides/snippets/src/main/java/CreatePresentation.java b/slides/snippets/src/main/java/CreatePresentation.java index 966362b2..f7d7d96b 100644 --- a/slides/snippets/src/main/java/CreatePresentation.java +++ b/slides/snippets/src/main/java/CreatePresentation.java @@ -14,6 +14,7 @@ // [START slides_create_presentation] + import com.google.api.client.http.HttpRequestInitializer; import com.google.api.client.http.javanet.NetHttpTransport; import com.google.api.client.json.gson.GsonFactory; @@ -28,38 +29,38 @@ /* Class to demonstrate the use of Slides Create Presentation API */ public class CreatePresentation { - /** - * Creates a new presentation. - * - * @param title - the name of the presentation to be created - * @return presentation id - * @throws IOException - if credentials file not found. - */ - public static String createPresentation(String title) throws IOException { + /** + * Creates a new presentation. + * + * @param title - the name of the presentation to be created + * @return presentation id + * @throws IOException - if credentials file not found. + */ + public static String createPresentation(String title) throws IOException { /* Load pre-authorized user credentials from the environment. TODO(developer) - See https://developers.google.com/identity for guides on implementing OAuth2 for your application. */ - GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() - .createScoped(Collections.singleton(SlidesScopes.PRESENTATIONS)); - HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( - credentials); + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Collections.singleton(SlidesScopes.PRESENTATIONS)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); - // Create the slides API client - Slides service = new Slides.Builder(new NetHttpTransport(), - GsonFactory.getDefaultInstance(), - requestInitializer) - .setApplicationName("Slides samples") - .build(); + // Create the slides API client + Slides service = new Slides.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Slides samples") + .build(); - // Creates a blank presentation with a specified title. - Presentation presentation = new Presentation() - .setTitle(title); - presentation = service.presentations().create(presentation) - .setFields("presentationId") - .execute(); - // Prints the newly created presentation id. - System.out.println("Created presentation with ID: " + presentation.getPresentationId()); - return presentation.getPresentationId(); - } + // Creates a blank presentation with a specified title. + Presentation presentation = new Presentation() + .setTitle(title); + presentation = service.presentations().create(presentation) + .setFields("presentationId") + .execute(); + // Prints the newly created presentation id. + System.out.println("Created presentation with ID: " + presentation.getPresentationId()); + return presentation.getPresentationId(); + } } // [END slides_create_presentation] \ No newline at end of file diff --git a/slides/snippets/src/main/java/CreateSheetsChart.java b/slides/snippets/src/main/java/CreateSheetsChart.java index d866007e..3f3d3e9b 100644 --- a/slides/snippets/src/main/java/CreateSheetsChart.java +++ b/slides/snippets/src/main/java/CreateSheetsChart.java @@ -14,6 +14,7 @@ // [START slides_create_sheets_chart] + import com.google.api.client.googleapis.json.GoogleJsonError; import com.google.api.client.googleapis.json.GoogleJsonResponseException; import com.google.api.client.http.HttpRequestInitializer; @@ -39,76 +40,75 @@ /* Class to demonstrate the use of Slides Create Chart API */ public class CreateSheetsChart { - /** - * Adds chart from spreadsheet to slides as linked. - * - * @param presentationId - id of the presentation. - * @param pageId - id of the page. - * @param spreadsheetId - id of the spreadsheet. - * @param sheetChartId - id of the chart in sheets. - * @return presentation chart id - * @throws IOException - if credentials file not found. - */ - public static BatchUpdatePresentationResponse createSheetsChart( - String presentationId, String pageId, String spreadsheetId, Integer sheetChartId) - throws IOException { + /** + * Adds chart from spreadsheet to slides as linked. + * + * @param presentationId - id of the presentation. + * @param pageId - id of the page. + * @param spreadsheetId - id of the spreadsheet. + * @param sheetChartId - id of the chart in sheets. + * @return presentation chart id + * @throws IOException - if credentials file not found. + */ + public static BatchUpdatePresentationResponse createSheetsChart( + String presentationId, String pageId, String spreadsheetId, Integer sheetChartId) + throws IOException { /* Load pre-authorized user credentials from the environment. TODO(developer) - See https://developers.google.com/identity for guides on implementing OAuth2 for your application. */ - GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() - .createScoped(Collections.singleton(SlidesScopes.PRESENTATIONS)); - HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( - credentials); + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Collections.singleton(SlidesScopes.PRESENTATIONS)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); - // Create the slides API client - Slides service = new Slides.Builder(new NetHttpTransport(), - GsonFactory.getDefaultInstance(), - requestInitializer) - .setApplicationName("Slides samples") - .build(); + // Create the slides API client + Slides service = new Slides.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Slides samples") + .build(); - // Embed a Sheets chart (indicated by the spreadsheetId and sheetChartId) onto - // a page in the presentation. Setting the linking mode as "LINKED" allows the - // chart to be refreshed if the Sheets version is updated. - List requests = new ArrayList<>(); - Dimension emu4M = new Dimension().setMagnitude(4000000.0).setUnit("EMU"); - String presentationChartId = "MyEmbeddedChart"; - requests.add(new Request() - .setCreateSheetsChart(new CreateSheetsChartRequest() - .setObjectId(presentationChartId) - .setSpreadsheetId(spreadsheetId) - .setChartId(sheetChartId) - .setLinkingMode("LINKED") - .setElementProperties(new PageElementProperties() - .setPageObjectId(pageId) - .setSize(new Size() - .setHeight(emu4M) - .setWidth(emu4M)) - .setTransform(new AffineTransform() - .setScaleX(1.0) - .setScaleY(1.0) - .setTranslateX(100000.0) - .setTranslateY(100000.0) - .setUnit("EMU"))))); + // Embed a Sheets chart (indicated by the spreadsheetId and sheetChartId) onto + // a page in the presentation. Setting the linking mode as "LINKED" allows the + // chart to be refreshed if the Sheets version is updated. + List requests = new ArrayList<>(); + Dimension emu4M = new Dimension().setMagnitude(4000000.0).setUnit("EMU"); + String presentationChartId = "MyEmbeddedChart"; + requests.add(new Request() + .setCreateSheetsChart(new CreateSheetsChartRequest() + .setObjectId(presentationChartId) + .setSpreadsheetId(spreadsheetId) + .setChartId(sheetChartId) + .setLinkingMode("LINKED") + .setElementProperties(new PageElementProperties() + .setPageObjectId(pageId) + .setSize(new Size() + .setHeight(emu4M) + .setWidth(emu4M)) + .setTransform(new AffineTransform() + .setScaleX(1.0) + .setScaleY(1.0) + .setTranslateX(100000.0) + .setTranslateY(100000.0) + .setUnit("EMU"))))); - BatchUpdatePresentationResponse response = null; - try { - // Execute the request. - BatchUpdatePresentationRequest body = - new BatchUpdatePresentationRequest().setRequests(requests); - response = service.presentations().batchUpdate(presentationId, body).execute(); - System.out.println("Added a linked Sheets chart with ID " + presentationChartId); - } catch (GoogleJsonResponseException e) { - // TODO(developer) - handle error appropriately - GoogleJsonError error = e.getDetails(); - if (error.getCode() == 404) { - System.out.printf("Presentation not found with id '%s'.\n", presentationId); - } - else { - throw e; - } - } - return response; + BatchUpdatePresentationResponse response = null; + try { + // Execute the request. + BatchUpdatePresentationRequest body = + new BatchUpdatePresentationRequest().setRequests(requests); + response = service.presentations().batchUpdate(presentationId, body).execute(); + System.out.println("Added a linked Sheets chart with ID " + presentationChartId); + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + GoogleJsonError error = e.getDetails(); + if (error.getCode() == 404) { + System.out.printf("Presentation not found with id '%s'.\n", presentationId); + } else { + throw e; + } } + return response; + } } // [END slides_create_sheets_chart] \ No newline at end of file diff --git a/slides/snippets/src/main/java/CreateSlide.java b/slides/snippets/src/main/java/CreateSlide.java index 9a809264..1ef009ab 100644 --- a/slides/snippets/src/main/java/CreateSlide.java +++ b/slides/snippets/src/main/java/CreateSlide.java @@ -14,6 +14,7 @@ // [START slides_create_slide] + import com.google.api.client.googleapis.json.GoogleJsonResponseException; import com.google.api.client.googleapis.json.GoogleJsonError; import com.google.api.client.http.HttpRequestInitializer; @@ -37,64 +38,65 @@ /* Class to demonstrate the use of Create Slides API */ public class CreateSlide { - /** - * Creates a new slide. - * - * @param presentationId - id of the presentation. - * @return slide id - * @throws IOException - if credentials file not found. - */ - public static BatchUpdatePresentationResponse createSlide(String presentationId) throws IOException { + /** + * Creates a new slide. + * + * @param presentationId - id of the presentation. + * @return slide id + * @throws IOException - if credentials file not found. + */ + public static BatchUpdatePresentationResponse createSlide(String presentationId) + throws IOException { /* Load pre-authorized user credentials from the environment. TODO(developer) - See https://developers.google.com/identity for guides on implementing OAuth2 for your application. */ - GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() - .createScoped(Collections.singleton(SlidesScopes.PRESENTATIONS)); - HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( - credentials); + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Collections.singleton(SlidesScopes.PRESENTATIONS)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); - // Create the slides API client - Slides service = new Slides.Builder(new NetHttpTransport(), - GsonFactory.getDefaultInstance(), - requestInitializer) - .setApplicationName("Slides samples") - .build(); + // Create the slides API client + Slides service = new Slides.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Slides samples") + .build(); - // Add a slide at index 1 using the predefined "TITLE_AND_TWO_COLUMNS" layout - List requests = new ArrayList<>(); - String slideId = "MyNewSlide_001"; - BatchUpdatePresentationResponse response = null; - try { - requests.add(new Request() - .setCreateSlide(new CreateSlideRequest() - .setObjectId(slideId) - .setInsertionIndex(1) - .setSlideLayoutReference(new LayoutReference() - .setPredefinedLayout("TITLE_AND_TWO_COLUMNS")))); + // Add a slide at index 1 using the predefined "TITLE_AND_TWO_COLUMNS" layout + List requests = new ArrayList<>(); + String slideId = "MyNewSlide_001"; + BatchUpdatePresentationResponse response = null; + try { + requests.add(new Request() + .setCreateSlide(new CreateSlideRequest() + .setObjectId(slideId) + .setInsertionIndex(1) + .setSlideLayoutReference(new LayoutReference() + .setPredefinedLayout("TITLE_AND_TWO_COLUMNS")))); - // If you wish to populate the slide with elements, add create requests here, - // using the slide ID specified above. + // If you wish to populate the slide with elements, add create requests here, + // using the slide ID specified above. - // Execute the request. - BatchUpdatePresentationRequest body = - new BatchUpdatePresentationRequest().setRequests(requests); - response = service.presentations().batchUpdate(presentationId, body).execute(); - CreateSlideResponse createSlideResponse = response.getReplies().get(0).getCreateSlide(); - // Prints the slide id. - System.out.println("Created slide with ID: " + createSlideResponse.getObjectId()); - } catch (GoogleJsonResponseException e) { - // TODO(developer) - handle error appropriately - GoogleJsonError error = e.getDetails(); - if (error.getCode() == 400) { - System.out.printf(" Id '%s' should be unique among all pages and page elements.\n", presentationId); - } else if (error.getCode() == 404) { - System.out.printf("Presentation not found with id '%s'.\n", presentationId); - } - else { - throw e; - } - } - return response; + // Execute the request. + BatchUpdatePresentationRequest body = + new BatchUpdatePresentationRequest().setRequests(requests); + response = service.presentations().batchUpdate(presentationId, body).execute(); + CreateSlideResponse createSlideResponse = response.getReplies().get(0).getCreateSlide(); + // Prints the slide id. + System.out.println("Created slide with ID: " + createSlideResponse.getObjectId()); + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + GoogleJsonError error = e.getDetails(); + if (error.getCode() == 400) { + System.out.printf(" Id '%s' should be unique among all pages and page elements.\n", + presentationId); + } else if (error.getCode() == 404) { + System.out.printf("Presentation not found with id '%s'.\n", presentationId); + } else { + throw e; + } } + return response; + } } // [END slides_create_slide] \ No newline at end of file diff --git a/slides/snippets/src/main/java/CreateTextboxWithText.java b/slides/snippets/src/main/java/CreateTextboxWithText.java index bb7df571..797be99e 100644 --- a/slides/snippets/src/main/java/CreateTextboxWithText.java +++ b/slides/snippets/src/main/java/CreateTextboxWithText.java @@ -14,6 +14,7 @@ // [START slides_create_textbox_with_text] + import com.google.api.client.googleapis.json.GoogleJsonError; import com.google.api.client.googleapis.json.GoogleJsonResponseException; import com.google.api.client.http.HttpRequestInitializer; @@ -41,76 +42,76 @@ /* Class to demonstrate the use of Slides Create Textbox API */ public class CreateTextboxWithText { - /** - * Create a new square textbox, using the specified id. - * - * @param presentationId - id of the presentation. - * @param slideId - id of the slide. - * @param textBoxId - id for the textbox. - * @return textbox id - * @throws IOException - if credentials file not found. - */ - public static BatchUpdatePresentationResponse createTextBoxWithText( - String presentationId, String slideId, String textBoxId) throws IOException { + /** + * Create a new square textbox, using the specified id. + * + * @param presentationId - id of the presentation. + * @param slideId - id of the slide. + * @param textBoxId - id for the textbox. + * @return textbox id + * @throws IOException - if credentials file not found. + */ + public static BatchUpdatePresentationResponse createTextBoxWithText( + String presentationId, String slideId, String textBoxId) throws IOException { /* Load pre-authorized user credentials from the environment. TODO(developer) - See https://developers.google.com/identity for guides on implementing OAuth2 for your application. */ - GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() - .createScoped(Collections.singleton(SlidesScopes.PRESENTATIONS)); - HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( - credentials); + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Collections.singleton(SlidesScopes.PRESENTATIONS)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); - // Create the slides API client - Slides service = new Slides.Builder(new NetHttpTransport(), - GsonFactory.getDefaultInstance(), - requestInitializer) - .setApplicationName("Slides samples") - .build(); + // Create the slides API client + Slides service = new Slides.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Slides samples") + .build(); - // Create a new square text box, using a supplied object ID. - List requests = new ArrayList<>(); - Dimension pt350 = new Dimension().setMagnitude(350.0).setUnit("PT"); - requests.add(new Request() - .setCreateShape(new CreateShapeRequest() - .setObjectId(textBoxId) - .setShapeType("TEXT_BOX") - .setElementProperties(new PageElementProperties() - .setPageObjectId(slideId) - .setSize(new Size() - .setHeight(pt350) - .setWidth(pt350)) - .setTransform(new AffineTransform() - .setScaleX(1.0) - .setScaleY(1.0) - .setTranslateX(350.0) - .setTranslateY(100.0) - .setUnit("PT"))))); + // Create a new square text box, using a supplied object ID. + List requests = new ArrayList<>(); + Dimension pt350 = new Dimension().setMagnitude(350.0).setUnit("PT"); + requests.add(new Request() + .setCreateShape(new CreateShapeRequest() + .setObjectId(textBoxId) + .setShapeType("TEXT_BOX") + .setElementProperties(new PageElementProperties() + .setPageObjectId(slideId) + .setSize(new Size() + .setHeight(pt350) + .setWidth(pt350)) + .setTransform(new AffineTransform() + .setScaleX(1.0) + .setScaleY(1.0) + .setTranslateX(350.0) + .setTranslateY(100.0) + .setUnit("PT"))))); - // Insert text into the box, using the object ID given to it. - requests.add(new Request() - .setInsertText(new InsertTextRequest() - .setObjectId(textBoxId) - .setInsertionIndex(0) - .setText("New Box Text Inserted"))); - BatchUpdatePresentationResponse response = null; + // Insert text into the box, using the object ID given to it. + requests.add(new Request() + .setInsertText(new InsertTextRequest() + .setObjectId(textBoxId) + .setInsertionIndex(0) + .setText("New Box Text Inserted"))); + BatchUpdatePresentationResponse response = null; - try { - // Execute the requests. - BatchUpdatePresentationRequest body = - new BatchUpdatePresentationRequest().setRequests(requests); - response = service.presentations().batchUpdate(presentationId, body).execute(); - CreateShapeResponse createShapeResponse = response.getReplies().get(0).getCreateShape(); - System.out.println("Created textbox with ID: " + createShapeResponse.getObjectId()); - } catch (GoogleJsonResponseException e) { - // TODO(developer) - handle error appropriately - GoogleJsonError error = e.getDetails(); - if (error.getCode() == 404) { - System.out.printf("Presentation not found with id '%s'.\n", presentationId); - } else { - throw e; - } - } - return response; + try { + // Execute the requests. + BatchUpdatePresentationRequest body = + new BatchUpdatePresentationRequest().setRequests(requests); + response = service.presentations().batchUpdate(presentationId, body).execute(); + CreateShapeResponse createShapeResponse = response.getReplies().get(0).getCreateShape(); + System.out.println("Created textbox with ID: " + createShapeResponse.getObjectId()); + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + GoogleJsonError error = e.getDetails(); + if (error.getCode() == 404) { + System.out.printf("Presentation not found with id '%s'.\n", presentationId); + } else { + throw e; + } } + return response; + } } // [END slides_create_textbox_with_text] \ No newline at end of file diff --git a/slides/snippets/src/main/java/ImageMerging.java b/slides/snippets/src/main/java/ImageMerging.java index 3b616aee..a45b9ad8 100644 --- a/slides/snippets/src/main/java/ImageMerging.java +++ b/slides/snippets/src/main/java/ImageMerging.java @@ -14,6 +14,7 @@ // [START slides_image_merging] + import com.google.api.client.http.HttpRequestInitializer; import com.google.api.client.http.javanet.NetHttpTransport; import com.google.api.client.json.gson.GsonFactory; @@ -37,78 +38,79 @@ /* Class to demonstrate the use of Slides Image Merging API */ public class ImageMerging { - /** - * Changes specified texts into images. - * - * @param templatePresentationId - id of the presentation. - * @param imageUrl - Url of the image. - * @param customerName - Name of the customer. - * @return merged presentation id - * @throws IOException - if credentials file not found. - */ - public static BatchUpdatePresentationResponse imageMerging(String templatePresentationId, - String imageUrl, - String customerName) throws IOException { + /** + * Changes specified texts into images. + * + * @param templatePresentationId - id of the presentation. + * @param imageUrl - Url of the image. + * @param customerName - Name of the customer. + * @return merged presentation id + * @throws IOException - if credentials file not found. + */ + public static BatchUpdatePresentationResponse imageMerging(String templatePresentationId, + String imageUrl, + String customerName) + throws IOException { /* Load pre-authorized user credentials from the environment. TODO(developer) - See https://developers.google.com/identity for guides on implementing OAuth2 for your application. */ - GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() - .createScoped(Arrays.asList(SlidesScopes.PRESENTATIONS, - SlidesScopes.DRIVE)); - HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( - credentials); + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Arrays.asList(SlidesScopes.PRESENTATIONS, + SlidesScopes.DRIVE)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); - // Create the slides API client - Slides service = new Slides.Builder(new NetHttpTransport(), - GsonFactory.getDefaultInstance(), - requestInitializer) - .setApplicationName("Slides samples") - .build(); + // Create the slides API client + Slides service = new Slides.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Slides samples") + .build(); - // Create the drive API client - Drive driveService = new Drive.Builder(new NetHttpTransport(), - GsonFactory.getDefaultInstance(), - requestInitializer) - .setApplicationName("Slides samples") - .build(); + // Create the drive API client + Drive driveService = new Drive.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Slides samples") + .build(); - // Duplicate the template presentation using the Drive API. - String copyTitle = customerName + " presentation"; - File content = new File().setName(copyTitle); - File presentationFile = - driveService.files().copy(templatePresentationId, content).execute(); - String presentationId = presentationFile.getId(); + // Duplicate the template presentation using the Drive API. + String copyTitle = customerName + " presentation"; + File content = new File().setName(copyTitle); + File presentationFile = + driveService.files().copy(templatePresentationId, content).execute(); + String presentationId = presentationFile.getId(); - // Create the image merge (replaceAllShapesWithImage) requests. - List requests = new ArrayList<>(); - requests.add(new Request() - .setReplaceAllShapesWithImage(new ReplaceAllShapesWithImageRequest() - .setImageUrl(imageUrl) - .setImageReplaceMethod("CENTER_INSIDE") - .setContainsText(new SubstringMatchCriteria() - .setText("{{company-logo}}") - .setMatchCase(true)))); + // Create the image merge (replaceAllShapesWithImage) requests. + List requests = new ArrayList<>(); + requests.add(new Request() + .setReplaceAllShapesWithImage(new ReplaceAllShapesWithImageRequest() + .setImageUrl(imageUrl) + .setImageReplaceMethod("CENTER_INSIDE") + .setContainsText(new SubstringMatchCriteria() + .setText("{{company-logo}}") + .setMatchCase(true)))); - // Execute the requests. - BatchUpdatePresentationRequest body = - new BatchUpdatePresentationRequest().setRequests(requests); - BatchUpdatePresentationResponse response = - service.presentations().batchUpdate(presentationId, body).execute(); + // Execute the requests. + BatchUpdatePresentationRequest body = + new BatchUpdatePresentationRequest().setRequests(requests); + BatchUpdatePresentationResponse response = + service.presentations().batchUpdate(presentationId, body).execute(); - int numReplacements = 0; - try { - // Count total number of replacements made. - for (Response resp : response.getReplies()) { - numReplacements += resp.getReplaceAllShapesWithImage().getOccurrencesChanged(); - } + int numReplacements = 0; + try { + // Count total number of replacements made. + for (Response resp : response.getReplies()) { + numReplacements += resp.getReplaceAllShapesWithImage().getOccurrencesChanged(); + } - // Prints the merged presentation id and count of replacements. - System.out.println("Created merged presentation with ID: " + presentationId); - System.out.println("Replaced " + numReplacements + " shapes instances with images."); - } catch (NullPointerException ne) { - System.out.println("Text not found to replace with image."); - } - return response; + // Prints the merged presentation id and count of replacements. + System.out.println("Created merged presentation with ID: " + presentationId); + System.out.println("Replaced " + numReplacements + " shapes instances with images."); + } catch (NullPointerException ne) { + System.out.println("Text not found to replace with image."); } + return response; + } } // [END slides_image_merging] \ No newline at end of file diff --git a/slides/snippets/src/main/java/RefreshSheetsChart.java b/slides/snippets/src/main/java/RefreshSheetsChart.java index 30230a5a..7ff9df97 100644 --- a/slides/snippets/src/main/java/RefreshSheetsChart.java +++ b/slides/snippets/src/main/java/RefreshSheetsChart.java @@ -14,6 +14,7 @@ // [START slides_refresh_sheets_chart] + import com.google.api.client.googleapis.json.GoogleJsonError; import com.google.api.client.googleapis.json.GoogleJsonResponseException; import com.google.api.client.http.HttpRequestInitializer; @@ -35,58 +36,57 @@ /* Class to demonstrate the use of Slides Refresh Chart API */ public class RefreshSheetsChart { - /** - * Refresh the sheets charts. - * - * @param presentationId - id of the presentation. - * @param presentationChartId - id of the presentation chart. - * @return presentation chart id - * @throws IOException - if credentials file not found. - */ - public static BatchUpdatePresentationResponse refreshSheetsChart( - String presentationId, String presentationChartId) throws IOException { + /** + * Refresh the sheets charts. + * + * @param presentationId - id of the presentation. + * @param presentationChartId - id of the presentation chart. + * @return presentation chart id + * @throws IOException - if credentials file not found. + */ + public static BatchUpdatePresentationResponse refreshSheetsChart( + String presentationId, String presentationChartId) throws IOException { /* Load pre-authorized user credentials from the environment. TODO(developer) - See https://developers.google.com/identity for guides on implementing OAuth2 for your application. */ - GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() - .createScoped(Collections.singleton(SlidesScopes.PRESENTATIONS)); - HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( - credentials); + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Collections.singleton(SlidesScopes.PRESENTATIONS)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); - // Create the slides API client - Slides service = new Slides.Builder(new NetHttpTransport(), - GsonFactory.getDefaultInstance(), - requestInitializer) - .setApplicationName("Slides samples") - .build(); + // Create the slides API client + Slides service = new Slides.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Slides samples") + .build(); - List requests = new ArrayList<>(); + List requests = new ArrayList<>(); - // Refresh an existing linked Sheets chart embedded a presentation. - requests.add(new Request() - .setRefreshSheetsChart(new RefreshSheetsChartRequest() - .setObjectId(presentationChartId))); + // Refresh an existing linked Sheets chart embedded a presentation. + requests.add(new Request() + .setRefreshSheetsChart(new RefreshSheetsChartRequest() + .setObjectId(presentationChartId))); - BatchUpdatePresentationResponse response = null; - try { - // Execute the request. - BatchUpdatePresentationRequest body = - new BatchUpdatePresentationRequest().setRequests(requests); - response = service.presentations().batchUpdate(presentationId, body).execute(); - System.out.println("Refreshed a linked Sheets chart with ID " + presentationChartId); - } catch (GoogleJsonResponseException e) { - // TODO(developer) - handle error appropriately - GoogleJsonError error = e.getDetails(); - if (error.getCode() == 400) { - System.out.printf("Presentation chart not found with id '%s'.\n", presentationChartId); - } else if (error.getCode() == 404) { - System.out.printf("Presentation not found with id '%s'.\n", presentationId); - } - else { - throw e; - } - } - return response; + BatchUpdatePresentationResponse response = null; + try { + // Execute the request. + BatchUpdatePresentationRequest body = + new BatchUpdatePresentationRequest().setRequests(requests); + response = service.presentations().batchUpdate(presentationId, body).execute(); + System.out.println("Refreshed a linked Sheets chart with ID " + presentationChartId); + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + GoogleJsonError error = e.getDetails(); + if (error.getCode() == 400) { + System.out.printf("Presentation chart not found with id '%s'.\n", presentationChartId); + } else if (error.getCode() == 404) { + System.out.printf("Presentation not found with id '%s'.\n", presentationId); + } else { + throw e; + } } + return response; + } } // [END slides_refresh_sheets_chart] \ No newline at end of file diff --git a/slides/snippets/src/main/java/SimpleTextReplace.java b/slides/snippets/src/main/java/SimpleTextReplace.java index 060215c1..0e23a303 100644 --- a/slides/snippets/src/main/java/SimpleTextReplace.java +++ b/slides/snippets/src/main/java/SimpleTextReplace.java @@ -14,6 +14,7 @@ // [START slides_simple_text_replace] + import com.google.api.client.googleapis.json.GoogleJsonError; import com.google.api.client.googleapis.json.GoogleJsonResponseException; import com.google.api.client.http.HttpRequestInitializer; @@ -37,65 +38,64 @@ /* Class to demonstrate the use of Slides Replace Text API */ public class SimpleTextReplace { - /** - * Remove existing text in the shape, then insert new text. - * - * @param presentationId - id of the presentation. - * @param shapeId - id of the shape. - * @param replacementText - New replacement text. - * @return response - * @throws IOException - if credentials file not found. - */ - public static BatchUpdatePresentationResponse simpleTextReplace( - String presentationId, String shapeId, String replacementText) throws IOException { + /** + * Remove existing text in the shape, then insert new text. + * + * @param presentationId - id of the presentation. + * @param shapeId - id of the shape. + * @param replacementText - New replacement text. + * @return response + * @throws IOException - if credentials file not found. + */ + public static BatchUpdatePresentationResponse simpleTextReplace( + String presentationId, String shapeId, String replacementText) throws IOException { /* Load pre-authorized user credentials from the environment. TODO(developer) - See https://developers.google.com/identity for guides on implementing OAuth2 for your application. */ - GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() - .createScoped(Collections.singleton(SlidesScopes.PRESENTATIONS)); - HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( - credentials); + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Collections.singleton(SlidesScopes.PRESENTATIONS)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); - // Create the slides API client - Slides service = new Slides.Builder(new NetHttpTransport(), - GsonFactory.getDefaultInstance(), - requestInitializer) - .setApplicationName("Slides samples") - .build(); + // Create the slides API client + Slides service = new Slides.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Slides samples") + .build(); - // Remove existing text in the shape, then insert the new text. - List requests = new ArrayList<>(); - requests.add(new Request() - .setDeleteText(new DeleteTextRequest() - .setObjectId(shapeId) - .setTextRange(new Range() - .setType("ALL")))); - requests.add(new Request() - .setInsertText(new InsertTextRequest() - .setObjectId(shapeId) - .setInsertionIndex(0) - .setText(replacementText))); + // Remove existing text in the shape, then insert the new text. + List requests = new ArrayList<>(); + requests.add(new Request() + .setDeleteText(new DeleteTextRequest() + .setObjectId(shapeId) + .setTextRange(new Range() + .setType("ALL")))); + requests.add(new Request() + .setInsertText(new InsertTextRequest() + .setObjectId(shapeId) + .setInsertionIndex(0) + .setText(replacementText))); - BatchUpdatePresentationResponse response = null; - try { - // Execute the requests. - BatchUpdatePresentationRequest body = - new BatchUpdatePresentationRequest().setRequests(requests); - response = service.presentations().batchUpdate(presentationId, body).execute(); - System.out.println("Replaced text in shape with ID: " + shapeId); - } catch (GoogleJsonResponseException e) { - // TODO(developer) - handle error appropriately - GoogleJsonError error = e.getDetails(); - if (error.getCode() == 400) { - System.out.printf("Shape not found with id '%s'.\n", shapeId); - } else if (error.getCode() == 404) { - System.out.printf("Presentation not found with id '%s'.\n", presentationId); - } - else { - throw e; - } - } - return response; + BatchUpdatePresentationResponse response = null; + try { + // Execute the requests. + BatchUpdatePresentationRequest body = + new BatchUpdatePresentationRequest().setRequests(requests); + response = service.presentations().batchUpdate(presentationId, body).execute(); + System.out.println("Replaced text in shape with ID: " + shapeId); + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + GoogleJsonError error = e.getDetails(); + if (error.getCode() == 400) { + System.out.printf("Shape not found with id '%s'.\n", shapeId); + } else if (error.getCode() == 404) { + System.out.printf("Presentation not found with id '%s'.\n", presentationId); + } else { + throw e; + } } + return response; + } } // [END slides_simple_text_replace] \ No newline at end of file diff --git a/slides/snippets/src/main/java/TextMerging.java b/slides/snippets/src/main/java/TextMerging.java index c58b8658..67f96955 100644 --- a/slides/snippets/src/main/java/TextMerging.java +++ b/slides/snippets/src/main/java/TextMerging.java @@ -14,6 +14,7 @@ // [START slides_text_merging] + import com.google.api.client.googleapis.json.GoogleJsonError; import com.google.api.client.googleapis.json.GoogleJsonResponseException; import com.google.api.client.http.HttpRequestInitializer; @@ -41,115 +42,116 @@ /* Class to demonstrate the use of Slides Text Merging API */ public class TextMerging { - /** - * Changes specified texts with data from spreadsheet. - * - * @param templatePresentationId - id of the presentation. - * @param dataSpreadsheetId - id of the spreadsheet containing data. - * @return merged presentation id - * @throws IOException - if credentials file not found. - */ - public static List textMerging( - String templatePresentationId, String dataSpreadsheetId) throws IOException { + /** + * Changes specified texts with data from spreadsheet. + * + * @param templatePresentationId - id of the presentation. + * @param dataSpreadsheetId - id of the spreadsheet containing data. + * @return merged presentation id + * @throws IOException - if credentials file not found. + */ + public static List textMerging( + String templatePresentationId, String dataSpreadsheetId) throws IOException { /* Load pre-authorized user credentials from the environment. TODO(developer) - See https://developers.google.com/identity for guides on implementing OAuth2 for your application. */ - GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() - .createScoped(Arrays.asList(SlidesScopes.PRESENTATIONS, - SlidesScopes.DRIVE,SlidesScopes.SPREADSHEETS)); - HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( - credentials); + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Arrays.asList(SlidesScopes.PRESENTATIONS, + SlidesScopes.DRIVE, SlidesScopes.SPREADSHEETS)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); - // Create the slides API client - Slides service = new Slides.Builder(new NetHttpTransport(), - GsonFactory.getDefaultInstance(), - requestInitializer) - .setApplicationName("Slides samples") - .build(); + // Create the slides API client + Slides service = new Slides.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Slides samples") + .build(); - // Create the drive API client - Drive driveService = new Drive.Builder(new NetHttpTransport(), - GsonFactory.getDefaultInstance(), - requestInitializer) - .setApplicationName("Slides samples") - .build(); + // Create the drive API client + Drive driveService = new Drive.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Slides samples") + .build(); - // Create the sheets API client - Sheets sheetsService = new Sheets.Builder(new NetHttpTransport(), - GsonFactory.getDefaultInstance(), - requestInitializer) - .setApplicationName("Slides samples") - .build(); + // Create the sheets API client + Sheets sheetsService = new Sheets.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Slides samples") + .build(); - List responses = new ArrayList<>(5); - // Use the Sheets API to load data, one record per row. - String dataRangeNotation = "Customers!A2:M6"; - ValueRange sheetsResponse = sheetsService.spreadsheets().values() - .get(dataSpreadsheetId, dataRangeNotation).execute(); - List> values = sheetsResponse.getValues(); + List responses = new ArrayList<>(5); + // Use the Sheets API to load data, one record per row. + String dataRangeNotation = "Customers!A2:M6"; + ValueRange sheetsResponse = sheetsService.spreadsheets().values() + .get(dataSpreadsheetId, dataRangeNotation).execute(); + List> values = sheetsResponse.getValues(); - try { - // For each record, create a new merged presentation. - for (List row : values) { - String customerName = row.get(2).toString(); // name in column 3 - String caseDescription = row.get(5).toString(); // case description in column 6 - String totalPortfolio = row.get(11).toString(); // total portfolio in column 12 + try { + // For each record, create a new merged presentation. + for (List row : values) { + String customerName = row.get(2).toString(); // name in column 3 + String caseDescription = row.get(5).toString(); // case description in column 6 + String totalPortfolio = row.get(11).toString(); // total portfolio in column 12 - // Duplicate the template presentation using the Drive API. - String copyTitle = customerName + " presentation"; - File content = new File().setName(copyTitle); - File presentationFile = - driveService.files().copy(templatePresentationId, content).execute(); - String presentationId = presentationFile.getId(); + // Duplicate the template presentation using the Drive API. + String copyTitle = customerName + " presentation"; + File content = new File().setName(copyTitle); + File presentationFile = + driveService.files().copy(templatePresentationId, content).execute(); + String presentationId = presentationFile.getId(); - // Create the text merge (replaceAllText) requests for this presentation. - List requests = new ArrayList<>(); - requests.add(new Request() - .setReplaceAllText(new ReplaceAllTextRequest() - .setContainsText(new SubstringMatchCriteria() - .setText("{{customer-name}}") - .setMatchCase(true)) - .setReplaceText(customerName))); - requests.add(new Request() - .setReplaceAllText(new ReplaceAllTextRequest() - .setContainsText(new SubstringMatchCriteria() - .setText("{{case-description}}") - .setMatchCase(true)) - .setReplaceText(caseDescription))); - requests.add(new Request() - .setReplaceAllText(new ReplaceAllTextRequest() - .setContainsText(new SubstringMatchCriteria() - .setText("{{total-portfolio}}") - .setMatchCase(true)) - .setReplaceText(totalPortfolio))); + // Create the text merge (replaceAllText) requests for this presentation. + List requests = new ArrayList<>(); + requests.add(new Request() + .setReplaceAllText(new ReplaceAllTextRequest() + .setContainsText(new SubstringMatchCriteria() + .setText("{{customer-name}}") + .setMatchCase(true)) + .setReplaceText(customerName))); + requests.add(new Request() + .setReplaceAllText(new ReplaceAllTextRequest() + .setContainsText(new SubstringMatchCriteria() + .setText("{{case-description}}") + .setMatchCase(true)) + .setReplaceText(caseDescription))); + requests.add(new Request() + .setReplaceAllText(new ReplaceAllTextRequest() + .setContainsText(new SubstringMatchCriteria() + .setText("{{total-portfolio}}") + .setMatchCase(true)) + .setReplaceText(totalPortfolio))); - // Execute the requests for this presentation. - BatchUpdatePresentationRequest body = - new BatchUpdatePresentationRequest().setRequests(requests); - BatchUpdatePresentationResponse response = service.presentations().batchUpdate(presentationId, body).execute(); + // Execute the requests for this presentation. + BatchUpdatePresentationRequest body = + new BatchUpdatePresentationRequest().setRequests(requests); + BatchUpdatePresentationResponse response = + service.presentations().batchUpdate(presentationId, body).execute(); - // Count total number of replacements made. - int numReplacements = 0; - for (Response resp : response.getReplies()) { - numReplacements += resp.getReplaceAllText().getOccurrencesChanged(); - } - // Prints the merged presentation id and count of replacements. - System.out.println("Created merged presentation for " + - customerName + " with ID: " + presentationId); - System.out.println("Replaced " + numReplacements + " text instances."); - } - }catch (NullPointerException ne) { - System.out.println("Text not found to replace with image."); - } catch (GoogleJsonResponseException e) { - // TODO(developer) - handle error appropriately - GoogleJsonError error = e.getDetails(); - if (error.getCode() == 404) { - System.out.printf("Presentation not found with id '%s'.\n", templatePresentationId); - } else { - throw e; - } + // Count total number of replacements made. + int numReplacements = 0; + for (Response resp : response.getReplies()) { + numReplacements += resp.getReplaceAllText().getOccurrencesChanged(); } - return responses; + // Prints the merged presentation id and count of replacements. + System.out.println("Created merged presentation for " + + customerName + " with ID: " + presentationId); + System.out.println("Replaced " + numReplacements + " text instances."); + } + } catch (NullPointerException ne) { + System.out.println("Text not found to replace with image."); + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + GoogleJsonError error = e.getDetails(); + if (error.getCode() == 404) { + System.out.printf("Presentation not found with id '%s'.\n", templatePresentationId); + } else { + throw e; + } } + return responses; + } } // [END slides_text_merging] \ No newline at end of file diff --git a/slides/snippets/src/main/java/TextStyleUpdate.java b/slides/snippets/src/main/java/TextStyleUpdate.java index 6b59a81c..86b694d0 100644 --- a/slides/snippets/src/main/java/TextStyleUpdate.java +++ b/slides/snippets/src/main/java/TextStyleUpdate.java @@ -14,6 +14,7 @@ // [START slides_text_style_update] + import com.google.api.client.googleapis.json.GoogleJsonError; import com.google.api.client.googleapis.json.GoogleJsonResponseException; import com.google.api.client.http.HttpRequestInitializer; @@ -42,97 +43,97 @@ /* Class to demonstrate the use of Slide Text Structure and Styling API */ public class TextStyleUpdate { - /** - * Styles text in the shape. - * - * @param presentationId - id of the presentation. - * @param shapeId - id of the shape. - * @return shape id - * @throws IOException - if credentials file not found. - */ - public static BatchUpdatePresentationResponse textStyleUpdate(String presentationId, String shapeId) - throws IOException { + /** + * Styles text in the shape. + * + * @param presentationId - id of the presentation. + * @param shapeId - id of the shape. + * @return shape id + * @throws IOException - if credentials file not found. + */ + public static BatchUpdatePresentationResponse textStyleUpdate(String presentationId, + String shapeId) + throws IOException { /* Load pre-authorized user credentials from the environment. TODO(developer) - See https://developers.google.com/identity for guides on implementing OAuth2 for your application. */ - GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() - .createScoped(Collections.singleton(SlidesScopes.PRESENTATIONS)); - HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( - credentials); + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Collections.singleton(SlidesScopes.PRESENTATIONS)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); - // Create the slides API client - Slides service = new Slides.Builder(new NetHttpTransport(), - GsonFactory.getDefaultInstance(), - requestInitializer) - .setApplicationName("Slides samples") - .build(); + // Create the slides API client + Slides service = new Slides.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Slides samples") + .build(); - // Update the text style so that the first 5 characters are bolded - // and italicized, and the next 5 are displayed in blue 14 pt Times - // New Roman font, and the next five are hyperlinked. - List requests = new ArrayList<>(); - requests.add(new Request() - .setUpdateTextStyle(new UpdateTextStyleRequest() - .setObjectId(shapeId) - .setTextRange(new Range() - .setType("FIXED_RANGE") - .setStartIndex(0) - .setEndIndex(5)) - .setStyle(new TextStyle() - .setBold(true) - .setItalic(true)) - .setFields("bold,italic"))); - requests.add(new Request() - .setUpdateTextStyle(new UpdateTextStyleRequest() - .setObjectId(shapeId) - .setTextRange(new Range() - .setType("FIXED_RANGE") - .setStartIndex(5) - .setEndIndex(10)) - .setStyle(new TextStyle() - .setFontFamily("Times New Roman") - .setFontSize(new Dimension() - .setMagnitude(14.0) - .setUnit("PT")) - .setForegroundColor(new OptionalColor() - .setOpaqueColor(new OpaqueColor() - .setRgbColor(new RgbColor() - .setBlue(1.0F) - .setGreen(0.0F) - .setRed(0.0F))))) - .setFields("foregroundColor,fontFamily,fontSize"))); - requests.add(new Request() - .setUpdateTextStyle(new UpdateTextStyleRequest() - .setObjectId(shapeId) - .setTextRange(new Range() - .setType("FIXED_RANGE") - .setStartIndex(10) - .setEndIndex(15)) - .setStyle(new TextStyle() - .setLink(new Link() - .setUrl("www.example.com"))) - .setFields("link"))); + // Update the text style so that the first 5 characters are bolded + // and italicized, and the next 5 are displayed in blue 14 pt Times + // New Roman font, and the next five are hyperlinked. + List requests = new ArrayList<>(); + requests.add(new Request() + .setUpdateTextStyle(new UpdateTextStyleRequest() + .setObjectId(shapeId) + .setTextRange(new Range() + .setType("FIXED_RANGE") + .setStartIndex(0) + .setEndIndex(5)) + .setStyle(new TextStyle() + .setBold(true) + .setItalic(true)) + .setFields("bold,italic"))); + requests.add(new Request() + .setUpdateTextStyle(new UpdateTextStyleRequest() + .setObjectId(shapeId) + .setTextRange(new Range() + .setType("FIXED_RANGE") + .setStartIndex(5) + .setEndIndex(10)) + .setStyle(new TextStyle() + .setFontFamily("Times New Roman") + .setFontSize(new Dimension() + .setMagnitude(14.0) + .setUnit("PT")) + .setForegroundColor(new OptionalColor() + .setOpaqueColor(new OpaqueColor() + .setRgbColor(new RgbColor() + .setBlue(1.0F) + .setGreen(0.0F) + .setRed(0.0F))))) + .setFields("foregroundColor,fontFamily,fontSize"))); + requests.add(new Request() + .setUpdateTextStyle(new UpdateTextStyleRequest() + .setObjectId(shapeId) + .setTextRange(new Range() + .setType("FIXED_RANGE") + .setStartIndex(10) + .setEndIndex(15)) + .setStyle(new TextStyle() + .setLink(new Link() + .setUrl("www.example.com"))) + .setFields("link"))); - BatchUpdatePresentationResponse response = null; - try { - // Execute the requests. - BatchUpdatePresentationRequest body = - new BatchUpdatePresentationRequest().setRequests(requests); - response = service.presentations().batchUpdate(presentationId, body).execute(); - System.out.println("Updated text style for shape with ID: " + shapeId); - } catch (GoogleJsonResponseException e) { - // TODO(developer) - handle error appropriately - GoogleJsonError error = e.getDetails(); - if (error.getCode() == 400) { - System.out.printf("Shape not found with id '%s'.\n", shapeId); - } else if (error.getCode() == 404) { - System.out.printf("Presentation not found with id '%s'.\n", presentationId); - } - else { - throw e; - } - } - return response; + BatchUpdatePresentationResponse response = null; + try { + // Execute the requests. + BatchUpdatePresentationRequest body = + new BatchUpdatePresentationRequest().setRequests(requests); + response = service.presentations().batchUpdate(presentationId, body).execute(); + System.out.println("Updated text style for shape with ID: " + shapeId); + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + GoogleJsonError error = e.getDetails(); + if (error.getCode() == 400) { + System.out.printf("Shape not found with id '%s'.\n", shapeId); + } else if (error.getCode() == 404) { + System.out.printf("Presentation not found with id '%s'.\n", presentationId); + } else { + throw e; + } } + return response; + } } // [END slides_text_style_update] \ No newline at end of file diff --git a/slides/snippets/src/test/java/BaseTest.java b/slides/snippets/src/test/java/BaseTest.java index f28c5117..d6f52d6b 100644 --- a/slides/snippets/src/test/java/BaseTest.java +++ b/slides/snippets/src/test/java/BaseTest.java @@ -32,145 +32,145 @@ import org.junit.After; public class BaseTest { - protected Slides service; - protected Drive driveService; - protected Sheets sheetsService; + protected Slides service; + protected Drive driveService; + protected Sheets sheetsService; - public GoogleCredentials getCredential() throws IOException { + public GoogleCredentials getCredential() throws IOException { /* Load pre-authorized user credentials from the environment. TODO(developer) - See https://developers.google.com/identity for guides on implementing OAuth2 for your application. */ - GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() - .createScoped(SlidesScopes.PRESENTATIONS, SlidesScopes.DRIVE); - return credentials; - } - - public Slides buildService(GoogleCredentials credential) { - return new Slides.Builder( - new NetHttpTransport(), - GsonFactory.getDefaultInstance(), - new HttpCredentialsAdapter(credential)) - .setApplicationName("Slides API Snippets") - .build(); - } - - public Drive buildDriveService(GoogleCredentials credential) { - return new Drive.Builder( - new NetHttpTransport(), - GsonFactory.getDefaultInstance(), - new HttpCredentialsAdapter(credential)) - .setApplicationName("Slides API Snippets") - .build(); - } - - public Sheets buildSheetsService(GoogleCredentials credential) { - return new Sheets.Builder( - new NetHttpTransport(), - GsonFactory.getDefaultInstance(), - new HttpCredentialsAdapter(credential)) - .setApplicationName("Slides API Snippets") - .build(); - } - - @Before - public void setup() throws IOException { - GoogleCredentials credential = getCredential(); - this.service = buildService(credential); - this.driveService = buildDriveService(credential); - this.sheetsService = buildSheetsService(credential); - } - - protected void deleteFileOnCleanup(String id) throws IOException { - this.driveService.files().delete(id).execute(); - } - - protected String createTestPresentation() throws IOException { - Presentation presentation = new Presentation() - .setTitle("Test Presentation"); - presentation = service.presentations().create(presentation) - .setFields("presentationId") - .execute(); - return presentation.getPresentationId(); - } - - protected String createTestSlide(String presentationId) throws IOException { - List requests = new ArrayList<>(); - requests.add(new Request() - .setCreateSlide(new CreateSlideRequest() - .setObjectId("TestSlide") - .setInsertionIndex(0) - .setSlideLayoutReference(new LayoutReference() - .setPredefinedLayout("BLANK")))); - BatchUpdatePresentationRequest body = - new BatchUpdatePresentationRequest().setRequests(requests); - BatchUpdatePresentationResponse response = - service.presentations().batchUpdate(presentationId, body).execute(); - return response.getReplies().get(0).getCreateSlide().getObjectId(); - } - - protected String createTestTextBox(String presentationId, String pageId) throws IOException { - String textBoxId = "MyTextBox_01"; - Dimension pt350 = new Dimension().setMagnitude(350.0).setUnit("PT"); - List requests = new ArrayList<>(); - requests.add(new Request() - .setCreateShape(new CreateShapeRequest() - .setObjectId(textBoxId) - .setShapeType("TEXT_BOX") - .setElementProperties(new PageElementProperties() - .setPageObjectId(pageId) - .setSize(new Size() - .setHeight(pt350) - .setWidth(pt350)) - .setTransform(new AffineTransform() - .setScaleX(1.0) - .setScaleY(1.0) - .setTranslateX(350.0) - .setTranslateY(100.0) - .setUnit("PT"))))); - - requests.add(new Request() - .setInsertText(new InsertTextRequest() - .setObjectId(textBoxId) - .setInsertionIndex(0) - .setText("New Box Text Inserted"))); - - BatchUpdatePresentationRequest body = - new BatchUpdatePresentationRequest().setRequests(requests); - BatchUpdatePresentationResponse response = - service.presentations().batchUpdate(presentationId, body).execute(); - return response.getReplies().get(0).getCreateShape().getObjectId(); - } - - protected String createTestSheetsChart(String presentationId, - String pageId, - String spreadsheetId, - Integer sheetChartId) throws IOException { - String presentationChartId = "MyChartId_01"; - Dimension emu4M = new Dimension().setMagnitude(4000000.0).setUnit("EMU"); - List requests = new ArrayList<>(); - requests.add(new Request() - .setCreateSheetsChart(new CreateSheetsChartRequest() - .setObjectId(presentationChartId) - .setSpreadsheetId(spreadsheetId) - .setChartId(sheetChartId) - .setLinkingMode("LINKED") - .setElementProperties(new PageElementProperties() - .setPageObjectId(pageId) - .setSize(new Size() - .setHeight(emu4M) - .setWidth(emu4M)) - .setTransform(new AffineTransform() - .setScaleX(1.0) - .setScaleY(1.0) - .setTranslateX(100000.0) - .setTranslateY(100000.0) - .setUnit("EMU"))))); - - BatchUpdatePresentationRequest body = - new BatchUpdatePresentationRequest().setRequests(requests); - BatchUpdatePresentationResponse response = - service.presentations().batchUpdate(presentationId, body).execute(); - return response.getReplies().get(0).getCreateSheetsChart().getObjectId(); - } + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(SlidesScopes.PRESENTATIONS, SlidesScopes.DRIVE); + return credentials; + } + + public Slides buildService(GoogleCredentials credential) { + return new Slides.Builder( + new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + new HttpCredentialsAdapter(credential)) + .setApplicationName("Slides API Snippets") + .build(); + } + + public Drive buildDriveService(GoogleCredentials credential) { + return new Drive.Builder( + new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + new HttpCredentialsAdapter(credential)) + .setApplicationName("Slides API Snippets") + .build(); + } + + public Sheets buildSheetsService(GoogleCredentials credential) { + return new Sheets.Builder( + new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + new HttpCredentialsAdapter(credential)) + .setApplicationName("Slides API Snippets") + .build(); + } + + @Before + public void setup() throws IOException { + GoogleCredentials credential = getCredential(); + this.service = buildService(credential); + this.driveService = buildDriveService(credential); + this.sheetsService = buildSheetsService(credential); + } + + protected void deleteFileOnCleanup(String id) throws IOException { + this.driveService.files().delete(id).execute(); + } + + protected String createTestPresentation() throws IOException { + Presentation presentation = new Presentation() + .setTitle("Test Presentation"); + presentation = service.presentations().create(presentation) + .setFields("presentationId") + .execute(); + return presentation.getPresentationId(); + } + + protected String createTestSlide(String presentationId) throws IOException { + List requests = new ArrayList<>(); + requests.add(new Request() + .setCreateSlide(new CreateSlideRequest() + .setObjectId("TestSlide") + .setInsertionIndex(0) + .setSlideLayoutReference(new LayoutReference() + .setPredefinedLayout("BLANK")))); + BatchUpdatePresentationRequest body = + new BatchUpdatePresentationRequest().setRequests(requests); + BatchUpdatePresentationResponse response = + service.presentations().batchUpdate(presentationId, body).execute(); + return response.getReplies().get(0).getCreateSlide().getObjectId(); + } + + protected String createTestTextBox(String presentationId, String pageId) throws IOException { + String textBoxId = "MyTextBox_01"; + Dimension pt350 = new Dimension().setMagnitude(350.0).setUnit("PT"); + List requests = new ArrayList<>(); + requests.add(new Request() + .setCreateShape(new CreateShapeRequest() + .setObjectId(textBoxId) + .setShapeType("TEXT_BOX") + .setElementProperties(new PageElementProperties() + .setPageObjectId(pageId) + .setSize(new Size() + .setHeight(pt350) + .setWidth(pt350)) + .setTransform(new AffineTransform() + .setScaleX(1.0) + .setScaleY(1.0) + .setTranslateX(350.0) + .setTranslateY(100.0) + .setUnit("PT"))))); + + requests.add(new Request() + .setInsertText(new InsertTextRequest() + .setObjectId(textBoxId) + .setInsertionIndex(0) + .setText("New Box Text Inserted"))); + + BatchUpdatePresentationRequest body = + new BatchUpdatePresentationRequest().setRequests(requests); + BatchUpdatePresentationResponse response = + service.presentations().batchUpdate(presentationId, body).execute(); + return response.getReplies().get(0).getCreateShape().getObjectId(); + } + + protected String createTestSheetsChart(String presentationId, + String pageId, + String spreadsheetId, + Integer sheetChartId) throws IOException { + String presentationChartId = "MyChartId_01"; + Dimension emu4M = new Dimension().setMagnitude(4000000.0).setUnit("EMU"); + List requests = new ArrayList<>(); + requests.add(new Request() + .setCreateSheetsChart(new CreateSheetsChartRequest() + .setObjectId(presentationChartId) + .setSpreadsheetId(spreadsheetId) + .setChartId(sheetChartId) + .setLinkingMode("LINKED") + .setElementProperties(new PageElementProperties() + .setPageObjectId(pageId) + .setSize(new Size() + .setHeight(emu4M) + .setWidth(emu4M)) + .setTransform(new AffineTransform() + .setScaleX(1.0) + .setScaleY(1.0) + .setTranslateX(100000.0) + .setTranslateY(100000.0) + .setUnit("EMU"))))); + + BatchUpdatePresentationRequest body = + new BatchUpdatePresentationRequest().setRequests(requests); + BatchUpdatePresentationResponse response = + service.presentations().batchUpdate(presentationId, body).execute(); + return response.getReplies().get(0).getCreateSheetsChart().getObjectId(); + } } diff --git a/slides/snippets/src/test/java/TestCopyPresentation.java b/slides/snippets/src/test/java/TestCopyPresentation.java index a4772d09..ddbf8d3e 100644 --- a/slides/snippets/src/test/java/TestCopyPresentation.java +++ b/slides/snippets/src/test/java/TestCopyPresentation.java @@ -19,13 +19,13 @@ import static org.junit.Assert.assertNotNull; // Unit testcase for copy presentation snippet -public class TestCopyPresentation extends BaseTest{ +public class TestCopyPresentation extends BaseTest { - @Test - public void testCopyPresentation() throws IOException { - String presentationId = createTestPresentation(); - String copyId = CopyPresentation.copyPresentation(presentationId, "My Duplicate Presentation"); - assertNotNull(copyId); - deleteFileOnCleanup(copyId); - } + @Test + public void testCopyPresentation() throws IOException { + String presentationId = createTestPresentation(); + String copyId = CopyPresentation.copyPresentation(presentationId, "My Duplicate Presentation"); + assertNotNull(copyId); + deleteFileOnCleanup(copyId); + } } diff --git a/slides/snippets/src/test/java/TestCreateBulletedText.java b/slides/snippets/src/test/java/TestCreateBulletedText.java index c6c00cf9..8d707000 100644 --- a/slides/snippets/src/test/java/TestCreateBulletedText.java +++ b/slides/snippets/src/test/java/TestCreateBulletedText.java @@ -20,16 +20,16 @@ import static org.junit.Assert.assertEquals; // Unit testcase for createBulletedText snippet -public class TestCreateBulletedText extends BaseTest{ +public class TestCreateBulletedText extends BaseTest { - @Test - public void testCreateBulletText() throws IOException { - String presentationId = createTestPresentation(); - String pageId = createTestSlide(presentationId); - String boxId = createTestTextBox(presentationId, pageId); - BatchUpdatePresentationResponse response = - CreateBulletedText.createBulletedText(presentationId, boxId); - assertEquals(1, response.getReplies().size()); - deleteFileOnCleanup(presentationId); - } + @Test + public void testCreateBulletText() throws IOException { + String presentationId = createTestPresentation(); + String pageId = createTestSlide(presentationId); + String boxId = createTestTextBox(presentationId, pageId); + BatchUpdatePresentationResponse response = + CreateBulletedText.createBulletedText(presentationId, boxId); + assertEquals(1, response.getReplies().size()); + deleteFileOnCleanup(presentationId); + } } diff --git a/slides/snippets/src/test/java/TestCreateImage.java b/slides/snippets/src/test/java/TestCreateImage.java index f2493670..d4d51840 100644 --- a/slides/snippets/src/test/java/TestCreateImage.java +++ b/slides/snippets/src/test/java/TestCreateImage.java @@ -23,17 +23,17 @@ // Unit testcase for createImage snippet public class TestCreateImage extends BaseTest { - private final String IMAGE_URL = - "https://www.google.com/images/branding/googlelogo/2x/googlelogo_color_272x92dp.png"; + private final String IMAGE_URL = + "https://www.google.com/images/branding/googlelogo/2x/googlelogo_color_272x92dp.png"; - @Test - public void testCreateImage() throws IOException { - String presentationId = createTestPresentation(); - String slideId = createTestSlide(presentationId); - BatchUpdatePresentationResponse response = CreateImage.createImage( - presentationId, slideId, IMAGE_URL); - assertEquals(1, response.getReplies().size()); - String imageId = response.getReplies().get(0).getCreateImage().getObjectId(); - assertNotNull(imageId); - } + @Test + public void testCreateImage() throws IOException { + String presentationId = createTestPresentation(); + String slideId = createTestSlide(presentationId); + BatchUpdatePresentationResponse response = CreateImage.createImage( + presentationId, slideId, IMAGE_URL); + assertEquals(1, response.getReplies().size()); + String imageId = response.getReplies().get(0).getCreateImage().getObjectId(); + assertNotNull(imageId); + } } diff --git a/slides/snippets/src/test/java/TestCreatePresentation.java b/slides/snippets/src/test/java/TestCreatePresentation.java index 8a44c76c..06bdd053 100644 --- a/slides/snippets/src/test/java/TestCreatePresentation.java +++ b/slides/snippets/src/test/java/TestCreatePresentation.java @@ -19,12 +19,12 @@ import static org.junit.Assert.assertNotNull; // Unit testcase for createPresentation snippet -public class TestCreatePresentation extends BaseTest{ +public class TestCreatePresentation extends BaseTest { - @Test - public void testCreatePresentation() throws IOException { - String presentationId = CreatePresentation.createPresentation("Title"); - assertNotNull(presentationId); - deleteFileOnCleanup(presentationId); - } + @Test + public void testCreatePresentation() throws IOException { + String presentationId = CreatePresentation.createPresentation("Title"); + assertNotNull(presentationId); + deleteFileOnCleanup(presentationId); + } } diff --git a/slides/snippets/src/test/java/TestCreateSheetsChart.java b/slides/snippets/src/test/java/TestCreateSheetsChart.java index c4905b83..7e7fa2c8 100644 --- a/slides/snippets/src/test/java/TestCreateSheetsChart.java +++ b/slides/snippets/src/test/java/TestCreateSheetsChart.java @@ -21,20 +21,21 @@ import static org.junit.Assert.assertNotNull; // Unit testcase for createSheetsChart snippet -public class TestCreateSheetsChart extends BaseTest{ - // TODO(developer) - change the IDs before executing - private final String DATA_SPREADSHEET_ID = "1ZCGbdHSvLnp776gDGSGtkEBxWQ-FDMuWEF4EOSmeDDw"; - private final Integer CHART_ID = 1107320627; - @Test - public void testCreateSheetsChart() throws IOException { - String presentationId = this.createTestPresentation(); - String pageId = this.createTestSlide(presentationId); - BatchUpdatePresentationResponse response = - CreateSheetsChart.createSheetsChart( - presentationId, pageId, DATA_SPREADSHEET_ID, CHART_ID); - assertEquals(1, response.getReplies().size()); - String chartId = response.getReplies().get(0).getCreateSheetsChart().getObjectId(); - assertNotNull(chartId); - deleteFileOnCleanup(presentationId); - } +public class TestCreateSheetsChart extends BaseTest { + // TODO(developer) - change the IDs before executing + private final String DATA_SPREADSHEET_ID = "1ZCGbdHSvLnp776gDGSGtkEBxWQ-FDMuWEF4EOSmeDDw"; + private final Integer CHART_ID = 1107320627; + + @Test + public void testCreateSheetsChart() throws IOException { + String presentationId = this.createTestPresentation(); + String pageId = this.createTestSlide(presentationId); + BatchUpdatePresentationResponse response = + CreateSheetsChart.createSheetsChart( + presentationId, pageId, DATA_SPREADSHEET_ID, CHART_ID); + assertEquals(1, response.getReplies().size()); + String chartId = response.getReplies().get(0).getCreateSheetsChart().getObjectId(); + assertNotNull(chartId); + deleteFileOnCleanup(presentationId); + } } diff --git a/slides/snippets/src/test/java/TestCreateSlide.java b/slides/snippets/src/test/java/TestCreateSlide.java index 84997780..506baa9d 100644 --- a/slides/snippets/src/test/java/TestCreateSlide.java +++ b/slides/snippets/src/test/java/TestCreateSlide.java @@ -21,17 +21,17 @@ import static org.junit.Assert.assertNotNull; // Unit testcase for createSlide snippet -public class TestCreateSlide extends BaseTest{ +public class TestCreateSlide extends BaseTest { - @Test - public void testCreateSlide() throws IOException { - String presentationId = createTestPresentation(); - BatchUpdatePresentationResponse response = - CreateSlide.createSlide(presentationId); - assertNotNull(response); - assertEquals(1, response.getReplies().size()); - String pageId = response.getReplies().get(0).getCreateSlide().getObjectId(); - assertNotNull(pageId); - deleteFileOnCleanup(presentationId); - } + @Test + public void testCreateSlide() throws IOException { + String presentationId = createTestPresentation(); + BatchUpdatePresentationResponse response = + CreateSlide.createSlide(presentationId); + assertNotNull(response); + assertEquals(1, response.getReplies().size()); + String pageId = response.getReplies().get(0).getCreateSlide().getObjectId(); + assertNotNull(pageId); + deleteFileOnCleanup(presentationId); + } } diff --git a/slides/snippets/src/test/java/TestCreateTextboxWithText.java b/slides/snippets/src/test/java/TestCreateTextboxWithText.java index 5fbf15bc..60dacb02 100644 --- a/slides/snippets/src/test/java/TestCreateTextboxWithText.java +++ b/slides/snippets/src/test/java/TestCreateTextboxWithText.java @@ -21,18 +21,18 @@ import static org.junit.Assert.assertNotNull; // Unit testcase for createTextboxWithText snippet -public class TestCreateTextboxWithText extends BaseTest{ +public class TestCreateTextboxWithText extends BaseTest { - @Test - public void testCreateTextBox() throws IOException { - String presentationId = createTestPresentation(); - String pageId = createTestSlide(presentationId); - BatchUpdatePresentationResponse response = - CreateTextboxWithText.createTextBoxWithText(presentationId, - pageId, "MyTextBox"); - assertEquals(2, response.getReplies().size()); - String boxId = response.getReplies().get(0).getCreateShape().getObjectId(); - assertNotNull(boxId); - deleteFileOnCleanup(presentationId); - } + @Test + public void testCreateTextBox() throws IOException { + String presentationId = createTestPresentation(); + String pageId = createTestSlide(presentationId); + BatchUpdatePresentationResponse response = + CreateTextboxWithText.createTextBoxWithText(presentationId, + pageId, "MyTextBox"); + assertEquals(2, response.getReplies().size()); + String boxId = response.getReplies().get(0).getCreateShape().getObjectId(); + assertNotNull(boxId); + deleteFileOnCleanup(presentationId); + } } diff --git a/slides/snippets/src/test/java/TestImageMerging.java b/slides/snippets/src/test/java/TestImageMerging.java index 73a16f90..43c6a4c4 100644 --- a/slides/snippets/src/test/java/TestImageMerging.java +++ b/slides/snippets/src/test/java/TestImageMerging.java @@ -22,24 +22,25 @@ import static org.junit.Assert.assertNotNull; // Unit testcase for imageMerging snippet -public class TestImageMerging extends BaseTest{ - // TODO(developer) - change the IDs before executing - private final String IMAGE_URL = - "https://www.google.com/images/branding/googlelogo/2x/googlelogo_color_272x92dp.png"; - private final String TEMPLATE_PRESENTATION_ID = "1wJUN1B5CQ2wQOBzmz2apky48QNK1OsE2oNKHPMLpKDc"; - private final String CUSTOMER_NAME = "Fake Customer"; - @Test - public void testImageMerge() throws IOException { - BatchUpdatePresentationResponse response = - ImageMerging.imageMerging(TEMPLATE_PRESENTATION_ID, IMAGE_URL, CUSTOMER_NAME); - String presentationId = response.getPresentationId(); - assertNotNull(presentationId); - assertEquals(2, response.getReplies().size()); - int numReplacements = 0; - for(Response resp: response.getReplies()) { - numReplacements += resp.getReplaceAllShapesWithImage().getOccurrencesChanged(); - } - assertEquals(2, numReplacements); - deleteFileOnCleanup(presentationId); +public class TestImageMerging extends BaseTest { + // TODO(developer) - change the IDs before executing + private final String IMAGE_URL = + "https://www.google.com/images/branding/googlelogo/2x/googlelogo_color_272x92dp.png"; + private final String TEMPLATE_PRESENTATION_ID = "1wJUN1B5CQ2wQOBzmz2apky48QNK1OsE2oNKHPMLpKDc"; + private final String CUSTOMER_NAME = "Fake Customer"; + + @Test + public void testImageMerge() throws IOException { + BatchUpdatePresentationResponse response = + ImageMerging.imageMerging(TEMPLATE_PRESENTATION_ID, IMAGE_URL, CUSTOMER_NAME); + String presentationId = response.getPresentationId(); + assertNotNull(presentationId); + assertEquals(2, response.getReplies().size()); + int numReplacements = 0; + for (Response resp : response.getReplies()) { + numReplacements += resp.getReplaceAllShapesWithImage().getOccurrencesChanged(); } + assertEquals(2, numReplacements); + deleteFileOnCleanup(presentationId); + } } diff --git a/slides/snippets/src/test/java/TestRefreshSheetsChart.java b/slides/snippets/src/test/java/TestRefreshSheetsChart.java index b2c17928..6031f85b 100644 --- a/slides/snippets/src/test/java/TestRefreshSheetsChart.java +++ b/slides/snippets/src/test/java/TestRefreshSheetsChart.java @@ -20,19 +20,20 @@ import static org.junit.Assert.assertEquals; // Unit testcase for refreshSheetsChart snippet -public class TestRefreshSheetsChart extends BaseTest{ - // TODO(developer) - change the IDs before executing - private final String DATA_SPREADSHEET_ID = "14KaZMq2aCAGt5acV77zaA_Ps8aDt04G7T0ei4KiXLX8"; - private final Integer CHART_ID = 1107320627; - @Test - public void testRefreshSheetsChart() throws IOException { - String presentationId = this.createTestPresentation(); - String pageId = this.createTestSlide(presentationId); - String chartId = - this.createTestSheetsChart(presentationId, pageId, DATA_SPREADSHEET_ID, CHART_ID); - BatchUpdatePresentationResponse response = - RefreshSheetsChart.refreshSheetsChart(presentationId, chartId); - assertEquals(1, response.getReplies().size()); - deleteFileOnCleanup(presentationId); - } +public class TestRefreshSheetsChart extends BaseTest { + // TODO(developer) - change the IDs before executing + private final String DATA_SPREADSHEET_ID = "14KaZMq2aCAGt5acV77zaA_Ps8aDt04G7T0ei4KiXLX8"; + private final Integer CHART_ID = 1107320627; + + @Test + public void testRefreshSheetsChart() throws IOException { + String presentationId = this.createTestPresentation(); + String pageId = this.createTestSlide(presentationId); + String chartId = + this.createTestSheetsChart(presentationId, pageId, DATA_SPREADSHEET_ID, CHART_ID); + BatchUpdatePresentationResponse response = + RefreshSheetsChart.refreshSheetsChart(presentationId, chartId); + assertEquals(1, response.getReplies().size()); + deleteFileOnCleanup(presentationId); + } } diff --git a/slides/snippets/src/test/java/TestSimpleTextReplace.java b/slides/snippets/src/test/java/TestSimpleTextReplace.java index 397a3263..67df2489 100644 --- a/slides/snippets/src/test/java/TestSimpleTextReplace.java +++ b/slides/snippets/src/test/java/TestSimpleTextReplace.java @@ -20,16 +20,16 @@ import static org.junit.Assert.assertEquals; // Unit testcase for simpleTextReplace snippet -public class TestSimpleTextReplace extends BaseTest{ +public class TestSimpleTextReplace extends BaseTest { - @Test - public void testSimpleTextReplace() throws IOException { - String presentationId = createTestPresentation(); - String pageId = createTestSlide(presentationId); - String boxId = createTestTextBox(presentationId, pageId); - BatchUpdatePresentationResponse response = - SimpleTextReplace.simpleTextReplace(presentationId, boxId, "MY NEW TEXT"); - assertEquals(2, response.getReplies().size()); - deleteFileOnCleanup(presentationId); - } + @Test + public void testSimpleTextReplace() throws IOException { + String presentationId = createTestPresentation(); + String pageId = createTestSlide(presentationId); + String boxId = createTestTextBox(presentationId, pageId); + BatchUpdatePresentationResponse response = + SimpleTextReplace.simpleTextReplace(presentationId, boxId, "MY NEW TEXT"); + assertEquals(2, response.getReplies().size()); + deleteFileOnCleanup(presentationId); + } } diff --git a/slides/snippets/src/test/java/TestTextMerging.java b/slides/snippets/src/test/java/TestTextMerging.java index 35917aa3..873e89f5 100644 --- a/slides/snippets/src/test/java/TestTextMerging.java +++ b/slides/snippets/src/test/java/TestTextMerging.java @@ -23,24 +23,25 @@ import static org.junit.Assert.assertNotNull; // Unit testcase for textMerging snippet -public class TestTextMerging extends BaseTest{ - // TODO(developer) - change the IDs before executing - private final String TEMPLATE_PRESENTATION_ID = "1wJUN1B5CQ2wQOBzmz2apky48QNK1OsE2oNKHPMLpKDc"; - private final String DATA_SPREADSHEET_ID = "14KaZMq2aCAGt5acV77zaA_Ps8aDt04G7T0ei4KiXLX8"; - @Test - public void testTextMerge() throws IOException { - List responses = - TextMerging.textMerging(TEMPLATE_PRESENTATION_ID, DATA_SPREADSHEET_ID); - for (BatchUpdatePresentationResponse response: responses) { - String presentationId = response.getPresentationId(); - assertNotNull(presentationId); - assertEquals(3, response.getReplies().size()); - int numReplacements = 0; - for (Response resp : response.getReplies()) { - numReplacements += resp.getReplaceAllText().getOccurrencesChanged(); - } - assertEquals(4, numReplacements); - deleteFileOnCleanup(presentationId); - } +public class TestTextMerging extends BaseTest { + // TODO(developer) - change the IDs before executing + private final String TEMPLATE_PRESENTATION_ID = "1wJUN1B5CQ2wQOBzmz2apky48QNK1OsE2oNKHPMLpKDc"; + private final String DATA_SPREADSHEET_ID = "14KaZMq2aCAGt5acV77zaA_Ps8aDt04G7T0ei4KiXLX8"; + + @Test + public void testTextMerge() throws IOException { + List responses = + TextMerging.textMerging(TEMPLATE_PRESENTATION_ID, DATA_SPREADSHEET_ID); + for (BatchUpdatePresentationResponse response : responses) { + String presentationId = response.getPresentationId(); + assertNotNull(presentationId); + assertEquals(3, response.getReplies().size()); + int numReplacements = 0; + for (Response resp : response.getReplies()) { + numReplacements += resp.getReplaceAllText().getOccurrencesChanged(); + } + assertEquals(4, numReplacements); + deleteFileOnCleanup(presentationId); } + } } diff --git a/slides/snippets/src/test/java/TestTextStyleUpdate.java b/slides/snippets/src/test/java/TestTextStyleUpdate.java index 6bf13102..d751c217 100644 --- a/slides/snippets/src/test/java/TestTextStyleUpdate.java +++ b/slides/snippets/src/test/java/TestTextStyleUpdate.java @@ -20,16 +20,16 @@ import static org.junit.Assert.assertEquals; // Unit testcase for textStyleUpdate snippet -public class TestTextStyleUpdate extends BaseTest{ +public class TestTextStyleUpdate extends BaseTest { - @Test - public void testTextStyleUpdate() throws IOException { - String presentationId = this.createTestPresentation(); - String pageId = this.createTestSlide(presentationId); - String boxId = this.createTestTextBox(presentationId, pageId); - BatchUpdatePresentationResponse response = - TextStyleUpdate.textStyleUpdate(presentationId, boxId); - assertEquals(3, response.getReplies().size()); - deleteFileOnCleanup(presentationId); - } + @Test + public void testTextStyleUpdate() throws IOException { + String presentationId = this.createTestPresentation(); + String pageId = this.createTestSlide(presentationId); + String boxId = this.createTestTextBox(presentationId, pageId); + BatchUpdatePresentationResponse response = + TextStyleUpdate.textStyleUpdate(presentationId, boxId); + assertEquals(3, response.getReplies().size()); + deleteFileOnCleanup(presentationId); + } } diff --git a/tasks/quickstart/src/main/java/TasksQuickstart.java b/tasks/quickstart/src/main/java/TasksQuickstart.java index 8a522fdd..3e3f8346 100644 --- a/tasks/quickstart/src/main/java/TasksQuickstart.java +++ b/tasks/quickstart/src/main/java/TasksQuickstart.java @@ -13,6 +13,7 @@ // limitations under the License. // [START tasks_quickstart] + import com.google.api.client.auth.oauth2.Credential; import com.google.api.client.extensions.java6.auth.oauth2.AuthorizationCodeInstalledApp; import com.google.api.client.extensions.jetty.auth.oauth2.LocalServerReceiver; @@ -27,7 +28,6 @@ import com.google.api.services.tasks.TasksScopes; import com.google.api.services.tasks.model.TaskList; import com.google.api.services.tasks.model.TaskLists; - import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; @@ -37,61 +37,64 @@ import java.util.List; public class TasksQuickstart { - private static final String APPLICATION_NAME = "Google Tasks API Java Quickstart"; - private static final JsonFactory JSON_FACTORY = GsonFactory.getDefaultInstance(); - private static final String TOKENS_DIRECTORY_PATH = "tokens"; + private static final String APPLICATION_NAME = "Google Tasks API Java Quickstart"; + private static final JsonFactory JSON_FACTORY = GsonFactory.getDefaultInstance(); + private static final String TOKENS_DIRECTORY_PATH = "tokens"; - /** - * Global instance of the scopes required by this quickstart. - * If modifying these scopes, delete your previously saved tokens/ folder. - */ - private static final List SCOPES = Collections.singletonList(TasksScopes.TASKS_READONLY); - private static final String CREDENTIALS_FILE_PATH = "/credentials.json"; + /** + * Global instance of the scopes required by this quickstart. + * If modifying these scopes, delete your previously saved tokens/ folder. + */ + private static final List SCOPES = Collections.singletonList(TasksScopes.TASKS_READONLY); + private static final String CREDENTIALS_FILE_PATH = "/credentials.json"; - /** - * Creates an authorized Credential object. - * @param HTTP_TRANSPORT The network HTTP Transport. - * @return An authorized Credential object. - * @throws IOException If the credentials.json file cannot be found. - */ - private static Credential getCredentials(final NetHttpTransport HTTP_TRANSPORT) throws IOException { - // Load client secrets. - InputStream in = TasksQuickstart.class.getResourceAsStream(CREDENTIALS_FILE_PATH); - if (in == null) { - throw new FileNotFoundException("Resource not found: " + CREDENTIALS_FILE_PATH); - } - GoogleClientSecrets clientSecrets = GoogleClientSecrets.load(JSON_FACTORY, new InputStreamReader(in)); - - // Build flow and trigger user authorization request. - GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow.Builder( - HTTP_TRANSPORT, JSON_FACTORY, clientSecrets, SCOPES) - .setDataStoreFactory(new FileDataStoreFactory(new java.io.File(TOKENS_DIRECTORY_PATH))) - .setAccessType("offline") - .build(); - LocalServerReceiver receiver = new LocalServerReceiver.Builder().setPort(8888).build(); - return new AuthorizationCodeInstalledApp(flow, receiver).authorize("user"); + /** + * Creates an authorized Credential object. + * + * @param HTTP_TRANSPORT The network HTTP Transport. + * @return An authorized Credential object. + * @throws IOException If the credentials.json file cannot be found. + */ + private static Credential getCredentials(final NetHttpTransport HTTP_TRANSPORT) + throws IOException { + // Load client secrets. + InputStream in = TasksQuickstart.class.getResourceAsStream(CREDENTIALS_FILE_PATH); + if (in == null) { + throw new FileNotFoundException("Resource not found: " + CREDENTIALS_FILE_PATH); } + GoogleClientSecrets clientSecrets = + GoogleClientSecrets.load(JSON_FACTORY, new InputStreamReader(in)); + + // Build flow and trigger user authorization request. + GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow.Builder( + HTTP_TRANSPORT, JSON_FACTORY, clientSecrets, SCOPES) + .setDataStoreFactory(new FileDataStoreFactory(new java.io.File(TOKENS_DIRECTORY_PATH))) + .setAccessType("offline") + .build(); + LocalServerReceiver receiver = new LocalServerReceiver.Builder().setPort(8888).build(); + return new AuthorizationCodeInstalledApp(flow, receiver).authorize("user"); + } - public static void main(String... args) throws IOException, GeneralSecurityException { - // Build a new authorized API client service. - final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport(); - Tasks service = new Tasks.Builder(HTTP_TRANSPORT, JSON_FACTORY, getCredentials(HTTP_TRANSPORT)) - .setApplicationName(APPLICATION_NAME) - .build(); + public static void main(String... args) throws IOException, GeneralSecurityException { + // Build a new authorized API client service. + final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport(); + Tasks service = new Tasks.Builder(HTTP_TRANSPORT, JSON_FACTORY, getCredentials(HTTP_TRANSPORT)) + .setApplicationName(APPLICATION_NAME) + .build(); - // Print the first 10 task lists. - TaskLists result = service.tasklists().list() - .setMaxResults(10) - .execute(); - List taskLists = result.getItems(); - if (taskLists == null || taskLists.isEmpty()) { - System.out.println("No task lists found."); - } else { - System.out.println("Task lists:"); - for (TaskList tasklist : taskLists) { - System.out.printf("%s (%s)\n", tasklist.getTitle(), tasklist.getId()); - } - } + // Print the first 10 task lists. + TaskLists result = service.tasklists().list() + .setMaxResults(10) + .execute(); + List taskLists = result.getItems(); + if (taskLists == null || taskLists.isEmpty()) { + System.out.println("No task lists found."); + } else { + System.out.println("Task lists:"); + for (TaskList tasklist : taskLists) { + System.out.printf("%s (%s)\n", tasklist.getTitle(), tasklist.getId()); + } } + } } // [END tasks_quickstart] diff --git a/vault/quickstart/src/main/java/Quickstart.java b/vault/quickstart/src/main/java/Quickstart.java index 742b6184..66d99a64 100644 --- a/vault/quickstart/src/main/java/Quickstart.java +++ b/vault/quickstart/src/main/java/Quickstart.java @@ -13,6 +13,7 @@ // limitations under the License. // [START vault_quickstart] + import com.google.api.client.auth.oauth2.Credential; import com.google.api.client.extensions.java6.auth.oauth2.AuthorizationCodeInstalledApp; import com.google.api.client.extensions.jetty.auth.oauth2.LocalServerReceiver; @@ -35,101 +36,109 @@ import java.util.List; public class Quickstart { - /** Application name. */ - private static final String APPLICATION_NAME = - "Google Vault API Java Quickstart"; - - /** Directory to store authorization tokens for this application. */ - private static final java.io.File DATA_STORE_DIR = new java.io.File("tokens"); - - /** Global instance of the {@link FileDataStoreFactory}. */ - private static FileDataStoreFactory DATA_STORE_FACTORY; - - /** Global instance of the JSON factory. */ - private static final JsonFactory JSON_FACTORY = GsonFactory.getDefaultInstance(); - - /** Global instance of the HTTP transport. */ - private static HttpTransport HTTP_TRANSPORT; + /** + * Application name. + */ + private static final String APPLICATION_NAME = + "Google Vault API Java Quickstart"; - private static final String CREDENTIALS_FILE_PATH = "/credentials.json"; + /** + * Directory to store authorization tokens for this application. + */ + private static final java.io.File DATA_STORE_DIR = new java.io.File("tokens"); + /** + * Global instance of the JSON factory. + */ + private static final JsonFactory JSON_FACTORY = GsonFactory.getDefaultInstance(); + private static final String CREDENTIALS_FILE_PATH = "/credentials.json"; + /** + * Global instance of the scopes required by this quickstart. + *

+ * If modifying these scopes, delete your previously saved credentials + * at ~/.credentials/vault.googleapis.com-java-quickstart + */ + private static final List SCOPES = + Arrays.asList(VaultScopes.EDISCOVERY_READONLY); + /** + * Global instance of the {@link FileDataStoreFactory}. + */ + private static FileDataStoreFactory DATA_STORE_FACTORY; + /** + * Global instance of the HTTP transport. + */ + private static HttpTransport HTTP_TRANSPORT; - /** Global instance of the scopes required by this quickstart. - * - * If modifying these scopes, delete your previously saved credentials - * at ~/.credentials/vault.googleapis.com-java-quickstart - */ - private static final List SCOPES = - Arrays.asList(VaultScopes.EDISCOVERY_READONLY); - - static { - try { - HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport(); - DATA_STORE_FACTORY = new FileDataStoreFactory(DATA_STORE_DIR); - } catch (Throwable t) { - t.printStackTrace(); - System.exit(1); - } + static { + try { + HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport(); + DATA_STORE_FACTORY = new FileDataStoreFactory(DATA_STORE_DIR); + } catch (Throwable t) { + t.printStackTrace(); + System.exit(1); } + } - /** - * Creates an authorized Credential object. - * @return an authorized Credential object. - * @throws IOException - */ - public static Credential authorize() throws IOException { - // Load client secrets. - InputStream in = - Quickstart.class.getResourceAsStream("/credentials.json"); - if (in == null) { - throw new FileNotFoundException("Resource not found: " + CREDENTIALS_FILE_PATH); - } - GoogleClientSecrets clientSecrets = - GoogleClientSecrets.load(JSON_FACTORY, new InputStreamReader(in)); - - // Build flow and trigger user authorization request. - GoogleAuthorizationCodeFlow flow = - new GoogleAuthorizationCodeFlow.Builder( - HTTP_TRANSPORT, JSON_FACTORY, clientSecrets, SCOPES) - .setDataStoreFactory(DATA_STORE_FACTORY) - .setAccessType("offline") - .build(); - Credential credential = new AuthorizationCodeInstalledApp( - flow, new LocalServerReceiver()).authorize("user"); - System.out.println( - "Credentials saved to " + DATA_STORE_DIR.getAbsolutePath()); - return credential; + /** + * Creates an authorized Credential object. + * + * @return an authorized Credential object. + * @throws IOException + */ + public static Credential authorize() throws IOException { + // Load client secrets. + InputStream in = + Quickstart.class.getResourceAsStream("/credentials.json"); + if (in == null) { + throw new FileNotFoundException("Resource not found: " + CREDENTIALS_FILE_PATH); } + GoogleClientSecrets clientSecrets = + GoogleClientSecrets.load(JSON_FACTORY, new InputStreamReader(in)); - /** - * Build and return an authorized Vault client service. - * @return an authorized Vault client service - * @throws IOException - */ - public static Vault getVaultService() throws IOException { - Credential credential = authorize(); - return new Vault.Builder(HTTP_TRANSPORT, JSON_FACTORY, credential) - .setApplicationName(APPLICATION_NAME) - .build(); - } + // Build flow and trigger user authorization request. + GoogleAuthorizationCodeFlow flow = + new GoogleAuthorizationCodeFlow.Builder( + HTTP_TRANSPORT, JSON_FACTORY, clientSecrets, SCOPES) + .setDataStoreFactory(DATA_STORE_FACTORY) + .setAccessType("offline") + .build(); + Credential credential = new AuthorizationCodeInstalledApp( + flow, new LocalServerReceiver()).authorize("user"); + System.out.println( + "Credentials saved to " + DATA_STORE_DIR.getAbsolutePath()); + return credential; + } - public static void main(String[] args) throws IOException { - // Build a new authorized API client service. - Vault service = getVaultService(); + /** + * Build and return an authorized Vault client service. + * + * @return an authorized Vault client service + * @throws IOException + */ + public static Vault getVaultService() throws IOException { + Credential credential = authorize(); + return new Vault.Builder(HTTP_TRANSPORT, JSON_FACTORY, credential) + .setApplicationName(APPLICATION_NAME) + .build(); + } - // List the first 10 matters. - ListMattersResponse response = service.matters().list() - .setPageSize(10) - .execute(); - List matters = response.getMatters(); - if (matters == null || matters.size() == 0) { - System.out.println("No matters found."); - return; - } - System.out.println("Matters:"); - for (Matter matter: matters) { - System.out.printf("%s (%s)\n", matter.getName(), - matter.getMatterId()); - } + public static void main(String[] args) throws IOException { + // Build a new authorized API client service. + Vault service = getVaultService(); + + // List the first 10 matters. + ListMattersResponse response = service.matters().list() + .setPageSize(10) + .execute(); + List matters = response.getMatters(); + if (matters == null || matters.size() == 0) { + System.out.println("No matters found."); + return; + } + System.out.println("Matters:"); + for (Matter matter : matters) { + System.out.printf("%s (%s)\n", matter.getName(), + matter.getMatterId()); } + } } // [END vault_quickstart] diff --git a/vault/vault-hold-migration-api/src/main/java/com/google/vault/chatmigration/DuplicateHold.java b/vault/vault-hold-migration-api/src/main/java/com/google/vault/chatmigration/DuplicateHold.java index cf8ef242..25a06f0f 100644 --- a/vault/vault-hold-migration-api/src/main/java/com/google/vault/chatmigration/DuplicateHold.java +++ b/vault/vault-hold-migration-api/src/main/java/com/google/vault/chatmigration/DuplicateHold.java @@ -35,15 +35,14 @@ import org.apache.commons.csv.CSVRecord; public class DuplicateHold { - private static Logger logger = Logger.getLogger(DuplicateHold.class.getName()); - private static final String ERROR_DESCRIPTION = "Error Description"; public static final String HOLD_NAME_SUFFIX = "_hangoutsChat"; + private static final String ERROR_DESCRIPTION = "Error Description"; private static final int MAX_ACCOUNTS_FOR_HOLD = 100; - + private static Logger logger = Logger.getLogger(DuplicateHold.class.getName()); + Vault vaultService; private CSVParser csvParser; private boolean includeRooms; private CSVPrinter errorReport; - Vault vaultService; private int numberOfHolds = 0; public DuplicateHold( @@ -66,8 +65,8 @@ public int duplicateHolds() throws Exception { (accounts.equals("")) ? null : Arrays.stream(accounts.split(",")) - .map(account -> new HeldAccount().setAccountId(account)) - .collect(Collectors.toList()); + .map(account -> new HeldAccount().setAccountId(account)) + .collect(Collectors.toList()); boolean exceedsAccountLimit = false; Hold hold = new Hold().setName(name + HOLD_NAME_SUFFIX).setCorpus("HANGOUTS_CHAT"); diff --git a/vault/vault-hold-migration-api/src/main/java/com/google/vault/chatmigration/HoldsReport.java b/vault/vault-hold-migration-api/src/main/java/com/google/vault/chatmigration/HoldsReport.java index b2bb1a07..b337cddf 100644 --- a/vault/vault-hold-migration-api/src/main/java/com/google/vault/chatmigration/HoldsReport.java +++ b/vault/vault-hold-migration-api/src/main/java/com/google/vault/chatmigration/HoldsReport.java @@ -31,8 +31,6 @@ public class HoldsReport { - private static final Logger LOGGER = Logger.getLogger(HoldsReport.class.getName()); - public static final String MATTER_ID = "Matter Id"; public static final String MATTER_NAME = "Matter Name"; public static final String HOLD_ID = "Hold Id"; @@ -46,7 +44,7 @@ public class HoldsReport { public static final String TERMS = "Terms"; public static final String START_TIME = "startTime"; public static final String END_TIME = "endTime"; - + private static final Logger LOGGER = Logger.getLogger(HoldsReport.class.getName()); private Vault vaultService; private DirectoryService directoryService; private CSVPrinter printer; @@ -71,11 +69,11 @@ private void iterateMatters(String nextPageToken) throws Exception { ListMattersResponse response = RetryableTemplate.callWithRetry( vaultService - .matters() - .list() - .setState("OPEN") - .setPageSize(100) - .setPageToken(nextPageToken) + .matters() + .list() + .setState("OPEN") + .setPageSize(100) + .setPageToken(nextPageToken) ::execute); List matters = response.getMatters(); diff --git a/vault/vault-hold-migration-api/src/main/java/com/google/vault/chatmigration/MigrationHelper.java b/vault/vault-hold-migration-api/src/main/java/com/google/vault/chatmigration/MigrationHelper.java index 2da593c3..e867ff63 100644 --- a/vault/vault-hold-migration-api/src/main/java/com/google/vault/chatmigration/MigrationHelper.java +++ b/vault/vault-hold-migration-api/src/main/java/com/google/vault/chatmigration/MigrationHelper.java @@ -43,44 +43,25 @@ public class MigrationHelper { - enum MigrationOptions { - GENERATE_REPORT("a", "genholdreport", "Generate Hold Report"), - DUPLICATE_HOLDS("b", "duplicateholds", "Duplicate Gmail Holds to Hangouts Chat"), - REPORT_FILE("f", "reportfile", "Path to holds report file"), - ERROR_FILE("e", "errorfile", "Path to error report file"), - INCLUDE_ROOMS("g", "includerooms", "Include Rooms when duplicating holds to Hangouts Chat"), - HELP("h", "help", "Options Help"); - - private final String option; - private final String longOpt; - private final String description; - - MigrationOptions(String opt, String longOpt, String description) { - this.option = opt; - this.longOpt = longOpt; - this.description = description; - } - - public String getOption() { - return option; - } - } - - /** Application name. */ + static final Option helpOption = + Option.builder(MigrationOptions.HELP.option) + .longOpt(MigrationOptions.HELP.longOpt) + .argName("help") + .desc(MigrationOptions.HELP.description) + .build(); + /** + * Application name. + */ private static final String APPLICATION_NAME = "Google Vault API Java Quickstart"; - /** Directory to store authorization tokens for this application. */ + /** + * Directory to store authorization tokens for this application. + */ private static final java.io.File DATA_STORE_DIR = new java.io.File("tokens"); - - /** Global instance of the {@link FileDataStoreFactory}. */ - private static FileDataStoreFactory DATA_STORE_FACTORY; - - /** Global instance of the JSON factory. */ + /** + * Global instance of the JSON factory. + */ private static final JsonFactory JSON_FACTORY = GsonFactory.getDefaultInstance(); - - /** Global instance of the HTTP transport. */ - private static HttpTransport HTTP_TRANSPORT; - /** * Global instance of the scopes required by this quickstart. * @@ -92,6 +73,14 @@ public String getOption() { VaultScopes.EDISCOVERY, DirectoryScopes.ADMIN_DIRECTORY_USER_READONLY, DirectoryScopes.ADMIN_DIRECTORY_ORGUNIT_READONLY); + /** + * Global instance of the {@link FileDataStoreFactory}. + */ + private static FileDataStoreFactory DATA_STORE_FACTORY; + /** + * Global instance of the HTTP transport. + */ + private static HttpTransport HTTP_TRANSPORT; static { try { @@ -106,13 +95,6 @@ public String getOption() { } } - static final Option helpOption = - Option.builder(MigrationOptions.HELP.option) - .longOpt(MigrationOptions.HELP.longOpt) - .argName("help") - .desc(MigrationOptions.HELP.description) - .build(); - static Options buildOptions() { Options options = new Options(); @@ -214,4 +196,27 @@ public static Directory getDirectoryService() throws IOException { .build(); return service; } + + enum MigrationOptions { + GENERATE_REPORT("a", "genholdreport", "Generate Hold Report"), + DUPLICATE_HOLDS("b", "duplicateholds", "Duplicate Gmail Holds to Hangouts Chat"), + REPORT_FILE("f", "reportfile", "Path to holds report file"), + ERROR_FILE("e", "errorfile", "Path to error report file"), + INCLUDE_ROOMS("g", "includerooms", "Include Rooms when duplicating holds to Hangouts Chat"), + HELP("h", "help", "Options Help"); + + private final String option; + private final String longOpt; + private final String description; + + MigrationOptions(String opt, String longOpt, String description) { + this.option = opt; + this.longOpt = longOpt; + this.description = description; + } + + public String getOption() { + return option; + } + } } From d94b838de9f6e8d775c0fc7ddd4d37cefcd7ee5d Mon Sep 17 00:00:00 2001 From: googleworkspace-bot <109114539+googleworkspace-bot@users.noreply.github.com> Date: Tue, 9 Aug 2022 17:01:01 -0600 Subject: [PATCH 127/262] chore: Synced file(s) with googleworkspace/.github (#259) * chore: Synced local '.github/workflows/automation.yml' with remote 'sync-files/defaults/.github/workflows/automation.yml' * chore: Synced local '.github/linters/' with remote 'sync-files/defaults/.github/linters/' --- .github/linters/sun_checks.xml | 620 +++++++++++++++---------------- .github/workflows/automation.yml | 10 +- 2 files changed, 315 insertions(+), 315 deletions(-) diff --git a/.github/linters/sun_checks.xml b/.github/linters/sun_checks.xml index de6c6cd4..76d0840d 100644 --- a/.github/linters/sun_checks.xml +++ b/.github/linters/sun_checks.xml @@ -13,8 +13,8 @@ --> + "-//Checkstyle//DTD Checkstyle Configuration 1.3//EN" + "https://checkstyle.org/dtds/configuration_1_3.dtd"> - - + + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + - - - - - - - - + + + + + - - + + + + + - - + + + + + + + + + + + + + + + + + + + + + + + + + - - - - + + - - - - - + + + - - - - - + + + - - - + - - - - - - - - - + + + + + + + - - - - - - - - - - - - + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - + + + + + + + + + + - - - + - - - - + + + - - - - + + - - - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - + + - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + - \ No newline at end of file diff --git a/.github/workflows/automation.yml b/.github/workflows/automation.yml index b01e9cf9..95f323bf 100644 --- a/.github/workflows/automation.yml +++ b/.github/workflows/automation.yml @@ -13,7 +13,7 @@ # limitations under the License. --- name: Automation -on: [push, pull_request, workflow_dispatch] +on: [ push, pull_request, workflow_dispatch ] jobs: dependabot: runs-on: ubuntu-latest @@ -41,13 +41,13 @@ jobs: - name: Set env run: | # set DEFAULT BRANCH - echo "DEFAULT_BRANCH=$(gh repo view --json defaultBranchRef --jq '.defaultBranchRef.name')" >> $GITHUB_ENV; + echo "DEFAULT_BRANCH=$(gh repo view --json defaultBranchRef --jq '.defaultBranchRef.name')" >> "$GITHUB_ENV"; # set HAS_MASTER_BRANCH - if [ ! -z "$(git ls-remote --heads origin master)" ]; then - echo "HAS_MASTER_BRANCH=true" >> $GITHUB_ENV + if [ -n "$(git ls-remote --heads origin master)" ]; then + echo "HAS_MASTER_BRANCH=true" >> "$GITHUB_ENV" else - echo "HAS_MASTER_BRANCH=false" >> $GITHUB_ENV + echo "HAS_MASTER_BRANCH=false" >> "$GITHUB_ENV" fi env: GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} From 7793559faf46d4c11f93399c180abb1498259a09 Mon Sep 17 00:00:00 2001 From: Steve Bazyl Date: Mon, 29 Aug 2022 12:10:25 -0600 Subject: [PATCH 128/262] fix: Update branch for rennovate --- renovate.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/renovate.json b/renovate.json index f45d8f11..f93f9542 100644 --- a/renovate.json +++ b/renovate.json @@ -1,5 +1,6 @@ { "extends": [ - "config:base" + "config:base", + "baseBranches": ["main"] ] } From e0a895afcda7a3de65d4653ef18eb3109a874b3e Mon Sep 17 00:00:00 2001 From: Steve Bazyl Date: Tue, 30 Aug 2022 09:33:12 -0600 Subject: [PATCH 129/262] chore: Create initial dependabot config --- .github/dependabot.yml | 110 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 110 insertions(+) create mode 100644 .github/dependabot.yml diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 00000000..c8c55cd4 --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,110 @@ +version: 2 +updates: + - package-ecosystem: "maven" + directory: "/calendar/sync" + schedule: + interval: "weekly" + - package-ecosystem: "gradle" + directory: "/calendar/sync" + schedule: + interval: "weekly" + - package-ecosystem: "gradle" + directory: "/calendar/quickstart" + schedule: + interval: "weekly" + - package-ecosystem: "gradle" + directory: "/sheets/snippets" + schedule: + interval: "weekly" + - package-ecosystem: "gradle" + directory: "/sheets/quickstart" + schedule: + interval: "weekly" + - package-ecosystem: "gradle" + directory: "/adminSDK/alertcenter" + schedule: + interval: "weekly" + - package-ecosystem: "gradle" + directory: "/adminSDK/directory/quickstart" + schedule: + interval: "weekly" + - package-ecosystem: "gradle" + directory: "/adminSDK/reseller/quickstart" + schedule: + interval: "weekly" + - package-ecosystem: "gradle" + directory: "/adminSDK/groups-settings/quickstart" + schedule: + interval: "weekly" + - package-ecosystem: "gradle" + directory: "/adminSDK/reports/quickstart" + schedule: + interval: "weekly" + - package-ecosystem: "gradle" + directory: "/classroom/snippets" + schedule: + interval: "weekly" + - package-ecosystem: "gradle" + directory: "/classroom/quickstart" + schedule: + interval: "weekly" + - package-ecosystem: "gradle" + directory: "/docs/outputJSON" + schedule: + interval: "weekly" + - package-ecosystem: "gradle" + directory: "/docs/quickstart" + schedule: + interval: "weekly" + - package-ecosystem: "gradle" + directory: "/slides/snippets" + schedule: + interval: "weekly" + - package-ecosystem: "gradle" + directory: "/slides/quickstart" + schedule: + interval: "weekly" + - package-ecosystem: "gradle" + directory: "/people/quickstart" + schedule: + interval: "weekly" + - package-ecosystem: "gradle" + directory: "/appsScript/quickstart" + schedule: + interval: "weekly" + - package-ecosystem: "gradle" + directory: "/drive/snippets/drive_v2" + schedule: + interval: "weekly" + - package-ecosystem: "gradle" + directory: "/drive/snippets/drive_v3" + schedule: + interval: "weekly" + - package-ecosystem: "gradle" + directory: "/drive/activity/quickstart" + schedule: + interval: "weekly" + - package-ecosystem: "gradle" + directory: "/drive/quickstart" + schedule: + interval: "weekly" + - package-ecosystem: "gradle" + directory: "/drive/activity-v2/quickstart" + schedule: + interval: "weekly" + - package-ecosystem: "gradle" + directory: "/gmail/snippets" + schedule: + interval: "weekly" + - package-ecosystem: "gradle" + directory: "/gmail/quickstart" + schedule: + interval: "weekly" + - package-ecosystem: "gradle" + directory: "/vault/quickstart" + schedule: + interval: "weekly" + - package-ecosystem: "gradle" + directory: "/vault/vault-hold-migration-api" + schedule: + interval: "weekly" From 39f5e7a3aab99c7d6b1a1d835f89d02872a0dd76 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 30 Aug 2022 15:33:34 +0000 Subject: [PATCH 130/262] Bump maven-compiler-plugin from 2.3.2 to 3.10.1 in /calendar/sync Bumps [maven-compiler-plugin](https://github.com/apache/maven-compiler-plugin) from 2.3.2 to 3.10.1. - [Release notes](https://github.com/apache/maven-compiler-plugin/releases) - [Commits](https://github.com/apache/maven-compiler-plugin/compare/maven-compiler-plugin-2.3.2...maven-compiler-plugin-3.10.1) --- updated-dependencies: - dependency-name: org.apache.maven.plugins:maven-compiler-plugin dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- calendar/sync/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/calendar/sync/pom.xml b/calendar/sync/pom.xml index 5c38dc4e..cfc48a4b 100644 --- a/calendar/sync/pom.xml +++ b/calendar/sync/pom.xml @@ -38,7 +38,7 @@ org.apache.maven.plugins maven-compiler-plugin - 2.3.2 + 3.10.1 1.6 1.6 From 459368bbbcc3021ea4d6a378f9b42b128bbc1209 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 30 Aug 2022 09:45:26 -0600 Subject: [PATCH 131/262] Bump google-oauth-client-jetty in /adminSDK/directory/quickstart (#264) Bumps [google-oauth-client-jetty](https://github.com/googleapis/google-oauth-java-client) from 1.32.1 to 1.34.1. - [Release notes](https://github.com/googleapis/google-oauth-java-client/releases) - [Changelog](https://github.com/googleapis/google-oauth-java-client/blob/main/CHANGELOG.md) - [Commits](https://github.com/googleapis/google-oauth-java-client/compare/v1.32.1...v1.34.1) --- updated-dependencies: - dependency-name: com.google.oauth-client:google-oauth-client-jetty dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- adminSDK/directory/quickstart/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/adminSDK/directory/quickstart/build.gradle b/adminSDK/directory/quickstart/build.gradle index 4ea5ca58..3504f0b0 100644 --- a/adminSDK/directory/quickstart/build.gradle +++ b/adminSDK/directory/quickstart/build.gradle @@ -12,6 +12,6 @@ repositories { dependencies { implementation 'com.google.api-client:google-api-client:1.33.0' - implementation 'com.google.oauth-client:google-oauth-client-jetty:1.32.1' + implementation 'com.google.oauth-client:google-oauth-client-jetty:1.34.1' implementation 'com.google.apis:google-api-services-admin-directory:directory_v1-rev118-1.25.0' } From 723e95e437745700bd548947d8a4d5b99c6d36fb Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 30 Aug 2022 09:45:50 -0600 Subject: [PATCH 132/262] Bump google-auth-library-oauth2-http in /sheets/snippets (#305) Bumps google-auth-library-oauth2-http from 1.6.0 to 1.10.0. --- updated-dependencies: - dependency-name: com.google.auth:google-auth-library-oauth2-http dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- sheets/snippets/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sheets/snippets/build.gradle b/sheets/snippets/build.gradle index 6988f011..e26101e4 100644 --- a/sheets/snippets/build.gradle +++ b/sheets/snippets/build.gradle @@ -5,7 +5,7 @@ repositories { } dependencies { - implementation 'com.google.auth:google-auth-library-oauth2-http:1.6.0' + implementation 'com.google.auth:google-auth-library-oauth2-http:1.10.0' implementation 'com.google.apis:google-api-services-drive:v3-rev20220508-1.32.1' implementation 'com.google.apis:google-api-services-sheets:v4-rev20220411-1.32.1' testImplementation 'junit:junit:4.13.2' From e253f091b9c26042bc721e1601d26a989bb280be Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 30 Aug 2022 09:47:25 -0600 Subject: [PATCH 133/262] Bump google-api-services-drive in /sheets/snippets (#302) Bumps google-api-services-drive from v3-rev20220508-1.32.1 to v3-rev20220815-2.0.0. --- updated-dependencies: - dependency-name: com.google.apis:google-api-services-drive dependency-type: direct:production ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- sheets/snippets/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sheets/snippets/build.gradle b/sheets/snippets/build.gradle index e26101e4..dc97d33a 100644 --- a/sheets/snippets/build.gradle +++ b/sheets/snippets/build.gradle @@ -6,7 +6,7 @@ repositories { dependencies { implementation 'com.google.auth:google-auth-library-oauth2-http:1.10.0' - implementation 'com.google.apis:google-api-services-drive:v3-rev20220508-1.32.1' + implementation 'com.google.apis:google-api-services-drive:v3-rev20220815-2.0.0' implementation 'com.google.apis:google-api-services-sheets:v4-rev20220411-1.32.1' testImplementation 'junit:junit:4.13.2' } From e8efd560d4fbc64a37f3fb70ace03109420fd339 Mon Sep 17 00:00:00 2001 From: Steve Bazyl Date: Tue, 30 Aug 2022 09:51:11 -0600 Subject: [PATCH 134/262] Revert "Bump google-api-services-drive in /sheets/snippets (#302)" (#327) This reverts commit e253f091b9c26042bc721e1601d26a989bb280be. --- sheets/snippets/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sheets/snippets/build.gradle b/sheets/snippets/build.gradle index dc97d33a..e26101e4 100644 --- a/sheets/snippets/build.gradle +++ b/sheets/snippets/build.gradle @@ -6,7 +6,7 @@ repositories { dependencies { implementation 'com.google.auth:google-auth-library-oauth2-http:1.10.0' - implementation 'com.google.apis:google-api-services-drive:v3-rev20220815-2.0.0' + implementation 'com.google.apis:google-api-services-drive:v3-rev20220508-1.32.1' implementation 'com.google.apis:google-api-services-sheets:v4-rev20220411-1.32.1' testImplementation 'junit:junit:4.13.2' } From aa8299e5d8e99d80c07bbf6280bf97ae9cb29cd2 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 30 Aug 2022 09:51:39 -0600 Subject: [PATCH 135/262] Bump google-oauth-client-jetty in /appsScript/quickstart (#311) Bumps [google-oauth-client-jetty](https://github.com/googleapis/google-oauth-java-client) from 1.32.1 to 1.34.1. - [Release notes](https://github.com/googleapis/google-oauth-java-client/releases) - [Changelog](https://github.com/googleapis/google-oauth-java-client/blob/main/CHANGELOG.md) - [Commits](https://github.com/googleapis/google-oauth-java-client/compare/v1.32.1...v1.34.1) --- updated-dependencies: - dependency-name: com.google.oauth-client:google-oauth-client-jetty dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- appsScript/quickstart/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/appsScript/quickstart/build.gradle b/appsScript/quickstart/build.gradle index 4990f03e..41dd51b6 100644 --- a/appsScript/quickstart/build.gradle +++ b/appsScript/quickstart/build.gradle @@ -12,6 +12,6 @@ repositories { dependencies { implementation 'com.google.api-client:google-api-client:1.33.0' - implementation 'com.google.oauth-client:google-oauth-client-jetty:1.32.1' + implementation 'com.google.oauth-client:google-oauth-client-jetty:1.34.1' implementation 'com.google.apis:google-api-services-script:v1-rev20210703-1.32.1' } From 52f1ea92012ee09ad5f00559edbcfc12d355eb78 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 30 Aug 2022 09:51:51 -0600 Subject: [PATCH 136/262] Bump google-oauth-client-jetty in /slides/quickstart (#312) Bumps [google-oauth-client-jetty](https://github.com/googleapis/google-oauth-java-client) from 1.32.1 to 1.34.1. - [Release notes](https://github.com/googleapis/google-oauth-java-client/releases) - [Changelog](https://github.com/googleapis/google-oauth-java-client/blob/main/CHANGELOG.md) - [Commits](https://github.com/googleapis/google-oauth-java-client/compare/v1.32.1...v1.34.1) --- updated-dependencies: - dependency-name: com.google.oauth-client:google-oauth-client-jetty dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- slides/quickstart/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/slides/quickstart/build.gradle b/slides/quickstart/build.gradle index 36d3ef1d..d4eac491 100644 --- a/slides/quickstart/build.gradle +++ b/slides/quickstart/build.gradle @@ -12,6 +12,6 @@ repositories { dependencies { implementation 'com.google.api-client:google-api-client:1.33.0' - implementation 'com.google.oauth-client:google-oauth-client-jetty:1.32.1' + implementation 'com.google.oauth-client:google-oauth-client-jetty:1.34.1' implementation 'com.google.apis:google-api-services-slides:v1-rev20210820-1.32.1' } From 3924b322468ca4c0892d2e319d0ccee6d479ce2a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 30 Aug 2022 09:52:16 -0600 Subject: [PATCH 137/262] Bump google-auth-library-oauth2-http in /drive/snippets/drive_v3 (#317) Bumps google-auth-library-oauth2-http from 1.3.0 to 1.10.0. --- updated-dependencies: - dependency-name: com.google.auth:google-auth-library-oauth2-http dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- drive/snippets/drive_v3/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drive/snippets/drive_v3/build.gradle b/drive/snippets/drive_v3/build.gradle index 4327d404..0343fc54 100644 --- a/drive/snippets/drive_v3/build.gradle +++ b/drive/snippets/drive_v3/build.gradle @@ -6,7 +6,7 @@ repositories { dependencies { implementation 'com.google.apis:google-api-services-drive:v3-rev20211107-1.32.1' implementation 'com.google.api-client:google-api-client:1.23.0' - implementation 'com.google.auth:google-auth-library-oauth2-http:1.3.0' + implementation 'com.google.auth:google-auth-library-oauth2-http:1.10.0' implementation 'com.google.code.gson:gson:2.4' testImplementation 'junit:junit:4.12' } From b3581e59e30cdd2e7b02ebb8341cb9eeb0defcde Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 30 Aug 2022 09:52:30 -0600 Subject: [PATCH 138/262] Bump google-oauth-client-jetty in /gmail/quickstart (#320) Bumps [google-oauth-client-jetty](https://github.com/googleapis/google-oauth-java-client) from 1.32.1 to 1.34.1. - [Release notes](https://github.com/googleapis/google-oauth-java-client/releases) - [Changelog](https://github.com/googleapis/google-oauth-java-client/blob/main/CHANGELOG.md) - [Commits](https://github.com/googleapis/google-oauth-java-client/compare/v1.32.1...v1.34.1) --- updated-dependencies: - dependency-name: com.google.oauth-client:google-oauth-client-jetty dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- gmail/quickstart/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gmail/quickstart/build.gradle b/gmail/quickstart/build.gradle index 0dae0ebf..ce120ab6 100644 --- a/gmail/quickstart/build.gradle +++ b/gmail/quickstart/build.gradle @@ -12,6 +12,6 @@ repositories { dependencies { implementation 'com.google.api-client:google-api-client:1.33.0' - implementation 'com.google.oauth-client:google-oauth-client-jetty:1.32.1' + implementation 'com.google.oauth-client:google-oauth-client-jetty:1.34.1' implementation 'com.google.apis:google-api-services-gmail:v1-rev20211108-1.32.1' } From 8db9cc176bfc2859ce1166c4740d3b859020fb24 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 30 Aug 2022 09:52:54 -0600 Subject: [PATCH 139/262] Bump mockito-inline from 4.5.1 to 4.7.0 in /gmail/snippets (#321) Bumps [mockito-inline](https://github.com/mockito/mockito) from 4.5.1 to 4.7.0. - [Release notes](https://github.com/mockito/mockito/releases) - [Commits](https://github.com/mockito/mockito/compare/v4.5.1...v4.7.0) --- updated-dependencies: - dependency-name: org.mockito:mockito-inline dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- gmail/snippets/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gmail/snippets/build.gradle b/gmail/snippets/build.gradle index 85351fa9..5e89d634 100644 --- a/gmail/snippets/build.gradle +++ b/gmail/snippets/build.gradle @@ -10,5 +10,5 @@ dependencies { implementation 'javax.mail:mail:1.4.7' implementation 'org.apache.commons:commons-csv:1.9.0' testImplementation 'junit:junit:4.13.2' - testImplementation 'org.mockito:mockito-inline:4.5.1' + testImplementation 'org.mockito:mockito-inline:4.7.0' } From 852802a313111e3d53f7bb4de611d9621abb7e40 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 30 Aug 2022 09:53:14 -0600 Subject: [PATCH 140/262] Bump google-oauth-client-jetty in /vault/vault-hold-migration-api (#324) Bumps [google-oauth-client-jetty](https://github.com/googleapis/google-oauth-java-client) from 1.32.1 to 1.34.1. - [Release notes](https://github.com/googleapis/google-oauth-java-client/releases) - [Changelog](https://github.com/googleapis/google-oauth-java-client/blob/main/CHANGELOG.md) - [Commits](https://github.com/googleapis/google-oauth-java-client/compare/v1.32.1...v1.34.1) --- updated-dependencies: - dependency-name: com.google.oauth-client:google-oauth-client-jetty dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- vault/vault-hold-migration-api/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vault/vault-hold-migration-api/build.gradle b/vault/vault-hold-migration-api/build.gradle index 83db2baf..82e95410 100644 --- a/vault/vault-hold-migration-api/build.gradle +++ b/vault/vault-hold-migration-api/build.gradle @@ -13,7 +13,7 @@ repositories { dependencies { implementation 'com.google.api-client:google-api-client:1.33.0' - implementation 'com.google.oauth-client:google-oauth-client-jetty:1.32.1' + implementation 'com.google.oauth-client:google-oauth-client-jetty:1.34.1' implementation 'com.google.apis:google-api-services-vault:v1-rev20211101-1.32.1' implementation group: 'org.apache.commons', name: 'commons-csv', version: '1.9.0' implementation 'com.github.rholder:guava-retrying:2.0.0' From eecc00323c0c60b4c7d23b96227f86e15554b719 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 30 Aug 2022 09:53:34 -0600 Subject: [PATCH 141/262] Bump google-auth-library-oauth2-http in /slides/snippets (#326) Bumps google-auth-library-oauth2-http from 1.3.0 to 1.10.0. --- updated-dependencies: - dependency-name: com.google.auth:google-auth-library-oauth2-http dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- slides/snippets/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/slides/snippets/build.gradle b/slides/snippets/build.gradle index 1279246b..ea3403b8 100644 --- a/slides/snippets/build.gradle +++ b/slides/snippets/build.gradle @@ -5,7 +5,7 @@ repositories { } dependencies { - implementation 'com.google.auth:google-auth-library-oauth2-http:1.3.0' + implementation 'com.google.auth:google-auth-library-oauth2-http:1.10.0' implementation 'com.google.apis:google-api-services-drive:v3-rev20211107-1.32.1' implementation 'com.google.apis:google-api-services-sheets:v4-rev20210629-1.32.1' implementation 'com.google.apis:google-api-services-slides:v1-rev20210820-1.32.1' From cb7ba0681710410b7ac2d3b988b2af0e8bae7131 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 30 Aug 2022 09:54:10 -0600 Subject: [PATCH 142/262] Bump google-oauth-client-jetty in /adminSDK/reseller/quickstart (#294) Bumps [google-oauth-client-jetty](https://github.com/googleapis/google-oauth-java-client) from 1.32.1 to 1.34.1. - [Release notes](https://github.com/googleapis/google-oauth-java-client/releases) - [Changelog](https://github.com/googleapis/google-oauth-java-client/blob/main/CHANGELOG.md) - [Commits](https://github.com/googleapis/google-oauth-java-client/compare/v1.32.1...v1.34.1) --- updated-dependencies: - dependency-name: com.google.oauth-client:google-oauth-client-jetty dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- adminSDK/reseller/quickstart/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/adminSDK/reseller/quickstart/build.gradle b/adminSDK/reseller/quickstart/build.gradle index 11603c02..8903a301 100644 --- a/adminSDK/reseller/quickstart/build.gradle +++ b/adminSDK/reseller/quickstart/build.gradle @@ -12,6 +12,6 @@ repositories { dependencies { implementation 'com.google.api-client:google-api-client:1.33.0' - implementation 'com.google.oauth-client:google-oauth-client-jetty:1.32.1' + implementation 'com.google.oauth-client:google-oauth-client-jetty:1.34.1' implementation 'com.google.apis:google-api-services-reseller:v1-rev20211106-1.32.1' } From 5148cb485ae821b08fa46aefaeed93bc2e993bc8 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 30 Aug 2022 09:54:33 -0600 Subject: [PATCH 143/262] Bump google-oauth-client-jetty in /adminSDK/groups-settings/quickstart (#290) Bumps [google-oauth-client-jetty](https://github.com/googleapis/google-oauth-java-client) from 1.32.1 to 1.34.1. - [Release notes](https://github.com/googleapis/google-oauth-java-client/releases) - [Changelog](https://github.com/googleapis/google-oauth-java-client/blob/main/CHANGELOG.md) - [Commits](https://github.com/googleapis/google-oauth-java-client/compare/v1.32.1...v1.34.1) --- updated-dependencies: - dependency-name: com.google.oauth-client:google-oauth-client-jetty dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- adminSDK/groups-settings/quickstart/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/adminSDK/groups-settings/quickstart/build.gradle b/adminSDK/groups-settings/quickstart/build.gradle index 34720176..c03cdd97 100644 --- a/adminSDK/groups-settings/quickstart/build.gradle +++ b/adminSDK/groups-settings/quickstart/build.gradle @@ -12,6 +12,6 @@ repositories { dependencies { implementation 'com.google.api-client:google-api-client:1.33.0' - implementation 'com.google.oauth-client:google-oauth-client-jetty:1.32.1' + implementation 'com.google.oauth-client:google-oauth-client-jetty:1.34.1' implementation 'com.google.apis:google-api-services-groupssettings:v1-rev20210624-1.32.1' } From cdfdafa538a6cd5668eb069da2279ae4edec4b83 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 30 Aug 2022 09:54:45 -0600 Subject: [PATCH 144/262] Bump google-oauth-client-jetty in /sheets/quickstart (#288) Bumps [google-oauth-client-jetty](https://github.com/googleapis/google-oauth-java-client) from 1.32.1 to 1.34.1. - [Release notes](https://github.com/googleapis/google-oauth-java-client/releases) - [Changelog](https://github.com/googleapis/google-oauth-java-client/blob/main/CHANGELOG.md) - [Commits](https://github.com/googleapis/google-oauth-java-client/compare/v1.32.1...v1.34.1) --- updated-dependencies: - dependency-name: com.google.oauth-client:google-oauth-client-jetty dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- sheets/quickstart/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sheets/quickstart/build.gradle b/sheets/quickstart/build.gradle index d5b89b8c..dbf63a92 100644 --- a/sheets/quickstart/build.gradle +++ b/sheets/quickstart/build.gradle @@ -12,6 +12,6 @@ repositories { dependencies { implementation 'com.google.api-client:google-api-client:1.33.0' - implementation 'com.google.oauth-client:google-oauth-client-jetty:1.32.1' + implementation 'com.google.oauth-client:google-oauth-client-jetty:1.34.1' implementation 'com.google.apis:google-api-services-sheets:v4-rev20210629-1.32.1' } From ed883c8f816d8a223e0577881cbcd55a6f6159e0 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 30 Aug 2022 09:55:26 -0600 Subject: [PATCH 145/262] Bump google-oauth-client-jetty in /adminSDK/reports/quickstart (#265) Bumps [google-oauth-client-jetty](https://github.com/googleapis/google-oauth-java-client) from 1.32.1 to 1.34.1. - [Release notes](https://github.com/googleapis/google-oauth-java-client/releases) - [Changelog](https://github.com/googleapis/google-oauth-java-client/blob/main/CHANGELOG.md) - [Commits](https://github.com/googleapis/google-oauth-java-client/compare/v1.32.1...v1.34.1) --- updated-dependencies: - dependency-name: com.google.oauth-client:google-oauth-client-jetty dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- adminSDK/reports/quickstart/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/adminSDK/reports/quickstart/build.gradle b/adminSDK/reports/quickstart/build.gradle index 80e4d79b..f5ae3c7e 100644 --- a/adminSDK/reports/quickstart/build.gradle +++ b/adminSDK/reports/quickstart/build.gradle @@ -12,6 +12,6 @@ repositories { dependencies { implementation 'com.google.api-client:google-api-client:1.33.0' - implementation 'com.google.oauth-client:google-oauth-client-jetty:1.32.1' + implementation 'com.google.oauth-client:google-oauth-client-jetty:1.34.1' implementation 'com.google.apis:google-api-services-admin-reports:reports_v1-rev89-1.25.0' } From fd6359c2cd8000340b938b726785968692b2a831 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 30 Aug 2022 09:55:43 -0600 Subject: [PATCH 146/262] Bump google-oauth-client-jetty in /calendar/quickstart (#267) Bumps [google-oauth-client-jetty](https://github.com/googleapis/google-oauth-java-client) from 1.32.1 to 1.34.1. - [Release notes](https://github.com/googleapis/google-oauth-java-client/releases) - [Changelog](https://github.com/googleapis/google-oauth-java-client/blob/main/CHANGELOG.md) - [Commits](https://github.com/googleapis/google-oauth-java-client/compare/v1.32.1...v1.34.1) --- updated-dependencies: - dependency-name: com.google.oauth-client:google-oauth-client-jetty dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- calendar/quickstart/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/calendar/quickstart/build.gradle b/calendar/quickstart/build.gradle index 1c1455c3..deb17b9e 100644 --- a/calendar/quickstart/build.gradle +++ b/calendar/quickstart/build.gradle @@ -12,6 +12,6 @@ repositories { dependencies { implementation 'com.google.api-client:google-api-client:1.33.0' - implementation 'com.google.oauth-client:google-oauth-client-jetty:1.32.1' + implementation 'com.google.oauth-client:google-oauth-client-jetty:1.34.1' implementation 'com.google.apis:google-api-services-calendar:v3-rev20211026-1.32.1' } From c7643e9f39cc6bd71b0d5582e97672a81bc371ce Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 30 Aug 2022 09:56:00 -0600 Subject: [PATCH 147/262] Bump google-oauth-client-jetty in /classroom/quickstart (#268) Bumps [google-oauth-client-jetty](https://github.com/googleapis/google-oauth-java-client) from 1.32.1 to 1.34.1. - [Release notes](https://github.com/googleapis/google-oauth-java-client/releases) - [Changelog](https://github.com/googleapis/google-oauth-java-client/blob/main/CHANGELOG.md) - [Commits](https://github.com/googleapis/google-oauth-java-client/compare/v1.32.1...v1.34.1) --- updated-dependencies: - dependency-name: com.google.oauth-client:google-oauth-client-jetty dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- classroom/quickstart/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/classroom/quickstart/build.gradle b/classroom/quickstart/build.gradle index c3dd8ad2..663c1057 100644 --- a/classroom/quickstart/build.gradle +++ b/classroom/quickstart/build.gradle @@ -12,6 +12,6 @@ repositories { dependencies { implementation 'com.google.api-client:google-api-client:1.33.0' - implementation 'com.google.oauth-client:google-oauth-client-jetty:1.32.1' + implementation 'com.google.oauth-client:google-oauth-client-jetty:1.34.1' implementation 'com.google.apis:google-api-services-classroom:v1-rev20211029-1.32.1' } From 7d4d744f16b7dceef787374504e3d247a8d34931 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 30 Aug 2022 09:56:12 -0600 Subject: [PATCH 148/262] Bump google-auth-library-oauth2-http in /classroom/snippets (#270) Bumps google-auth-library-oauth2-http from 1.6.0 to 1.10.0. --- updated-dependencies: - dependency-name: com.google.auth:google-auth-library-oauth2-http dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- classroom/snippets/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/classroom/snippets/build.gradle b/classroom/snippets/build.gradle index 1f4cdc7b..f9591fca 100644 --- a/classroom/snippets/build.gradle +++ b/classroom/snippets/build.gradle @@ -7,7 +7,7 @@ repositories { dependencies { implementation 'com.google.api-client:google-api-client:1.34.1' - implementation 'com.google.auth:google-auth-library-oauth2-http:1.6.0' + implementation 'com.google.auth:google-auth-library-oauth2-http:1.10.0' implementation 'com.google.apis:google-api-services-classroom:v1-rev20220323-1.32.1' testImplementation 'junit:junit:4.13.2' } From 8045076a85329574aa2e68f817ed0b3f470bb64f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 30 Aug 2022 09:56:29 -0600 Subject: [PATCH 149/262] Bump google-oauth-client-jetty from 1.32.1 to 1.34.1 in /docs/quickstart (#271) Bumps [google-oauth-client-jetty](https://github.com/googleapis/google-oauth-java-client) from 1.32.1 to 1.34.1. - [Release notes](https://github.com/googleapis/google-oauth-java-client/releases) - [Changelog](https://github.com/googleapis/google-oauth-java-client/blob/main/CHANGELOG.md) - [Commits](https://github.com/googleapis/google-oauth-java-client/compare/v1.32.1...v1.34.1) --- updated-dependencies: - dependency-name: com.google.oauth-client:google-oauth-client-jetty dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- docs/quickstart/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/quickstart/build.gradle b/docs/quickstart/build.gradle index 48c9c11a..6583c267 100644 --- a/docs/quickstart/build.gradle +++ b/docs/quickstart/build.gradle @@ -12,6 +12,6 @@ repositories { dependencies { implementation 'com.google.api-client:google-api-client:1.33.0' - implementation 'com.google.oauth-client:google-oauth-client-jetty:1.32.1' + implementation 'com.google.oauth-client:google-oauth-client-jetty:1.34.1' implementation 'com.google.apis:google-api-services-docs:v1-rev20210707-1.32.1' } From a1094e4be0868062e19d5f73edf1db0f70afed6f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 30 Aug 2022 09:56:39 -0600 Subject: [PATCH 150/262] Bump google-oauth-client-jetty from 1.32.1 to 1.34.1 in /docs/outputJSON (#272) Bumps [google-oauth-client-jetty](https://github.com/googleapis/google-oauth-java-client) from 1.32.1 to 1.34.1. - [Release notes](https://github.com/googleapis/google-oauth-java-client/releases) - [Changelog](https://github.com/googleapis/google-oauth-java-client/blob/main/CHANGELOG.md) - [Commits](https://github.com/googleapis/google-oauth-java-client/compare/v1.32.1...v1.34.1) --- updated-dependencies: - dependency-name: com.google.oauth-client:google-oauth-client-jetty dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- docs/outputJSON/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/outputJSON/build.gradle b/docs/outputJSON/build.gradle index 9a65d38a..7d9f8019 100644 --- a/docs/outputJSON/build.gradle +++ b/docs/outputJSON/build.gradle @@ -12,7 +12,7 @@ repositories { dependencies { implementation 'com.google.api-client:google-api-client:1.33.0' - implementation 'com.google.oauth-client:google-oauth-client-jetty:1.32.1' + implementation 'com.google.oauth-client:google-oauth-client-jetty:1.34.1' implementation 'com.google.apis:google-api-services-docs:v1-rev20210707-1.32.1' implementation group: 'com.google.code.gson', name: 'gson', version: '2.8.9' } From 3677bb015f4273a1c389286dddfccea08ae7b51d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 30 Aug 2022 09:56:56 -0600 Subject: [PATCH 151/262] Bump google-oauth-client-jetty in /people/quickstart (#274) Bumps [google-oauth-client-jetty](https://github.com/googleapis/google-oauth-java-client) from 1.32.1 to 1.34.1. - [Release notes](https://github.com/googleapis/google-oauth-java-client/releases) - [Changelog](https://github.com/googleapis/google-oauth-java-client/blob/main/CHANGELOG.md) - [Commits](https://github.com/googleapis/google-oauth-java-client/compare/v1.32.1...v1.34.1) --- updated-dependencies: - dependency-name: com.google.oauth-client:google-oauth-client-jetty dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- people/quickstart/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/people/quickstart/build.gradle b/people/quickstart/build.gradle index 6b72f13a..8592e052 100644 --- a/people/quickstart/build.gradle +++ b/people/quickstart/build.gradle @@ -13,6 +13,6 @@ repositories { dependencies { implementation 'com.google.api-client:google-api-client:1.33.0' - implementation 'com.google.oauth-client:google-oauth-client-jetty:1.32.1' + implementation 'com.google.oauth-client:google-oauth-client-jetty:1.34.1' implementation 'com.google.apis:google-api-services-people:v1-rev20210903-1.32.1' } From 92a97507f19ed251922a9f0138b5b6a134692e07 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 30 Aug 2022 09:57:12 -0600 Subject: [PATCH 152/262] Bump gson from 2.8.9 to 2.9.1 in /docs/outputJSON (#275) Bumps [gson](https://github.com/google/gson) from 2.8.9 to 2.9.1. - [Release notes](https://github.com/google/gson/releases) - [Changelog](https://github.com/google/gson/blob/master/CHANGELOG.md) - [Commits](https://github.com/google/gson/compare/gson-parent-2.8.9...gson-parent-2.9.1) --- updated-dependencies: - dependency-name: com.google.code.gson:gson dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- docs/outputJSON/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/outputJSON/build.gradle b/docs/outputJSON/build.gradle index 7d9f8019..1a1343c3 100644 --- a/docs/outputJSON/build.gradle +++ b/docs/outputJSON/build.gradle @@ -14,5 +14,5 @@ dependencies { implementation 'com.google.api-client:google-api-client:1.33.0' implementation 'com.google.oauth-client:google-oauth-client-jetty:1.34.1' implementation 'com.google.apis:google-api-services-docs:v1-rev20210707-1.32.1' - implementation group: 'com.google.code.gson', name: 'gson', version: '2.8.9' + implementation group: 'com.google.code.gson', name: 'gson', version: '2.9.1' } From edb6ed7f72ef4da6de1841687054efc7332909df Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 30 Aug 2022 09:57:26 -0600 Subject: [PATCH 153/262] Bump google-oauth-client-jetty in /drive/quickstart (#277) Bumps [google-oauth-client-jetty](https://github.com/googleapis/google-oauth-java-client) from 1.32.1 to 1.34.1. - [Release notes](https://github.com/googleapis/google-oauth-java-client/releases) - [Changelog](https://github.com/googleapis/google-oauth-java-client/blob/main/CHANGELOG.md) - [Commits](https://github.com/googleapis/google-oauth-java-client/compare/v1.32.1...v1.34.1) --- updated-dependencies: - dependency-name: com.google.oauth-client:google-oauth-client-jetty dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- drive/quickstart/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drive/quickstart/build.gradle b/drive/quickstart/build.gradle index b83619da..0cc1a504 100644 --- a/drive/quickstart/build.gradle +++ b/drive/quickstart/build.gradle @@ -12,6 +12,6 @@ repositories { dependencies { implementation 'com.google.api-client:google-api-client:1.33.0' - implementation 'com.google.oauth-client:google-oauth-client-jetty:1.32.1' + implementation 'com.google.oauth-client:google-oauth-client-jetty:1.34.1' implementation 'com.google.apis:google-api-services-drive:v3-rev20211107-1.32.1' } From 047cc2e3d5e5a99bcf424c0960ef87dd4951dcca Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 30 Aug 2022 09:57:41 -0600 Subject: [PATCH 154/262] Bump google-oauth-client-jetty in /drive/activity-v2/quickstart (#279) Bumps [google-oauth-client-jetty](https://github.com/googleapis/google-oauth-java-client) from 1.32.1 to 1.34.1. - [Release notes](https://github.com/googleapis/google-oauth-java-client/releases) - [Changelog](https://github.com/googleapis/google-oauth-java-client/blob/main/CHANGELOG.md) - [Commits](https://github.com/googleapis/google-oauth-java-client/compare/v1.32.1...v1.34.1) --- updated-dependencies: - dependency-name: com.google.oauth-client:google-oauth-client-jetty dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- drive/activity-v2/quickstart/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drive/activity-v2/quickstart/build.gradle b/drive/activity-v2/quickstart/build.gradle index 7d0a08b6..8cc523f1 100644 --- a/drive/activity-v2/quickstart/build.gradle +++ b/drive/activity-v2/quickstart/build.gradle @@ -12,6 +12,6 @@ repositories { dependencies { implementation 'com.google.api-client:google-api-client:1.33.0' - implementation 'com.google.oauth-client:google-oauth-client-jetty:1.32.1' + implementation 'com.google.oauth-client:google-oauth-client-jetty:1.34.1' implementation 'com.google.apis:google-api-services-driveactivity:v2-rev20210319-1.32.1' } From b30dff3187f1a9f446e184daacd522dd8103d164 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 30 Aug 2022 09:57:55 -0600 Subject: [PATCH 155/262] Bump google-oauth-client-jetty in /vault/quickstart (#281) Bumps [google-oauth-client-jetty](https://github.com/googleapis/google-oauth-java-client) from 1.32.1 to 1.34.1. - [Release notes](https://github.com/googleapis/google-oauth-java-client/releases) - [Changelog](https://github.com/googleapis/google-oauth-java-client/blob/main/CHANGELOG.md) - [Commits](https://github.com/googleapis/google-oauth-java-client/compare/v1.32.1...v1.34.1) --- updated-dependencies: - dependency-name: com.google.oauth-client:google-oauth-client-jetty dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- vault/quickstart/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vault/quickstart/build.gradle b/vault/quickstart/build.gradle index c7428927..26e72d92 100644 --- a/vault/quickstart/build.gradle +++ b/vault/quickstart/build.gradle @@ -12,6 +12,6 @@ repositories { dependencies { implementation 'com.google.api-client:google-api-client:1.33.0' - implementation 'com.google.oauth-client:google-oauth-client-jetty:1.32.1' + implementation 'com.google.oauth-client:google-oauth-client-jetty:1.34.1' implementation 'com.google.apis:google-api-services-vault:v1-rev20211101-1.32.1' } From c3286021e30dbaccf4d19cf0f152d4e794bd3436 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 30 Aug 2022 09:58:06 -0600 Subject: [PATCH 156/262] Bump google-oauth-client-jetty in /drive/activity/quickstart (#282) Bumps [google-oauth-client-jetty](https://github.com/googleapis/google-oauth-java-client) from 1.32.1 to 1.34.1. - [Release notes](https://github.com/googleapis/google-oauth-java-client/releases) - [Changelog](https://github.com/googleapis/google-oauth-java-client/blob/main/CHANGELOG.md) - [Commits](https://github.com/googleapis/google-oauth-java-client/compare/v1.32.1...v1.34.1) --- updated-dependencies: - dependency-name: com.google.oauth-client:google-oauth-client-jetty dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- drive/activity/quickstart/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drive/activity/quickstart/build.gradle b/drive/activity/quickstart/build.gradle index 32e034a8..583730c7 100644 --- a/drive/activity/quickstart/build.gradle +++ b/drive/activity/quickstart/build.gradle @@ -12,6 +12,6 @@ repositories { dependencies { implementation 'com.google.api-client:google-api-client:1.33.0' - implementation 'com.google.oauth-client:google-oauth-client-jetty:1.32.1' + implementation 'com.google.oauth-client:google-oauth-client-jetty:1.34.1' implementation 'com.google.apis:google-api-services-appsactivity:v1-rev20200128-1.30.10' } From 1e7064a1480edfcfb1cc1a7707e89d54583cfba7 Mon Sep 17 00:00:00 2001 From: Steve Bazyl Date: Tue, 30 Aug 2022 13:33:06 -0600 Subject: [PATCH 157/262] chore: disable rennovate --- renovate.json | 6 ------ 1 file changed, 6 deletions(-) delete mode 100644 renovate.json diff --git a/renovate.json b/renovate.json deleted file mode 100644 index f93f9542..00000000 --- a/renovate.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "extends": [ - "config:base", - "baseBranches": ["main"] - ] -} From 6ba16c3c4ae46e2cb2e682eb997f4c390cbe126a Mon Sep 17 00:00:00 2001 From: Steve Bazyl Date: Tue, 30 Aug 2022 13:38:47 -0600 Subject: [PATCH 158/262] fix: FIx broken path + add commit message prefix --- .github/dependabot.yml | 54 ++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 52 insertions(+), 2 deletions(-) diff --git a/.github/dependabot.yml b/.github/dependabot.yml index c8c55cd4..f8f45ff1 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -4,62 +4,92 @@ updates: directory: "/calendar/sync" schedule: interval: "weekly" + commit-message: + prefix: "chore(deps):" - package-ecosystem: "gradle" - directory: "/calendar/sync" + directory: "/tasks/quickstart" schedule: interval: "weekly" + commit-message: + prefix: "chore(deps):" - package-ecosystem: "gradle" directory: "/calendar/quickstart" schedule: interval: "weekly" + commit-message: + prefix: "chore(deps):" - package-ecosystem: "gradle" directory: "/sheets/snippets" schedule: interval: "weekly" + commit-message: + prefix: "chore(deps):" - package-ecosystem: "gradle" directory: "/sheets/quickstart" schedule: interval: "weekly" + commit-message: + prefix: "chore(deps):" - package-ecosystem: "gradle" - directory: "/adminSDK/alertcenter" + directory: "/adminSDK/alertcenter/quickstart" schedule: interval: "weekly" + commit-message: + prefix: "chore(deps):" - package-ecosystem: "gradle" directory: "/adminSDK/directory/quickstart" schedule: interval: "weekly" + commit-message: + prefix: "chore(deps):" - package-ecosystem: "gradle" directory: "/adminSDK/reseller/quickstart" schedule: interval: "weekly" + commit-message: + prefix: "chore(deps):" - package-ecosystem: "gradle" directory: "/adminSDK/groups-settings/quickstart" schedule: interval: "weekly" + commit-message: + prefix: "chore(deps):" - package-ecosystem: "gradle" directory: "/adminSDK/reports/quickstart" schedule: interval: "weekly" + commit-message: + prefix: "chore(deps):" - package-ecosystem: "gradle" directory: "/classroom/snippets" schedule: interval: "weekly" + commit-message: + prefix: "chore(deps):" - package-ecosystem: "gradle" directory: "/classroom/quickstart" schedule: interval: "weekly" + commit-message: + prefix: "chore(deps):" - package-ecosystem: "gradle" directory: "/docs/outputJSON" schedule: interval: "weekly" + commit-message: + prefix: "chore(deps):" - package-ecosystem: "gradle" directory: "/docs/quickstart" schedule: interval: "weekly" + commit-message: + prefix: "chore(deps):" - package-ecosystem: "gradle" directory: "/slides/snippets" schedule: interval: "weekly" + commit-message: + prefix: "chore(deps):" - package-ecosystem: "gradle" directory: "/slides/quickstart" schedule: @@ -68,42 +98,62 @@ updates: directory: "/people/quickstart" schedule: interval: "weekly" + commit-message: + prefix: "chore(deps):" - package-ecosystem: "gradle" directory: "/appsScript/quickstart" schedule: interval: "weekly" + commit-message: + prefix: "chore(deps):" - package-ecosystem: "gradle" directory: "/drive/snippets/drive_v2" schedule: interval: "weekly" + commit-message: + prefix: "chore(deps):" - package-ecosystem: "gradle" directory: "/drive/snippets/drive_v3" schedule: interval: "weekly" + commit-message: + prefix: "chore(deps):" - package-ecosystem: "gradle" directory: "/drive/activity/quickstart" schedule: interval: "weekly" + commit-message: + prefix: "chore(deps):" - package-ecosystem: "gradle" directory: "/drive/quickstart" schedule: interval: "weekly" + commit-message: + prefix: "chore(deps):" - package-ecosystem: "gradle" directory: "/drive/activity-v2/quickstart" schedule: interval: "weekly" + commit-message: + prefix: "chore(deps):" - package-ecosystem: "gradle" directory: "/gmail/snippets" schedule: interval: "weekly" + commit-message: + prefix: "chore(deps):" - package-ecosystem: "gradle" directory: "/gmail/quickstart" schedule: interval: "weekly" + commit-message: + prefix: "chore(deps):" - package-ecosystem: "gradle" directory: "/vault/quickstart" schedule: interval: "weekly" + commit-message: + prefix: "chore(deps):" - package-ecosystem: "gradle" directory: "/vault/vault-hold-migration-api" schedule: From 462ee2a9792b76f74085904df6a428dedeb5ae49 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 30 Aug 2022 13:58:21 -0600 Subject: [PATCH 159/262] chore(deps): bump google-auth-library-oauth2-http (#348) Bumps google-auth-library-oauth2-http from 1.3.0 to 1.10.0. --- updated-dependencies: - dependency-name: com.google.auth:google-auth-library-oauth2-http dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- adminSDK/alertcenter/quickstart/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/adminSDK/alertcenter/quickstart/build.gradle b/adminSDK/alertcenter/quickstart/build.gradle index 5cd6a28e..ddd97edc 100644 --- a/adminSDK/alertcenter/quickstart/build.gradle +++ b/adminSDK/alertcenter/quickstart/build.gradle @@ -13,6 +13,6 @@ repositories { dependencies { implementation 'com.google.api-client:google-api-client:1.33.0' - implementation 'com.google.auth:google-auth-library-oauth2-http:1.3.0' + implementation 'com.google.auth:google-auth-library-oauth2-http:1.10.0' implementation 'com.google.apis:google-api-services-alertcenter:v1beta1-rev20211012-1.32.1' } \ No newline at end of file From c80f847bc4d9e9c15d9a5154f61f5e8e57fad05c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 30 Aug 2022 13:58:42 -0600 Subject: [PATCH 160/262] chore(deps): bump google-oauth-client-jetty in /tasks/quickstart (#350) Bumps [google-oauth-client-jetty](https://github.com/googleapis/google-oauth-java-client) from 1.32.1 to 1.34.1. - [Release notes](https://github.com/googleapis/google-oauth-java-client/releases) - [Changelog](https://github.com/googleapis/google-oauth-java-client/blob/main/CHANGELOG.md) - [Commits](https://github.com/googleapis/google-oauth-java-client/compare/v1.32.1...v1.34.1) --- updated-dependencies: - dependency-name: com.google.oauth-client:google-oauth-client-jetty dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- tasks/quickstart/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tasks/quickstart/build.gradle b/tasks/quickstart/build.gradle index d1d434d1..929d1afd 100644 --- a/tasks/quickstart/build.gradle +++ b/tasks/quickstart/build.gradle @@ -12,6 +12,6 @@ repositories { dependencies { implementation 'com.google.api-client:google-api-client:1.33.0' - implementation 'com.google.oauth-client:google-oauth-client-jetty:1.32.1' + implementation 'com.google.oauth-client:google-oauth-client-jetty:1.34.1' implementation 'com.google.apis:google-api-services-tasks:v1-rev20210709-1.32.1' } \ No newline at end of file From a274c4379bb3c9f515644bcc2045346d93dcc2b7 Mon Sep 17 00:00:00 2001 From: Steven Bazyl Date: Tue, 30 Aug 2022 14:09:44 -0600 Subject: [PATCH 161/262] fix: Remove obsolete files --- .../snippets/src/test/java/CoursesTest.java | 142 ------------------ .../src/main/java/AppDataSnippets.java | 78 ---------- .../src/main/java/ChangeSnippets.java | 64 -------- .../drive_v2/src/main/java/DriveSnippets.java | 96 ------------ .../src/test/java/AppDataSnippetsTest.java | 56 ------- .../src/test/java/ChangeSnippetsTest.java | 47 ------ .../src/test/java/DriveSnippetsTest.java | 66 -------- .../src/test/java/FileSnippetsTest.java | 137 ----------------- .../src/test/java/TeamDriveSnippetsTest.java | 66 -------- .../src/main/java/AppDataSnippets.java | 76 ---------- .../src/main/java/ChangeSnippets.java | 63 -------- .../drive_v3/src/main/java/DriveSnippets.java | 97 ------------ .../src/test/java/AppDataSnippetsTest.java | 57 ------- .../src/test/java/ChangeSnippetsTest.java | 47 ------ .../src/test/java/DriveSnippetsTest.java | 66 -------- .../src/test/java/FileSnippetsTest.java | 137 ----------------- .../src/test/java/TeamDriveSnippetsTest.java | 66 -------- 17 files changed, 1361 deletions(-) delete mode 100644 classroom/snippets/src/test/java/CoursesTest.java delete mode 100644 drive/snippets/drive_v2/src/main/java/AppDataSnippets.java delete mode 100644 drive/snippets/drive_v2/src/main/java/ChangeSnippets.java delete mode 100644 drive/snippets/drive_v2/src/main/java/DriveSnippets.java delete mode 100644 drive/snippets/drive_v2/src/test/java/AppDataSnippetsTest.java delete mode 100644 drive/snippets/drive_v2/src/test/java/ChangeSnippetsTest.java delete mode 100644 drive/snippets/drive_v2/src/test/java/DriveSnippetsTest.java delete mode 100644 drive/snippets/drive_v2/src/test/java/FileSnippetsTest.java delete mode 100644 drive/snippets/drive_v2/src/test/java/TeamDriveSnippetsTest.java delete mode 100644 drive/snippets/drive_v3/src/main/java/AppDataSnippets.java delete mode 100644 drive/snippets/drive_v3/src/main/java/ChangeSnippets.java delete mode 100644 drive/snippets/drive_v3/src/main/java/DriveSnippets.java delete mode 100644 drive/snippets/drive_v3/src/test/java/AppDataSnippetsTest.java delete mode 100644 drive/snippets/drive_v3/src/test/java/ChangeSnippetsTest.java delete mode 100644 drive/snippets/drive_v3/src/test/java/DriveSnippetsTest.java delete mode 100644 drive/snippets/drive_v3/src/test/java/FileSnippetsTest.java delete mode 100644 drive/snippets/drive_v3/src/test/java/TeamDriveSnippetsTest.java diff --git a/classroom/snippets/src/test/java/CoursesTest.java b/classroom/snippets/src/test/java/CoursesTest.java deleted file mode 100644 index 81b6de6e..00000000 --- a/classroom/snippets/src/test/java/CoursesTest.java +++ /dev/null @@ -1,142 +0,0 @@ -/* - * Copyright 2022 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import com.google.api.services.classroom.Classroom; -import com.google.api.services.classroom.model.Course; -import com.google.api.services.classroom.model.CourseAlias; -import com.google.api.services.classroom.model.Student; -import com.google.api.services.classroom.model.Teacher; - -import org.junit.After; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - -import java.io.IOException; -import java.util.Arrays; -import java.util.List; -import java.util.UUID; - -/** - * Tests for the courses snippets. - */ -public class CoursesTest extends BaseTest { - private Classroom service; - private Course testCourse; - private String otherUser = "erics@homeroomacademy.com"; - - public CoursesTest() throws IOException { - this.service = this.getService(); - } - - @Before - public void setUp() throws IOException { - this.testCourse = createTestCourse("me"); - } - - @After - public void tearDown() throws IOException { - deleteCourse(this.testCourse.getId()); - this.testCourse = null; - } - - @Test - public void testCreateCourse() throws IOException { - Course course = Courses.createCourse(this.service); - Assert.assertNotNull("Course not returned.", course); - deleteCourse(course.getId()); - } - - @Test - public void testGetCourse() throws IOException { - Course course = Courses.getCourse(this.service, this.testCourse.getId()); - Assert.assertNotNull("Course not returned.", course); - Assert.assertEquals("Wrong course returned.", this.testCourse.getId(), course.getId()); - } - - @Test - public void testListCourses() throws IOException { - List courses = Courses.listCourses(this.service); - Assert.assertTrue("No courses returned.", courses.size() > 0); - } - - @Test - public void testUpdateCourse() throws IOException { - Course course = Courses.updateCourse(this.service, this.testCourse.getId()); - Assert.assertNotNull("Course not returned.", course); - Assert.assertEquals("Wrong course returned.", this.testCourse.getId(), course.getId()); - } - - @Test - public void testPatchCourse() throws IOException { - Course course = Courses.patchCourse(this.service, this.testCourse.getId()); - Assert.assertNotNull("Course not returned.", course); - Assert.assertEquals("Wrong course returned.", this.testCourse.getId(), course.getId()); - } - - @Test - public void testCreateCourseAlias() throws IOException { - String alias = "p:" + UUID.randomUUID().toString(); - CourseAlias courseAlias = - Courses.createCourseAlias(this.service, this.testCourse.getId(), alias); - Assert.assertNotNull("Course alias not returned.", courseAlias); - Assert.assertEquals("Wrong course alias returned.", alias, courseAlias.getAlias()); - } - - @Test - public void testListCourseAliases() throws IOException { - List courseAliases = - Courses.listCourseAliases(this.service, this.testCourse.getId()); - Assert.assertTrue("Incorrect number of course aliases returned.", courseAliases.size() == 1); - } - - @Test - public void testAddTeacher() throws IOException { - Teacher teacher = Courses.addTeacher(this.service, this.testCourse.getId(), this.otherUser); - Assert.assertNotNull("Teacher not returned.", teacher); - Assert.assertEquals("Teacher added to wrong course.", this.testCourse.getId(), - teacher.getCourseId()); - } - - @Test - public void testEnrollAsStudent() throws IOException { - Course course = this.createTestCourse(this.otherUser); - Student student = - Courses.enrollAsStudent(this.service, course.getId(), course.getEnrollmentCode()); - this.deleteCourse(course.getId()); - Assert.assertNotNull("Student not returned.", student); - Assert.assertEquals("Student added to wrong course.", course.getId(), - student.getCourseId()); - } - - @Test - public void testBatchAddStudents() throws IOException { - List studentEmails = - Arrays.asList("erics@homeroomacademy.com", "zach@homeroomacademy.com"); - Courses.batchAddStudents(this.service, this.testCourse.getId(), studentEmails); - } - - private Course createTestCourse(String ownerId) throws IOException { - String alias = "p:" + UUID.randomUUID().toString(); - Course course = new Course().setId(alias).setName("Test Course").setSection("Section") - .setOwnerId(ownerId); - return this.service.courses().create(course).execute(); - } - - private void deleteCourse(String courseId) throws IOException { - this.service.courses().delete(courseId).execute(); - } -} diff --git a/drive/snippets/drive_v2/src/main/java/AppDataSnippets.java b/drive/snippets/drive_v2/src/main/java/AppDataSnippets.java deleted file mode 100644 index 6d13d7a4..00000000 --- a/drive/snippets/drive_v2/src/main/java/AppDataSnippets.java +++ /dev/null @@ -1,78 +0,0 @@ -/* - * Copyright 2022 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import com.google.api.client.http.FileContent; -import com.google.api.services.drive.Drive; -import com.google.api.services.drive.model.File; -import com.google.api.services.drive.model.FileList; -import com.google.api.services.drive.model.ParentReference; -import java.io.IOException; -import java.util.Collections; - - -public class AppDataSnippets { - - private Drive service; - - public AppDataSnippets(Drive service) { - this.service = service; - } - - public String uploadAppData() throws IOException { - Drive driveService = this.service; - // [START uploadAppData] - File fileMetadata = new File(); - fileMetadata.setTitle("config.json"); - fileMetadata.setParents(Collections.singletonList( - new ParentReference().setId("appDataFolder"))); - java.io.File filePath = new java.io.File("files/config.json"); - FileContent mediaContent = new FileContent("application/json", filePath); - File file = driveService.files().insert(fileMetadata, mediaContent) - .setFields("id") - .execute(); - System.out.println("File ID: " + file.getId()); - // [END uploadAppData] - return file.getId(); - } - - public FileList listAppData() throws IOException { - Drive driveService = this.service; - // [START listAppData] - FileList files = driveService.files().list() - .setSpaces("appDataFolder") - .setFields("nextPageToken, items(id, title)") - .setMaxResults(10) - .execute(); - for (File file : files.getItems()) { - System.out.printf("Found file: %s (%s)\n", - file.getTitle(), file.getId()); - } - // [END listAppData] - return files; - } - - public String fetchAppDataFolder() throws IOException { - Drive driveService = this.service; - // [START fetchAppDataFolder] - File file = driveService.files().get("appDataFolder") - .setFields("id") - .execute(); - System.out.println("Folder ID: " + file.getId()); - // [END fetchAppDataFolder] - return file.getId(); - } - -} diff --git a/drive/snippets/drive_v2/src/main/java/ChangeSnippets.java b/drive/snippets/drive_v2/src/main/java/ChangeSnippets.java deleted file mode 100644 index b3999d88..00000000 --- a/drive/snippets/drive_v2/src/main/java/ChangeSnippets.java +++ /dev/null @@ -1,64 +0,0 @@ -/* - * Copyright 2022 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import com.google.api.services.drive.Drive; -import com.google.api.services.drive.model.Change; -import com.google.api.services.drive.model.ChangeList; -import com.google.api.services.drive.model.StartPageToken; -import java.io.IOException; - -public class ChangeSnippets { - - private Drive service; - - public ChangeSnippets(Drive service) { - this.service = service; - } - - public String fetchStartPageToken() throws IOException { - Drive driveService = this.service; - // [START fetchStartPageToken] - StartPageToken response = driveService.changes() - .getStartPageToken().execute(); - System.out.println("Start token: " + response.getStartPageToken()); - // [END fetchStartPageToken] - return response.getStartPageToken(); - } - - public String fetchChanges(String savedStartPageToken) throws IOException { - Drive driveService = this.service; - // [START fetchChanges] - // Begin with our last saved start token for this user or the - // current token from getStartPageToken() - String pageToken = savedStartPageToken; - while (pageToken != null) { - ChangeList changes = driveService.changes().list() - .setPageToken(pageToken) - .execute(); - for (Change change : changes.getItems()) { - // Process change - System.out.println("Change found for file: " + change.getFileId()); - } - if (changes.getNewStartPageToken() != null) { - // Last page, save this token for the next polling interval - savedStartPageToken = changes.getNewStartPageToken(); - } - pageToken = changes.getNextPageToken(); - } - // [END fetchChanges] - return savedStartPageToken; - } -} diff --git a/drive/snippets/drive_v2/src/main/java/DriveSnippets.java b/drive/snippets/drive_v2/src/main/java/DriveSnippets.java deleted file mode 100644 index a40483bc..00000000 --- a/drive/snippets/drive_v2/src/main/java/DriveSnippets.java +++ /dev/null @@ -1,96 +0,0 @@ -/* - * Copyright 2022 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import com.google.api.services.drive.model.Drive; -import com.google.api.services.drive.model.DriveList; -import com.google.api.services.drive.model.Permission; -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; -import java.util.UUID; - -public class DriveSnippets { - private com.google.api.services.drive.Drive service; - - public DriveSnippets(com.google.api.services.drive.Drive service) { - this.service = service; - } - - public String createDrive() throws IOException { - com.google.api.services.drive.Drive driveService = this.service; - // [START createDrive] - Drive driveMetadata = new Drive(); - driveMetadata.setName("Project Resources"); - String requestId = UUID.randomUUID().toString(); - Drive drive = driveService.drives().insert(requestId, driveMetadata) - .execute(); - System.out.println("Drive ID: " + drive.getId()); - // [END createDrive] - return drive.getId(); - } - - public List recoverDrives(String realUser) - throws IOException { - com.google.api.services.drive.Drive driveService = this.service; - List drives = new ArrayList(); - // [START recoverDrives] - // Find all shared drives without an organizer and add one. - // Note: This example does not capture all cases. Shared drives - // that have an empty group as the sole organizer, or an - // organizer outside the organization are not captured. A - // more exhaustive approach would evaluate each shared drive - // and the associated permissions and groups to ensure an active - // organizer is assigned. - String pageToken = null; - Permission newOrganizerPermission = new Permission() - .setType("user") - .setRole("organizer") - .setValue("user@example.com"); - // [START_EXCLUDE silent] - newOrganizerPermission.setValue(realUser); - // [END_EXCLUDE] - - do { - DriveList result = driveService.drives().list() - .setQ("organizerCount = 0") - .setUseDomainAdminAccess(true) - .setFields("nextPageToken, items(id, name)") - .setPageToken(pageToken) - .execute(); - for (Drive drive : result.getItems()) { - System.out.printf("Found drive without organizer: %s (%s)\n", - drive.getName(), drive.getId()); - // Note: For improved efficiency, consider batching - // permission insert requests - Permission permissionResult = driveService.permissions() - .insert(drive.getId(), newOrganizerPermission) - .setUseDomainAdminAccess(true) - .setSupportsAllDrives(true) - .setFields("id") - .execute(); - System.out.printf("Added organizer permission: %s\n", - permissionResult.getId()); - - } - // [START_EXCLUDE silent] - drives.addAll(result.getItems()); - // [END_EXCLUDE] - pageToken = result.getNextPageToken(); - } while (pageToken != null); - // [END recoverDrives] - return drives; - } -} diff --git a/drive/snippets/drive_v2/src/test/java/AppDataSnippetsTest.java b/drive/snippets/drive_v2/src/test/java/AppDataSnippetsTest.java deleted file mode 100644 index 31726d4e..00000000 --- a/drive/snippets/drive_v2/src/test/java/AppDataSnippetsTest.java +++ /dev/null @@ -1,56 +0,0 @@ -/* - * Copyright 2022 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import static org.junit.Assert.assertNotNull; - -import com.google.api.services.drive.model.FileList; -import java.io.IOException; -import java.security.GeneralSecurityException; -import org.junit.Before; -import org.junit.Test; - -public class AppDataSnippetsTest extends BaseTest { - - private AppDataSnippets snippets; - - @Before - public void createSnippets() { - this.snippets = new AppDataSnippets(this.service); - } - - @Test - public void fetchAppDataFolder() throws IOException, GeneralSecurityException { - String id = this.snippets.fetchAppDataFolder(); - assertNotNull(id); - } - - @Test - public void uploadAppData() - throws IOException, GeneralSecurityException { - String id = this.snippets.uploadAppData(); - assertNotNull(id); - deleteFileOnCleanup(id); - } - - @Test - public void listAppData() throws IOException, GeneralSecurityException { - String id = this.snippets.uploadAppData(); - deleteFileOnCleanup(id); - FileList files = this.snippets.listAppData(); - assertNotEquals(0, files.getItems().size()); - } - -} diff --git a/drive/snippets/drive_v2/src/test/java/ChangeSnippetsTest.java b/drive/snippets/drive_v2/src/test/java/ChangeSnippetsTest.java deleted file mode 100644 index 7ad14676..00000000 --- a/drive/snippets/drive_v2/src/test/java/ChangeSnippetsTest.java +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Copyright 2022 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import static org.junit.Assert.assertNotEquals; -import static org.junit.Assert.assertNotNull; - -import java.io.IOException; -import org.junit.Before; -import org.junit.Test; - -public class ChangeSnippetsTest extends BaseTest { - - private ChangeSnippets snippets; - - @Before - public void createSnippets() { - this.snippets = new ChangeSnippets(this.service); - } - - @Test - public void fetchStartPageToken() throws IOException { - String token = this.snippets.fetchStartPageToken(); - assertNotNull(token); - } - - @Test - public void fetchChanges() throws IOException { - String startPageToken = this.snippets.fetchStartPageToken(); - this.createTestBlob(); - String newStartPageToken = this.snippets.fetchChanges(startPageToken); - assertNotNull(newStartPageToken); - assertNotEquals(startPageToken, newStartPageToken); - } -} diff --git a/drive/snippets/drive_v2/src/test/java/DriveSnippetsTest.java b/drive/snippets/drive_v2/src/test/java/DriveSnippetsTest.java deleted file mode 100644 index ebe24d24..00000000 --- a/drive/snippets/drive_v2/src/test/java/DriveSnippetsTest.java +++ /dev/null @@ -1,66 +0,0 @@ -/* - * Copyright 2022 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import static org.junit.Assert.assertNotEquals; -import static org.junit.Assert.assertNotNull; - -import com.google.api.services.drive.model.Drive; -import com.google.api.services.drive.model.Permission; -import com.google.api.services.drive.model.PermissionList; -import java.io.IOException; -import java.security.GeneralSecurityException; -import java.util.List; -import org.junit.Before; -import org.junit.Test; - -public class DriveSnippetsTest extends BaseTest { - - private DriveSnippets snippets; - - @Before - public void createSnippets() { - this.snippets = new DriveSnippets(this.service); - } - - @Test - public void createDrive() throws IOException, GeneralSecurityException { - String id = this.snippets.createDrive(); - assertNotNull(id); - this.service.drives().delete(id); - } - - @Test - public void recoverDrives() throws IOException { - String id = this.createOrphanedDrive(); - List results = this.snippets.recoverDrives( - "sbazyl@test.appsdevtesting.com"); - assertNotEquals(0, results.size()); - this.service.drives().delete(id).execute(); - } - - private String createOrphanedDrive() throws IOException { - String driveId = this.snippets.createDrive(); - PermissionList response = this.service.permissions().list(driveId) - .setSupportsAllDrives(true) - .execute(); - for (Permission permission : response.getItems()) { - this.service.permissions().delete(driveId, permission.getId()) - .setSupportsAllDrives(true) - .execute(); - } - return driveId; - } -} diff --git a/drive/snippets/drive_v2/src/test/java/FileSnippetsTest.java b/drive/snippets/drive_v2/src/test/java/FileSnippetsTest.java deleted file mode 100644 index 7703c464..00000000 --- a/drive/snippets/drive_v2/src/test/java/FileSnippetsTest.java +++ /dev/null @@ -1,137 +0,0 @@ -/* - * Copyright 2022 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotEquals; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertTrue; - -import com.google.api.services.drive.model.File; -import java.io.ByteArrayOutputStream; -import java.io.IOException; -import java.security.GeneralSecurityException; -import java.util.List; -import org.junit.Before; -import org.junit.Test; - -public class FileSnippetsTest extends BaseTest { - - private FileSnippets snippets; - - @Before - public void createSnippets() { - this.snippets = new FileSnippets(this.service); - } - - @Test - public void uploadBasic() throws IOException, GeneralSecurityException { - String id = this.snippets.uploadBasic(); - assertNotNull(id); - deleteFileOnCleanup(id); - } - - @Test - public void uploadRevision() throws IOException, GeneralSecurityException { - String id = this.snippets.uploadBasic(); - assertNotNull(id); - deleteFileOnCleanup(id); - String id2 = this.snippets.uploadRevision(id); - assertEquals(id, id2); - } - - @Test - public void uploadToFolder() throws IOException, GeneralSecurityException { - String folderId = this.snippets.createFolder(); - File file = this.snippets.uploadToFolder(folderId); - assertTrue(file.getParents().get(0).getId().equals(folderId)); - deleteFileOnCleanup(file.getId()); - deleteFileOnCleanup(folderId); - } - - @Test - public void uploadWithConversion() - throws IOException, GeneralSecurityException { - String id = this.snippets.uploadWithConversion(); - assertNotNull(id); - deleteFileOnCleanup(id); - } - - @Test - public void exportPdf() throws IOException, GeneralSecurityException { - String id = createTestDocument(); - ByteArrayOutputStream out = this.snippets.exportPdf(id); - assertEquals("%PDF", out.toString("UTF-8").substring(0, 4)); - } - - @Test - public void downloadFile() throws IOException, GeneralSecurityException { - String id = createTestBlob(); - ByteArrayOutputStream out = this.snippets.downloadFile(id); - byte[] bytes = out.toByteArray(); - assertEquals((byte) 0xFF, bytes[0]); - assertEquals((byte) 0xD8, bytes[1]); - } - - @Test - public void createShortcut() throws IOException, GeneralSecurityException { - String id = this.snippets.createShortcut(); - assertNotNull(id); - deleteFileOnCleanup(id); - } - - @Test - public void touchFile() throws IOException, GeneralSecurityException { - String id = this.createTestBlob(); - long now = System.currentTimeMillis(); - long modifiedTime = this.snippets.touchFile(id, now); - assertEquals(now, modifiedTime); - } - - @Test - public void createFolder() throws IOException, GeneralSecurityException { - String id = this.snippets.createFolder(); - assertNotNull(id); - deleteFileOnCleanup(id); - } - - @Test - public void moveFileToFolder() - throws IOException, GeneralSecurityException { - String folderId = this.snippets.createFolder(); - deleteFileOnCleanup(folderId); - String fileId = this.createTestBlob(); - List parents = this.snippets.moveFileToFolder(fileId, folderId); - assertEquals(1, parents.size()); - assertTrue(parents.contains(folderId)); - } - - @Test - public void searchFiles() - throws IOException, GeneralSecurityException { - this.createTestBlob(); - List files = this.snippets.searchFiles(); - assertNotEquals(0, files.size()); - } - - @Test - public void shareFile() throws IOException { - String fileId = this.createTestBlob(); - List ids = this.snippets.shareFile(fileId, - "user@test.appsdevtesting.com", - "test.appsdevtesting.com"); - assertEquals(2, ids.size()); - } -} diff --git a/drive/snippets/drive_v2/src/test/java/TeamDriveSnippetsTest.java b/drive/snippets/drive_v2/src/test/java/TeamDriveSnippetsTest.java deleted file mode 100644 index a0f53e9c..00000000 --- a/drive/snippets/drive_v2/src/test/java/TeamDriveSnippetsTest.java +++ /dev/null @@ -1,66 +0,0 @@ -/* - * Copyright 2022 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import static org.junit.Assert.assertNotEquals; -import static org.junit.Assert.assertNotNull; - -import com.google.api.services.drive.model.Permission; -import com.google.api.services.drive.model.PermissionList; -import com.google.api.services.drive.model.TeamDrive; -import java.io.IOException; -import java.security.GeneralSecurityException; -import java.util.List; -import org.junit.Before; -import org.junit.Test; - -public class TeamDriveSnippetsTest extends BaseTest { - - private TeamDriveSnippets snippets; - - @Before - public void createSnippets() { - this.snippets = new TeamDriveSnippets(this.service); - } - - @Test - public void createTeamDrive() throws IOException, GeneralSecurityException { - String id = this.snippets.createTeamDrive(); - assertNotNull(id); - this.service.teamdrives().delete(id); - } - - @Test - public void recoverTeamDrives() throws IOException { - String id = this.createOrphanedTeamDrive(); - List results = this.snippets.recoverTeamDrives( - "sbazyl@test.appsdevtesting.com"); - assertNotEquals(0, results.size()); - this.service.teamdrives().delete(id).execute(); - } - - private String createOrphanedTeamDrive() throws IOException { - String teamDriveId = this.snippets.createTeamDrive(); - PermissionList response = this.service.permissions().list(teamDriveId) - .setSupportsTeamDrives(true) - .execute(); - for (Permission permission : response.getItems()) { - this.service.permissions().delete(teamDriveId, permission.getId()) - .setSupportsTeamDrives(true) - .execute(); - } - return teamDriveId; - } -} diff --git a/drive/snippets/drive_v3/src/main/java/AppDataSnippets.java b/drive/snippets/drive_v3/src/main/java/AppDataSnippets.java deleted file mode 100644 index 5f75f5c4..00000000 --- a/drive/snippets/drive_v3/src/main/java/AppDataSnippets.java +++ /dev/null @@ -1,76 +0,0 @@ -/* - * Copyright 2022 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import com.google.api.client.http.FileContent; -import com.google.api.services.drive.Drive; -import com.google.api.services.drive.model.File; -import com.google.api.services.drive.model.FileList; -import java.io.IOException; -import java.util.Collections; - - -public class AppDataSnippets { - - private Drive service; - - public AppDataSnippets(Drive service) { - this.service = service; - } - - public String uploadAppData() throws IOException { - Drive driveService = this.service; - // [START uploadAppData] - File fileMetadata = new File(); - fileMetadata.setName("config.json"); - fileMetadata.setParents(Collections.singletonList("appDataFolder")); - java.io.File filePath = new java.io.File("files/config.json"); - FileContent mediaContent = new FileContent("application/json", filePath); - File file = driveService.files().create(fileMetadata, mediaContent) - .setFields("id") - .execute(); - System.out.println("File ID: " + file.getId()); - // [END uploadAppData] - return file.getId(); - } - - public FileList listAppData() throws IOException { - Drive driveService = this.service; - // [START listAppData] - FileList files = driveService.files().list() - .setSpaces("appDataFolder") - .setFields("nextPageToken, files(id, name)") - .setPageSize(10) - .execute(); - for (File file : files.getFiles()) { - System.out.printf("Found file: %s (%s)\n", - file.getName(), file.getId()); - } - // [END listAppData] - return files; - } - - public String fetchAppDataFolder() throws IOException { - Drive driveService = this.service; - // [START fetchAppDataFolder] - File file = driveService.files().get("appDataFolder") - .setFields("id") - .execute(); - System.out.println("Folder ID: " + file.getId()); - // [END fetchAppDataFolder] - return file.getId(); - } - -} diff --git a/drive/snippets/drive_v3/src/main/java/ChangeSnippets.java b/drive/snippets/drive_v3/src/main/java/ChangeSnippets.java deleted file mode 100644 index 141991bc..00000000 --- a/drive/snippets/drive_v3/src/main/java/ChangeSnippets.java +++ /dev/null @@ -1,63 +0,0 @@ -/* - * Copyright 2022 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import com.google.api.services.drive.Drive; -import com.google.api.services.drive.model.Change; -import com.google.api.services.drive.model.ChangeList; -import com.google.api.services.drive.model.StartPageToken; -import java.io.IOException; - -public class ChangeSnippets { - - private Drive service; - - public ChangeSnippets(Drive service) { - this.service = service; - } - - public String fetchStartPageToken() throws IOException { - Drive driveService = this.service; - // [START fetchStartPageToken] - StartPageToken response = driveService.changes() - .getStartPageToken().execute(); - System.out.println("Start token: " + response.getStartPageToken()); - // [END fetchStartPageToken] - return response.getStartPageToken(); - } - - public String fetchChanges(String savedStartPageToken) throws IOException { - Drive driveService = this.service; - // [START fetchChanges] - // Begin with our last saved start token for this user or the - // current token from getStartPageToken() - String pageToken = savedStartPageToken; - while (pageToken != null) { - ChangeList changes = driveService.changes().list(pageToken) - .execute(); - for (Change change : changes.getChanges()) { - // Process change - System.out.println("Change found for file: " + change.getFileId()); - } - if (changes.getNewStartPageToken() != null) { - // Last page, save this token for the next polling interval - savedStartPageToken = changes.getNewStartPageToken(); - } - pageToken = changes.getNextPageToken(); - } - // [END fetchChanges] - return savedStartPageToken; - } -} diff --git a/drive/snippets/drive_v3/src/main/java/DriveSnippets.java b/drive/snippets/drive_v3/src/main/java/DriveSnippets.java deleted file mode 100644 index 9fa22647..00000000 --- a/drive/snippets/drive_v3/src/main/java/DriveSnippets.java +++ /dev/null @@ -1,97 +0,0 @@ -/* - * Copyright 2022 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import com.google.api.services.drive.model.Drive; -import com.google.api.services.drive.model.DriveList; -import com.google.api.services.drive.model.Permission; -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; -import java.util.UUID; - -public class DriveSnippets { - private com.google.api.services.drive.Drive service; - - public DriveSnippets(com.google.api.services.drive.Drive service) { - this.service = service; - } - - public String createDrive() throws IOException { - com.google.api.services.drive.Drive driveService = this.service; - // [START createDrive] - Drive driveMetadata = new Drive(); - driveMetadata.setName("Project Resources"); - String requestId = UUID.randomUUID().toString(); - Drive drive = driveService.drives().create(requestId, - driveMetadata) - .execute(); - System.out.println("Drive ID: " + drive.getId()); - // [END createDrive] - return drive.getId(); - } - - public List recoverDrives(String realUser) - throws IOException { - com.google.api.services.drive.Drive driveService = this.service; - List drives = new ArrayList(); - // [START recoverDrives] - // Find all shared drives without an organizer and add one. - // Note: This example does not capture all cases. Shared drives - // that have an empty group as the sole organizer, or an - // organizer outside the organization are not captured. A - // more exhaustive approach would evaluate each shared drive - // and the associated permissions and groups to ensure an active - // organizer is assigned. - String pageToken = null; - Permission newOrganizerPermission = new Permission() - .setType("user") - .setRole("organizer") - .setEmailAddress("user@example.com"); - // [START_EXCLUDE silent] - newOrganizerPermission.setEmailAddress(realUser); - // [END_EXCLUDE] - - do { - DriveList result = driveService.drives().list() - .setQ("organizerCount = 0") - .setFields("nextPageToken, drives(id, name)") - .setUseDomainAdminAccess(true) - .setPageToken(pageToken) - .execute(); - for (Drive drive : result.getDrives()) { - System.out.printf("Found drive without organizer: %s (%s)\n", - drive.getName(), drive.getId()); - // Note: For improved efficiency, consider batching - // permission insert requests - Permission permissionResult = driveService.permissions() - .create(drive.getId(), newOrganizerPermission) - .setUseDomainAdminAccess(true) - .setSupportsAllDrives(true) - .setFields("id") - .execute(); - System.out.printf("Added organizer permission: %s\n", - permissionResult.getId()); - - } - // [START_EXCLUDE silent] - drives.addAll(result.getDrives()); - // [END_EXCLUDE] - pageToken = result.getNextPageToken(); - } while (pageToken != null); - // [END recoverDrives] - return drives; - } -} diff --git a/drive/snippets/drive_v3/src/test/java/AppDataSnippetsTest.java b/drive/snippets/drive_v3/src/test/java/AppDataSnippetsTest.java deleted file mode 100644 index 446af287..00000000 --- a/drive/snippets/drive_v3/src/test/java/AppDataSnippetsTest.java +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Copyright 2022 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import static org.junit.Assert.assertNotEquals; -import static org.junit.Assert.assertNotNull; - -import com.google.api.services.drive.model.FileList; -import java.io.IOException; -import java.security.GeneralSecurityException; -import org.junit.Before; -import org.junit.Test; - -public class AppDataSnippetsTest extends BaseTest { - - private AppDataSnippets snippets; - - @Before - public void createSnippets() { - this.snippets = new AppDataSnippets(this.service); - } - - @Test - public void fetchAppDataFolder() throws IOException, GeneralSecurityException { - String id = this.snippets.fetchAppDataFolder(); - assertNotNull(id); - } - - @Test - public void uploadAppData() - throws IOException, GeneralSecurityException { - String id = this.snippets.uploadAppData(); - assertNotNull(id); - deleteFileOnCleanup(id); - } - - @Test - public void listAppData() throws IOException, GeneralSecurityException { - String id = this.snippets.uploadAppData(); - deleteFileOnCleanup(id); - FileList files = this.snippets.listAppData(); - assertNotEquals(0, files.getFiles().size()); - } - -} diff --git a/drive/snippets/drive_v3/src/test/java/ChangeSnippetsTest.java b/drive/snippets/drive_v3/src/test/java/ChangeSnippetsTest.java deleted file mode 100644 index 7ad14676..00000000 --- a/drive/snippets/drive_v3/src/test/java/ChangeSnippetsTest.java +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Copyright 2022 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import static org.junit.Assert.assertNotEquals; -import static org.junit.Assert.assertNotNull; - -import java.io.IOException; -import org.junit.Before; -import org.junit.Test; - -public class ChangeSnippetsTest extends BaseTest { - - private ChangeSnippets snippets; - - @Before - public void createSnippets() { - this.snippets = new ChangeSnippets(this.service); - } - - @Test - public void fetchStartPageToken() throws IOException { - String token = this.snippets.fetchStartPageToken(); - assertNotNull(token); - } - - @Test - public void fetchChanges() throws IOException { - String startPageToken = this.snippets.fetchStartPageToken(); - this.createTestBlob(); - String newStartPageToken = this.snippets.fetchChanges(startPageToken); - assertNotNull(newStartPageToken); - assertNotEquals(startPageToken, newStartPageToken); - } -} diff --git a/drive/snippets/drive_v3/src/test/java/DriveSnippetsTest.java b/drive/snippets/drive_v3/src/test/java/DriveSnippetsTest.java deleted file mode 100644 index e32dc904..00000000 --- a/drive/snippets/drive_v3/src/test/java/DriveSnippetsTest.java +++ /dev/null @@ -1,66 +0,0 @@ -/* - * Copyright 2022 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import static org.junit.Assert.assertNotEquals; -import static org.junit.Assert.assertNotNull; - -import com.google.api.services.drive.model.Drive; -import com.google.api.services.drive.model.Permission; -import com.google.api.services.drive.model.PermissionList; -import java.io.IOException; -import java.security.GeneralSecurityException; -import java.util.List; -import org.junit.Before; -import org.junit.Test; - -public class DriveSnippetsTest extends BaseTest { - - private DriveSnippets snippets; - - @Before - public void createSnippets() { - this.snippets = new DriveSnippets(this.service); - } - - @Test - public void createDrive() throws IOException, GeneralSecurityException { - String id = this.snippets.createDrive(); - assertNotNull(id); - this.service.drives().delete(id); - } - - @Test - public void recoverDrives() throws IOException { - String id = this.createOrphanedDrive(); - List results = this.snippets.recoverDrives( - "sbazyl@test.appsdevtesting.com"); - assertNotEquals(0, results.size()); - this.service.drives().delete(id).execute(); - } - - private String createOrphanedDrive() throws IOException { - String driveId = this.snippets.createDrive(); - PermissionList response = this.service.permissions().list(driveId) - .setSupportsAllDrives(true) - .execute(); - for (Permission permission : response.getPermissions()) { - this.service.permissions().delete(driveId, permission.getId()) - .setSupportsAllDrives(true) - .execute(); - } - return driveId; - } -} diff --git a/drive/snippets/drive_v3/src/test/java/FileSnippetsTest.java b/drive/snippets/drive_v3/src/test/java/FileSnippetsTest.java deleted file mode 100644 index 383a7935..00000000 --- a/drive/snippets/drive_v3/src/test/java/FileSnippetsTest.java +++ /dev/null @@ -1,137 +0,0 @@ -/* - * Copyright 2022 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotEquals; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertTrue; - -import com.google.api.services.drive.model.File; -import java.io.ByteArrayOutputStream; -import java.io.IOException; -import java.security.GeneralSecurityException; -import java.util.List; -import org.junit.Before; -import org.junit.Test; - -public class FileSnippetsTest extends BaseTest { - - private FileSnippets snippets; - - @Before - public void createSnippets() { - this.snippets = new FileSnippets(this.service); - } - - @Test - public void uploadBasic() throws IOException, GeneralSecurityException { - String id = this.snippets.uploadBasic(); - assertNotNull(id); - deleteFileOnCleanup(id); - } - - @Test - public void uploadRevision() throws IOException, GeneralSecurityException { - String id = this.snippets.uploadBasic(); - assertNotNull(id); - deleteFileOnCleanup(id); - String id2 = this.snippets.uploadRevision(id); - assertEquals(id, id2); - } - - @Test - public void uploadToFolder() throws IOException, GeneralSecurityException { - String folderId = this.snippets.createFolder(); - File file = this.snippets.uploadToFolder(folderId); - assertTrue(file.getParents().contains(folderId)); - deleteFileOnCleanup(file.getId()); - deleteFileOnCleanup(folderId); - } - - @Test - public void uploadWithConversion() - throws IOException, GeneralSecurityException { - String id = this.snippets.uploadWithConversion(); - assertNotNull(id); - deleteFileOnCleanup(id); - } - - @Test - public void exportPdf() throws IOException, GeneralSecurityException { - String id = createTestDocument(); - ByteArrayOutputStream out = this.snippets.exportPdf(id); - assertEquals("%PDF", out.toString("UTF-8").substring(0, 4)); - } - - @Test - public void downloadFile() throws IOException, GeneralSecurityException { - String id = createTestBlob(); - ByteArrayOutputStream out = this.snippets.downloadFile(id); - byte[] bytes = out.toByteArray(); - assertEquals((byte) 0xFF, bytes[0]); - assertEquals((byte) 0xD8, bytes[1]); - } - - @Test - public void createShortcut() throws IOException, GeneralSecurityException { - String id = this.snippets.createShortcut(); - assertNotNull(id); - deleteFileOnCleanup(id); - } - - @Test - public void touchFile() throws IOException, GeneralSecurityException { - String id = this.createTestBlob(); - long now = System.currentTimeMillis(); - long modifiedTime = this.snippets.touchFile(id, now); - assertEquals(now, modifiedTime); - } - - @Test - public void createFolder() throws IOException, GeneralSecurityException { - String id = this.snippets.createFolder(); - assertNotNull(id); - deleteFileOnCleanup(id); - } - - @Test - public void moveFileToFolder() - throws IOException, GeneralSecurityException { - String folderId = this.snippets.createFolder(); - deleteFileOnCleanup(folderId); - String fileId = this.createTestBlob(); - List parents = this.snippets.moveFileToFolder(fileId, folderId); - assertTrue(parents.contains(folderId)); - assertEquals(1, parents.size()); - } - - @Test - public void searchFiles() - throws IOException, GeneralSecurityException { - this.createTestBlob(); - List files = this.snippets.searchFiles(); - assertNotEquals(0, files.size()); - } - - @Test - public void shareFile() throws IOException { - String fileId = this.createTestBlob(); - List ids = this.snippets.shareFile(fileId, - "user@test.appsdevtesting.com", - "test.appsdevtesting.com"); - assertEquals(2, ids.size()); - } -} diff --git a/drive/snippets/drive_v3/src/test/java/TeamDriveSnippetsTest.java b/drive/snippets/drive_v3/src/test/java/TeamDriveSnippetsTest.java deleted file mode 100644 index b59b235a..00000000 --- a/drive/snippets/drive_v3/src/test/java/TeamDriveSnippetsTest.java +++ /dev/null @@ -1,66 +0,0 @@ -/* - * Copyright 2022 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import static org.junit.Assert.assertNotEquals; -import static org.junit.Assert.assertNotNull; - -import com.google.api.services.drive.model.Permission; -import com.google.api.services.drive.model.PermissionList; -import com.google.api.services.drive.model.TeamDrive; -import java.io.IOException; -import java.security.GeneralSecurityException; -import java.util.List; -import org.junit.Before; -import org.junit.Test; - -public class TeamDriveSnippetsTest extends BaseTest { - - private TeamDriveSnippets snippets; - - @Before - public void createSnippets() { - this.snippets = new TeamDriveSnippets(this.service); - } - - @Test - public void createTeamDrive() throws IOException, GeneralSecurityException { - String id = this.snippets.createTeamDrive(); - assertNotNull(id); - this.service.teamdrives().delete(id); - } - - @Test - public void recoverTeamDrives() throws IOException { - String id = this.createOrphanedTeamDrive(); - List results = this.snippets.recoverTeamDrives( - "sbazyl@test.appsdevtesting.com"); - assertNotEquals(0, results.size()); - this.service.teamdrives().delete(id).execute(); - } - - private String createOrphanedTeamDrive() throws IOException { - String teamDriveId = this.snippets.createTeamDrive(); - PermissionList response = this.service.permissions().list(teamDriveId) - .setSupportsTeamDrives(true) - .execute(); - for (Permission permission : response.getPermissions()) { - this.service.permissions().delete(teamDriveId, permission.getId()) - .setSupportsTeamDrives(true) - .execute(); - } - return teamDriveId; - } -} From 5877f2c40642f2b13a1e392cb0de961e1cc2d7b4 Mon Sep 17 00:00:00 2001 From: Steven Bazyl Date: Tue, 30 Aug 2022 14:41:15 -0600 Subject: [PATCH 162/262] fix: Add missing hamcrest dependency --- gmail/snippets/build.gradle | 1 + 1 file changed, 1 insertion(+) diff --git a/gmail/snippets/build.gradle b/gmail/snippets/build.gradle index 5e89d634..2881c148 100644 --- a/gmail/snippets/build.gradle +++ b/gmail/snippets/build.gradle @@ -11,4 +11,5 @@ dependencies { implementation 'org.apache.commons:commons-csv:1.9.0' testImplementation 'junit:junit:4.13.2' testImplementation 'org.mockito:mockito-inline:4.7.0' + testImplementation 'org.hamcrest:hamcrest:2.2' } From 4eec0616549ecd59bed4045048e0cd753c1b8f57 Mon Sep 17 00:00:00 2001 From: Steven Bazyl Date: Tue, 30 Aug 2022 14:52:19 -0600 Subject: [PATCH 163/262] fix: Add missing import --- drive/snippets/drive_v2/src/test/java/TestListAppdata.java | 1 + 1 file changed, 1 insertion(+) diff --git a/drive/snippets/drive_v2/src/test/java/TestListAppdata.java b/drive/snippets/drive_v2/src/test/java/TestListAppdata.java index 3aa6558b..a6baf68c 100644 --- a/drive/snippets/drive_v2/src/test/java/TestListAppdata.java +++ b/drive/snippets/drive_v2/src/test/java/TestListAppdata.java @@ -12,6 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. +import static org.junit.Assert.assertNotEquals; import com.google.api.services.drive.model.FileList; import java.io.IOException; import java.security.GeneralSecurityException; From 4d0174d516835e95fe732cb7f57da6896c57f86b Mon Sep 17 00:00:00 2001 From: Steve Bazyl Date: Tue, 30 Aug 2022 16:20:31 -0600 Subject: [PATCH 164/262] chore: update maven plugin --- calendar/sync/pom.xml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/calendar/sync/pom.xml b/calendar/sync/pom.xml index cfc48a4b..f788e4a1 100644 --- a/calendar/sync/pom.xml +++ b/calendar/sync/pom.xml @@ -30,7 +30,7 @@ TODO: Determine the final URL. 2014 - 2.0.9 + 3.0.0 @@ -40,8 +40,8 @@ maven-compiler-plugin 3.10.1 - 1.6 - 1.6 + 1.8 + 1.8 From 88165e8561c2d7b27e26b8e4feeaab5b1ebf023b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 30 Aug 2022 16:21:43 -0600 Subject: [PATCH 165/262] Bump exec-maven-plugin from 1.1 to 3.1.0 in /calendar/sync (#285) Bumps [exec-maven-plugin](https://github.com/mojohaus/exec-maven-plugin) from 1.1 to 3.1.0. - [Release notes](https://github.com/mojohaus/exec-maven-plugin/releases) - [Commits](https://github.com/mojohaus/exec-maven-plugin/compare/exec-maven-plugin-1.1...exec-maven-plugin-3.1.0) --- updated-dependencies: - dependency-name: org.codehaus.mojo:exec-maven-plugin dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- calendar/sync/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/calendar/sync/pom.xml b/calendar/sync/pom.xml index f788e4a1..f35f8cc1 100644 --- a/calendar/sync/pom.xml +++ b/calendar/sync/pom.xml @@ -47,7 +47,7 @@ org.codehaus.mojo exec-maven-plugin - 1.1 + 3.1.0 From 5c5338b45862bdf25556260be32b4b449f69ae71 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 30 Aug 2022 16:51:04 -0600 Subject: [PATCH 166/262] Bump junit from 4.12 to 4.13.2 in /drive/snippets/drive_v3 (#342) Bumps [junit](https://github.com/junit-team/junit4) from 4.12 to 4.13.2. - [Release notes](https://github.com/junit-team/junit4/releases) - [Changelog](https://github.com/junit-team/junit4/blob/main/doc/ReleaseNotes4.12.md) - [Commits](https://github.com/junit-team/junit4/compare/r4.12...r4.13.2) --- updated-dependencies: - dependency-name: junit:junit dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- drive/snippets/drive_v3/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drive/snippets/drive_v3/build.gradle b/drive/snippets/drive_v3/build.gradle index 0343fc54..ade01244 100644 --- a/drive/snippets/drive_v3/build.gradle +++ b/drive/snippets/drive_v3/build.gradle @@ -8,7 +8,7 @@ dependencies { implementation 'com.google.api-client:google-api-client:1.23.0' implementation 'com.google.auth:google-auth-library-oauth2-http:1.10.0' implementation 'com.google.code.gson:gson:2.4' - testImplementation 'junit:junit:4.12' + testImplementation 'junit:junit:4.13.2' } test { From a795407379e070697d9bc7dee78508555cd12428 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 30 Aug 2022 16:51:06 -0600 Subject: [PATCH 167/262] Bump junit from 4.12 to 4.13.2 in /drive/snippets/drive_v2 (#339) Bumps [junit](https://github.com/junit-team/junit4) from 4.12 to 4.13.2. - [Release notes](https://github.com/junit-team/junit4/releases) - [Changelog](https://github.com/junit-team/junit4/blob/main/doc/ReleaseNotes4.12.md) - [Commits](https://github.com/junit-team/junit4/compare/r4.12...r4.13.2) --- updated-dependencies: - dependency-name: junit:junit dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- drive/snippets/drive_v2/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drive/snippets/drive_v2/build.gradle b/drive/snippets/drive_v2/build.gradle index a9b22fb3..6a111d9a 100644 --- a/drive/snippets/drive_v2/build.gradle +++ b/drive/snippets/drive_v2/build.gradle @@ -10,7 +10,7 @@ dependencies { implementation 'com.google.auth:google-auth-library-oauth2-http:1.3.0' implementation 'com.google.oauth-client:google-oauth-client-jetty:1.32.1' implementation 'com.google.code.gson:gson:2.4' - testImplementation 'junit:junit:4.12' + testImplementation 'junit:junit:4.13.2' } test { From 0dc73faedbfbbb8295ddc438a234a73cfcfd4b55 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 30 Aug 2022 16:51:08 -0600 Subject: [PATCH 168/262] Bump google-api-client from 1.33.0 to 2.0.0 in /vault/quickstart (#341) Bumps [google-api-client](https://github.com/googleapis/google-api-java-client) from 1.33.0 to 2.0.0. - [Release notes](https://github.com/googleapis/google-api-java-client/releases) - [Changelog](https://github.com/googleapis/google-api-java-client/blob/main/CHANGELOG.md) - [Commits](https://github.com/googleapis/google-api-java-client/compare/v1.33.0...v2.0.0) --- updated-dependencies: - dependency-name: com.google.api-client:google-api-client dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- vault/quickstart/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vault/quickstart/build.gradle b/vault/quickstart/build.gradle index 26e72d92..d60d73f4 100644 --- a/vault/quickstart/build.gradle +++ b/vault/quickstart/build.gradle @@ -11,7 +11,7 @@ repositories { } dependencies { - implementation 'com.google.api-client:google-api-client:1.33.0' + implementation 'com.google.api-client:google-api-client:2.0.0' implementation 'com.google.oauth-client:google-oauth-client-jetty:1.34.1' implementation 'com.google.apis:google-api-services-vault:v1-rev20211101-1.32.1' } From 38e5e3bcb26658c91ab7ec59f5162742c323f35f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 30 Aug 2022 16:51:10 -0600 Subject: [PATCH 169/262] Bump google-api-client from 1.33.0 to 2.0.0 in /gmail/quickstart (#340) Bumps [google-api-client](https://github.com/googleapis/google-api-java-client) from 1.33.0 to 2.0.0. - [Release notes](https://github.com/googleapis/google-api-java-client/releases) - [Changelog](https://github.com/googleapis/google-api-java-client/blob/main/CHANGELOG.md) - [Commits](https://github.com/googleapis/google-api-java-client/compare/v1.33.0...v2.0.0) --- updated-dependencies: - dependency-name: com.google.api-client:google-api-client dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- gmail/quickstart/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gmail/quickstart/build.gradle b/gmail/quickstart/build.gradle index ce120ab6..9de1d325 100644 --- a/gmail/quickstart/build.gradle +++ b/gmail/quickstart/build.gradle @@ -11,7 +11,7 @@ repositories { } dependencies { - implementation 'com.google.api-client:google-api-client:1.33.0' + implementation 'com.google.api-client:google-api-client:2.0.0' implementation 'com.google.oauth-client:google-oauth-client-jetty:1.34.1' implementation 'com.google.apis:google-api-services-gmail:v1-rev20211108-1.32.1' } From fc8277e1f68875efacf7629a82f5131e1d57310e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 30 Aug 2022 16:51:13 -0600 Subject: [PATCH 170/262] Bump google-api-client from 1.33.0 to 2.0.0 in /docs/outputJSON (#314) Bumps [google-api-client](https://github.com/googleapis/google-api-java-client) from 1.33.0 to 2.0.0. - [Release notes](https://github.com/googleapis/google-api-java-client/releases) - [Changelog](https://github.com/googleapis/google-api-java-client/blob/main/CHANGELOG.md) - [Commits](https://github.com/googleapis/google-api-java-client/compare/v1.33.0...v2.0.0) --- updated-dependencies: - dependency-name: com.google.api-client:google-api-client dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- docs/outputJSON/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/outputJSON/build.gradle b/docs/outputJSON/build.gradle index 1a1343c3..32220cf2 100644 --- a/docs/outputJSON/build.gradle +++ b/docs/outputJSON/build.gradle @@ -11,7 +11,7 @@ repositories { } dependencies { - implementation 'com.google.api-client:google-api-client:1.33.0' + implementation 'com.google.api-client:google-api-client:2.0.0' implementation 'com.google.oauth-client:google-oauth-client-jetty:1.34.1' implementation 'com.google.apis:google-api-services-docs:v1-rev20210707-1.32.1' implementation group: 'com.google.code.gson', name: 'gson', version: '2.9.1' From e1eb9e47edf41c22f9f147cff11a12512542d668 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 30 Aug 2022 16:51:15 -0600 Subject: [PATCH 171/262] Bump google-api-client from 1.33.0 to 2.0.0 in /slides/quickstart (#308) Bumps [google-api-client](https://github.com/googleapis/google-api-java-client) from 1.33.0 to 2.0.0. - [Release notes](https://github.com/googleapis/google-api-java-client/releases) - [Changelog](https://github.com/googleapis/google-api-java-client/blob/main/CHANGELOG.md) - [Commits](https://github.com/googleapis/google-api-java-client/compare/v1.33.0...v2.0.0) --- updated-dependencies: - dependency-name: com.google.api-client:google-api-client dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- slides/quickstart/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/slides/quickstart/build.gradle b/slides/quickstart/build.gradle index d4eac491..05916c6f 100644 --- a/slides/quickstart/build.gradle +++ b/slides/quickstart/build.gradle @@ -11,7 +11,7 @@ repositories { } dependencies { - implementation 'com.google.api-client:google-api-client:1.33.0' + implementation 'com.google.api-client:google-api-client:2.0.0' implementation 'com.google.oauth-client:google-oauth-client-jetty:1.34.1' implementation 'com.google.apis:google-api-services-slides:v1-rev20210820-1.32.1' } From f6db2027a9b0d9bb6de529c719e036a4d9081270 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 30 Aug 2022 16:51:17 -0600 Subject: [PATCH 172/262] Bump google-api-client in /adminSDK/directory/quickstart (#295) Bumps [google-api-client](https://github.com/googleapis/google-api-java-client) from 1.33.0 to 2.0.0. - [Release notes](https://github.com/googleapis/google-api-java-client/releases) - [Changelog](https://github.com/googleapis/google-api-java-client/blob/main/CHANGELOG.md) - [Commits](https://github.com/googleapis/google-api-java-client/compare/v1.33.0...v2.0.0) --- updated-dependencies: - dependency-name: com.google.api-client:google-api-client dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- adminSDK/directory/quickstart/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/adminSDK/directory/quickstart/build.gradle b/adminSDK/directory/quickstart/build.gradle index 3504f0b0..c2dfbf80 100644 --- a/adminSDK/directory/quickstart/build.gradle +++ b/adminSDK/directory/quickstart/build.gradle @@ -11,7 +11,7 @@ repositories { } dependencies { - implementation 'com.google.api-client:google-api-client:1.33.0' + implementation 'com.google.api-client:google-api-client:2.0.0' implementation 'com.google.oauth-client:google-oauth-client-jetty:1.34.1' implementation 'com.google.apis:google-api-services-admin-directory:directory_v1-rev118-1.25.0' } From ef296bc7c30fa487d55079f2561fca0596d8aa24 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 30 Aug 2022 16:51:19 -0600 Subject: [PATCH 173/262] Bump google-api-client from 1.33.0 to 2.0.0 in /appsScript/quickstart (#307) Bumps [google-api-client](https://github.com/googleapis/google-api-java-client) from 1.33.0 to 2.0.0. - [Release notes](https://github.com/googleapis/google-api-java-client/releases) - [Changelog](https://github.com/googleapis/google-api-java-client/blob/main/CHANGELOG.md) - [Commits](https://github.com/googleapis/google-api-java-client/compare/v1.33.0...v2.0.0) --- updated-dependencies: - dependency-name: com.google.api-client:google-api-client dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- appsScript/quickstart/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/appsScript/quickstart/build.gradle b/appsScript/quickstart/build.gradle index 41dd51b6..f26ede54 100644 --- a/appsScript/quickstart/build.gradle +++ b/appsScript/quickstart/build.gradle @@ -11,7 +11,7 @@ repositories { } dependencies { - implementation 'com.google.api-client:google-api-client:1.33.0' + implementation 'com.google.api-client:google-api-client:2.0.0' implementation 'com.google.oauth-client:google-oauth-client-jetty:1.34.1' implementation 'com.google.apis:google-api-services-script:v1-rev20210703-1.32.1' } From d38841c9295a5496a1402ef9ae87fdda7243cdf1 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 30 Aug 2022 16:51:22 -0600 Subject: [PATCH 174/262] Bump google-api-client from 1.33.0 to 2.0.0 in /calendar/quickstart (#300) Bumps [google-api-client](https://github.com/googleapis/google-api-java-client) from 1.33.0 to 2.0.0. - [Release notes](https://github.com/googleapis/google-api-java-client/releases) - [Changelog](https://github.com/googleapis/google-api-java-client/blob/main/CHANGELOG.md) - [Commits](https://github.com/googleapis/google-api-java-client/compare/v1.33.0...v2.0.0) --- updated-dependencies: - dependency-name: com.google.api-client:google-api-client dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- calendar/quickstart/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/calendar/quickstart/build.gradle b/calendar/quickstart/build.gradle index deb17b9e..923ec144 100644 --- a/calendar/quickstart/build.gradle +++ b/calendar/quickstart/build.gradle @@ -11,7 +11,7 @@ repositories { } dependencies { - implementation 'com.google.api-client:google-api-client:1.33.0' + implementation 'com.google.api-client:google-api-client:2.0.0' implementation 'com.google.oauth-client:google-oauth-client-jetty:1.34.1' implementation 'com.google.apis:google-api-services-calendar:v3-rev20211026-1.32.1' } From 9a0422723e59cd272ec4283030ff932b8e198850 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 30 Aug 2022 16:51:24 -0600 Subject: [PATCH 175/262] Bump google-api-client from 1.33.0 to 2.0.0 in /classroom/quickstart (#301) Bumps [google-api-client](https://github.com/googleapis/google-api-java-client) from 1.33.0 to 2.0.0. - [Release notes](https://github.com/googleapis/google-api-java-client/releases) - [Changelog](https://github.com/googleapis/google-api-java-client/blob/main/CHANGELOG.md) - [Commits](https://github.com/googleapis/google-api-java-client/compare/v1.33.0...v2.0.0) --- updated-dependencies: - dependency-name: com.google.api-client:google-api-client dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- classroom/quickstart/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/classroom/quickstart/build.gradle b/classroom/quickstart/build.gradle index 663c1057..7773fab2 100644 --- a/classroom/quickstart/build.gradle +++ b/classroom/quickstart/build.gradle @@ -11,7 +11,7 @@ repositories { } dependencies { - implementation 'com.google.api-client:google-api-client:1.33.0' + implementation 'com.google.api-client:google-api-client:2.0.0' implementation 'com.google.oauth-client:google-oauth-client-jetty:1.34.1' implementation 'com.google.apis:google-api-services-classroom:v1-rev20211029-1.32.1' } From 52cd4e6021248f99faa3c27aa82cf2c82860a436 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 30 Aug 2022 16:51:26 -0600 Subject: [PATCH 176/262] Bump google-api-client in /adminSDK/reports/quickstart (#296) Bumps [google-api-client](https://github.com/googleapis/google-api-java-client) from 1.33.0 to 2.0.0. - [Release notes](https://github.com/googleapis/google-api-java-client/releases) - [Changelog](https://github.com/googleapis/google-api-java-client/blob/main/CHANGELOG.md) - [Commits](https://github.com/googleapis/google-api-java-client/compare/v1.33.0...v2.0.0) --- updated-dependencies: - dependency-name: com.google.api-client:google-api-client dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- adminSDK/reports/quickstart/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/adminSDK/reports/quickstart/build.gradle b/adminSDK/reports/quickstart/build.gradle index f5ae3c7e..450d681a 100644 --- a/adminSDK/reports/quickstart/build.gradle +++ b/adminSDK/reports/quickstart/build.gradle @@ -11,7 +11,7 @@ repositories { } dependencies { - implementation 'com.google.api-client:google-api-client:1.33.0' + implementation 'com.google.api-client:google-api-client:2.0.0' implementation 'com.google.oauth-client:google-oauth-client-jetty:1.34.1' implementation 'com.google.apis:google-api-services-admin-reports:reports_v1-rev89-1.25.0' } From 323089fdcbb60f8e6e876a28c45463e70294e88f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 30 Aug 2022 16:51:28 -0600 Subject: [PATCH 177/262] Bump google-api-client from 1.34.1 to 2.0.0 in /classroom/snippets (#269) Bumps [google-api-client](https://github.com/googleapis/google-api-java-client) from 1.34.1 to 2.0.0. - [Release notes](https://github.com/googleapis/google-api-java-client/releases) - [Changelog](https://github.com/googleapis/google-api-java-client/blob/main/CHANGELOG.md) - [Commits](https://github.com/googleapis/google-api-java-client/compare/v1.34.1...v2.0.0) --- updated-dependencies: - dependency-name: com.google.api-client:google-api-client dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- classroom/snippets/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/classroom/snippets/build.gradle b/classroom/snippets/build.gradle index f9591fca..f1deeb31 100644 --- a/classroom/snippets/build.gradle +++ b/classroom/snippets/build.gradle @@ -6,7 +6,7 @@ repositories { } dependencies { - implementation 'com.google.api-client:google-api-client:1.34.1' + implementation 'com.google.api-client:google-api-client:2.0.0' implementation 'com.google.auth:google-auth-library-oauth2-http:1.10.0' implementation 'com.google.apis:google-api-services-classroom:v1-rev20220323-1.32.1' testImplementation 'junit:junit:4.13.2' From 4eab80287bf95eb8d79fca7f38d4c740f736989b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 30 Aug 2022 16:51:31 -0600 Subject: [PATCH 178/262] Bump google-api-client in /drive/activity/quickstart (#278) Bumps [google-api-client](https://github.com/googleapis/google-api-java-client) from 1.33.0 to 2.0.0. - [Release notes](https://github.com/googleapis/google-api-java-client/releases) - [Changelog](https://github.com/googleapis/google-api-java-client/blob/main/CHANGELOG.md) - [Commits](https://github.com/googleapis/google-api-java-client/compare/v1.33.0...v2.0.0) --- updated-dependencies: - dependency-name: com.google.api-client:google-api-client dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- drive/activity/quickstart/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drive/activity/quickstart/build.gradle b/drive/activity/quickstart/build.gradle index 583730c7..de3ddb63 100644 --- a/drive/activity/quickstart/build.gradle +++ b/drive/activity/quickstart/build.gradle @@ -11,7 +11,7 @@ repositories { } dependencies { - implementation 'com.google.api-client:google-api-client:1.33.0' + implementation 'com.google.api-client:google-api-client:2.0.0' implementation 'com.google.oauth-client:google-oauth-client-jetty:1.34.1' implementation 'com.google.apis:google-api-services-appsactivity:v1-rev20200128-1.30.10' } From b4b350cf6fed83665d0ba61bfdb22f7c429884bf Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 30 Aug 2022 16:51:33 -0600 Subject: [PATCH 179/262] Bump google-api-client from 1.33.0 to 2.0.0 in /drive/quickstart (#280) Bumps [google-api-client](https://github.com/googleapis/google-api-java-client) from 1.33.0 to 2.0.0. - [Release notes](https://github.com/googleapis/google-api-java-client/releases) - [Changelog](https://github.com/googleapis/google-api-java-client/blob/main/CHANGELOG.md) - [Commits](https://github.com/googleapis/google-api-java-client/compare/v1.33.0...v2.0.0) --- updated-dependencies: - dependency-name: com.google.api-client:google-api-client dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- drive/quickstart/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drive/quickstart/build.gradle b/drive/quickstart/build.gradle index 0cc1a504..ba1f28b5 100644 --- a/drive/quickstart/build.gradle +++ b/drive/quickstart/build.gradle @@ -11,7 +11,7 @@ repositories { } dependencies { - implementation 'com.google.api-client:google-api-client:1.33.0' + implementation 'com.google.api-client:google-api-client:2.0.0' implementation 'com.google.oauth-client:google-oauth-client-jetty:1.34.1' implementation 'com.google.apis:google-api-services-drive:v3-rev20211107-1.32.1' } From fda3bf3992ac4e00bf50525f1a20ea01ba3bf262 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 30 Aug 2022 16:51:35 -0600 Subject: [PATCH 180/262] Bump google-api-client from 1.33.0 to 2.0.0 in /people/quickstart (#276) Bumps [google-api-client](https://github.com/googleapis/google-api-java-client) from 1.33.0 to 2.0.0. - [Release notes](https://github.com/googleapis/google-api-java-client/releases) - [Changelog](https://github.com/googleapis/google-api-java-client/blob/main/CHANGELOG.md) - [Commits](https://github.com/googleapis/google-api-java-client/compare/v1.33.0...v2.0.0) --- updated-dependencies: - dependency-name: com.google.api-client:google-api-client dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- people/quickstart/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/people/quickstart/build.gradle b/people/quickstart/build.gradle index 8592e052..540e613c 100644 --- a/people/quickstart/build.gradle +++ b/people/quickstart/build.gradle @@ -12,7 +12,7 @@ repositories { } dependencies { - implementation 'com.google.api-client:google-api-client:1.33.0' + implementation 'com.google.api-client:google-api-client:2.0.0' implementation 'com.google.oauth-client:google-oauth-client-jetty:1.34.1' implementation 'com.google.apis:google-api-services-people:v1-rev20210903-1.32.1' } From 5eb04cab3ad46e92bc0503b10817df4cbf64ee62 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 30 Aug 2022 16:51:38 -0600 Subject: [PATCH 181/262] Bump google-api-client from 1.33.0 to 2.0.0 in /docs/quickstart (#273) Bumps [google-api-client](https://github.com/googleapis/google-api-java-client) from 1.33.0 to 2.0.0. - [Release notes](https://github.com/googleapis/google-api-java-client/releases) - [Changelog](https://github.com/googleapis/google-api-java-client/blob/main/CHANGELOG.md) - [Commits](https://github.com/googleapis/google-api-java-client/compare/v1.33.0...v2.0.0) --- updated-dependencies: - dependency-name: com.google.api-client:google-api-client dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- docs/quickstart/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/quickstart/build.gradle b/docs/quickstart/build.gradle index 6583c267..1b5fed39 100644 --- a/docs/quickstart/build.gradle +++ b/docs/quickstart/build.gradle @@ -11,7 +11,7 @@ repositories { } dependencies { - implementation 'com.google.api-client:google-api-client:1.33.0' + implementation 'com.google.api-client:google-api-client:2.0.0' implementation 'com.google.oauth-client:google-oauth-client-jetty:1.34.1' implementation 'com.google.apis:google-api-services-docs:v1-rev20210707-1.32.1' } From 112b1d8312b8a7f144e3b863ca82715a9dd4e44f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 30 Aug 2022 16:51:39 -0600 Subject: [PATCH 182/262] Bump google-api-client in /adminSDK/reseller/quickstart (#266) Bumps [google-api-client](https://github.com/googleapis/google-api-java-client) from 1.33.0 to 2.0.0. - [Release notes](https://github.com/googleapis/google-api-java-client/releases) - [Changelog](https://github.com/googleapis/google-api-java-client/blob/main/CHANGELOG.md) - [Commits](https://github.com/googleapis/google-api-java-client/compare/v1.33.0...v2.0.0) --- updated-dependencies: - dependency-name: com.google.api-client:google-api-client dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- adminSDK/reseller/quickstart/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/adminSDK/reseller/quickstart/build.gradle b/adminSDK/reseller/quickstart/build.gradle index 8903a301..20e39b10 100644 --- a/adminSDK/reseller/quickstart/build.gradle +++ b/adminSDK/reseller/quickstart/build.gradle @@ -11,7 +11,7 @@ repositories { } dependencies { - implementation 'com.google.api-client:google-api-client:1.33.0' + implementation 'com.google.api-client:google-api-client:2.0.0' implementation 'com.google.oauth-client:google-oauth-client-jetty:1.34.1' implementation 'com.google.apis:google-api-services-reseller:v1-rev20211106-1.32.1' } From a2c2e4b9d46f33588768149986389807e63e8c31 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 30 Aug 2022 16:51:42 -0600 Subject: [PATCH 183/262] Bump google-api-client from 1.33.0 to 2.0.0 in /sheets/quickstart (#263) Bumps [google-api-client](https://github.com/googleapis/google-api-java-client) from 1.33.0 to 2.0.0. - [Release notes](https://github.com/googleapis/google-api-java-client/releases) - [Changelog](https://github.com/googleapis/google-api-java-client/blob/main/CHANGELOG.md) - [Commits](https://github.com/googleapis/google-api-java-client/compare/v1.33.0...v2.0.0) --- updated-dependencies: - dependency-name: com.google.api-client:google-api-client dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- sheets/quickstart/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sheets/quickstart/build.gradle b/sheets/quickstart/build.gradle index dbf63a92..4dff318c 100644 --- a/sheets/quickstart/build.gradle +++ b/sheets/quickstart/build.gradle @@ -11,7 +11,7 @@ repositories { } dependencies { - implementation 'com.google.api-client:google-api-client:1.33.0' + implementation 'com.google.api-client:google-api-client:2.0.0' implementation 'com.google.oauth-client:google-oauth-client-jetty:1.34.1' implementation 'com.google.apis:google-api-services-sheets:v4-rev20210629-1.32.1' } From 653aa48009e8a0f0b9adfd8f7178c8e5afd635a5 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 30 Aug 2022 16:51:46 -0600 Subject: [PATCH 184/262] Bump google-api-client from 1.33.0 to 2.0.0 in /calendar/sync (#262) Bumps [google-api-client](https://github.com/googleapis/google-api-java-client) from 1.33.0 to 2.0.0. - [Release notes](https://github.com/googleapis/google-api-java-client/releases) - [Changelog](https://github.com/googleapis/google-api-java-client/blob/main/CHANGELOG.md) - [Commits](https://github.com/googleapis/google-api-java-client/compare/v1.33.0...v2.0.0) --- updated-dependencies: - dependency-name: com.google.api-client:google-api-client dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- calendar/sync/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/calendar/sync/pom.xml b/calendar/sync/pom.xml index f35f8cc1..01f4b039 100644 --- a/calendar/sync/pom.xml +++ b/calendar/sync/pom.xml @@ -77,7 +77,7 @@ com.google.api-client google-api-client - 1.33.0 + 2.0.0 com.google.http-client From 3fc1d73e79a277479d37af6ef91154a04f87ed64 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 30 Aug 2022 16:51:48 -0600 Subject: [PATCH 185/262] chore(deps): bump google-api-client in /adminSDK/alertcenter/quickstart (#346) Bumps [google-api-client](https://github.com/googleapis/google-api-java-client) from 1.33.0 to 2.0.0. - [Release notes](https://github.com/googleapis/google-api-java-client/releases) - [Changelog](https://github.com/googleapis/google-api-java-client/blob/main/CHANGELOG.md) - [Commits](https://github.com/googleapis/google-api-java-client/compare/v1.33.0...v2.0.0) --- updated-dependencies: - dependency-name: com.google.api-client:google-api-client dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- adminSDK/alertcenter/quickstart/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/adminSDK/alertcenter/quickstart/build.gradle b/adminSDK/alertcenter/quickstart/build.gradle index ddd97edc..c5be324b 100644 --- a/adminSDK/alertcenter/quickstart/build.gradle +++ b/adminSDK/alertcenter/quickstart/build.gradle @@ -12,7 +12,7 @@ repositories { } dependencies { - implementation 'com.google.api-client:google-api-client:1.33.0' + implementation 'com.google.api-client:google-api-client:2.0.0' implementation 'com.google.auth:google-auth-library-oauth2-http:1.10.0' implementation 'com.google.apis:google-api-services-alertcenter:v1beta1-rev20211012-1.32.1' } \ No newline at end of file From 4cd8181cca329e63beaca759f8fc42a6bdd2ba89 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 30 Aug 2022 16:51:52 -0600 Subject: [PATCH 186/262] chore(deps): bump google-api-client in /tasks/quickstart (#344) Bumps [google-api-client](https://github.com/googleapis/google-api-java-client) from 1.33.0 to 2.0.0. - [Release notes](https://github.com/googleapis/google-api-java-client/releases) - [Changelog](https://github.com/googleapis/google-api-java-client/blob/main/CHANGELOG.md) - [Commits](https://github.com/googleapis/google-api-java-client/compare/v1.33.0...v2.0.0) --- updated-dependencies: - dependency-name: com.google.api-client:google-api-client dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- tasks/quickstart/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tasks/quickstart/build.gradle b/tasks/quickstart/build.gradle index 929d1afd..c8f052b1 100644 --- a/tasks/quickstart/build.gradle +++ b/tasks/quickstart/build.gradle @@ -11,7 +11,7 @@ repositories { } dependencies { - implementation 'com.google.api-client:google-api-client:1.33.0' + implementation 'com.google.api-client:google-api-client:2.0.0' implementation 'com.google.oauth-client:google-oauth-client-jetty:1.34.1' implementation 'com.google.apis:google-api-services-tasks:v1-rev20210709-1.32.1' } \ No newline at end of file From 1d7f663c6765e26c9ce249c1f31d7a18181fa534 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 30 Aug 2022 16:51:54 -0600 Subject: [PATCH 187/262] Bump google-api-client in /drive/activity-v2/quickstart (#343) Bumps [google-api-client](https://github.com/googleapis/google-api-java-client) from 1.33.0 to 2.0.0. - [Release notes](https://github.com/googleapis/google-api-java-client/releases) - [Changelog](https://github.com/googleapis/google-api-java-client/blob/main/CHANGELOG.md) - [Commits](https://github.com/googleapis/google-api-java-client/compare/v1.33.0...v2.0.0) --- updated-dependencies: - dependency-name: com.google.api-client:google-api-client dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- drive/activity-v2/quickstart/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drive/activity-v2/quickstart/build.gradle b/drive/activity-v2/quickstart/build.gradle index 8cc523f1..8663a975 100644 --- a/drive/activity-v2/quickstart/build.gradle +++ b/drive/activity-v2/quickstart/build.gradle @@ -11,7 +11,7 @@ repositories { } dependencies { - implementation 'com.google.api-client:google-api-client:1.33.0' + implementation 'com.google.api-client:google-api-client:2.0.0' implementation 'com.google.oauth-client:google-oauth-client-jetty:1.34.1' implementation 'com.google.apis:google-api-services-driveactivity:v2-rev20210319-1.32.1' } From aa4c3cff0953c09fd2d789e8eb0a95f8301ae829 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 30 Aug 2022 16:51:56 -0600 Subject: [PATCH 188/262] Bump google-auth-library-oauth2-http in /gmail/snippets (#337) Bumps google-auth-library-oauth2-http from 1.6.0 to 1.10.0. --- updated-dependencies: - dependency-name: com.google.auth:google-auth-library-oauth2-http dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- gmail/snippets/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gmail/snippets/build.gradle b/gmail/snippets/build.gradle index 2881c148..7df49f06 100644 --- a/gmail/snippets/build.gradle +++ b/gmail/snippets/build.gradle @@ -5,7 +5,7 @@ repositories { } dependencies { - implementation 'com.google.auth:google-auth-library-oauth2-http:1.6.0' + implementation 'com.google.auth:google-auth-library-oauth2-http:1.10.0' implementation 'com.google.apis:google-api-services-gmail:v1-rev20220404-1.32.1' implementation 'javax.mail:mail:1.4.7' implementation 'org.apache.commons:commons-csv:1.9.0' From c0eac2c66cacaab57b0e3793525943e206ff483d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 30 Aug 2022 16:51:58 -0600 Subject: [PATCH 189/262] Bump google-api-services-vault in /vault/quickstart (#334) Bumps google-api-services-vault from v1-rev20211101-1.32.1 to v1-rev20220423-2.0.0. --- updated-dependencies: - dependency-name: com.google.apis:google-api-services-vault dependency-type: direct:production ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- vault/quickstart/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vault/quickstart/build.gradle b/vault/quickstart/build.gradle index d60d73f4..d3221860 100644 --- a/vault/quickstart/build.gradle +++ b/vault/quickstart/build.gradle @@ -13,5 +13,5 @@ repositories { dependencies { implementation 'com.google.api-client:google-api-client:2.0.0' implementation 'com.google.oauth-client:google-oauth-client-jetty:1.34.1' - implementation 'com.google.apis:google-api-services-vault:v1-rev20211101-1.32.1' + implementation 'com.google.apis:google-api-services-vault:v1-rev20220423-2.0.0' } From 4ddb547838c9352cd2bc00b8b9a2e4cbc144e3ed Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 30 Aug 2022 16:52:00 -0600 Subject: [PATCH 190/262] Bump google-auth-library-oauth2-http in /drive/snippets/drive_v2 (#332) Bumps google-auth-library-oauth2-http from 1.3.0 to 1.10.0. --- updated-dependencies: - dependency-name: com.google.auth:google-auth-library-oauth2-http dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- drive/snippets/drive_v2/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drive/snippets/drive_v2/build.gradle b/drive/snippets/drive_v2/build.gradle index 6a111d9a..1c46fca4 100644 --- a/drive/snippets/drive_v2/build.gradle +++ b/drive/snippets/drive_v2/build.gradle @@ -7,7 +7,7 @@ repositories { dependencies { implementation 'com.google.apis:google-api-services-drive:v2-rev20211205-1.32.1' implementation 'com.google.api-client:google-api-client:1.23.0' - implementation 'com.google.auth:google-auth-library-oauth2-http:1.3.0' + implementation 'com.google.auth:google-auth-library-oauth2-http:1.10.0' implementation 'com.google.oauth-client:google-oauth-client-jetty:1.32.1' implementation 'com.google.code.gson:gson:2.4' testImplementation 'junit:junit:4.13.2' From a2603ceac54b42006f290f6bf280298b6ad23368 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 30 Aug 2022 16:52:03 -0600 Subject: [PATCH 191/262] Bump google-api-services-drive in /drive/quickstart (#328) Bumps google-api-services-drive from v3-rev20211107-1.32.1 to v3-rev20220815-2.0.0. --- updated-dependencies: - dependency-name: com.google.apis:google-api-services-drive dependency-type: direct:production ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- drive/quickstart/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drive/quickstart/build.gradle b/drive/quickstart/build.gradle index ba1f28b5..bcc8c21a 100644 --- a/drive/quickstart/build.gradle +++ b/drive/quickstart/build.gradle @@ -13,5 +13,5 @@ repositories { dependencies { implementation 'com.google.api-client:google-api-client:2.0.0' implementation 'com.google.oauth-client:google-oauth-client-jetty:1.34.1' - implementation 'com.google.apis:google-api-services-drive:v3-rev20211107-1.32.1' + implementation 'com.google.apis:google-api-services-drive:v3-rev20220815-2.0.0' } From 05deb03358e28dd4dedaf0630889f4f47ced6a2e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 30 Aug 2022 16:52:05 -0600 Subject: [PATCH 192/262] Bump google-api-services-sheets in /sheets/snippets (#338) Bumps google-api-services-sheets from v4-rev20220411-1.32.1 to v4-rev20220620-2.0.0. --- updated-dependencies: - dependency-name: com.google.apis:google-api-services-sheets dependency-type: direct:production ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- sheets/snippets/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sheets/snippets/build.gradle b/sheets/snippets/build.gradle index e26101e4..e086836c 100644 --- a/sheets/snippets/build.gradle +++ b/sheets/snippets/build.gradle @@ -7,7 +7,7 @@ repositories { dependencies { implementation 'com.google.auth:google-auth-library-oauth2-http:1.10.0' implementation 'com.google.apis:google-api-services-drive:v3-rev20220508-1.32.1' - implementation 'com.google.apis:google-api-services-sheets:v4-rev20220411-1.32.1' + implementation 'com.google.apis:google-api-services-sheets:v4-rev20220620-2.0.0' testImplementation 'junit:junit:4.13.2' } From 0ee109b81c133d71ab5e2484946a31adf6070982 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 30 Aug 2022 16:52:08 -0600 Subject: [PATCH 193/262] Bump google-api-services-sheets in /slides/snippets (#336) Bumps google-api-services-sheets from v4-rev20210629-1.32.1 to v4-rev20220620-2.0.0. --- updated-dependencies: - dependency-name: com.google.apis:google-api-services-sheets dependency-type: direct:production ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- slides/snippets/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/slides/snippets/build.gradle b/slides/snippets/build.gradle index ea3403b8..73a6c2e1 100644 --- a/slides/snippets/build.gradle +++ b/slides/snippets/build.gradle @@ -7,7 +7,7 @@ repositories { dependencies { implementation 'com.google.auth:google-auth-library-oauth2-http:1.10.0' implementation 'com.google.apis:google-api-services-drive:v3-rev20211107-1.32.1' - implementation 'com.google.apis:google-api-services-sheets:v4-rev20210629-1.32.1' + implementation 'com.google.apis:google-api-services-sheets:v4-rev20220620-2.0.0' implementation 'com.google.apis:google-api-services-slides:v1-rev20210820-1.32.1' testImplementation 'junit:junit:4.13.2' From 401ec9f4da5aa3c02f6a23cc91f5095cbf905c41 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 30 Aug 2022 16:52:10 -0600 Subject: [PATCH 194/262] Bump google-api-client in /vault/vault-hold-migration-api (#323) Bumps [google-api-client](https://github.com/googleapis/google-api-java-client) from 1.33.0 to 2.0.0. - [Release notes](https://github.com/googleapis/google-api-java-client/releases) - [Changelog](https://github.com/googleapis/google-api-java-client/blob/main/CHANGELOG.md) - [Commits](https://github.com/googleapis/google-api-java-client/compare/v1.33.0...v2.0.0) --- updated-dependencies: - dependency-name: com.google.api-client:google-api-client dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- vault/vault-hold-migration-api/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vault/vault-hold-migration-api/build.gradle b/vault/vault-hold-migration-api/build.gradle index 82e95410..1eaa2531 100644 --- a/vault/vault-hold-migration-api/build.gradle +++ b/vault/vault-hold-migration-api/build.gradle @@ -12,7 +12,7 @@ repositories { } dependencies { - implementation 'com.google.api-client:google-api-client:1.33.0' + implementation 'com.google.api-client:google-api-client:2.0.0' implementation 'com.google.oauth-client:google-oauth-client-jetty:1.34.1' implementation 'com.google.apis:google-api-services-vault:v1-rev20211101-1.32.1' implementation group: 'org.apache.commons', name: 'commons-csv', version: '1.9.0' From a7aee284fe5a58c2b53590868ad87f276faddcc3 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 30 Aug 2022 16:52:12 -0600 Subject: [PATCH 195/262] Bump google-api-client from 1.23.0 to 2.0.0 in /drive/snippets/drive_v3 (#322) Bumps [google-api-client](https://github.com/googleapis/google-api-java-client) from 1.23.0 to 2.0.0. - [Release notes](https://github.com/googleapis/google-api-java-client/releases) - [Changelog](https://github.com/googleapis/google-api-java-client/blob/main/CHANGELOG.md) - [Commits](https://github.com/googleapis/google-api-java-client/compare/1.23.0...v2.0.0) --- updated-dependencies: - dependency-name: com.google.api-client:google-api-client dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- drive/snippets/drive_v3/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drive/snippets/drive_v3/build.gradle b/drive/snippets/drive_v3/build.gradle index ade01244..f1f21c4b 100644 --- a/drive/snippets/drive_v3/build.gradle +++ b/drive/snippets/drive_v3/build.gradle @@ -5,7 +5,7 @@ repositories { } dependencies { implementation 'com.google.apis:google-api-services-drive:v3-rev20211107-1.32.1' - implementation 'com.google.api-client:google-api-client:1.23.0' + implementation 'com.google.api-client:google-api-client:2.0.0' implementation 'com.google.auth:google-auth-library-oauth2-http:1.10.0' implementation 'com.google.code.gson:gson:2.4' testImplementation 'junit:junit:4.13.2' From a22a92de96285b393afc4006d9f520870c1a869e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 30 Aug 2022 16:52:15 -0600 Subject: [PATCH 196/262] Bump google-api-client in /adminSDK/groups-settings/quickstart (#297) Bumps [google-api-client](https://github.com/googleapis/google-api-java-client) from 1.33.0 to 2.0.0. - [Release notes](https://github.com/googleapis/google-api-java-client/releases) - [Changelog](https://github.com/googleapis/google-api-java-client/blob/main/CHANGELOG.md) - [Commits](https://github.com/googleapis/google-api-java-client/compare/v1.33.0...v2.0.0) --- updated-dependencies: - dependency-name: com.google.api-client:google-api-client dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- adminSDK/groups-settings/quickstart/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/adminSDK/groups-settings/quickstart/build.gradle b/adminSDK/groups-settings/quickstart/build.gradle index c03cdd97..8026c439 100644 --- a/adminSDK/groups-settings/quickstart/build.gradle +++ b/adminSDK/groups-settings/quickstart/build.gradle @@ -11,7 +11,7 @@ repositories { } dependencies { - implementation 'com.google.api-client:google-api-client:1.33.0' + implementation 'com.google.api-client:google-api-client:2.0.0' implementation 'com.google.oauth-client:google-oauth-client-jetty:1.34.1' implementation 'com.google.apis:google-api-services-groupssettings:v1-rev20210624-1.32.1' } From afe6dbee7829c1866267f9a2ff6d4188ba32dcb3 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 30 Aug 2022 16:52:17 -0600 Subject: [PATCH 197/262] Bump google-api-services-script in /appsScript/quickstart (#303) Bumps google-api-services-script from v1-rev20210703-1.32.1 to v1-rev20220323-2.0.0. --- updated-dependencies: - dependency-name: com.google.apis:google-api-services-script dependency-type: direct:production ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- appsScript/quickstart/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/appsScript/quickstart/build.gradle b/appsScript/quickstart/build.gradle index f26ede54..7ce6076f 100644 --- a/appsScript/quickstart/build.gradle +++ b/appsScript/quickstart/build.gradle @@ -13,5 +13,5 @@ repositories { dependencies { implementation 'com.google.api-client:google-api-client:2.0.0' implementation 'com.google.oauth-client:google-oauth-client-jetty:1.34.1' - implementation 'com.google.apis:google-api-services-script:v1-rev20210703-1.32.1' + implementation 'com.google.apis:google-api-services-script:v1-rev20220323-2.0.0' } From 20cbee839086ca40576af3f06d0093df7e73d287 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 30 Aug 2022 16:52:20 -0600 Subject: [PATCH 198/262] Bump google-api-services-slides in /slides/quickstart (#304) Bumps google-api-services-slides from v1-rev20210820-1.32.1 to v1-rev20220722-2.0.0. --- updated-dependencies: - dependency-name: com.google.apis:google-api-services-slides dependency-type: direct:production ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- slides/quickstart/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/slides/quickstart/build.gradle b/slides/quickstart/build.gradle index 05916c6f..8350296e 100644 --- a/slides/quickstart/build.gradle +++ b/slides/quickstart/build.gradle @@ -13,5 +13,5 @@ repositories { dependencies { implementation 'com.google.api-client:google-api-client:2.0.0' implementation 'com.google.oauth-client:google-oauth-client-jetty:1.34.1' - implementation 'com.google.apis:google-api-services-slides:v1-rev20210820-1.32.1' + implementation 'com.google.apis:google-api-services-slides:v1-rev20220722-2.0.0' } From 8b3665d51638bd00d34b5f62a07d9004afccce8e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 30 Aug 2022 16:52:22 -0600 Subject: [PATCH 199/262] Bump google-api-services-sheets in /sheets/quickstart (#284) Bumps google-api-services-sheets from v4-rev20210629-1.32.1 to v4-rev20220620-2.0.0. --- updated-dependencies: - dependency-name: com.google.apis:google-api-services-sheets dependency-type: direct:production ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- sheets/quickstart/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sheets/quickstart/build.gradle b/sheets/quickstart/build.gradle index 4dff318c..c12db6f3 100644 --- a/sheets/quickstart/build.gradle +++ b/sheets/quickstart/build.gradle @@ -13,5 +13,5 @@ repositories { dependencies { implementation 'com.google.api-client:google-api-client:2.0.0' implementation 'com.google.oauth-client:google-oauth-client-jetty:1.34.1' - implementation 'com.google.apis:google-api-services-sheets:v4-rev20210629-1.32.1' + implementation 'com.google.apis:google-api-services-sheets:v4-rev20220620-2.0.0' } From 7b4903e3d1c0591e9992906e2e0e1d08f8a87d1f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 30 Aug 2022 16:52:24 -0600 Subject: [PATCH 200/262] Bump google-api-services-classroom in /classroom/snippets (#298) Bumps google-api-services-classroom from v1-rev20220323-1.32.1 to v1-rev20220323-2.0.0. --- updated-dependencies: - dependency-name: com.google.apis:google-api-services-classroom dependency-type: direct:production ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- classroom/snippets/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/classroom/snippets/build.gradle b/classroom/snippets/build.gradle index f1deeb31..b0776149 100644 --- a/classroom/snippets/build.gradle +++ b/classroom/snippets/build.gradle @@ -8,7 +8,7 @@ repositories { dependencies { implementation 'com.google.api-client:google-api-client:2.0.0' implementation 'com.google.auth:google-auth-library-oauth2-http:1.10.0' - implementation 'com.google.apis:google-api-services-classroom:v1-rev20220323-1.32.1' + implementation 'com.google.apis:google-api-services-classroom:v1-rev20220323-2.0.0' testImplementation 'junit:junit:4.13.2' } From 64e7c92db342bdc288ea03ef762743a5dd147822 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 30 Aug 2022 16:52:26 -0600 Subject: [PATCH 201/262] Bump google-api-services-calendar in /calendar/quickstart (#292) Bumps google-api-services-calendar from v3-rev20211026-1.32.1 to v3-rev20220715-2.0.0. --- updated-dependencies: - dependency-name: com.google.apis:google-api-services-calendar dependency-type: direct:production ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- calendar/quickstart/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/calendar/quickstart/build.gradle b/calendar/quickstart/build.gradle index 923ec144..6252ad03 100644 --- a/calendar/quickstart/build.gradle +++ b/calendar/quickstart/build.gradle @@ -13,5 +13,5 @@ repositories { dependencies { implementation 'com.google.api-client:google-api-client:2.0.0' implementation 'com.google.oauth-client:google-oauth-client-jetty:1.34.1' - implementation 'com.google.apis:google-api-services-calendar:v3-rev20211026-1.32.1' + implementation 'com.google.apis:google-api-services-calendar:v3-rev20220715-2.0.0' } From 4405ee52951ab758386db772c3efeab6b3681557 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 30 Aug 2022 16:52:29 -0600 Subject: [PATCH 202/262] Bump google-api-services-people in /people/quickstart (#310) Bumps google-api-services-people from v1-rev20210903-1.32.1 to v1-rev20220531-2.0.0. --- updated-dependencies: - dependency-name: com.google.apis:google-api-services-people dependency-type: direct:production ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- people/quickstart/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/people/quickstart/build.gradle b/people/quickstart/build.gradle index 540e613c..8009371c 100644 --- a/people/quickstart/build.gradle +++ b/people/quickstart/build.gradle @@ -14,5 +14,5 @@ repositories { dependencies { implementation 'com.google.api-client:google-api-client:2.0.0' implementation 'com.google.oauth-client:google-oauth-client-jetty:1.34.1' - implementation 'com.google.apis:google-api-services-people:v1-rev20210903-1.32.1' + implementation 'com.google.apis:google-api-services-people:v1-rev20220531-2.0.0' } From da2bb7af850e4d4a4e6021400f25f0527631f221 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 30 Aug 2022 16:52:30 -0600 Subject: [PATCH 203/262] Bump google-api-services-docs in /docs/outputJSON (#309) Bumps google-api-services-docs from v1-rev20210707-1.32.1 to v1-rev20220609-2.0.0. --- updated-dependencies: - dependency-name: com.google.apis:google-api-services-docs dependency-type: direct:production ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- docs/outputJSON/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/outputJSON/build.gradle b/docs/outputJSON/build.gradle index 32220cf2..0e76e226 100644 --- a/docs/outputJSON/build.gradle +++ b/docs/outputJSON/build.gradle @@ -13,6 +13,6 @@ repositories { dependencies { implementation 'com.google.api-client:google-api-client:2.0.0' implementation 'com.google.oauth-client:google-oauth-client-jetty:1.34.1' - implementation 'com.google.apis:google-api-services-docs:v1-rev20210707-1.32.1' + implementation 'com.google.apis:google-api-services-docs:v1-rev20220609-2.0.0' implementation group: 'com.google.code.gson', name: 'gson', version: '2.9.1' } From 3b3695cc679418fb8bc4f6ca360fe9f64bb7bf7f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 30 Aug 2022 16:52:33 -0600 Subject: [PATCH 204/262] Bump google-api-services-slides in /slides/snippets (#325) Bumps google-api-services-slides from v1-rev20210820-1.32.1 to v1-rev20220722-2.0.0. --- updated-dependencies: - dependency-name: com.google.apis:google-api-services-slides dependency-type: direct:production ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- slides/snippets/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/slides/snippets/build.gradle b/slides/snippets/build.gradle index 73a6c2e1..415434c8 100644 --- a/slides/snippets/build.gradle +++ b/slides/snippets/build.gradle @@ -8,7 +8,7 @@ dependencies { implementation 'com.google.auth:google-auth-library-oauth2-http:1.10.0' implementation 'com.google.apis:google-api-services-drive:v3-rev20211107-1.32.1' implementation 'com.google.apis:google-api-services-sheets:v4-rev20220620-2.0.0' - implementation 'com.google.apis:google-api-services-slides:v1-rev20210820-1.32.1' + implementation 'com.google.apis:google-api-services-slides:v1-rev20220722-2.0.0' testImplementation 'junit:junit:4.13.2' implementation fileTree(dir: 'lib', include: ['*.jar']) From c2c9c2de58423fb11f2990cf76437f33b41805e9 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 30 Aug 2022 16:52:35 -0600 Subject: [PATCH 205/262] Bump google-api-services-gmail in /gmail/quickstart (#316) Bumps google-api-services-gmail from v1-rev20211108-1.32.1 to v1-rev20220404-2.0.0. --- updated-dependencies: - dependency-name: com.google.apis:google-api-services-gmail dependency-type: direct:production ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- gmail/quickstart/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gmail/quickstart/build.gradle b/gmail/quickstart/build.gradle index 9de1d325..ca113827 100644 --- a/gmail/quickstart/build.gradle +++ b/gmail/quickstart/build.gradle @@ -13,5 +13,5 @@ repositories { dependencies { implementation 'com.google.api-client:google-api-client:2.0.0' implementation 'com.google.oauth-client:google-oauth-client-jetty:1.34.1' - implementation 'com.google.apis:google-api-services-gmail:v1-rev20211108-1.32.1' + implementation 'com.google.apis:google-api-services-gmail:v1-rev20220404-2.0.0' } From 0594e7fc829b3b9b4f9257ce3ec6beeef44696a8 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 30 Aug 2022 16:52:37 -0600 Subject: [PATCH 206/262] Bump google-api-services-docs in /docs/quickstart (#306) Bumps google-api-services-docs from v1-rev20210707-1.32.1 to v1-rev20220609-2.0.0. --- updated-dependencies: - dependency-name: com.google.apis:google-api-services-docs dependency-type: direct:production ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- docs/quickstart/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/quickstart/build.gradle b/docs/quickstart/build.gradle index 1b5fed39..9f6c9fd7 100644 --- a/docs/quickstart/build.gradle +++ b/docs/quickstart/build.gradle @@ -13,5 +13,5 @@ repositories { dependencies { implementation 'com.google.api-client:google-api-client:2.0.0' implementation 'com.google.oauth-client:google-oauth-client-jetty:1.34.1' - implementation 'com.google.apis:google-api-services-docs:v1-rev20210707-1.32.1' + implementation 'com.google.apis:google-api-services-docs:v1-rev20220609-2.0.0' } From bd1b219247a1a702f562fcbe156b1297eb908015 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 30 Aug 2022 16:52:39 -0600 Subject: [PATCH 207/262] Bump google-api-services-gmail in /gmail/snippets (#313) Bumps google-api-services-gmail from v1-rev20220404-1.32.1 to v1-rev20220404-2.0.0. --- updated-dependencies: - dependency-name: com.google.apis:google-api-services-gmail dependency-type: direct:production ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- gmail/snippets/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gmail/snippets/build.gradle b/gmail/snippets/build.gradle index 7df49f06..88a66631 100644 --- a/gmail/snippets/build.gradle +++ b/gmail/snippets/build.gradle @@ -6,7 +6,7 @@ repositories { dependencies { implementation 'com.google.auth:google-auth-library-oauth2-http:1.10.0' - implementation 'com.google.apis:google-api-services-gmail:v1-rev20220404-1.32.1' + implementation 'com.google.apis:google-api-services-gmail:v1-rev20220404-2.0.0' implementation 'javax.mail:mail:1.4.7' implementation 'org.apache.commons:commons-csv:1.9.0' testImplementation 'junit:junit:4.13.2' From 32e412b5625831b6a477107eeb27704784a00792 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 30 Aug 2022 16:52:41 -0600 Subject: [PATCH 208/262] Bump google-api-services-classroom in /classroom/quickstart (#293) Bumps google-api-services-classroom from v1-rev20211029-1.32.1 to v1-rev20220323-2.0.0. --- updated-dependencies: - dependency-name: com.google.apis:google-api-services-classroom dependency-type: direct:production ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- classroom/quickstart/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/classroom/quickstart/build.gradle b/classroom/quickstart/build.gradle index 7773fab2..d69815f0 100644 --- a/classroom/quickstart/build.gradle +++ b/classroom/quickstart/build.gradle @@ -13,5 +13,5 @@ repositories { dependencies { implementation 'com.google.api-client:google-api-client:2.0.0' implementation 'com.google.oauth-client:google-oauth-client-jetty:1.34.1' - implementation 'com.google.apis:google-api-services-classroom:v1-rev20211029-1.32.1' + implementation 'com.google.apis:google-api-services-classroom:v1-rev20220323-2.0.0' } From a9d9ce28f09fb27ae2e153b9a242ead3efa7701d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 30 Aug 2022 16:52:43 -0600 Subject: [PATCH 209/262] Bump google-api-services-calendar in /calendar/sync (#283) Bumps google-api-services-calendar from v3-rev20211026-1.32.1 to v3-rev20220715-2.0.0. --- updated-dependencies: - dependency-name: com.google.apis:google-api-services-calendar dependency-type: direct:production ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- calendar/sync/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/calendar/sync/pom.xml b/calendar/sync/pom.xml index 01f4b039..af98470c 100644 --- a/calendar/sync/pom.xml +++ b/calendar/sync/pom.xml @@ -72,7 +72,7 @@ com.google.apis google-api-services-calendar - v3-rev20211026-1.32.1 + v3-rev20220715-2.0.0 com.google.api-client From e9a78eaf65e17a30b3227057ca59a33250448d5a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 30 Aug 2022 16:52:45 -0600 Subject: [PATCH 210/262] chore(deps): bump google-api-services-alertcenter (#345) Bumps google-api-services-alertcenter from v1beta1-rev20211012-1.32.1 to v1beta1-rev20220718-2.0.0. --- updated-dependencies: - dependency-name: com.google.apis:google-api-services-alertcenter dependency-type: direct:production ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- adminSDK/alertcenter/quickstart/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/adminSDK/alertcenter/quickstart/build.gradle b/adminSDK/alertcenter/quickstart/build.gradle index c5be324b..b448253b 100644 --- a/adminSDK/alertcenter/quickstart/build.gradle +++ b/adminSDK/alertcenter/quickstart/build.gradle @@ -14,5 +14,5 @@ repositories { dependencies { implementation 'com.google.api-client:google-api-client:2.0.0' implementation 'com.google.auth:google-auth-library-oauth2-http:1.10.0' - implementation 'com.google.apis:google-api-services-alertcenter:v1beta1-rev20211012-1.32.1' + implementation 'com.google.apis:google-api-services-alertcenter:v1beta1-rev20220718-2.0.0' } \ No newline at end of file From 12afbc230c73f03d5f72881aa03e7ceaf3b11121 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 30 Aug 2022 16:52:47 -0600 Subject: [PATCH 211/262] chore(deps): bump google-api-services-tasks in /tasks/quickstart (#349) Bumps google-api-services-tasks from v1-rev20210709-1.32.1 to v1-rev20210709-2.0.0. --- updated-dependencies: - dependency-name: com.google.apis:google-api-services-tasks dependency-type: direct:production ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- tasks/quickstart/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tasks/quickstart/build.gradle b/tasks/quickstart/build.gradle index c8f052b1..2ae5b7d2 100644 --- a/tasks/quickstart/build.gradle +++ b/tasks/quickstart/build.gradle @@ -13,5 +13,5 @@ repositories { dependencies { implementation 'com.google.api-client:google-api-client:2.0.0' implementation 'com.google.oauth-client:google-oauth-client-jetty:1.34.1' - implementation 'com.google.apis:google-api-services-tasks:v1-rev20210709-1.32.1' + implementation 'com.google.apis:google-api-services-tasks:v1-rev20210709-2.0.0' } \ No newline at end of file From 0fa7379cdd8cfb4f49f485f80fa5a71f98cd6c81 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 30 Aug 2022 16:52:49 -0600 Subject: [PATCH 212/262] chore(deps): bump google-api-services-drive in /sheets/snippets (#347) Bumps google-api-services-drive from v3-rev20220508-1.32.1 to v3-rev20220815-2.0.0. --- updated-dependencies: - dependency-name: com.google.apis:google-api-services-drive dependency-type: direct:production ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- sheets/snippets/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sheets/snippets/build.gradle b/sheets/snippets/build.gradle index e086836c..8763dd63 100644 --- a/sheets/snippets/build.gradle +++ b/sheets/snippets/build.gradle @@ -6,7 +6,7 @@ repositories { dependencies { implementation 'com.google.auth:google-auth-library-oauth2-http:1.10.0' - implementation 'com.google.apis:google-api-services-drive:v3-rev20220508-1.32.1' + implementation 'com.google.apis:google-api-services-drive:v3-rev20220815-2.0.0' implementation 'com.google.apis:google-api-services-sheets:v4-rev20220620-2.0.0' testImplementation 'junit:junit:4.13.2' } From 4e7a24324de42d3ac88bfefe74a7cb3cfac56bec Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 30 Aug 2022 16:52:52 -0600 Subject: [PATCH 213/262] Bump google-api-services-vault in /vault/vault-hold-migration-api (#335) Bumps google-api-services-vault from v1-rev20211101-1.32.1 to v1-rev20220423-2.0.0. --- updated-dependencies: - dependency-name: com.google.apis:google-api-services-vault dependency-type: direct:production ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- vault/vault-hold-migration-api/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vault/vault-hold-migration-api/build.gradle b/vault/vault-hold-migration-api/build.gradle index 1eaa2531..8b389d2a 100644 --- a/vault/vault-hold-migration-api/build.gradle +++ b/vault/vault-hold-migration-api/build.gradle @@ -14,7 +14,7 @@ repositories { dependencies { implementation 'com.google.api-client:google-api-client:2.0.0' implementation 'com.google.oauth-client:google-oauth-client-jetty:1.34.1' - implementation 'com.google.apis:google-api-services-vault:v1-rev20211101-1.32.1' + implementation 'com.google.apis:google-api-services-vault:v1-rev20220423-2.0.0' implementation group: 'org.apache.commons', name: 'commons-csv', version: '1.9.0' implementation 'com.github.rholder:guava-retrying:2.0.0' implementation 'com.google.apis:google-api-services-admin-directory:directory_v1-rev118-1.25.0' From 9f841ac51ff95d2feef41a7d446ea5b6b0f2b680 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 30 Aug 2022 16:52:54 -0600 Subject: [PATCH 214/262] Bump google-api-services-drive in /drive/snippets/drive_v2 (#331) Bumps google-api-services-drive from v2-rev20211205-1.32.1 to v3-rev20220815-2.0.0. --- updated-dependencies: - dependency-name: com.google.apis:google-api-services-drive dependency-type: direct:production ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- drive/snippets/drive_v2/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drive/snippets/drive_v2/build.gradle b/drive/snippets/drive_v2/build.gradle index 1c46fca4..96be2075 100644 --- a/drive/snippets/drive_v2/build.gradle +++ b/drive/snippets/drive_v2/build.gradle @@ -5,7 +5,7 @@ repositories { } dependencies { - implementation 'com.google.apis:google-api-services-drive:v2-rev20211205-1.32.1' + implementation 'com.google.apis:google-api-services-drive:v3-rev20220815-2.0.0' implementation 'com.google.api-client:google-api-client:1.23.0' implementation 'com.google.auth:google-auth-library-oauth2-http:1.10.0' implementation 'com.google.oauth-client:google-oauth-client-jetty:1.32.1' From a8969da96266b5fa7dae376a9af1ba1fba340697 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 30 Aug 2022 16:52:56 -0600 Subject: [PATCH 215/262] Bump google-api-services-drive in /drive/snippets/drive_v3 (#315) Bumps google-api-services-drive from v3-rev20211107-1.32.1 to v3-rev20220815-2.0.0. --- updated-dependencies: - dependency-name: com.google.apis:google-api-services-drive dependency-type: direct:production ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- drive/snippets/drive_v3/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drive/snippets/drive_v3/build.gradle b/drive/snippets/drive_v3/build.gradle index f1f21c4b..a94160c8 100644 --- a/drive/snippets/drive_v3/build.gradle +++ b/drive/snippets/drive_v3/build.gradle @@ -4,7 +4,7 @@ repositories { mavenCentral() } dependencies { - implementation 'com.google.apis:google-api-services-drive:v3-rev20211107-1.32.1' + implementation 'com.google.apis:google-api-services-drive:v3-rev20220815-2.0.0' implementation 'com.google.api-client:google-api-client:2.0.0' implementation 'com.google.auth:google-auth-library-oauth2-http:1.10.0' implementation 'com.google.code.gson:gson:2.4' From 21008d82696f073ccc122a1c2976ede6fd10d04c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 30 Aug 2022 16:52:58 -0600 Subject: [PATCH 216/262] Bump google-api-services-driveactivity in /drive/activity-v2/quickstart (#319) Bumps google-api-services-driveactivity from v2-rev20210319-1.32.1 to v2-rev20210319-2.0.0. --- updated-dependencies: - dependency-name: com.google.apis:google-api-services-driveactivity dependency-type: direct:production ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- drive/activity-v2/quickstart/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drive/activity-v2/quickstart/build.gradle b/drive/activity-v2/quickstart/build.gradle index 8663a975..0f90a6c1 100644 --- a/drive/activity-v2/quickstart/build.gradle +++ b/drive/activity-v2/quickstart/build.gradle @@ -13,5 +13,5 @@ repositories { dependencies { implementation 'com.google.api-client:google-api-client:2.0.0' implementation 'com.google.oauth-client:google-oauth-client-jetty:1.34.1' - implementation 'com.google.apis:google-api-services-driveactivity:v2-rev20210319-1.32.1' + implementation 'com.google.apis:google-api-services-driveactivity:v2-rev20210319-2.0.0' } From 534ef4f9d9229577614cdcdf1208561b2f656e46 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 30 Aug 2022 16:53:00 -0600 Subject: [PATCH 217/262] Bump google-api-services-admin-reports in /adminSDK/reports/quickstart (#289) Bumps google-api-services-admin-reports from reports_v1-rev89-1.25.0 to reports_v1-rev20211207-2.0.0. --- updated-dependencies: - dependency-name: com.google.apis:google-api-services-admin-reports dependency-type: direct:production ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- adminSDK/reports/quickstart/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/adminSDK/reports/quickstart/build.gradle b/adminSDK/reports/quickstart/build.gradle index 450d681a..9f9aff5d 100644 --- a/adminSDK/reports/quickstart/build.gradle +++ b/adminSDK/reports/quickstart/build.gradle @@ -13,5 +13,5 @@ repositories { dependencies { implementation 'com.google.api-client:google-api-client:2.0.0' implementation 'com.google.oauth-client:google-oauth-client-jetty:1.34.1' - implementation 'com.google.apis:google-api-services-admin-reports:reports_v1-rev89-1.25.0' + implementation 'com.google.apis:google-api-services-admin-reports:reports_v1-rev20211207-2.0.0' } From e8656cfd86bd43b75ca4d88b6cad2e097a8cddde Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 30 Aug 2022 16:53:03 -0600 Subject: [PATCH 218/262] Bump google-api-services-reseller in /adminSDK/reseller/quickstart (#291) Bumps google-api-services-reseller from v1-rev20211106-1.32.1 to v1sandbox-rev60-1.22.0. --- updated-dependencies: - dependency-name: com.google.apis:google-api-services-reseller dependency-type: direct:production ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- adminSDK/reseller/quickstart/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/adminSDK/reseller/quickstart/build.gradle b/adminSDK/reseller/quickstart/build.gradle index 20e39b10..3e382f87 100644 --- a/adminSDK/reseller/quickstart/build.gradle +++ b/adminSDK/reseller/quickstart/build.gradle @@ -13,5 +13,5 @@ repositories { dependencies { implementation 'com.google.api-client:google-api-client:2.0.0' implementation 'com.google.oauth-client:google-oauth-client-jetty:1.34.1' - implementation 'com.google.apis:google-api-services-reseller:v1-rev20211106-1.32.1' + implementation 'com.google.apis:google-api-services-reseller:v1sandbox-rev60-1.22.0' } From 1a33fe3b9a25a7ada9437d73a2d041ff44a966ac Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 30 Aug 2022 16:53:05 -0600 Subject: [PATCH 219/262] Bump google-api-services-groupssettings (#286) Bumps google-api-services-groupssettings from v1-rev20210624-1.32.1 to v1-rev20210624-2.0.0. --- updated-dependencies: - dependency-name: com.google.apis:google-api-services-groupssettings dependency-type: direct:production ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- adminSDK/groups-settings/quickstart/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/adminSDK/groups-settings/quickstart/build.gradle b/adminSDK/groups-settings/quickstart/build.gradle index 8026c439..26e5218e 100644 --- a/adminSDK/groups-settings/quickstart/build.gradle +++ b/adminSDK/groups-settings/quickstart/build.gradle @@ -13,5 +13,5 @@ repositories { dependencies { implementation 'com.google.api-client:google-api-client:2.0.0' implementation 'com.google.oauth-client:google-oauth-client-jetty:1.34.1' - implementation 'com.google.apis:google-api-services-groupssettings:v1-rev20210624-1.32.1' + implementation 'com.google.apis:google-api-services-groupssettings:v1-rev20210624-2.0.0' } From 4c511910090a8484165fb08883604eb8353794a5 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 30 Aug 2022 16:53:07 -0600 Subject: [PATCH 220/262] Bump google-api-services-admin-directory (#318) Bumps google-api-services-admin-directory from directory_v1-rev118-1.25.0 to directory_v1-rev20220816-2.0.0. --- updated-dependencies: - dependency-name: com.google.apis:google-api-services-admin-directory dependency-type: direct:production ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- vault/vault-hold-migration-api/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vault/vault-hold-migration-api/build.gradle b/vault/vault-hold-migration-api/build.gradle index 8b389d2a..964a2c63 100644 --- a/vault/vault-hold-migration-api/build.gradle +++ b/vault/vault-hold-migration-api/build.gradle @@ -17,6 +17,6 @@ dependencies { implementation 'com.google.apis:google-api-services-vault:v1-rev20220423-2.0.0' implementation group: 'org.apache.commons', name: 'commons-csv', version: '1.9.0' implementation 'com.github.rholder:guava-retrying:2.0.0' - implementation 'com.google.apis:google-api-services-admin-directory:directory_v1-rev118-1.25.0' + implementation 'com.google.apis:google-api-services-admin-directory:directory_v1-rev20220816-2.0.0' implementation group: 'commons-cli', name: 'commons-cli', version: '1.5.0' } \ No newline at end of file From 3e25cfd9bcc9dd0c6404cf1a494a681a466da987 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 30 Aug 2022 16:53:09 -0600 Subject: [PATCH 221/262] Bump google-api-services-admin-directory (#287) Bumps google-api-services-admin-directory from directory_v1-rev118-1.25.0 to directory_v1-rev20220816-2.0.0. --- updated-dependencies: - dependency-name: com.google.apis:google-api-services-admin-directory dependency-type: direct:production ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- adminSDK/directory/quickstart/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/adminSDK/directory/quickstart/build.gradle b/adminSDK/directory/quickstart/build.gradle index c2dfbf80..5cc56d2a 100644 --- a/adminSDK/directory/quickstart/build.gradle +++ b/adminSDK/directory/quickstart/build.gradle @@ -13,5 +13,5 @@ repositories { dependencies { implementation 'com.google.api-client:google-api-client:2.0.0' implementation 'com.google.oauth-client:google-oauth-client-jetty:1.34.1' - implementation 'com.google.apis:google-api-services-admin-directory:directory_v1-rev118-1.25.0' + implementation 'com.google.apis:google-api-services-admin-directory:directory_v1-rev20220816-2.0.0' } From d4567a58806fbe35c5405dc2fb3d3e090a30e779 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 30 Aug 2022 16:55:42 -0600 Subject: [PATCH 222/262] Bump gson from 2.4 to 2.9.1 in /drive/snippets/drive_v3 (#333) Bumps [gson](https://github.com/google/gson) from 2.4 to 2.9.1. - [Release notes](https://github.com/google/gson/releases) - [Changelog](https://github.com/google/gson/blob/master/CHANGELOG.md) - [Commits](https://github.com/google/gson/compare/gson-2.4...gson-parent-2.9.1) --- updated-dependencies: - dependency-name: com.google.code.gson:gson dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- drive/snippets/drive_v3/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drive/snippets/drive_v3/build.gradle b/drive/snippets/drive_v3/build.gradle index a94160c8..b1196d59 100644 --- a/drive/snippets/drive_v3/build.gradle +++ b/drive/snippets/drive_v3/build.gradle @@ -7,7 +7,7 @@ dependencies { implementation 'com.google.apis:google-api-services-drive:v3-rev20220815-2.0.0' implementation 'com.google.api-client:google-api-client:2.0.0' implementation 'com.google.auth:google-auth-library-oauth2-http:1.10.0' - implementation 'com.google.code.gson:gson:2.4' + implementation 'com.google.code.gson:gson:2.9.1' testImplementation 'junit:junit:4.13.2' } From 3315352dd6c0f413453a8da647f6b4c2220973ca Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 30 Aug 2022 16:55:44 -0600 Subject: [PATCH 223/262] Bump gson from 2.4 to 2.9.1 in /drive/snippets/drive_v2 (#330) Bumps [gson](https://github.com/google/gson) from 2.4 to 2.9.1. - [Release notes](https://github.com/google/gson/releases) - [Changelog](https://github.com/google/gson/blob/master/CHANGELOG.md) - [Commits](https://github.com/google/gson/compare/gson-2.4...gson-parent-2.9.1) --- updated-dependencies: - dependency-name: com.google.code.gson:gson dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- drive/snippets/drive_v2/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drive/snippets/drive_v2/build.gradle b/drive/snippets/drive_v2/build.gradle index 96be2075..c3a4a34c 100644 --- a/drive/snippets/drive_v2/build.gradle +++ b/drive/snippets/drive_v2/build.gradle @@ -9,7 +9,7 @@ dependencies { implementation 'com.google.api-client:google-api-client:1.23.0' implementation 'com.google.auth:google-auth-library-oauth2-http:1.10.0' implementation 'com.google.oauth-client:google-oauth-client-jetty:1.32.1' - implementation 'com.google.code.gson:gson:2.4' + implementation 'com.google.code.gson:gson:2.9.1' testImplementation 'junit:junit:4.13.2' } From 4280aec2a0310e3860879390d0d33e91486f865a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 30 Aug 2022 16:55:48 -0600 Subject: [PATCH 224/262] Bump google-api-services-drive in /slides/snippets (#299) Bumps google-api-services-drive from v3-rev20211107-1.32.1 to v3-rev20220815-2.0.0. --- updated-dependencies: - dependency-name: com.google.apis:google-api-services-drive dependency-type: direct:production ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- slides/snippets/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/slides/snippets/build.gradle b/slides/snippets/build.gradle index 415434c8..48965f8c 100644 --- a/slides/snippets/build.gradle +++ b/slides/snippets/build.gradle @@ -6,7 +6,7 @@ repositories { dependencies { implementation 'com.google.auth:google-auth-library-oauth2-http:1.10.0' - implementation 'com.google.apis:google-api-services-drive:v3-rev20211107-1.32.1' + implementation 'com.google.apis:google-api-services-drive:v3-rev20220815-2.0.0' implementation 'com.google.apis:google-api-services-sheets:v4-rev20220620-2.0.0' implementation 'com.google.apis:google-api-services-slides:v1-rev20220722-2.0.0' testImplementation 'junit:junit:4.13.2' From fb2ae2384e26a358d4ebd8fd8776d3cf97c60c5d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 30 Aug 2022 16:56:11 -0600 Subject: [PATCH 225/262] Bump google-oauth-client-jetty in /drive/snippets/drive_v2 (#329) Bumps [google-oauth-client-jetty](https://github.com/googleapis/google-oauth-java-client) from 1.32.1 to 1.34.1. - [Release notes](https://github.com/googleapis/google-oauth-java-client/releases) - [Changelog](https://github.com/googleapis/google-oauth-java-client/blob/main/CHANGELOG.md) - [Commits](https://github.com/googleapis/google-oauth-java-client/compare/v1.32.1...v1.34.1) --- updated-dependencies: - dependency-name: com.google.oauth-client:google-oauth-client-jetty dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- drive/snippets/drive_v2/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drive/snippets/drive_v2/build.gradle b/drive/snippets/drive_v2/build.gradle index c3a4a34c..9be525c6 100644 --- a/drive/snippets/drive_v2/build.gradle +++ b/drive/snippets/drive_v2/build.gradle @@ -8,7 +8,7 @@ dependencies { implementation 'com.google.apis:google-api-services-drive:v3-rev20220815-2.0.0' implementation 'com.google.api-client:google-api-client:1.23.0' implementation 'com.google.auth:google-auth-library-oauth2-http:1.10.0' - implementation 'com.google.oauth-client:google-oauth-client-jetty:1.32.1' + implementation 'com.google.oauth-client:google-oauth-client-jetty:1.34.1' implementation 'com.google.code.gson:gson:2.9.1' testImplementation 'junit:junit:4.13.2' } From ac95ef4c01f808b28a264c2125942ee3a0e4a9d0 Mon Sep 17 00:00:00 2001 From: Steve Bazyl Date: Tue, 30 Aug 2022 17:47:20 -0600 Subject: [PATCH 226/262] fix: Update package names for new version of client lib --- .../src/main/java/AdminSDKDirectoryQuickstart.java | 8 ++++---- .../src/main/java/AdminSDKReportsQuickstart.java | 8 ++++---- drive/snippets/drive_v2/build.gradle | 2 +- gmail/snippets/src/test/java/TestCreateSmimeInfo.java | 1 + .../com/google/vault/chatmigration/DirectoryService.java | 8 ++++---- .../java/com/google/vault/chatmigration/HoldsReport.java | 2 +- .../com/google/vault/chatmigration/MigrationHelper.java | 4 ++-- .../java/com/google/vault/chatmigration/QuickStart.java | 2 +- 8 files changed, 18 insertions(+), 17 deletions(-) diff --git a/adminSDK/directory/quickstart/src/main/java/AdminSDKDirectoryQuickstart.java b/adminSDK/directory/quickstart/src/main/java/AdminSDKDirectoryQuickstart.java index f0573b6f..a5466fc3 100644 --- a/adminSDK/directory/quickstart/src/main/java/AdminSDKDirectoryQuickstart.java +++ b/adminSDK/directory/quickstart/src/main/java/AdminSDKDirectoryQuickstart.java @@ -24,10 +24,10 @@ import com.google.api.client.json.JsonFactory; import com.google.api.client.json.gson.GsonFactory; import com.google.api.client.util.store.FileDataStoreFactory; -import com.google.api.services.admin.directory.Directory; -import com.google.api.services.admin.directory.DirectoryScopes; -import com.google.api.services.admin.directory.model.User; -import com.google.api.services.admin.directory.model.Users; +import com.google.api.services.directory.Directory; +import com.google.api.services.directory.DirectoryScopes; +import com.google.api.services.directory.model.User; +import com.google.api.services.directory.model.Users; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; diff --git a/adminSDK/reports/quickstart/src/main/java/AdminSDKReportsQuickstart.java b/adminSDK/reports/quickstart/src/main/java/AdminSDKReportsQuickstart.java index 3b5b6881..3b0d2d69 100644 --- a/adminSDK/reports/quickstart/src/main/java/AdminSDKReportsQuickstart.java +++ b/adminSDK/reports/quickstart/src/main/java/AdminSDKReportsQuickstart.java @@ -25,10 +25,10 @@ import com.google.api.client.json.JsonFactory; import com.google.api.client.json.gson.GsonFactory; import com.google.api.client.util.store.FileDataStoreFactory; -import com.google.api.services.admin.reports.Reports; -import com.google.api.services.admin.reports.ReportsScopes; -import com.google.api.services.admin.reports.model.Activities; -import com.google.api.services.admin.reports.model.Activity; +import com.google.api.services.reports.Reports; +import com.google.api.services.reports.ReportsScopes; +import com.google.api.services.reports.model.Activities; +import com.google.api.services.reports.model.Activity; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; diff --git a/drive/snippets/drive_v2/build.gradle b/drive/snippets/drive_v2/build.gradle index 9be525c6..e3bfcd2b 100644 --- a/drive/snippets/drive_v2/build.gradle +++ b/drive/snippets/drive_v2/build.gradle @@ -5,7 +5,7 @@ repositories { } dependencies { - implementation 'com.google.apis:google-api-services-drive:v3-rev20220815-2.0.0' + implementation 'com.google.apis:google-api-services-drive:v2-rev20220815-2.0.0' implementation 'com.google.api-client:google-api-client:1.23.0' implementation 'com.google.auth:google-auth-library-oauth2-http:1.10.0' implementation 'com.google.oauth-client:google-oauth-client-jetty:1.34.1' diff --git a/gmail/snippets/src/test/java/TestCreateSmimeInfo.java b/gmail/snippets/src/test/java/TestCreateSmimeInfo.java index 6e304814..dcf90890 100644 --- a/gmail/snippets/src/test/java/TestCreateSmimeInfo.java +++ b/gmail/snippets/src/test/java/TestCreateSmimeInfo.java @@ -17,6 +17,7 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertThat; import com.google.api.services.gmail.model.SmimeInfo; import org.junit.Test; diff --git a/vault/vault-hold-migration-api/src/main/java/com/google/vault/chatmigration/DirectoryService.java b/vault/vault-hold-migration-api/src/main/java/com/google/vault/chatmigration/DirectoryService.java index 24514a5e..4c36043a 100644 --- a/vault/vault-hold-migration-api/src/main/java/com/google/vault/chatmigration/DirectoryService.java +++ b/vault/vault-hold-migration-api/src/main/java/com/google/vault/chatmigration/DirectoryService.java @@ -17,10 +17,10 @@ package com.google.vault.chatmigration; import com.github.rholder.retry.RetryException; -import com.google.api.services.admin.directory.Directory; -import com.google.api.services.admin.directory.model.OrgUnit; -import com.google.api.services.admin.directory.model.OrgUnits; -import com.google.api.services.admin.directory.model.User; +import com.google.api.services.directory.Directory; +import com.google.api.services.directory.model.OrgUnit; +import com.google.api.services.directory.model.OrgUnits; +import com.google.api.services.directory.model.User; import java.io.IOException; import java.util.HashMap; import java.util.Map; diff --git a/vault/vault-hold-migration-api/src/main/java/com/google/vault/chatmigration/HoldsReport.java b/vault/vault-hold-migration-api/src/main/java/com/google/vault/chatmigration/HoldsReport.java index b337cddf..d42f608b 100644 --- a/vault/vault-hold-migration-api/src/main/java/com/google/vault/chatmigration/HoldsReport.java +++ b/vault/vault-hold-migration-api/src/main/java/com/google/vault/chatmigration/HoldsReport.java @@ -16,7 +16,7 @@ package com.google.vault.chatmigration; -import com.google.api.services.admin.directory.model.OrgUnit; +import com.google.api.services.directory.model.OrgUnit; import com.google.api.services.vault.v1.Vault; import com.google.api.services.vault.v1.model.Hold; import com.google.api.services.vault.v1.model.ListHoldsResponse; diff --git a/vault/vault-hold-migration-api/src/main/java/com/google/vault/chatmigration/MigrationHelper.java b/vault/vault-hold-migration-api/src/main/java/com/google/vault/chatmigration/MigrationHelper.java index e867ff63..c18f697c 100644 --- a/vault/vault-hold-migration-api/src/main/java/com/google/vault/chatmigration/MigrationHelper.java +++ b/vault/vault-hold-migration-api/src/main/java/com/google/vault/chatmigration/MigrationHelper.java @@ -26,8 +26,8 @@ import com.google.api.client.json.JsonFactory; import com.google.api.client.json.gson.GsonFactory; import com.google.api.client.util.store.FileDataStoreFactory; -import com.google.api.services.admin.directory.Directory; -import com.google.api.services.admin.directory.DirectoryScopes; +import com.google.api.services.directory.Directory; +import com.google.api.services.directory.DirectoryScopes; import com.google.api.services.vault.v1.Vault; import com.google.api.services.vault.v1.VaultScopes; import java.io.IOException; diff --git a/vault/vault-hold-migration-api/src/main/java/com/google/vault/chatmigration/QuickStart.java b/vault/vault-hold-migration-api/src/main/java/com/google/vault/chatmigration/QuickStart.java index 70e5943e..c94ccbfc 100644 --- a/vault/vault-hold-migration-api/src/main/java/com/google/vault/chatmigration/QuickStart.java +++ b/vault/vault-hold-migration-api/src/main/java/com/google/vault/chatmigration/QuickStart.java @@ -16,7 +16,7 @@ package com.google.vault.chatmigration; -import com.google.api.services.admin.directory.Directory; +import com.google.api.services.directory.Directory; import com.google.api.services.vault.v1.Vault; import com.google.vault.chatmigration.MigrationHelper.MigrationOptions; import java.io.File; From 96f5406d37fa75436cc6d550f747181295df68e8 Mon Sep 17 00:00:00 2001 From: Steve Bazyl Date: Wed, 31 Aug 2022 16:23:25 -0600 Subject: [PATCH 227/262] fix: Enable drive tests + fix failing classrom one --- classroom/snippets/src/main/java/AddStudent.java | 2 +- drive/snippets/drive_v2/build.gradle | 4 ++-- drive/snippets/drive_v3/build.gradle | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/classroom/snippets/src/main/java/AddStudent.java b/classroom/snippets/src/main/java/AddStudent.java index 142072a3..c04c38fb 100644 --- a/classroom/snippets/src/main/java/AddStudent.java +++ b/classroom/snippets/src/main/java/AddStudent.java @@ -55,7 +55,7 @@ public static Student addStudent(String courseId, String enrollmentCode) .setApplicationName("Classroom samples") .build(); - Student student = new Student().setUserId("me"); + Student student = new Student().setUserId("gduser1@workspacesamples.dev"); try { // Enrolling a student to a specified course student = service.courses().students().create(courseId, student) diff --git a/drive/snippets/drive_v2/build.gradle b/drive/snippets/drive_v2/build.gradle index e3bfcd2b..13db3ac6 100644 --- a/drive/snippets/drive_v2/build.gradle +++ b/drive/snippets/drive_v2/build.gradle @@ -14,5 +14,5 @@ dependencies { } test { - useJUnitPlatform() -} \ No newline at end of file + testLogging.showStandardStreams = true +} diff --git a/drive/snippets/drive_v3/build.gradle b/drive/snippets/drive_v3/build.gradle index b1196d59..b7c50196 100644 --- a/drive/snippets/drive_v3/build.gradle +++ b/drive/snippets/drive_v3/build.gradle @@ -12,5 +12,5 @@ dependencies { } test { - useJUnitPlatform() -} \ No newline at end of file + testLogging.showStandardStreams = true +} From b75a5f9a5e180f2e904daea3cfcd89f2a60a5cc3 Mon Sep 17 00:00:00 2001 From: googleworkspace-bot <109114539+googleworkspace-bot@users.noreply.github.com> Date: Fri, 30 Sep 2022 08:56:12 -0600 Subject: [PATCH 228/262] chore: Synced local '.github/sync-repo-settings.yaml' with remote 'sync-files/defaults/.github/sync-repo-settings.yaml' (#363) --- .github/sync-repo-settings.yaml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/sync-repo-settings.yaml b/.github/sync-repo-settings.yaml index 1e81cab7..fc025621 100644 --- a/.github/sync-repo-settings.yaml +++ b/.github/sync-repo-settings.yaml @@ -37,3 +37,5 @@ branchProtectionRules: permissionRules: - team: workspace-devrel-dpe permission: admin + - team: workspace-devrel + permission: write From 953c2c0472968fdc3ff476df36f86fcd1d856e00 Mon Sep 17 00:00:00 2001 From: googleworkspace-bot <109114539+googleworkspace-bot@users.noreply.github.com> Date: Mon, 3 Oct 2022 10:27:43 -0600 Subject: [PATCH 229/262] chore: Synced local '.github/sync-repo-settings.yaml' with remote 'sync-files/defaults/.github/sync-repo-settings.yaml' (#365) --- .github/sync-repo-settings.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/sync-repo-settings.yaml b/.github/sync-repo-settings.yaml index fc025621..7b363bc4 100644 --- a/.github/sync-repo-settings.yaml +++ b/.github/sync-repo-settings.yaml @@ -38,4 +38,4 @@ permissionRules: - team: workspace-devrel-dpe permission: admin - team: workspace-devrel - permission: write + permission: push From 1c8b4497fa19bc4ac05c58501731a01d73105ab0 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 3 Oct 2022 14:52:19 -0600 Subject: [PATCH 230/262] chore(deps): bump google-api-services-sheets in /sheets/quickstart (#369) Bumps google-api-services-sheets from v4-rev20220620-2.0.0 to v4-rev20220927-2.0.0. --- updated-dependencies: - dependency-name: com.google.apis:google-api-services-sheets dependency-type: direct:production ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- sheets/quickstart/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sheets/quickstart/build.gradle b/sheets/quickstart/build.gradle index c12db6f3..e0c6f5a5 100644 --- a/sheets/quickstart/build.gradle +++ b/sheets/quickstart/build.gradle @@ -13,5 +13,5 @@ repositories { dependencies { implementation 'com.google.api-client:google-api-client:2.0.0' implementation 'com.google.oauth-client:google-oauth-client-jetty:1.34.1' - implementation 'com.google.apis:google-api-services-sheets:v4-rev20220620-2.0.0' + implementation 'com.google.apis:google-api-services-sheets:v4-rev20220927-2.0.0' } From 95618d9ead845d53cc4057bb104394833f4047d8 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 3 Oct 2022 14:52:34 -0600 Subject: [PATCH 231/262] chore(deps): bump google-api-services-sheets in /slides/snippets (#368) Bumps google-api-services-sheets from v4-rev20220620-2.0.0 to v4-rev20220927-2.0.0. --- updated-dependencies: - dependency-name: com.google.apis:google-api-services-sheets dependency-type: direct:production ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- slides/snippets/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/slides/snippets/build.gradle b/slides/snippets/build.gradle index 48965f8c..406a6b20 100644 --- a/slides/snippets/build.gradle +++ b/slides/snippets/build.gradle @@ -7,7 +7,7 @@ repositories { dependencies { implementation 'com.google.auth:google-auth-library-oauth2-http:1.10.0' implementation 'com.google.apis:google-api-services-drive:v3-rev20220815-2.0.0' - implementation 'com.google.apis:google-api-services-sheets:v4-rev20220620-2.0.0' + implementation 'com.google.apis:google-api-services-sheets:v4-rev20220927-2.0.0' implementation 'com.google.apis:google-api-services-slides:v1-rev20220722-2.0.0' testImplementation 'junit:junit:4.13.2' From 40c542d7ae8a5d28190d91172c8f5df0c461452c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 3 Oct 2022 14:52:53 -0600 Subject: [PATCH 232/262] chore(deps): bump google-api-services-sheets in /sheets/snippets (#367) Bumps google-api-services-sheets from v4-rev20220620-2.0.0 to v4-rev20220927-2.0.0. --- updated-dependencies: - dependency-name: com.google.apis:google-api-services-sheets dependency-type: direct:production ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- sheets/snippets/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sheets/snippets/build.gradle b/sheets/snippets/build.gradle index 8763dd63..cda0250f 100644 --- a/sheets/snippets/build.gradle +++ b/sheets/snippets/build.gradle @@ -7,7 +7,7 @@ repositories { dependencies { implementation 'com.google.auth:google-auth-library-oauth2-http:1.10.0' implementation 'com.google.apis:google-api-services-drive:v3-rev20220815-2.0.0' - implementation 'com.google.apis:google-api-services-sheets:v4-rev20220620-2.0.0' + implementation 'com.google.apis:google-api-services-sheets:v4-rev20220927-2.0.0' testImplementation 'junit:junit:4.13.2' } From 3a06524bf6183ffb7ca99f80afd58c104640400b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 3 Oct 2022 14:53:09 -0600 Subject: [PATCH 233/262] chore(deps): bump google-api-services-driveactivity (#366) Bumps google-api-services-driveactivity from v2-rev20210319-2.0.0 to v2-rev20220926-2.0.0. --- updated-dependencies: - dependency-name: com.google.apis:google-api-services-driveactivity dependency-type: direct:production ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- drive/activity-v2/quickstart/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drive/activity-v2/quickstart/build.gradle b/drive/activity-v2/quickstart/build.gradle index 0f90a6c1..86df8be7 100644 --- a/drive/activity-v2/quickstart/build.gradle +++ b/drive/activity-v2/quickstart/build.gradle @@ -13,5 +13,5 @@ repositories { dependencies { implementation 'com.google.api-client:google-api-client:2.0.0' implementation 'com.google.oauth-client:google-oauth-client-jetty:1.34.1' - implementation 'com.google.apis:google-api-services-driveactivity:v2-rev20210319-2.0.0' + implementation 'com.google.apis:google-api-services-driveactivity:v2-rev20220926-2.0.0' } From e97ff9e465bf76814ce0e5592b37d3522933d46f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 3 Oct 2022 14:53:21 -0600 Subject: [PATCH 234/262] chore(deps): bump google-api-services-admin-directory (#361) Bumps google-api-services-admin-directory from directory_v1-rev20220816-2.0.0 to directory_v1-rev20220919-2.0.0. --- updated-dependencies: - dependency-name: com.google.apis:google-api-services-admin-directory dependency-type: direct:production ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- adminSDK/directory/quickstart/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/adminSDK/directory/quickstart/build.gradle b/adminSDK/directory/quickstart/build.gradle index 5cc56d2a..08a0538e 100644 --- a/adminSDK/directory/quickstart/build.gradle +++ b/adminSDK/directory/quickstart/build.gradle @@ -13,5 +13,5 @@ repositories { dependencies { implementation 'com.google.api-client:google-api-client:2.0.0' implementation 'com.google.oauth-client:google-oauth-client-jetty:1.34.1' - implementation 'com.google.apis:google-api-services-admin-directory:directory_v1-rev20220816-2.0.0' + implementation 'com.google.apis:google-api-services-admin-directory:directory_v1-rev20220919-2.0.0' } From 264538d3a7c6ad51028455d23577a36f2e1101b8 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 3 Oct 2022 14:53:39 -0600 Subject: [PATCH 235/262] chore(deps): bump google-api-services-admin-directory (#360) Bumps google-api-services-admin-directory from directory_v1-rev20220816-2.0.0 to directory_v1-rev20220919-2.0.0. --- updated-dependencies: - dependency-name: com.google.apis:google-api-services-admin-directory dependency-type: direct:production ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- vault/vault-hold-migration-api/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vault/vault-hold-migration-api/build.gradle b/vault/vault-hold-migration-api/build.gradle index 964a2c63..16a5b2c2 100644 --- a/vault/vault-hold-migration-api/build.gradle +++ b/vault/vault-hold-migration-api/build.gradle @@ -17,6 +17,6 @@ dependencies { implementation 'com.google.apis:google-api-services-vault:v1-rev20220423-2.0.0' implementation group: 'org.apache.commons', name: 'commons-csv', version: '1.9.0' implementation 'com.github.rholder:guava-retrying:2.0.0' - implementation 'com.google.apis:google-api-services-admin-directory:directory_v1-rev20220816-2.0.0' + implementation 'com.google.apis:google-api-services-admin-directory:directory_v1-rev20220919-2.0.0' implementation group: 'commons-cli', name: 'commons-cli', version: '1.5.0' } \ No newline at end of file From 3f9de3ed792e12ce48008b3dbd04ab8605c7c319 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 3 Oct 2022 14:53:53 -0600 Subject: [PATCH 236/262] chore(deps): bump mockito-inline from 4.7.0 to 4.8.0 in /gmail/snippets (#359) Bumps [mockito-inline](https://github.com/mockito/mockito) from 4.7.0 to 4.8.0. - [Release notes](https://github.com/mockito/mockito/releases) - [Commits](https://github.com/mockito/mockito/compare/v4.7.0...v4.8.0) --- updated-dependencies: - dependency-name: org.mockito:mockito-inline dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- gmail/snippets/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gmail/snippets/build.gradle b/gmail/snippets/build.gradle index 88a66631..0a4690d9 100644 --- a/gmail/snippets/build.gradle +++ b/gmail/snippets/build.gradle @@ -10,6 +10,6 @@ dependencies { implementation 'javax.mail:mail:1.4.7' implementation 'org.apache.commons:commons-csv:1.9.0' testImplementation 'junit:junit:4.13.2' - testImplementation 'org.mockito:mockito-inline:4.7.0' + testImplementation 'org.mockito:mockito-inline:4.8.0' testImplementation 'org.hamcrest:hamcrest:2.2' } From 18921fbb21c10b9c059f2a4fb032b0269edebe8a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 3 Oct 2022 14:54:06 -0600 Subject: [PATCH 237/262] chore(deps): bump google-auth-library-oauth2-http in /gmail/snippets (#358) Bumps google-auth-library-oauth2-http from 1.10.0 to 1.11.0. --- updated-dependencies: - dependency-name: com.google.auth:google-auth-library-oauth2-http dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- gmail/snippets/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gmail/snippets/build.gradle b/gmail/snippets/build.gradle index 0a4690d9..69378a2d 100644 --- a/gmail/snippets/build.gradle +++ b/gmail/snippets/build.gradle @@ -5,7 +5,7 @@ repositories { } dependencies { - implementation 'com.google.auth:google-auth-library-oauth2-http:1.10.0' + implementation 'com.google.auth:google-auth-library-oauth2-http:1.11.0' implementation 'com.google.apis:google-api-services-gmail:v1-rev20220404-2.0.0' implementation 'javax.mail:mail:1.4.7' implementation 'org.apache.commons:commons-csv:1.9.0' From 16ee39e8db1636b6c8207da2d051a5b87507a291 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 3 Oct 2022 14:54:16 -0600 Subject: [PATCH 238/262] chore(deps): bump google-auth-library-oauth2-http in /slides/snippets (#357) Bumps google-auth-library-oauth2-http from 1.10.0 to 1.11.0. --- updated-dependencies: - dependency-name: com.google.auth:google-auth-library-oauth2-http dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- slides/snippets/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/slides/snippets/build.gradle b/slides/snippets/build.gradle index 406a6b20..0471dc29 100644 --- a/slides/snippets/build.gradle +++ b/slides/snippets/build.gradle @@ -5,7 +5,7 @@ repositories { } dependencies { - implementation 'com.google.auth:google-auth-library-oauth2-http:1.10.0' + implementation 'com.google.auth:google-auth-library-oauth2-http:1.11.0' implementation 'com.google.apis:google-api-services-drive:v3-rev20220815-2.0.0' implementation 'com.google.apis:google-api-services-sheets:v4-rev20220927-2.0.0' implementation 'com.google.apis:google-api-services-slides:v1-rev20220722-2.0.0' From db010abcd83c6daac5dcabf19fcc8bcea700e38b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 3 Oct 2022 14:54:34 -0600 Subject: [PATCH 239/262] chore(deps): bump google-auth-library-oauth2-http in /classroom/snippets (#356) Bumps google-auth-library-oauth2-http from 1.10.0 to 1.11.0. --- updated-dependencies: - dependency-name: com.google.auth:google-auth-library-oauth2-http dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- classroom/snippets/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/classroom/snippets/build.gradle b/classroom/snippets/build.gradle index b0776149..6971123c 100644 --- a/classroom/snippets/build.gradle +++ b/classroom/snippets/build.gradle @@ -7,7 +7,7 @@ repositories { dependencies { implementation 'com.google.api-client:google-api-client:2.0.0' - implementation 'com.google.auth:google-auth-library-oauth2-http:1.10.0' + implementation 'com.google.auth:google-auth-library-oauth2-http:1.11.0' implementation 'com.google.apis:google-api-services-classroom:v1-rev20220323-2.0.0' testImplementation 'junit:junit:4.13.2' } From 0c821edb4af057f96261c629228a4f6a6bdd6bea Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 3 Oct 2022 14:54:46 -0600 Subject: [PATCH 240/262] chore(deps): bump google-auth-library-oauth2-http in /sheets/snippets (#355) Bumps google-auth-library-oauth2-http from 1.10.0 to 1.11.0. --- updated-dependencies: - dependency-name: com.google.auth:google-auth-library-oauth2-http dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- sheets/snippets/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sheets/snippets/build.gradle b/sheets/snippets/build.gradle index cda0250f..22610657 100644 --- a/sheets/snippets/build.gradle +++ b/sheets/snippets/build.gradle @@ -5,7 +5,7 @@ repositories { } dependencies { - implementation 'com.google.auth:google-auth-library-oauth2-http:1.10.0' + implementation 'com.google.auth:google-auth-library-oauth2-http:1.11.0' implementation 'com.google.apis:google-api-services-drive:v3-rev20220815-2.0.0' implementation 'com.google.apis:google-api-services-sheets:v4-rev20220927-2.0.0' testImplementation 'junit:junit:4.13.2' From 3bf6700b91695e1e2c466aaa2d3d03ad9a279465 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 3 Oct 2022 14:55:12 -0600 Subject: [PATCH 241/262] chore(deps): bump google-auth-library-oauth2-http (#354) Bumps google-auth-library-oauth2-http from 1.10.0 to 1.11.0. --- updated-dependencies: - dependency-name: com.google.auth:google-auth-library-oauth2-http dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- drive/snippets/drive_v2/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drive/snippets/drive_v2/build.gradle b/drive/snippets/drive_v2/build.gradle index 13db3ac6..df0967a5 100644 --- a/drive/snippets/drive_v2/build.gradle +++ b/drive/snippets/drive_v2/build.gradle @@ -7,7 +7,7 @@ repositories { dependencies { implementation 'com.google.apis:google-api-services-drive:v2-rev20220815-2.0.0' implementation 'com.google.api-client:google-api-client:1.23.0' - implementation 'com.google.auth:google-auth-library-oauth2-http:1.10.0' + implementation 'com.google.auth:google-auth-library-oauth2-http:1.11.0' implementation 'com.google.oauth-client:google-oauth-client-jetty:1.34.1' implementation 'com.google.code.gson:gson:2.9.1' testImplementation 'junit:junit:4.13.2' From def6803eb45d52a9d2e449302d4bb6d2b1a5f84c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 3 Oct 2022 14:55:33 -0600 Subject: [PATCH 242/262] chore(deps): bump google-auth-library-oauth2-http (#353) Bumps google-auth-library-oauth2-http from 1.10.0 to 1.11.0. --- updated-dependencies: - dependency-name: com.google.auth:google-auth-library-oauth2-http dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- drive/snippets/drive_v3/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drive/snippets/drive_v3/build.gradle b/drive/snippets/drive_v3/build.gradle index b7c50196..9f0dc9f7 100644 --- a/drive/snippets/drive_v3/build.gradle +++ b/drive/snippets/drive_v3/build.gradle @@ -6,7 +6,7 @@ repositories { dependencies { implementation 'com.google.apis:google-api-services-drive:v3-rev20220815-2.0.0' implementation 'com.google.api-client:google-api-client:2.0.0' - implementation 'com.google.auth:google-auth-library-oauth2-http:1.10.0' + implementation 'com.google.auth:google-auth-library-oauth2-http:1.11.0' implementation 'com.google.code.gson:gson:2.9.1' testImplementation 'junit:junit:4.13.2' } From 3d4bca36c298a7d229a97f20c8318a813d45864e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 3 Oct 2022 14:56:02 -0600 Subject: [PATCH 243/262] chore(deps): bump google-auth-library-oauth2-http (#352) Bumps google-auth-library-oauth2-http from 1.10.0 to 1.11.0. --- updated-dependencies: - dependency-name: com.google.auth:google-auth-library-oauth2-http dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- adminSDK/alertcenter/quickstart/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/adminSDK/alertcenter/quickstart/build.gradle b/adminSDK/alertcenter/quickstart/build.gradle index b448253b..2e7e184c 100644 --- a/adminSDK/alertcenter/quickstart/build.gradle +++ b/adminSDK/alertcenter/quickstart/build.gradle @@ -13,6 +13,6 @@ repositories { dependencies { implementation 'com.google.api-client:google-api-client:2.0.0' - implementation 'com.google.auth:google-auth-library-oauth2-http:1.10.0' + implementation 'com.google.auth:google-auth-library-oauth2-http:1.11.0' implementation 'com.google.apis:google-api-services-alertcenter:v1beta1-rev20220718-2.0.0' } \ No newline at end of file From 2fa7089ab98faf6e959d472aa95495bf5201ea24 Mon Sep 17 00:00:00 2001 From: Mahima Desetty <45216855+mahima-desetty@users.noreply.github.com> Date: Mon, 12 Dec 2022 11:41:45 -0500 Subject: [PATCH 244/262] =?UTF-8?q?feat:=20added=20Java=20code=20snippets?= =?UTF-8?q?=20for=20Aliases,=20CourseWork,=20and=20Topics=C2=A0=20(#464)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * add alias snippet and unit test * java snippets for topics, create coursework, create alias * updates based on team review * renamed alias methods, added devsite comments * added missing license header to TestDeleteTopic.java --- .../src/main/java/AddAliasToCourse.java | 85 ++++++++++++++ .../src/main/java/CreateCourseWithAlias.java | 89 +++++++++++++++ .../src/main/java/CreateCourseWork.java | 107 ++++++++++++++++++ .../snippets/src/main/java/CreateTopic.java | 81 +++++++++++++ .../snippets/src/main/java/DeleteTopic.java | 76 +++++++++++++ .../snippets/src/main/java/GetTopic.java | 80 +++++++++++++ .../snippets/src/main/java/ListTopics.java | 98 ++++++++++++++++ .../snippets/src/main/java/UpdateTopic.java | 89 +++++++++++++++ .../snippets/src/test/java/BaseTest.java | 4 + .../src/test/java/TestAddAliasToCourse.java | 34 ++++++ .../test/java/TestCreateCourseWithAlias.java | 36 ++++++ .../src/test/java/TestCreateCourseWork.java | 28 +++++ .../src/test/java/TestCreateTopic.java | 28 +++++ .../src/test/java/TestDeleteTopic.java | 29 +++++ .../snippets/src/test/java/TestGetTopic.java | 31 +++++ .../src/test/java/TestListTopics.java | 31 +++++ .../src/test/java/TestUpdateTopic.java | 28 +++++ 17 files changed, 954 insertions(+) create mode 100644 classroom/snippets/src/main/java/AddAliasToCourse.java create mode 100644 classroom/snippets/src/main/java/CreateCourseWithAlias.java create mode 100644 classroom/snippets/src/main/java/CreateCourseWork.java create mode 100644 classroom/snippets/src/main/java/CreateTopic.java create mode 100644 classroom/snippets/src/main/java/DeleteTopic.java create mode 100644 classroom/snippets/src/main/java/GetTopic.java create mode 100644 classroom/snippets/src/main/java/ListTopics.java create mode 100644 classroom/snippets/src/main/java/UpdateTopic.java create mode 100644 classroom/snippets/src/test/java/TestAddAliasToCourse.java create mode 100644 classroom/snippets/src/test/java/TestCreateCourseWithAlias.java create mode 100644 classroom/snippets/src/test/java/TestCreateCourseWork.java create mode 100644 classroom/snippets/src/test/java/TestCreateTopic.java create mode 100644 classroom/snippets/src/test/java/TestDeleteTopic.java create mode 100644 classroom/snippets/src/test/java/TestGetTopic.java create mode 100644 classroom/snippets/src/test/java/TestListTopics.java create mode 100644 classroom/snippets/src/test/java/TestUpdateTopic.java diff --git a/classroom/snippets/src/main/java/AddAliasToCourse.java b/classroom/snippets/src/main/java/AddAliasToCourse.java new file mode 100644 index 00000000..10434391 --- /dev/null +++ b/classroom/snippets/src/main/java/AddAliasToCourse.java @@ -0,0 +1,85 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + + +// [START classroom_add_alias_to_course_class] + +import com.google.api.client.googleapis.json.GoogleJsonError; +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.classroom.Classroom; +import com.google.api.services.classroom.ClassroomScopes; +import com.google.api.services.classroom.model.CourseAlias; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; +import java.io.IOException; +import java.util.Collections; + +/* Class to demonstrate the use of Classroom Create Alias API. */ +public class AddAliasToCourse { + /** + * Add an alias on an existing course. + * + * @param courseId - id of the course to add an alias to. + * @return - newly created course alias. + * @throws IOException - if credentials file not found. + */ + public static CourseAlias addAliasToCourse(String courseId) throws IOException { + /* Load pre-authorized user credentials from the environment. + TODO(developer) - See https://developers.google.com/identity for + guides on implementing OAuth2 for your application. */ + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Collections.singleton(ClassroomScopes.CLASSROOM_COURSES)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + + // Create the classroom API client. + Classroom service = new Classroom.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Classroom samples") + .build(); + + // [START classroom_add_alias_to_course_code_snippet] + + /* Create a new CourseAlias object with a project-wide alias. Project-wide aliases use a prefix + of "p:" and can only be seen and used by the application that created them. */ + CourseAlias content = new CourseAlias() + .setAlias("p:biology_10"); + CourseAlias courseAlias = null; + + try { + courseAlias = service.courses().aliases().create(courseId, content) + .execute(); + System.out.printf("Course alias created: %s \n", courseAlias.getAlias()); + } catch (GoogleJsonResponseException e) { + //TODO (developer) - handle error appropriately + GoogleJsonError error = e.getDetails(); + if (error.getCode() == 409) { + System.out.printf("The course alias already exists: %s.\n", content); + } else { + throw e; + } + } catch (Exception e) { + throw e; + } + return courseAlias; + + // [END classroom_add_alias_to_course_code_snippet] + + } +} +// [END classroom_add_alias_to_course_class] diff --git a/classroom/snippets/src/main/java/CreateCourseWithAlias.java b/classroom/snippets/src/main/java/CreateCourseWithAlias.java new file mode 100644 index 00000000..77a6521b --- /dev/null +++ b/classroom/snippets/src/main/java/CreateCourseWithAlias.java @@ -0,0 +1,89 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + + +// [START classroom_create_course_with_alias_class] +import com.google.api.client.googleapis.json.GoogleJsonError; +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.classroom.Classroom; +import com.google.api.services.classroom.ClassroomScopes; +import com.google.api.services.classroom.model.Course; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; +import java.io.IOException; +import java.util.Collections; + +/* Class to demonstrate how to create a course with an alias. */ +public class CreateCourseWithAlias { + /** + * Create a new course with an alias. Set the new course id to the desired alias. + * + * @return - newly created course. + * @throws IOException - if credentials file not found. + */ + public static Course createCourseWithAlias() throws IOException { + /* Load pre-authorized user credentials from the environment. + TODO(developer) - See https://developers.google.com/identity for + guides on implementing OAuth2 for your application. */ + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Collections.singleton(ClassroomScopes.CLASSROOM_COURSES)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + + // Create the classroom API client. + Classroom service = new Classroom.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Classroom samples") + .build(); + + // [START classroom_create_course_with_alias_code_snippet] + + Course course = null; + + /* Create a new Course with the alias set as the id field. Project-wide aliases use a prefix + of "p:" and can only be seen and used by the application that created them. */ + Course content = new Course() + .setId("p:history_4_2022") + .setName("9th Grade History") + .setSection("Period 4") + .setDescriptionHeading("Welcome to 9th Grade History.") + .setOwnerId("me") + .setCourseState("PROVISIONED"); + + try { + course = service.courses().create(content).execute(); + // Prints the new created course id and name + System.out.printf("Course created: %s (%s)\n", course.getName(), course.getId()); + } catch (GoogleJsonResponseException e) { + //TODO (developer) - handle error appropriately + GoogleJsonError error = e.getDetails(); + if (error.getCode() == 409) { + System.out.printf("The course alias already exists: %s.\n", content.getId()); + } else { + throw e; + } + } catch (Exception e) { + throw e; + } + return course; + + // [END classroom_create_course_with_alias_code_snippet] + + } +} +// [END classroom_create_course_with_alias_class] diff --git a/classroom/snippets/src/main/java/CreateCourseWork.java b/classroom/snippets/src/main/java/CreateCourseWork.java new file mode 100644 index 00000000..631ced38 --- /dev/null +++ b/classroom/snippets/src/main/java/CreateCourseWork.java @@ -0,0 +1,107 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + + +// [START classroom_create_coursework_class] +import com.google.api.client.googleapis.json.GoogleJsonError; +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.classroom.Classroom; +import com.google.api.services.classroom.ClassroomScopes; +import com.google.api.services.classroom.model.CourseWork; +import com.google.api.services.classroom.model.Date; +import com.google.api.services.classroom.model.Link; +import com.google.api.services.classroom.model.Material; +import com.google.api.services.classroom.model.TimeOfDay; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; +import java.io.IOException; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; + +/* Class to demonstrate the use of Classroom Create CourseWork API. */ +public class CreateCourseWork { + /** + * Creates course work. + * + * @param courseId - id of the course to create coursework in. + * @return - newly created CourseWork object. + * @throws IOException - if credentials file not found. + */ + public static CourseWork createCourseWork(String courseId) throws IOException { + /* Load pre-authorized user credentials from the environment. + TODO(developer) - See https://developers.google.com/identity for + guides on implementing OAuth2 for your application. */ + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Collections.singleton(ClassroomScopes.CLASSROOM_COURSEWORK_STUDENTS)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + + // Create the classroom API client. + Classroom service = new Classroom.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Classroom samples") + .build(); + + // [START classroom_create_coursework_code_snippet] + + CourseWork courseWork = null; + try { + // Create a link to add as a material on course work. + Link articleLink = new Link() + .setTitle("SR-71 Blackbird") + .setUrl("https://www.lockheedmartin.com/en-us/news/features/history/blackbird.html"); + + // Create a list of Materials to add to course work. + List materials = Arrays.asList(new Material().setLink(articleLink)); + + /* Create new CourseWork object with the material attached. + Set workType to `ASSIGNMENT`. Possible values of workType can be found here: + https://developers.google.com/classroom/reference/rest/v1/CourseWorkType + Set state to `PUBLISHED`. Possible values of state can be found here: + https://developers.google.com/classroom/reference/rest/v1/courses.courseWork#courseworkstate */ + CourseWork content = new CourseWork() + .setTitle("Supersonic aviation") + .setDescription("Read about how the SR-71 Blackbird, the world’s fastest and " + + "highest-flying manned aircraft, was built.") + .setMaterials(materials) + .setDueDate(new Date().setMonth(12).setDay(10).setYear(2022)) + .setDueTime(new TimeOfDay().setHours(15).setMinutes(0)) + .setWorkType("ASSIGNMENT") + .setState("PUBLISHED"); + + courseWork = service.courses().courseWork().create(courseId, content) + .execute(); + } catch (GoogleJsonResponseException e) { + //TODO (developer) - handle error appropriately + GoogleJsonError error = e.getDetails(); + if (error.getCode() == 404) { + System.out.printf("The courseId does not exist: %s.\n", courseId); + } else { + throw e; + } + throw e; + } catch (Exception e) { + throw e; + } + return courseWork; + + // [END classroom_create_coursework_code_snippet] + } +} +// [END classroom_create_coursework_class] \ No newline at end of file diff --git a/classroom/snippets/src/main/java/CreateTopic.java b/classroom/snippets/src/main/java/CreateTopic.java new file mode 100644 index 00000000..a46e573f --- /dev/null +++ b/classroom/snippets/src/main/java/CreateTopic.java @@ -0,0 +1,81 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + + +// [START classroom_create_topic_class] + +import com.google.api.client.googleapis.json.GoogleJsonError; +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.classroom.Classroom; +import com.google.api.services.classroom.ClassroomScopes; +import com.google.api.services.classroom.model.Topic; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; +import java.io.IOException; +import java.util.Collections; + +/* Class to demonstrate how to create a topic. */ +public class CreateTopic { + /** + * Create a new topic in a course. + * + * @param courseId - the id of the course to create a topic in. + * @return - newly created topic. + * @throws IOException - if credentials file not found. + */ + public static Topic createTopic(String courseId) throws IOException { + /* Load pre-authorized user credentials from the environment. + TODO(developer) - See https://developers.google.com/identity for + guides on implementing OAuth2 for your application. */ + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Collections.singleton(ClassroomScopes.CLASSROOM_TOPICS)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + + // Create the classroom API client. + Classroom service = new Classroom.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Classroom samples") + .build(); + + // [START classroom_create_topic_code_snippet] + + Topic topic = null; + try { + // Create the new Topic. + Topic content = new Topic().setName("Semester 1"); + topic = service.courses().topics().create(courseId, content).execute(); + System.out.println("Topic id: " + topic.getTopicId() + "\n" + "Course id: " + courseId); + } catch (GoogleJsonResponseException e) { + //TODO (developer) - handle error appropriately + GoogleJsonError error = e.getDetails(); + if (error.getCode() == 404) { + System.out.printf("The courseId does not exist: %s.\n", courseId); + } else { + throw e; + } + } catch (Exception e) { + throw e; + } + return topic; + + // [END classroom_create_topic_code_snippet] + + } +} +// [END classroom_create_topic_class] diff --git a/classroom/snippets/src/main/java/DeleteTopic.java b/classroom/snippets/src/main/java/DeleteTopic.java new file mode 100644 index 00000000..b8ee8f73 --- /dev/null +++ b/classroom/snippets/src/main/java/DeleteTopic.java @@ -0,0 +1,76 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + + +// [START classroom_delete_topic_class] + +import com.google.api.client.googleapis.json.GoogleJsonError; +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.classroom.Classroom; +import com.google.api.services.classroom.ClassroomScopes; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; +import java.io.IOException; +import java.util.Collections; + +/* Class to demonstrate how to delete a topic. */ +public class DeleteTopic { + /** + * Delete a topic in a course. + * + * @param courseId - the id of the course where the topic belongs. + * @param topicId - the id of the topic to delete. + * @return - updated topic. + * @throws IOException - if credentials file not found. + */ + public static void deleteTopic(String courseId, String topicId) throws IOException { + /* Load pre-authorized user credentials from the environment. + TODO(developer) - See https://developers.google.com/identity for + guides on implementing OAuth2 for your application. */ + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Collections.singleton(ClassroomScopes.CLASSROOM_TOPICS)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + + // Create the classroom API client. + Classroom service = new Classroom.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Classroom samples") + .build(); + + // [START classroom_delete_topic_code_snippet] + + try { + service.courses().topics().delete(courseId, topicId).execute(); + } catch (GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + GoogleJsonError error = e.getDetails(); + if (error.getCode() == 404) { + System.out.printf("The courseId or topicId does not exist: %s, %s.\n", courseId, topicId); + } else { + throw e; + } + } catch (Exception e) { + throw e; + } + + // [END classroom_delete_topic_code_snippet] + + } +} +// [END classroom_delete_topic_class] diff --git a/classroom/snippets/src/main/java/GetTopic.java b/classroom/snippets/src/main/java/GetTopic.java new file mode 100644 index 00000000..5332bd5c --- /dev/null +++ b/classroom/snippets/src/main/java/GetTopic.java @@ -0,0 +1,80 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + + +// [START classroom_get_topic_class] + +import com.google.api.client.googleapis.json.GoogleJsonError; +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.classroom.Classroom; +import com.google.api.services.classroom.ClassroomScopes; +import com.google.api.services.classroom.model.Topic; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; +import java.io.IOException; +import java.util.Collections; + +/* Class to demonstrate how to get a topic. */ +public class GetTopic { + /** + * Get a topic in a course. + * + * @param courseId - the id of the course the topic belongs to. + * @param topicId - the id of the topic to retrieve. + * @return - the topic to retrieve. + * @throws IOException - if credentials file not found. + */ + public static Topic getTopic(String courseId, String topicId) throws IOException { + /* Load pre-authorized user credentials from the environment. + TODO(developer) - See https://developers.google.com/identity for + guides on implementing OAuth2 for your application. */ + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Collections.singleton(ClassroomScopes.CLASSROOM_TOPICS)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + + // Create the classroom API client. + Classroom service = new Classroom.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Classroom samples") + .build(); + + // [START classroom_get_topic_code_snippet] + + Topic topic = null; + try { + // Get the topic. + topic = service.courses().topics().get(courseId, topicId).execute(); + } catch (GoogleJsonResponseException e) { + //TODO (developer) - handle error appropriately + GoogleJsonError error = e.getDetails(); + if (error.getCode() == 404) { + System.out.printf("The courseId or topicId does not exist: %s, %s.\n", courseId, topicId); + } else { + throw e; + } + } catch (Exception e) { + throw e; + } + return topic; + + // [END classroom_get_topic_code_snippet] + + } +} +// [END classroom_get_topic_class] diff --git a/classroom/snippets/src/main/java/ListTopics.java b/classroom/snippets/src/main/java/ListTopics.java new file mode 100644 index 00000000..61ea9b89 --- /dev/null +++ b/classroom/snippets/src/main/java/ListTopics.java @@ -0,0 +1,98 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + + +// [START classroom_list_topic_class] + +import com.google.api.client.googleapis.json.GoogleJsonError; +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.classroom.Classroom; +import com.google.api.services.classroom.ClassroomScopes; +import com.google.api.services.classroom.model.ListTopicResponse; +import com.google.api.services.classroom.model.Topic; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +/* Class to demonstrate how to list topics in a course. */ +public class ListTopics { + /** + * List topics in a course. + * + * @param courseId - the id of the course to retrieve topics for. + * @return - the list of topics in the course that the caller is permitted to view. + * @throws IOException - if credentials file not found. + */ + public static List listTopics(String courseId) throws IOException { + /* Load pre-authorized user credentials from the environment. + TODO(developer) - See https://developers.google.com/identity for + guides on implementing OAuth2 for your application. */ + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Collections.singleton(ClassroomScopes.CLASSROOM_TOPICS)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + + // Create the classroom API client. + Classroom service = new Classroom.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Classroom samples") + .build(); + + // [START classroom_list_topic_code_snippet] + + List topics = new ArrayList<>(); + String pageToken = null; + + try { + do { + ListTopicResponse response = service.courses().topics().list(courseId) + .setPageSize(100) + .setPageToken(pageToken) + .execute(); + topics.addAll(response.getTopic()); + pageToken = response.getNextPageToken(); + } while (pageToken != null); + + if (topics.isEmpty()) { + System.out.println("No topics found."); + } else { + for (Topic topic : topics) { + System.out.printf("%s (%s)\n", topic.getName(), topic.getTopicId()); + } + } + } catch (GoogleJsonResponseException e) { + //TODO (developer) - handle error appropriately + GoogleJsonError error = e.getDetails(); + if (error.getCode() == 404) { + System.out.printf("The courseId does not exist: %s.\n", courseId); + } else { + throw e; + } + } catch (Exception e) { + throw e; + } + return topics; + + // [END classroom_list_topic_code_snippet] + + } +} +// [END classroom_list_topic_class] diff --git a/classroom/snippets/src/main/java/UpdateTopic.java b/classroom/snippets/src/main/java/UpdateTopic.java new file mode 100644 index 00000000..770bee30 --- /dev/null +++ b/classroom/snippets/src/main/java/UpdateTopic.java @@ -0,0 +1,89 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + + +// [START classroom_update_topic_class] + +import com.google.api.client.googleapis.json.GoogleJsonError; +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.classroom.Classroom; +import com.google.api.services.classroom.ClassroomScopes; +import com.google.api.services.classroom.model.Topic; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; +import java.io.IOException; +import java.util.Collections; + +/* Class to demonstrate how to update one or more fields in a topic. */ +public class UpdateTopic { + /** + * Update one or more fields in a topic in a course. + * + * @param courseId - the id of the course where the topic belongs. + * @param topicId - the id of the topic to update. + * @return - updated topic. + * @throws IOException - if credentials file not found. + */ + public static Topic updateTopic(String courseId, String topicId) throws IOException { + /* Load pre-authorized user credentials from the environment. + TODO(developer) - See https://developers.google.com/identity for + guides on implementing OAuth2 for your application. */ + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Collections.singleton(ClassroomScopes.CLASSROOM_TOPICS)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + + // Create the classroom API client. + Classroom service = new Classroom.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Classroom samples") + .build(); + + // [START classroom_update_topic_code_snippet] + + Topic topic = null; + try { + // Retrieve the topic to update. + Topic topicToUpdate = service.courses().topics().get(courseId, topicId).execute(); + + // Update the name field for the topic retrieved. + topicToUpdate.setName("Semester 2"); + + /* Call the patch endpoint and set the updateMask query parameter to the field that needs to + be updated. */ + topic = service.courses().topics().patch(courseId, topicId, topicToUpdate) + .set("updateMask", "name") + .execute(); + } catch(GoogleJsonResponseException e) { + // TODO(developer) - handle error appropriately + GoogleJsonError error = e.getDetails(); + if (error.getCode() == 404) { + System.out.printf("The courseId or topicId does not exist: %s, %s.\n", courseId, topicId); + } else { + throw e; + } + } catch (Exception e) { + throw e; + } + return topic; + + // [END classroom_update_topic_code_snippet] + + } +} +// [END classroom_update_topic_class] diff --git a/classroom/snippets/src/test/java/BaseTest.java b/classroom/snippets/src/test/java/BaseTest.java index c1e46717..cc3996de 100644 --- a/classroom/snippets/src/test/java/BaseTest.java +++ b/classroom/snippets/src/test/java/BaseTest.java @@ -80,6 +80,10 @@ public CourseAlias createAlias(String courseId) throws IOException { } public void deleteCourse(String courseId) throws IOException { + // updating the course state to be archived so the course can be deleted. + Course course = service.courses().get(courseId).execute(); + course.setCourseState("ARCHIVED"); + this.service.courses().update(courseId, course).execute(); this.service.courses().delete(courseId).execute(); } } diff --git a/classroom/snippets/src/test/java/TestAddAliasToCourse.java b/classroom/snippets/src/test/java/TestAddAliasToCourse.java new file mode 100644 index 00000000..c5b85777 --- /dev/null +++ b/classroom/snippets/src/test/java/TestAddAliasToCourse.java @@ -0,0 +1,34 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import com.google.api.services.classroom.model.CourseAlias; +import java.io.IOException; +import java.util.List; +import org.junit.Assert; +import org.junit.Test; + +// Unit test class for Add Alias classroom snippet +public class TestAddAliasToCourse extends BaseTest { + + @Test + public void testAddCourseAlias() throws IOException { + CourseAlias courseAlias = AddAliasToCourse.addAliasToCourse(testCourse.getId()); + List courseAliases = service.courses().aliases() + .list(testCourse.getId() + ).execute() + .getAliases(); + Assert.assertNotNull("Course alias not returned.", courseAlias); + Assert.assertTrue("No course aliases exist.", courseAliases.size() > 0); + } +} \ No newline at end of file diff --git a/classroom/snippets/src/test/java/TestCreateCourseWithAlias.java b/classroom/snippets/src/test/java/TestCreateCourseWithAlias.java new file mode 100644 index 00000000..5152b984 --- /dev/null +++ b/classroom/snippets/src/test/java/TestCreateCourseWithAlias.java @@ -0,0 +1,36 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import com.google.api.services.classroom.model.Course; +import com.google.api.services.classroom.model.CourseAlias; +import java.io.IOException; +import java.util.List; +import org.junit.Assert; +import org.junit.Test; + +// Unit test class for Create Alias classroom snippet +public class TestCreateCourseWithAlias extends BaseTest { + + @Test + public void testCreateCourseWithAlias() throws IOException { + Course course = CreateCourseWithAlias.createCourseWithAlias(); + List courseAliases = service.courses().aliases() + .list(course.getId() + ).execute() + .getAliases(); + Assert.assertNotNull("Course not returned.", course); + Assert.assertTrue("No course aliases exist.", courseAliases.size() > 0); + deleteCourse(course.getId()); + } +} \ No newline at end of file diff --git a/classroom/snippets/src/test/java/TestCreateCourseWork.java b/classroom/snippets/src/test/java/TestCreateCourseWork.java new file mode 100644 index 00000000..e3a25b6b --- /dev/null +++ b/classroom/snippets/src/test/java/TestCreateCourseWork.java @@ -0,0 +1,28 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import com.google.api.services.classroom.model.CourseWork; +import java.io.IOException; +import org.junit.Assert; +import org.junit.Test; + +// Unit test class for Create Coursework classroom snippet +public class TestCreateCourseWork extends BaseTest { + + @Test + public void testCreateCoursework() throws IOException { + CourseWork courseWork = CreateCourseWork.createCourseWork(testCourse.getId()); + Assert.assertNotNull("Coursework not returned.", courseWork); + } +} diff --git a/classroom/snippets/src/test/java/TestCreateTopic.java b/classroom/snippets/src/test/java/TestCreateTopic.java new file mode 100644 index 00000000..e2d77586 --- /dev/null +++ b/classroom/snippets/src/test/java/TestCreateTopic.java @@ -0,0 +1,28 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import com.google.api.services.classroom.model.Topic; +import java.io.IOException; +import org.junit.Assert; +import org.junit.Test; + +// Unit test class for Create Topic classroom snippet +public class TestCreateTopic extends BaseTest { + + @Test + public void testCreateTopic() throws IOException { + Topic topic = CreateTopic.createTopic(testCourse.getId()); + Assert.assertNotNull("Topic not returned.", topic); + } +} diff --git a/classroom/snippets/src/test/java/TestDeleteTopic.java b/classroom/snippets/src/test/java/TestDeleteTopic.java new file mode 100644 index 00000000..b093865c --- /dev/null +++ b/classroom/snippets/src/test/java/TestDeleteTopic.java @@ -0,0 +1,29 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.services.classroom.model.Topic; +import java.io.IOException; +import org.junit.Assert; +import org.junit.Test; + +public class TestDeleteTopic extends BaseTest { + @Test + public void testDeleteTopic() throws IOException { + Topic topic = CreateTopic.createTopic(testCourse.getId()); + DeleteTopic.deleteTopic(testCourse.getId(), topic.getTopicId()); + Assert.assertThrows(GoogleJsonResponseException.class, + () -> GetTopic.getTopic(testCourse.getId(), topic.getTopicId())); + } +} diff --git a/classroom/snippets/src/test/java/TestGetTopic.java b/classroom/snippets/src/test/java/TestGetTopic.java new file mode 100644 index 00000000..b7cb7840 --- /dev/null +++ b/classroom/snippets/src/test/java/TestGetTopic.java @@ -0,0 +1,31 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import com.google.api.services.classroom.model.Topic; +import java.io.IOException; +import org.junit.Assert; +import org.junit.Test; + +// Unit test class for Get Topic classroom snippet +public class TestGetTopic extends BaseTest { + + @Test + public void testGetTopic() throws IOException { + Topic topic = CreateTopic.createTopic(testCourse.getId()); + Topic getTopic = GetTopic.getTopic(testCourse.getId(), topic.getTopicId()); + Assert.assertNotNull("Topic could not be created.", topic); + Assert.assertNotNull("Topic could not be retrieved.", getTopic); + Assert.assertEquals("Wrong topic was retrieved.", topic, getTopic); + } +} diff --git a/classroom/snippets/src/test/java/TestListTopics.java b/classroom/snippets/src/test/java/TestListTopics.java new file mode 100644 index 00000000..081be57b --- /dev/null +++ b/classroom/snippets/src/test/java/TestListTopics.java @@ -0,0 +1,31 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import com.google.api.services.classroom.model.Topic; +import java.io.IOException; +import java.util.List; +import org.junit.Assert; +import org.junit.Test; + +// Unit test class for List Topics classroom snippet +public class TestListTopics extends BaseTest { + + @Test + public void testListTopics() throws IOException { + CreateTopic.createTopic(testCourse.getId()); + List listTopics = ListTopics.listTopics(testCourse.getId()); + Assert.assertNotNull("Topics could not be retrieved.", listTopics); + Assert.assertFalse("No topics were retrieved.", listTopics.size() == 0); + } +} diff --git a/classroom/snippets/src/test/java/TestUpdateTopic.java b/classroom/snippets/src/test/java/TestUpdateTopic.java new file mode 100644 index 00000000..5b1b9eec --- /dev/null +++ b/classroom/snippets/src/test/java/TestUpdateTopic.java @@ -0,0 +1,28 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +import com.google.api.services.classroom.model.Topic; +import java.io.IOException; +import org.junit.Assert; +import org.junit.Test; + +// Unit test class for Update Topic classroom snippet +public class TestUpdateTopic extends BaseTest { + @Test + public void testUpdateTopic() throws IOException { + Topic topic = CreateTopic.createTopic(testCourse.getId()); + System.out.println("New topic created: " + topic.getName()); + Topic updatedTopic = UpdateTopic.updateTopic(testCourse.getId(), topic.getTopicId()); + Assert.assertNotEquals("Topic name was not updated.", topic.getName(), updatedTopic.getName()); + } +} From e49fb413ed95f62a4c0d71dd7ecb20b755585cd7 Mon Sep 17 00:00:00 2001 From: Mahima Desetty <45216855+mahima-desetty@users.noreply.github.com> Date: Mon, 19 Dec 2022 11:17:03 -0600 Subject: [PATCH 245/262] feat: added List, ModifyAttachments, Patch, Return methods for StudentSubmission resource (#467) * add alias snippet and unit test * java snippets for topics, create coursework, create alias * updates based on team review * renamed alias methods, added devsite comments * added missing license header to TestDeleteTopic.java * Adding List, ModifyAttachments, Patch, Return StudentSubmission methods * minor fixes * adding comments for developer * modifications based on team review * modifications based on team review * Adding print statements and devsite tag to ListCourseAliases --- .../src/main/java/CreateCourseWork.java | 5 +- .../snippets/src/main/java/GetTopic.java | 1 + .../src/main/java/ListCourseAliases.java | 8 +- .../src/main/java/ListStudentSubmissions.java | 105 ++++++++++++++++++ .../src/main/java/ListSubmissions.java | 102 +++++++++++++++++ .../snippets/src/main/java/ListTopics.java | 6 +- .../ModifyAttachmentsStudentSubmission.java | 100 +++++++++++++++++ .../src/main/java/PatchStudentSubmission.java | 98 ++++++++++++++++ .../main/java/ReturnStudentSubmission.java | 80 +++++++++++++ .../snippets/src/main/java/UpdateTopic.java | 5 +- .../src/test/java/TestListSubmissions.java | 31 ++++++ 11 files changed, 534 insertions(+), 7 deletions(-) create mode 100644 classroom/snippets/src/main/java/ListStudentSubmissions.java create mode 100644 classroom/snippets/src/main/java/ListSubmissions.java create mode 100644 classroom/snippets/src/main/java/ModifyAttachmentsStudentSubmission.java create mode 100644 classroom/snippets/src/main/java/PatchStudentSubmission.java create mode 100644 classroom/snippets/src/main/java/ReturnStudentSubmission.java create mode 100644 classroom/snippets/src/test/java/TestListSubmissions.java diff --git a/classroom/snippets/src/main/java/CreateCourseWork.java b/classroom/snippets/src/main/java/CreateCourseWork.java index 631ced38..7f9973ca 100644 --- a/classroom/snippets/src/main/java/CreateCourseWork.java +++ b/classroom/snippets/src/main/java/CreateCourseWork.java @@ -80,13 +80,14 @@ public static CourseWork createCourseWork(String courseId) throws IOException { .setDescription("Read about how the SR-71 Blackbird, the world’s fastest and " + "highest-flying manned aircraft, was built.") .setMaterials(materials) - .setDueDate(new Date().setMonth(12).setDay(10).setYear(2022)) - .setDueTime(new TimeOfDay().setHours(15).setMinutes(0)) .setWorkType("ASSIGNMENT") .setState("PUBLISHED"); courseWork = service.courses().courseWork().create(courseId, content) .execute(); + + /* Prints the created courseWork. */ + System.out.printf("CourseWork created: %s\n", courseWork.getTitle()); } catch (GoogleJsonResponseException e) { //TODO (developer) - handle error appropriately GoogleJsonError error = e.getDetails(); diff --git a/classroom/snippets/src/main/java/GetTopic.java b/classroom/snippets/src/main/java/GetTopic.java index 5332bd5c..140a0407 100644 --- a/classroom/snippets/src/main/java/GetTopic.java +++ b/classroom/snippets/src/main/java/GetTopic.java @@ -60,6 +60,7 @@ public static Topic getTopic(String courseId, String topicId) throws IOException try { // Get the topic. topic = service.courses().topics().get(courseId, topicId).execute(); + System.out.printf("Topic '%s' found.\n", topic.getName()); } catch (GoogleJsonResponseException e) { //TODO (developer) - handle error appropriately GoogleJsonError error = e.getDetails(); diff --git a/classroom/snippets/src/main/java/ListCourseAliases.java b/classroom/snippets/src/main/java/ListCourseAliases.java index 171f4fa6..c3141cf1 100644 --- a/classroom/snippets/src/main/java/ListCourseAliases.java +++ b/classroom/snippets/src/main/java/ListCourseAliases.java @@ -13,7 +13,7 @@ // limitations under the License. -// [START classroom_list_aliases] +// [START classroom_list_aliases_class] import com.google.api.client.googleapis.json.GoogleJsonError; import com.google.api.client.googleapis.json.GoogleJsonResponseException; @@ -57,6 +57,8 @@ public static List listCourseAliases(String courseId) .setApplicationName("Classroom samples") .build(); + // [START classroom_list_aliases_code_snippet] + String pageToken = null; List courseAliases = new ArrayList<>(); @@ -89,6 +91,8 @@ public static List listCourseAliases(String courseId) } } return courseAliases; + + // [END classroom_list_aliases_code_snippet] } } -// [END classroom_list_aliases] \ No newline at end of file +// [END classroom_list_aliases_class] \ No newline at end of file diff --git a/classroom/snippets/src/main/java/ListStudentSubmissions.java b/classroom/snippets/src/main/java/ListStudentSubmissions.java new file mode 100644 index 00000000..acc7b898 --- /dev/null +++ b/classroom/snippets/src/main/java/ListStudentSubmissions.java @@ -0,0 +1,105 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + + +// [START classroom_list_student_submissions_class] + +import com.google.api.client.googleapis.json.GoogleJsonError; +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.classroom.Classroom; +import com.google.api.services.classroom.ClassroomScopes; +import com.google.api.services.classroom.model.ListStudentSubmissionsResponse; +import com.google.api.services.classroom.model.StudentSubmission; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +/* Class to demonstrate the use of Classroom List StudentSubmissions API. */ +public class ListStudentSubmissions { + /** + * Retrieves a specific student's submissions for the specified course work. + * + * @param courseId - identifier of the course. + * @param courseWorkId - identifier of the course work. + * @param userId - identifier of the student whose work to return. + * @return - list of student submissions. + * @throws IOException - if credentials file not found. + */ + public static List listStudentSubmissions(String courseId, String courseWorkId, + String userId) throws IOException { + /* Load pre-authorized user credentials from the environment. + TODO(developer) - See https://developers.google.com/identity for + guides on implementing OAuth2 for your application. */ + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Collections.singleton(ClassroomScopes.CLASSROOM_COURSEWORK_STUDENTS)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + + // Create the classroom API client. + Classroom service = new Classroom.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Classroom samples") + .build(); + + // [START classroom_list_student_submissions_code_snippet] + + List studentSubmissions = new ArrayList<>(); + String pageToken = null; + + try { + do { + // Set the userId as a query parameter on the request. + ListStudentSubmissionsResponse response = service.courses().courseWork().studentSubmissions() + .list(courseId, courseWorkId) + .set("userId", userId) + .execute(); + if (response.getStudentSubmissions() != null) { + studentSubmissions.addAll(response.getStudentSubmissions()); + pageToken = response.getNextPageToken(); + } + } while (pageToken != null); + + if (studentSubmissions.isEmpty()) { + System.out.println("No student submission found."); + } else { + for (StudentSubmission submission : studentSubmissions) { + System.out.printf("Student submission: %s.\n", submission.getId()); + } + } + } catch (GoogleJsonResponseException e) { + //TODO (developer) - handle error appropriately + GoogleJsonError error = e.getDetails(); + if (error.getCode() == 404) { + System.out.printf("The courseId (%s), courseWorkId (%s), or userId (%s) does " + + "not exist.\n", courseId, courseWorkId, userId); + } else { + throw e; + } + } catch (Exception e) { + throw e; + } + return studentSubmissions; + + // [END classroom_list_student_submissions_code_snippet] + + } +} +// [END classroom_list_student_submissions_class] \ No newline at end of file diff --git a/classroom/snippets/src/main/java/ListSubmissions.java b/classroom/snippets/src/main/java/ListSubmissions.java new file mode 100644 index 00000000..ed5898de --- /dev/null +++ b/classroom/snippets/src/main/java/ListSubmissions.java @@ -0,0 +1,102 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + + +// [START classroom_list_submissions_class] + +import com.google.api.client.googleapis.json.GoogleJsonError; +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.classroom.Classroom; +import com.google.api.services.classroom.ClassroomScopes; +import com.google.api.services.classroom.model.ListStudentSubmissionsResponse; +import com.google.api.services.classroom.model.StudentSubmission; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +/* Class to demonstrate the use of Classroom List StudentSubmissions API. */ +public class ListSubmissions { + /** + * Retrieves submissions for all students for the specified course work in a course. + * + * @param courseId - identifier of the course. + * @param courseWorkId - identifier of the course work. + * @return - list of student submissions. + * @throws IOException - if credentials file not found. + */ + public static List listSubmissions(String courseId, String courseWorkId) + throws IOException { + /* Load pre-authorized user credentials from the environment. + TODO(developer) - See https://developers.google.com/identity for + guides on implementing OAuth2 for your application. */ + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Collections.singleton(ClassroomScopes.CLASSROOM_COURSEWORK_STUDENTS)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + + // Create the classroom API client. + Classroom service = new Classroom.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Classroom samples") + .build(); + + // [START classroom_list_submissions_code_snippet] + + List studentSubmissions = new ArrayList<>(); + String pageToken = null; + + try { + do { + ListStudentSubmissionsResponse response = service.courses().courseWork().studentSubmissions() + .list(courseId, courseWorkId) + .execute(); + if (response.getStudentSubmissions() != null) { + studentSubmissions.addAll(response.getStudentSubmissions()); + } + } while (pageToken != null); + + if (studentSubmissions.isEmpty()) { + System.out.println("No student submission found."); + } else { + for (StudentSubmission submission : studentSubmissions) { + System.out.printf("Student id (%s), student submission id (%s)\n", submission.getUserId(), + submission.getId()); + } + } + } catch (GoogleJsonResponseException e) { + //TODO (developer) - handle error appropriately + GoogleJsonError error = e.getDetails(); + if (error.getCode() == 404) { + System.out.printf("The courseId (%s) or courseWorkId (%s) does not exist.\n", courseId, + courseWorkId); + } else { + throw e; + } + } catch (Exception e) { + throw e; + } + return studentSubmissions; + + // [END classroom_list_submissions_code_snippet] + + } +} +// [END classroom_list_submissions_class] \ No newline at end of file diff --git a/classroom/snippets/src/main/java/ListTopics.java b/classroom/snippets/src/main/java/ListTopics.java index 61ea9b89..e754f82b 100644 --- a/classroom/snippets/src/main/java/ListTopics.java +++ b/classroom/snippets/src/main/java/ListTopics.java @@ -67,8 +67,10 @@ public static List listTopics(String courseId) throws IOException { .setPageSize(100) .setPageToken(pageToken) .execute(); - topics.addAll(response.getTopic()); - pageToken = response.getNextPageToken(); + if (response.getTopic() != null) { + topics.addAll(response.getTopic()); + pageToken = response.getNextPageToken(); + } } while (pageToken != null); if (topics.isEmpty()) { diff --git a/classroom/snippets/src/main/java/ModifyAttachmentsStudentSubmission.java b/classroom/snippets/src/main/java/ModifyAttachmentsStudentSubmission.java new file mode 100644 index 00000000..252f51f5 --- /dev/null +++ b/classroom/snippets/src/main/java/ModifyAttachmentsStudentSubmission.java @@ -0,0 +1,100 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + + +// [START classroom_modify_attachments_student_submissions_class] + +import com.google.api.client.googleapis.json.GoogleJsonError; +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.classroom.Classroom; +import com.google.api.services.classroom.ClassroomScopes; +import com.google.api.services.classroom.model.Attachment; +import com.google.api.services.classroom.model.Link; +import com.google.api.services.classroom.model.ModifyAttachmentsRequest; +import com.google.api.services.classroom.model.StudentSubmission; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; +import java.io.IOException; +import java.util.Arrays; +import java.util.Collections; + +/* Class to demonstrate the use of Classroom ModifyAttachments StudentSubmissions API. */ +public class ModifyAttachmentsStudentSubmission { + /** + * Modify attachments on a student submission. + * + * @param courseId - identifier of the course. + * @param courseWorkId - identifier of the course work. + * @param id - identifier of the student submission. + * @return - the modified student submission. + * @throws IOException - if credentials file not found. + */ + public static StudentSubmission modifyAttachments(String courseId, String courseWorkId, String id) + throws IOException { + /* Load pre-authorized user credentials from the environment. + TODO(developer) - See https://developers.google.com/identity for + guides on implementing OAuth2 for your application. */ + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Collections.singleton(ClassroomScopes.CLASSROOM_COURSEWORK_STUDENTS)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + + // Create the classroom API client. + Classroom service = new Classroom.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Classroom samples") + .build(); + + // [START classroom_modify_attachments_student_submissions_code_snippet] + + StudentSubmission studentSubmission = null; + try { + // Create ModifyAttachmentRequest object that includes a new attachment with a link. + Link link = new Link().setUrl("https://en.wikipedia.org/wiki/Irrational_number"); + Attachment attachment = new Attachment().setLink(link); + ModifyAttachmentsRequest modifyAttachmentsRequest = new ModifyAttachmentsRequest() + .setAddAttachments(Arrays.asList(attachment)); + + // The modified studentSubmission object is returned with the new attachment added to it. + studentSubmission = service.courses().courseWork().studentSubmissions().modifyAttachments( + courseId, courseWorkId, id, modifyAttachmentsRequest) + .execute(); + + /* Prints the modified student submission. */ + System.out.printf("Modified student submission attachments: '%s'.\n", studentSubmission + .getAssignmentSubmission() + .getAttachments()); + } catch (GoogleJsonResponseException e) { + //TODO (developer) - handle error appropriately + GoogleJsonError error = e.getDetails(); + if (error.getCode() == 404) { + System.out.printf("The courseId (%s), courseWorkId (%s), or studentSubmissionId (%s) does " + + "not exist.\n", courseId, courseWorkId, id); + } else { + throw e; + } + } catch(Exception e) { + throw e; + } + return studentSubmission; + + // [END classroom_modify_attachments_student_submissions_code_snippet] + + } +} +// [END classroom_modify_attachments_student_submissions_class] \ No newline at end of file diff --git a/classroom/snippets/src/main/java/PatchStudentSubmission.java b/classroom/snippets/src/main/java/PatchStudentSubmission.java new file mode 100644 index 00000000..1690ef8e --- /dev/null +++ b/classroom/snippets/src/main/java/PatchStudentSubmission.java @@ -0,0 +1,98 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + + +// [START classroom_patch_student_submissions_class] + +import com.google.api.client.googleapis.json.GoogleJsonError; +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.classroom.Classroom; +import com.google.api.services.classroom.ClassroomScopes; +import com.google.api.services.classroom.model.StudentSubmission; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; +import java.io.IOException; +import java.util.Collections; + +/* Class to demonstrate the use of Classroom Patch StudentSubmissions API. */ +public class PatchStudentSubmission { + /** + * Updates the draft grade and/or assigned grade of a student submission. + * + * @param courseId - identifier of the course. + * @param courseWorkId - identifier of the course work. + * @param id - identifier of the student submission. + * @return - the updated student submission. + * @throws IOException - if credentials file not found. + */ + public static StudentSubmission patchStudentSubmission(String courseId, String courseWorkId, + String id) throws IOException { + /* Load pre-authorized user credentials from the environment. + TODO(developer) - See https://developers.google.com/identity for + guides on implementing OAuth2 for your application. */ + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Collections.singleton(ClassroomScopes.CLASSROOM_COURSEWORK_STUDENTS)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + + // Create the classroom API client. + Classroom service = new Classroom.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Classroom samples") + .build(); + + // [START classroom_patch_student_submissions_code_snippet] + + StudentSubmission studentSubmission = null; + try { + // Updating the draftGrade and assignedGrade fields for the specific student submission. + StudentSubmission content = service.courses().courseWork().studentSubmissions() + .get(courseId, courseWorkId, id) + .execute(); + content.setAssignedGrade(90.00); + content.setDraftGrade(80.00); + + // The updated studentSubmission object is returned with the new draftGrade and assignedGrade. + studentSubmission = service.courses().courseWork().studentSubmissions() + .patch(courseId, courseWorkId, id, content) + .set("updateMask", "draftGrade,assignedGrade") + .execute(); + + /* Prints the updated student submission. */ + System.out.printf("Updated student submission draft grade (%s) and assigned grade (%s).\n", + studentSubmission.getDraftGrade(), + studentSubmission.getAssignedGrade()); + } catch (GoogleJsonResponseException e) { + //TODO (developer) - handle error appropriately + GoogleJsonError error = e.getDetails(); + if (error.getCode() == 404) { + System.out.printf("The courseId (%s), courseWorkId (%s), or studentSubmissionId (%s) does " + + "not exist.\n", courseId, courseWorkId, id); + } else { + throw e; + } + } catch (Exception e) { + throw e; + } + return studentSubmission; + + // [END classroom_patch_student_submissions_code_snippet] + + } +} +// [END classroom_patch_student_submissions_class] \ No newline at end of file diff --git a/classroom/snippets/src/main/java/ReturnStudentSubmission.java b/classroom/snippets/src/main/java/ReturnStudentSubmission.java new file mode 100644 index 00000000..6b40fc96 --- /dev/null +++ b/classroom/snippets/src/main/java/ReturnStudentSubmission.java @@ -0,0 +1,80 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + + +// [START classroom_return_student_submissions_class] + +import com.google.api.client.googleapis.json.GoogleJsonError; +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.classroom.Classroom; +import com.google.api.services.classroom.ClassroomScopes; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; +import java.io.IOException; +import java.util.Collections; + +/* Class to demonstrate the use of Classroom Return StudentSubmissions API. */ +public class ReturnStudentSubmission { + /** + * Return a student submission back to the student which updates the submission state to `RETURNED`. + * + * @param courseId - identifier of the course. + * @param courseWorkId - identifier of the course work. + * @param id - identifier of the student submission. + * @throws IOException - if credentials file not found. + */ + public static void returnSubmission(String courseId, String courseWorkId, String id) + throws IOException { + /* Load pre-authorized user credentials from the environment. + TODO(developer) - See https://developers.google.com/identity for + guides on implementing OAuth2 for your application. */ + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Collections.singleton(ClassroomScopes.CLASSROOM_COURSEWORK_STUDENTS)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( + credentials); + + // Create the classroom API client. + Classroom service = new Classroom.Builder(new NetHttpTransport(), + GsonFactory.getDefaultInstance(), + requestInitializer) + .setApplicationName("Classroom samples") + .build(); + + // [START classroom_return_student_submissions_code_snippet] + + try { + service.courses().courseWork().studentSubmissions() + .classroomReturn(courseId, courseWorkId, id, null) + .execute(); + } catch (GoogleJsonResponseException e) { + //TODO (developer) - handle error appropriately + GoogleJsonError error = e.getDetails(); + if (error.getCode() == 404) { + System.out.printf("The courseId (%s), courseWorkId (%s), or studentSubmissionId (%s) does " + + "not exist.\n", courseId, courseWorkId, id); + } else { + throw e; + } + } catch (Exception e) { + throw e; + } + + // [END classroom_return_student_submissions_code_snippet] + + } +} +// [END classroom_return_student_submissions_class] diff --git a/classroom/snippets/src/main/java/UpdateTopic.java b/classroom/snippets/src/main/java/UpdateTopic.java index 770bee30..f45ffeca 100644 --- a/classroom/snippets/src/main/java/UpdateTopic.java +++ b/classroom/snippets/src/main/java/UpdateTopic.java @@ -69,7 +69,10 @@ public static Topic updateTopic(String courseId, String topicId) throws IOExcept topic = service.courses().topics().patch(courseId, topicId, topicToUpdate) .set("updateMask", "name") .execute(); - } catch(GoogleJsonResponseException e) { + + /* Prints the updated topic. */ + System.out.printf("Topic '%s' updated.\n", topic.getName()); + } catch (GoogleJsonResponseException e) { // TODO(developer) - handle error appropriately GoogleJsonError error = e.getDetails(); if (error.getCode() == 404) { diff --git a/classroom/snippets/src/test/java/TestListSubmissions.java b/classroom/snippets/src/test/java/TestListSubmissions.java new file mode 100644 index 00000000..148e9529 --- /dev/null +++ b/classroom/snippets/src/test/java/TestListSubmissions.java @@ -0,0 +1,31 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import com.google.api.services.classroom.model.StudentSubmission; +import java.io.IOException; +import java.util.List; +import org.junit.Assert; +import org.junit.Test; + +// Unit test class for ListSubmissions classroom snippet +public class TestListSubmissions extends BaseTest { + + @Test + public void testListSubmissions() throws IOException { + List submissions = ListSubmissions.listSubmissions( + testCourse.getId(), + "-"); + Assert.assertNotNull("No submissions returned.", submissions); + } +} From 8718e29af586e50c912eb15aa48c57377fd1f2a6 Mon Sep 17 00:00:00 2001 From: Mahima Desetty <45216855+mahima-desetty@users.noreply.github.com> Date: Tue, 17 Jan 2023 12:44:14 -0500 Subject: [PATCH 246/262] feat: added Guardian and Guardian Invitation code snippets. (#528) * add alias snippet and unit test * java snippets for topics, create coursework, create alias * updates based on team review * renamed alias methods, added devsite comments * added missing license header to TestDeleteTopic.java * Adding List, ModifyAttachments, Patch, Return StudentSubmission methods * minor fixes * adding comments for developer * modifications based on team review * modifications based on team review * Adding print statements and devsite tag to ListCourseAliases * added class templates for guardians and guardianInvitations * guardian and guardian invitation implementation * tests for list guardians and list guardian invitations * adding tests for guardians and guardian invites. removing use of ADC for auth. * base test updates * updates based on team feedback * fixing BaseTest.java * updating copyright year to 2023 for new files * testing google-java-format plugin to fix lint errors * updated files after running google-java-format plugin * updated BaseTest * fixing copyright header for BaseTest --- classroom/snippets/build.gradle | 6 +- .../main/java/CancelGuardianInvitation.java | 97 +++++++++++++++++ .../src/main/java/ClassroomCredentials.java | 64 +++++++++++ .../main/java/CreateGuardianInvitation.java | 90 ++++++++++++++++ .../src/main/java/DeleteGuardian.java | 66 ++++++++++++ .../snippets/src/main/java/GetGuardian.java | 74 +++++++++++++ .../ListGuardianInvitationsByStudent.java | 102 ++++++++++++++++++ .../snippets/src/main/java/ListGuardians.java | 99 +++++++++++++++++ .../src/main/java/ListStudentSubmissions.java | 51 +++++---- .../src/main/java/ListSubmissions.java | 50 +++++---- .../snippets/src/main/java/ListTopics.java | 39 ++++--- .../snippets/src/test/java/BaseTest.java | 68 ++++++------ .../java/TestCancelGuardianInvitation.java | 37 +++++++ .../java/TestCreateGuardianInvitation.java | 31 ++++++ .../src/test/java/TestDeleteGuardian.java | 31 ++++++ .../TestListGuardianInvitationsByStudent.java | 31 ++++++ .../src/test/java/TestListGuardians.java | 30 ++++++ 17 files changed, 868 insertions(+), 98 deletions(-) create mode 100644 classroom/snippets/src/main/java/CancelGuardianInvitation.java create mode 100644 classroom/snippets/src/main/java/ClassroomCredentials.java create mode 100644 classroom/snippets/src/main/java/CreateGuardianInvitation.java create mode 100644 classroom/snippets/src/main/java/DeleteGuardian.java create mode 100644 classroom/snippets/src/main/java/GetGuardian.java create mode 100644 classroom/snippets/src/main/java/ListGuardianInvitationsByStudent.java create mode 100644 classroom/snippets/src/main/java/ListGuardians.java create mode 100644 classroom/snippets/src/test/java/TestCancelGuardianInvitation.java create mode 100644 classroom/snippets/src/test/java/TestCreateGuardianInvitation.java create mode 100644 classroom/snippets/src/test/java/TestDeleteGuardian.java create mode 100644 classroom/snippets/src/test/java/TestListGuardianInvitationsByStudent.java create mode 100644 classroom/snippets/src/test/java/TestListGuardians.java diff --git a/classroom/snippets/build.gradle b/classroom/snippets/build.gradle index 6971123c..8def0b0f 100644 --- a/classroom/snippets/build.gradle +++ b/classroom/snippets/build.gradle @@ -7,9 +7,13 @@ repositories { dependencies { implementation 'com.google.api-client:google-api-client:2.0.0' - implementation 'com.google.auth:google-auth-library-oauth2-http:1.11.0' + implementation 'com.google.oauth-client:google-oauth-client-jetty:1.34.1' implementation 'com.google.apis:google-api-services-classroom:v1-rev20220323-2.0.0' testImplementation 'junit:junit:4.13.2' + + /** This will be removed once all the classes have been updated to use the + * ClassroomCredentials class. */ + implementation 'com.google.auth:google-auth-library-oauth2-http:1.11.0' } test { diff --git a/classroom/snippets/src/main/java/CancelGuardianInvitation.java b/classroom/snippets/src/main/java/CancelGuardianInvitation.java new file mode 100644 index 00000000..33585400 --- /dev/null +++ b/classroom/snippets/src/main/java/CancelGuardianInvitation.java @@ -0,0 +1,97 @@ +// Copyright 2023 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// [START classroom_cancel_guardian_invitation_class] + +import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport; +import com.google.api.client.googleapis.json.GoogleJsonError; +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.classroom.Classroom; +import com.google.api.services.classroom.ClassroomScopes; +import com.google.api.services.classroom.model.GuardianInvitation; +import java.io.IOException; +import java.util.Collections; +import java.util.List; + +/* Class to demonstrate the use of Classroom Patch Guardian Invitation API. */ +public class CancelGuardianInvitation { + /** + * Cancel a guardian invitation by modifying the state of the invite. + * + * @param studentId - the id of the student. + * @param invitationId - the id of the guardian invitation to modify. + * @return - the modified guardian invitation. + * @throws IOException - if credentials file not found. + */ + public static GuardianInvitation cancelGuardianInvitation(String studentId, String invitationId) + throws Exception { + + /* Scopes required by this API call. If modifying these scopes, delete your previously saved + tokens/ folder. */ + final List SCOPES = + Collections.singletonList(ClassroomScopes.CLASSROOM_GUARDIANLINKS_STUDENTS); + + // Create the classroom API client + final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport(); + Classroom service = + new Classroom.Builder( + HTTP_TRANSPORT, + GsonFactory.getDefaultInstance(), + ClassroomCredentials.getCredentials(HTTP_TRANSPORT, SCOPES)) + .setApplicationName("Classroom samples") + .build(); + + // [START classroom_cancel_guardian_invitation_code_snippet] + + GuardianInvitation guardianInvitation = null; + + try { + /* Change the state of the GuardianInvitation from PENDING to COMPLETE. See + https://developers.google.com/classroom/reference/rest/v1/userProfiles.guardianInvitations#guardianinvitationstate + for other possible states of guardian invitations. */ + GuardianInvitation content = + service.userProfiles().guardianInvitations().get(studentId, invitationId).execute(); + content.setState("COMPLETE"); + + guardianInvitation = + service + .userProfiles() + .guardianInvitations() + .patch(studentId, invitationId, content) + .set("updateMask", "state") + .execute(); + + System.out.printf( + "Invitation (%s) state set to %s\n.", + guardianInvitation.getInvitationId(), guardianInvitation.getState()); + } catch (GoogleJsonResponseException e) { + // TODO (developer) - handle error appropriately + GoogleJsonError error = e.getDetails(); + if (error.getCode() == 404) { + System.out.printf( + "There is no record of studentId (%s) or invitationId (%s).", studentId, invitationId); + } else { + throw e; + } + } catch (Exception e) { + throw e; + } + return guardianInvitation; + + // [END classroom_cancel_guardian_invitation_code_snippet] + } +} +// [END classroom_cancel_guardian_invitation_class] diff --git a/classroom/snippets/src/main/java/ClassroomCredentials.java b/classroom/snippets/src/main/java/ClassroomCredentials.java new file mode 100644 index 00000000..70cd5d94 --- /dev/null +++ b/classroom/snippets/src/main/java/ClassroomCredentials.java @@ -0,0 +1,64 @@ +// Copyright 2023 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import com.google.api.client.auth.oauth2.Credential; +import com.google.api.client.extensions.java6.auth.oauth2.AuthorizationCodeInstalledApp; +import com.google.api.client.extensions.jetty.auth.oauth2.LocalServerReceiver; +import com.google.api.client.googleapis.auth.oauth2.GoogleAuthorizationCodeFlow; +import com.google.api.client.googleapis.auth.oauth2.GoogleClientSecrets; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.JsonFactory; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.client.util.store.FileDataStoreFactory; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.util.Collection; + +public class ClassroomCredentials { + private static final JsonFactory JSON_FACTORY = GsonFactory.getDefaultInstance(); + private static final String TOKENS_DIRECTORY_PATH = "tokens"; + private static final String CREDENTIALS_FILE_PATH = "/credentials.json"; + + /** + * Creates an authorized Credential object. + * + * @param HTTP_TRANSPORT The network HTTP Transport. + * @param SCOPES The scopes required to make the API call. + * @return An authorized Credential object. + * @throws IOException If the credentials.json file cannot be found. + */ + static Credential getCredentials(final NetHttpTransport HTTP_TRANSPORT, Collection SCOPES) + throws IOException { + // Load client secrets. + InputStream in = ClassroomCredentials.class.getResourceAsStream(CREDENTIALS_FILE_PATH); + if (in == null) { + throw new FileNotFoundException("Resource not found: " + CREDENTIALS_FILE_PATH); + } + + GoogleClientSecrets clientSecrets = + GoogleClientSecrets.load(JSON_FACTORY, new InputStreamReader(in)); + + // Build flow and trigger user authorization request. + GoogleAuthorizationCodeFlow flow = + new GoogleAuthorizationCodeFlow.Builder(HTTP_TRANSPORT, JSON_FACTORY, clientSecrets, SCOPES) + .setDataStoreFactory(new FileDataStoreFactory(new java.io.File(TOKENS_DIRECTORY_PATH))) + .setAccessType("offline") + .build(); + + LocalServerReceiver receiver = new LocalServerReceiver.Builder().setPort(8888).build(); + return new AuthorizationCodeInstalledApp(flow, receiver).authorize("user"); + } +} diff --git a/classroom/snippets/src/main/java/CreateGuardianInvitation.java b/classroom/snippets/src/main/java/CreateGuardianInvitation.java new file mode 100644 index 00000000..cb3fe374 --- /dev/null +++ b/classroom/snippets/src/main/java/CreateGuardianInvitation.java @@ -0,0 +1,90 @@ +// Copyright 2023 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// [START classroom_create_guardian_invitation_class] + +import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport; +import com.google.api.client.googleapis.json.GoogleJsonError; +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.classroom.Classroom; +import com.google.api.services.classroom.ClassroomScopes; +import com.google.api.services.classroom.model.GuardianInvitation; +import java.io.IOException; +import java.util.Collections; +import java.util.List; + +/* Class to demonstrate the use of Classroom Create Guardian Invitation API. */ +public class CreateGuardianInvitation { + /** + * Creates a guardian invitation by sending an email to the guardian for confirmation. + * + * @param studentId - the id of the student. + * @param guardianEmail - email to send the guardian invitation to. + * @return - the newly created guardian invitation. + * @throws IOException - if credentials file not found. + */ + public static GuardianInvitation createGuardianInvitation(String studentId, String guardianEmail) + throws Exception { + + /* Scopes required by this API call. If modifying these scopes, delete your previously saved + tokens/ folder. */ + final List SCOPES = + Collections.singletonList(ClassroomScopes.CLASSROOM_GUARDIANLINKS_STUDENTS); + + // Create the classroom API client + final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport(); + Classroom service = + new Classroom.Builder( + HTTP_TRANSPORT, + GsonFactory.getDefaultInstance(), + ClassroomCredentials.getCredentials(HTTP_TRANSPORT, SCOPES)) + .setApplicationName("Classroom samples") + .build(); + + // [START classroom_create_guardian_invitation_code_snippet] + + GuardianInvitation guardianInvitation = null; + + /* Create a GuardianInvitation object with state set to PENDING. See + https://developers.google.com/classroom/reference/rest/v1/userProfiles.guardianInvitations#guardianinvitationstate + for other possible states of guardian invitations. */ + GuardianInvitation content = + new GuardianInvitation() + .setStudentId(studentId) + .setInvitedEmailAddress(guardianEmail) + .setState("PENDING"); + try { + guardianInvitation = + service.userProfiles().guardianInvitations().create(studentId, content).execute(); + + System.out.printf("Invitation created: %s\n", guardianInvitation.getInvitationId()); + } catch (GoogleJsonResponseException e) { + // TODO (developer) - handle error appropriately + GoogleJsonError error = e.getDetails(); + if (error.getCode() == 404) { + System.out.printf("There is no record of studentId: %s", studentId); + } else { + throw e; + } + } catch (Exception e) { + throw e; + } + return guardianInvitation; + + // [END classroom_create_guardian_invitation_code_snippet] + } +} +// [END classroom_create_guardian_invitation_class] diff --git a/classroom/snippets/src/main/java/DeleteGuardian.java b/classroom/snippets/src/main/java/DeleteGuardian.java new file mode 100644 index 00000000..7cc67a23 --- /dev/null +++ b/classroom/snippets/src/main/java/DeleteGuardian.java @@ -0,0 +1,66 @@ +// Copyright 2023 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// [START classroom_delete_guardian_class] + +import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport; +import com.google.api.client.googleapis.json.GoogleJsonError; +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.classroom.Classroom; +import com.google.api.services.classroom.ClassroomScopes; +import java.io.IOException; +import java.util.Collections; +import java.util.List; + +/* Class to demonstrate the use of Classroom Delete Guardian API. */ +public class DeleteGuardian { + /** + * Delete a guardian for a specific student. + * + * @param studentId - the id of the student the guardian belongs to. + * @param guardianId - the id of the guardian to delete. + * @throws IOException - if credentials file not found. + */ + public static void deleteGuardian(String studentId, String guardianId) throws Exception { + /* Scopes required by this API call. If modifying these scopes, delete your previously saved + tokens/ folder. */ + final List SCOPES = + Collections.singletonList(ClassroomScopes.CLASSROOM_GUARDIANLINKS_STUDENTS); + + // Create the classroom API client + final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport(); + Classroom service = + new Classroom.Builder( + HTTP_TRANSPORT, + GsonFactory.getDefaultInstance(), + ClassroomCredentials.getCredentials(HTTP_TRANSPORT, SCOPES)) + .setApplicationName("Classroom samples") + .build(); + + // [START classroom_delete_guardian_code_snippet] + try { + service.userProfiles().guardians().delete(studentId, guardianId).execute(); + System.out.printf("The guardian with id %s was deleted.\n", guardianId); + } catch (GoogleJsonResponseException e) { + GoogleJsonError error = e.getDetails(); + if (error.getCode() == 404) { + System.out.printf("There is no record of guardianId (%s).", guardianId); + } + } + // [END classroom_delete_guardian_code_snippet] + } +} +// [END classroom_delete_guardian_class] diff --git a/classroom/snippets/src/main/java/GetGuardian.java b/classroom/snippets/src/main/java/GetGuardian.java new file mode 100644 index 00000000..781b6728 --- /dev/null +++ b/classroom/snippets/src/main/java/GetGuardian.java @@ -0,0 +1,74 @@ +// Copyright 2023 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// [START classroom_get_guardian_class] + +import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport; +import com.google.api.client.googleapis.json.GoogleJsonError; +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.classroom.Classroom; +import com.google.api.services.classroom.ClassroomScopes; +import com.google.api.services.classroom.model.Guardian; +import java.io.IOException; +import java.util.Collections; +import java.util.List; + +/* Class to demonstrate the use of Classroom Get Guardian API. */ +public class GetGuardian { + /** + * Retrieve a guardian for a specific student. + * + * @param studentId - the id of the student the guardian belongs to. + * @param guardianId - the id of the guardian to delete. + * @throws IOException - if credentials file not found. + */ + public static void getGuardian(String studentId, String guardianId) throws Exception { + /* Scopes required by this API call. If modifying these scopes, delete your previously saved + tokens/ folder. */ + final List SCOPES = + Collections.singletonList(ClassroomScopes.CLASSROOM_GUARDIANLINKS_STUDENTS); + + // Create the classroom API client + final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport(); + Classroom service = + new Classroom.Builder( + HTTP_TRANSPORT, + GsonFactory.getDefaultInstance(), + ClassroomCredentials.getCredentials(HTTP_TRANSPORT, SCOPES)) + .setApplicationName("Classroom samples") + .build(); + + // [START classroom_get_guardian_code_snippet] + Guardian guardian = null; + + try { + guardian = service.userProfiles().guardians().get(studentId, guardianId).execute(); + System.out.printf("Guardian retrieved: %s", guardian.getInvitedEmailAddress()); + } catch (GoogleJsonResponseException e) { + GoogleJsonError error = e.getDetails(); + if (error.getCode() == 404) { + System.err.printf("There is no record of guardianId (%s).\n", guardianId); + throw e; + } else { + throw e; + } + } catch (Exception e) { + throw e; + } + // [END classroom_get_guardian_code_snippet] + } +} +// [END classroom_get_guardian_class] diff --git a/classroom/snippets/src/main/java/ListGuardianInvitationsByStudent.java b/classroom/snippets/src/main/java/ListGuardianInvitationsByStudent.java new file mode 100644 index 00000000..b565f44d --- /dev/null +++ b/classroom/snippets/src/main/java/ListGuardianInvitationsByStudent.java @@ -0,0 +1,102 @@ +// Copyright 2023 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// [START classroom_list_guardian_invitations_class] + +import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport; +import com.google.api.client.googleapis.json.GoogleJsonError; +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.classroom.Classroom; +import com.google.api.services.classroom.ClassroomScopes; +import com.google.api.services.classroom.model.GuardianInvitation; +import com.google.api.services.classroom.model.ListGuardianInvitationsResponse; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +/* Class to demonstrate the use of Classroom List Guardian Invitations API. */ +public class ListGuardianInvitationsByStudent { + /** + * Retrieves guardian invitations by student. + * + * @param studentId - the id of the student. + * @return a list of guardian invitations that were sent for a specific student. + * @throws IOException - if credentials file not found. + */ + public static List listGuardianInvitationsByStudent(String studentId) + throws Exception { + + /* Scopes required by this API call. If modifying these scopes, delete your previously saved + tokens/ folder. */ + final List SCOPES = + Collections.singletonList(ClassroomScopes.CLASSROOM_GUARDIANLINKS_STUDENTS); + + // Create the classroom API client + final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport(); + Classroom service = + new Classroom.Builder( + HTTP_TRANSPORT, + GsonFactory.getDefaultInstance(), + ClassroomCredentials.getCredentials(HTTP_TRANSPORT, SCOPES)) + .setApplicationName("Classroom samples") + .build(); + + // [START classroom_list_guardian_invitations_code_snippet] + + List guardianInvitations = new ArrayList<>(); + String pageToken = null; + + try { + do { + ListGuardianInvitationsResponse response = + service + .userProfiles() + .guardianInvitations() + .list(studentId) + .setPageToken(pageToken) + .execute(); + + /* Ensure that the response is not null before retrieving data from it to avoid errors. */ + if (response.getGuardianInvitations() != null) { + guardianInvitations.addAll(response.getGuardianInvitations()); + pageToken = response.getNextPageToken(); + } + } while (pageToken != null); + + if (guardianInvitations.isEmpty()) { + System.out.println("No guardian invitations found."); + } else { + for (GuardianInvitation invitation : guardianInvitations) { + System.out.printf("Guardian invitation id: %s\n", invitation.getInvitationId()); + } + } + } catch (GoogleJsonResponseException e) { + GoogleJsonError error = e.getDetails(); + if (error.getCode() == 404) { + System.out.printf("There is no record of studentId (%s).", studentId); + } else { + throw e; + } + } catch (Exception e) { + throw e; + } + return guardianInvitations; + + // [END classroom_list_guardian_invitations_code_snippet] + } +} +// [END classroom_list_guardian_invitations_class] diff --git a/classroom/snippets/src/main/java/ListGuardians.java b/classroom/snippets/src/main/java/ListGuardians.java new file mode 100644 index 00000000..1cb87014 --- /dev/null +++ b/classroom/snippets/src/main/java/ListGuardians.java @@ -0,0 +1,99 @@ +// Copyright 2023 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// [START classroom_list_guardians_class] + +import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport; +import com.google.api.client.googleapis.json.GoogleJsonError; +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.classroom.Classroom; +import com.google.api.services.classroom.ClassroomScopes; +import com.google.api.services.classroom.model.Guardian; +import com.google.api.services.classroom.model.ListGuardiansResponse; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +/* Class to demonstrate the use of Classroom List Guardians API. */ +public class ListGuardians { + /** + * Retrieves active guardians for a specific student. + * + * @param studentId - the id of the student. + * @return a list of active guardians for a specific student. + * @throws IOException - if credentials file not found. + */ + public static List listGuardians(String studentId) throws Exception { + /* Scopes required by this API call. If modifying these scopes, delete your previously saved + tokens/ folder. */ + final List SCOPES = + Collections.singletonList(ClassroomScopes.CLASSROOM_GUARDIANLINKS_STUDENTS); + + final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport(); + Classroom service = + new Classroom.Builder( + HTTP_TRANSPORT, + GsonFactory.getDefaultInstance(), + ClassroomCredentials.getCredentials(HTTP_TRANSPORT, SCOPES)) + .setApplicationName("Classroom samples") + .build(); + + // [START classroom_list_guardians_code_snippet] + + List guardians = new ArrayList<>(); + String pageToken = null; + + try { + do { + ListGuardiansResponse response = + service.userProfiles().guardians().list(studentId).setPageToken(pageToken).execute(); + + /* Ensure that the response is not null before retrieving data from it to avoid errors. */ + if (response.getGuardians() != null) { + guardians.addAll(response.getGuardians()); + pageToken = response.getNextPageToken(); + } + } while (pageToken != null); + + if (guardians.isEmpty()) { + System.out.println("No guardians found."); + } else { + for (Guardian guardian : guardians) { + System.out.printf( + "Guardian name: %s, guardian id: %s, guardian email: %s\n", + guardian.getGuardianProfile().getName().getFullName(), + guardian.getGuardianId(), + guardian.getInvitedEmailAddress()); + } + } + + } catch (GoogleJsonResponseException e) { + GoogleJsonError error = e.getDetails(); + if (error.getCode() == 404) { + System.out.printf("There is no record of studentId (%s).", studentId); + } else { + throw e; + } + } catch (Exception e) { + throw e; + } + return guardians; + + // [END classroom_list_guardians_code_snippet] + } +} +// [END classroom_list_guardians_class] diff --git a/classroom/snippets/src/main/java/ListStudentSubmissions.java b/classroom/snippets/src/main/java/ListStudentSubmissions.java index acc7b898..c5d8b29f 100644 --- a/classroom/snippets/src/main/java/ListStudentSubmissions.java +++ b/classroom/snippets/src/main/java/ListStudentSubmissions.java @@ -12,7 +12,6 @@ // See the License for the specific language governing permissions and // limitations under the License. - // [START classroom_list_student_submissions_class] import com.google.api.client.googleapis.json.GoogleJsonError; @@ -42,22 +41,22 @@ public class ListStudentSubmissions { * @return - list of student submissions. * @throws IOException - if credentials file not found. */ - public static List listStudentSubmissions(String courseId, String courseWorkId, - String userId) throws IOException { + public static List listStudentSubmissions( + String courseId, String courseWorkId, String userId) throws IOException { /* Load pre-authorized user credentials from the environment. - TODO(developer) - See https://developers.google.com/identity for - guides on implementing OAuth2 for your application. */ - GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() - .createScoped(Collections.singleton(ClassroomScopes.CLASSROOM_COURSEWORK_STUDENTS)); - HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( - credentials); + TODO(developer) - See https://developers.google.com/identity for + guides on implementing OAuth2 for your application. */ + GoogleCredentials credentials = + GoogleCredentials.getApplicationDefault() + .createScoped(Collections.singleton(ClassroomScopes.CLASSROOM_COURSEWORK_STUDENTS)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter(credentials); // Create the classroom API client. - Classroom service = new Classroom.Builder(new NetHttpTransport(), - GsonFactory.getDefaultInstance(), - requestInitializer) - .setApplicationName("Classroom samples") - .build(); + Classroom service = + new Classroom.Builder( + new NetHttpTransport(), GsonFactory.getDefaultInstance(), requestInitializer) + .setApplicationName("Classroom samples") + .build(); // [START classroom_list_student_submissions_code_snippet] @@ -67,10 +66,17 @@ public static List listStudentSubmissions(String courseId, St try { do { // Set the userId as a query parameter on the request. - ListStudentSubmissionsResponse response = service.courses().courseWork().studentSubmissions() - .list(courseId, courseWorkId) - .set("userId", userId) - .execute(); + ListStudentSubmissionsResponse response = + service + .courses() + .courseWork() + .studentSubmissions() + .list(courseId, courseWorkId) + .setPageToken(pageToken) + .set("userId", userId) + .execute(); + + /* Ensure that the response is not null before retrieving data from it to avoid errors. */ if (response.getStudentSubmissions() != null) { studentSubmissions.addAll(response.getStudentSubmissions()); pageToken = response.getNextPageToken(); @@ -85,11 +91,12 @@ public static List listStudentSubmissions(String courseId, St } } } catch (GoogleJsonResponseException e) { - //TODO (developer) - handle error appropriately + // TODO (developer) - handle error appropriately GoogleJsonError error = e.getDetails(); if (error.getCode() == 404) { - System.out.printf("The courseId (%s), courseWorkId (%s), or userId (%s) does " - + "not exist.\n", courseId, courseWorkId, userId); + System.out.printf( + "The courseId (%s), courseWorkId (%s), or userId (%s) does " + "not exist.\n", + courseId, courseWorkId, userId); } else { throw e; } @@ -102,4 +109,4 @@ public static List listStudentSubmissions(String courseId, St } } -// [END classroom_list_student_submissions_class] \ No newline at end of file +// [END classroom_list_student_submissions_class] diff --git a/classroom/snippets/src/main/java/ListSubmissions.java b/classroom/snippets/src/main/java/ListSubmissions.java index ed5898de..d5356d70 100644 --- a/classroom/snippets/src/main/java/ListSubmissions.java +++ b/classroom/snippets/src/main/java/ListSubmissions.java @@ -12,7 +12,6 @@ // See the License for the specific language governing permissions and // limitations under the License. - // [START classroom_list_submissions_class] import com.google.api.client.googleapis.json.GoogleJsonError; @@ -44,19 +43,19 @@ public class ListSubmissions { public static List listSubmissions(String courseId, String courseWorkId) throws IOException { /* Load pre-authorized user credentials from the environment. - TODO(developer) - See https://developers.google.com/identity for - guides on implementing OAuth2 for your application. */ - GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() - .createScoped(Collections.singleton(ClassroomScopes.CLASSROOM_COURSEWORK_STUDENTS)); - HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( - credentials); + TODO(developer) - See https://developers.google.com/identity for + guides on implementing OAuth2 for your application. */ + GoogleCredentials credentials = + GoogleCredentials.getApplicationDefault() + .createScoped(Collections.singleton(ClassroomScopes.CLASSROOM_COURSEWORK_STUDENTS)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter(credentials); // Create the classroom API client. - Classroom service = new Classroom.Builder(new NetHttpTransport(), - GsonFactory.getDefaultInstance(), - requestInitializer) - .setApplicationName("Classroom samples") - .build(); + Classroom service = + new Classroom.Builder( + new NetHttpTransport(), GsonFactory.getDefaultInstance(), requestInitializer) + .setApplicationName("Classroom samples") + .build(); // [START classroom_list_submissions_code_snippet] @@ -65,11 +64,19 @@ public static List listSubmissions(String courseId, String co try { do { - ListStudentSubmissionsResponse response = service.courses().courseWork().studentSubmissions() - .list(courseId, courseWorkId) - .execute(); + ListStudentSubmissionsResponse response = + service + .courses() + .courseWork() + .studentSubmissions() + .list(courseId, courseWorkId) + .setPageToken(pageToken) + .execute(); + + /* Ensure that the response is not null before retrieving data from it to avoid errors. */ if (response.getStudentSubmissions() != null) { studentSubmissions.addAll(response.getStudentSubmissions()); + pageToken = response.getNextPageToken(); } } while (pageToken != null); @@ -77,16 +84,17 @@ public static List listSubmissions(String courseId, String co System.out.println("No student submission found."); } else { for (StudentSubmission submission : studentSubmissions) { - System.out.printf("Student id (%s), student submission id (%s)\n", submission.getUserId(), - submission.getId()); + System.out.printf( + "Student id (%s), student submission id (%s)\n", + submission.getUserId(), submission.getId()); } } } catch (GoogleJsonResponseException e) { - //TODO (developer) - handle error appropriately + // TODO (developer) - handle error appropriately GoogleJsonError error = e.getDetails(); if (error.getCode() == 404) { - System.out.printf("The courseId (%s) or courseWorkId (%s) does not exist.\n", courseId, - courseWorkId); + System.out.printf( + "The courseId (%s) or courseWorkId (%s) does not exist.\n", courseId, courseWorkId); } else { throw e; } @@ -99,4 +107,4 @@ public static List listSubmissions(String courseId, String co } } -// [END classroom_list_submissions_class] \ No newline at end of file +// [END classroom_list_submissions_class] diff --git a/classroom/snippets/src/main/java/ListTopics.java b/classroom/snippets/src/main/java/ListTopics.java index e754f82b..6412a1cb 100644 --- a/classroom/snippets/src/main/java/ListTopics.java +++ b/classroom/snippets/src/main/java/ListTopics.java @@ -12,7 +12,6 @@ // See the License for the specific language governing permissions and // limitations under the License. - // [START classroom_list_topic_class] import com.google.api.client.googleapis.json.GoogleJsonError; @@ -42,19 +41,19 @@ public class ListTopics { */ public static List listTopics(String courseId) throws IOException { /* Load pre-authorized user credentials from the environment. - TODO(developer) - See https://developers.google.com/identity for - guides on implementing OAuth2 for your application. */ - GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() - .createScoped(Collections.singleton(ClassroomScopes.CLASSROOM_TOPICS)); - HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( - credentials); + TODO(developer) - See https://developers.google.com/identity for + guides on implementing OAuth2 for your application. */ + GoogleCredentials credentials = + GoogleCredentials.getApplicationDefault() + .createScoped(Collections.singleton(ClassroomScopes.CLASSROOM_TOPICS)); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter(credentials); // Create the classroom API client. - Classroom service = new Classroom.Builder(new NetHttpTransport(), - GsonFactory.getDefaultInstance(), - requestInitializer) - .setApplicationName("Classroom samples") - .build(); + Classroom service = + new Classroom.Builder( + new NetHttpTransport(), GsonFactory.getDefaultInstance(), requestInitializer) + .setApplicationName("Classroom samples") + .build(); // [START classroom_list_topic_code_snippet] @@ -63,10 +62,16 @@ public static List listTopics(String courseId) throws IOException { try { do { - ListTopicResponse response = service.courses().topics().list(courseId) - .setPageSize(100) - .setPageToken(pageToken) - .execute(); + ListTopicResponse response = + service + .courses() + .topics() + .list(courseId) + .setPageSize(100) + .setPageToken(pageToken) + .execute(); + + /* Ensure that the response is not null before retrieving data from it to avoid errors. */ if (response.getTopic() != null) { topics.addAll(response.getTopic()); pageToken = response.getNextPageToken(); @@ -81,7 +86,7 @@ public static List listTopics(String courseId) throws IOException { } } } catch (GoogleJsonResponseException e) { - //TODO (developer) - handle error appropriately + // TODO (developer) - handle error appropriately GoogleJsonError error = e.getDetails(); if (error.getCode() == 404) { System.out.printf("The courseId does not exist: %s.\n", courseId); diff --git a/classroom/snippets/src/test/java/BaseTest.java b/classroom/snippets/src/test/java/BaseTest.java index cc3996de..b0c5286e 100644 --- a/classroom/snippets/src/test/java/BaseTest.java +++ b/classroom/snippets/src/test/java/BaseTest.java @@ -1,28 +1,26 @@ -/* - * Copyright 2022 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. -import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport; import com.google.api.client.http.javanet.NetHttpTransport; import com.google.api.client.json.gson.GsonFactory; import com.google.api.services.classroom.Classroom; import com.google.api.services.classroom.ClassroomScopes; import com.google.api.services.classroom.model.Course; import com.google.api.services.classroom.model.CourseAlias; -import com.google.auth.http.HttpCredentialsAdapter; -import com.google.auth.oauth2.GoogleCredentials; +import java.util.Collections; +import java.util.List; import org.junit.After; import org.junit.Before; @@ -40,27 +38,24 @@ public class BaseTest { * @return an authorized Classroom client service * @throws IOException - if credentials file not found. */ - protected Classroom buildService() throws IOException { - /* Load pre-authorized user credentials from the environment. - TODO(developer) - See https://developers.google.com/identity for - guides on implementing OAuth2 for your application. */ - GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() - .createScoped(ClassroomScopes.CLASSROOM_ROSTERS); - HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( - credentials); + protected Classroom buildService() throws Exception { + /* Scopes required by this API call. If modifying these scopes, delete your previously saved + tokens/ folder. */ + final List SCOPES = Collections.singletonList(ClassroomScopes.CLASSROOM_COURSES); // Create the classroom API client - Classroom service = new Classroom.Builder(new NetHttpTransport(), - GsonFactory.getDefaultInstance(), - requestInitializer) - .setApplicationName("Classroom Snippets") - .build(); - - return service; + final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport(); + return service = + new Classroom.Builder( + HTTP_TRANSPORT, + GsonFactory.getDefaultInstance(), + ClassroomCredentials.getCredentials(HTTP_TRANSPORT, SCOPES)) + .setApplicationName("Classroom samples") + .build(); } @Before - public void setup() throws IOException { + public void setup() throws Exception { this.service = buildService(); this.testCourse = CreateCourse.createCourse(); createAlias(this.testCourse.getId()); @@ -72,11 +67,10 @@ public void tearDown() throws IOException { this.testCourse = null; } - public CourseAlias createAlias(String courseId) throws IOException { + public void createAlias(String courseId) throws IOException { String alias = "p:" + UUID.randomUUID(); CourseAlias courseAlias = new CourseAlias().setAlias(alias); - courseAlias = this.service.courses().aliases().create(courseId, courseAlias).execute(); - return courseAlias; + this.service.courses().aliases().create(courseId, courseAlias).execute(); } public void deleteCourse(String courseId) throws IOException { diff --git a/classroom/snippets/src/test/java/TestCancelGuardianInvitation.java b/classroom/snippets/src/test/java/TestCancelGuardianInvitation.java new file mode 100644 index 00000000..d5ad35b4 --- /dev/null +++ b/classroom/snippets/src/test/java/TestCancelGuardianInvitation.java @@ -0,0 +1,37 @@ +// Copyright 2023 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import com.google.api.services.classroom.model.GuardianInvitation; +import org.junit.Assert; +import org.junit.Test; + +// Unit test class for Cancel Guardian Invitation classroom snippet +public class TestCancelGuardianInvitation { + + @Test + public void testCancelGuardianInvitation() throws Exception { + String studentId = "insert_student_id"; + String guardianEmail = "insert_guardian_email"; + + GuardianInvitation invitation = + CreateGuardianInvitation.createGuardianInvitation(studentId, guardianEmail); + + GuardianInvitation guardianInvitation = + CancelGuardianInvitation.cancelGuardianInvitation(studentId, invitation.getInvitationId()); + + Assert.assertTrue("Guardian invitation not canceled.", guardianInvitation != null); + Assert.assertTrue( + "Guardian invitation state not updated.", guardianInvitation.getState().equals("COMPLETE")); + } +} diff --git a/classroom/snippets/src/test/java/TestCreateGuardianInvitation.java b/classroom/snippets/src/test/java/TestCreateGuardianInvitation.java new file mode 100644 index 00000000..bc98e2b9 --- /dev/null +++ b/classroom/snippets/src/test/java/TestCreateGuardianInvitation.java @@ -0,0 +1,31 @@ +// Copyright 2023 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import com.google.api.services.classroom.model.GuardianInvitation; +import org.junit.Assert; +import org.junit.Test; + +// Unit test class for Create Guardian Invitation classroom snippet +public class TestCreateGuardianInvitation { + + @Test + public void testCreateGuardianInvitation() throws Exception { + String studentId = "insert_student_id"; + String guardianEmail = "insert_guardian_email"; + GuardianInvitation guardianInvitation = + CreateGuardianInvitation.createGuardianInvitation(studentId, guardianEmail); + + Assert.assertTrue("Guardian invitation not created.", guardianInvitation != null); + } +} diff --git a/classroom/snippets/src/test/java/TestDeleteGuardian.java b/classroom/snippets/src/test/java/TestDeleteGuardian.java new file mode 100644 index 00000000..fc70bd08 --- /dev/null +++ b/classroom/snippets/src/test/java/TestDeleteGuardian.java @@ -0,0 +1,31 @@ +// Copyright 2023 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import org.junit.Assert; +import org.junit.Test; + +// Unit test class for Delete Guardian classroom snippet +public class TestDeleteGuardian { + + @Test + public void testDeleteGuardian() throws Exception { + String studentId = "insert_student_id"; + String guardianId = "insert_guardian_id"; + DeleteGuardian.deleteGuardian(studentId, guardianId); + + Assert.assertThrows( + GoogleJsonResponseException.class, () -> GetGuardian.getGuardian(studentId, guardianId)); + } +} diff --git a/classroom/snippets/src/test/java/TestListGuardianInvitationsByStudent.java b/classroom/snippets/src/test/java/TestListGuardianInvitationsByStudent.java new file mode 100644 index 00000000..0ee3390f --- /dev/null +++ b/classroom/snippets/src/test/java/TestListGuardianInvitationsByStudent.java @@ -0,0 +1,31 @@ +// Copyright 2023 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import com.google.api.services.classroom.model.GuardianInvitation; +import java.util.List; +import org.junit.Assert; +import org.junit.Test; + +// Unit test class for List Guardian Invitations classroom snippet +public class TestListGuardianInvitationsByStudent { + + @Test + public void testListGuardianInvitationsByStudent() throws Exception { + String studentId = "insert_student_id"; + List invitationList = + ListGuardianInvitationsByStudent.listGuardianInvitationsByStudent(studentId); + + Assert.assertTrue("No guardian invitations returned.", invitationList.size() > 0); + } +} diff --git a/classroom/snippets/src/test/java/TestListGuardians.java b/classroom/snippets/src/test/java/TestListGuardians.java new file mode 100644 index 00000000..b1b5eb03 --- /dev/null +++ b/classroom/snippets/src/test/java/TestListGuardians.java @@ -0,0 +1,30 @@ +// Copyright 2023 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import com.google.api.services.classroom.model.Guardian; +import java.util.List; +import org.junit.Assert; +import org.junit.Test; + +// Unit test class for List Guardians classroom snippet +public class TestListGuardians { + + @Test + public void testListGuardians() throws Exception { + String studentId = "insert_student_id"; + List guardianList = ListGuardians.listGuardians(studentId); + + Assert.assertTrue("No guardians returned.", guardianList.size() > 0); + } +} From 079711b1913ae92f56764716b923a56e7c6b1cdd Mon Sep 17 00:00:00 2001 From: Mahima Desetty <45216855+mahima-desetty@users.noreply.github.com> Date: Tue, 28 Feb 2023 12:38:30 -0500 Subject: [PATCH 247/262] feat: updating authorization flow & added invitation resource Classroom code snippets. (#601) * add alias snippet and unit test * java snippets for topics, create coursework, create alias * updates based on team review * renamed alias methods, added devsite comments * added missing license header to TestDeleteTopic.java * Adding List, ModifyAttachments, Patch, Return StudentSubmission methods * minor fixes * adding comments for developer * modifications based on team review * modifications based on team review * Adding print statements and devsite tag to ListCourseAliases * added class templates for guardians and guardianInvitations * guardian and guardian invitation implementation * tests for list guardians and list guardian invitations * adding tests for guardians and guardian invites. removing use of ADC for auth. * base test updates * updates based on team feedback * fixing BaseTest.java * updating copyright year to 2023 for new files * testing google-java-format plugin to fix lint errors * updated files after running google-java-format plugin * updated BaseTest * fixing copyright header for BaseTest * updated auth for AddAlias and CreateCourse classes * removing unused imports * Fixing comment. * specifying errors in method signatures * updated BaseTest and AddStudent * Adding annotation for GeneralSecurityException * updating AddStudent method signature and test * updated AddTeacher and AddStudent test * updated auth for BatchAddStudents * updated auth for CreateCourseWork * updated auth for Topic related classes and tests * added link to CourseState info and updated GetTopic error handling * updated auth for remaining classes * updated auth for CreateCourseWithAlias * CreateInvitation code snippet * accept, create, delete invitation classes * list invitations class * listAssignedGrades method in ListStudentSubmissions class * deleting ListInvitations classes until bug is fixed * team review updates * google java format for tests * google-java-format on classes * google java format DeleteTopic * added test cases to CreateInvitation and DeleteInvitation classes * additional comment in accept invitation test case * fixing java formatting * google java format fix --- .../src/main/java/AcceptInvitation.java | 72 ++++++++++++++ .../src/main/java/AddAliasToCourse.java | 46 ++++----- .../snippets/src/main/java/AddStudent.java | 61 ++++++------ .../snippets/src/main/java/AddTeacher.java | 47 ++++----- .../src/main/java/BatchAddStudents.java | 64 ++++++------ .../snippets/src/main/java/CreateCourse.java | 67 +++++++------ .../src/main/java/CreateCourseWithAlias.java | 56 ++++++----- .../src/main/java/CreateCourseWork.java | 70 ++++++------- .../src/main/java/CreateInvitation.java | 89 +++++++++++++++++ .../snippets/src/main/java/CreateTopic.java | 40 ++++---- .../src/main/java/DeleteInvitation.java | 72 ++++++++++++++ .../snippets/src/main/java/DeleteTopic.java | 47 +++++---- .../snippets/src/main/java/GetCourse.java | 42 ++++---- .../snippets/src/main/java/GetInvitation.java | 76 +++++++++++++++ .../snippets/src/main/java/GetTopic.java | 44 +++++---- .../src/main/java/ListCourseAliases.java | 53 +++++----- .../snippets/src/main/java/ListCourses.java | 48 +++++---- .../src/main/java/ListStudentSubmissions.java | 97 ++++++++++++++++--- .../src/main/java/ListSubmissions.java | 27 +++--- .../snippets/src/main/java/ListTopics.java | 29 +++--- .../ModifyAttachmentsStudentSubmission.java | 69 +++++++------ .../snippets/src/main/java/PatchCourse.java | 51 +++++----- .../src/main/java/PatchStudentSubmission.java | 78 ++++++++------- .../main/java/ReturnStudentSubmission.java | 53 +++++----- .../snippets/src/main/java/UpdateCourse.java | 41 ++++---- .../snippets/src/main/java/UpdateTopic.java | 52 +++++----- .../snippets/src/test/java/BaseTest.java | 22 ++--- .../src/test/java/TestAcceptInvitation.java | 39 ++++++++ .../src/test/java/TestAddAliasToCourse.java | 13 +-- .../src/test/java/TestAddStudent.java | 22 +++-- .../src/test/java/TestAddTeacher.java | 18 ++-- .../src/test/java/TestBatchAddStudents.java | 11 ++- .../src/test/java/TestCreateCourse.java | 7 +- .../test/java/TestCreateCourseWithAlias.java | 12 +-- .../src/test/java/TestCreateCourseWork.java | 5 +- .../src/test/java/TestCreateInvitation.java | 43 ++++++++ .../src/test/java/TestCreateTopic.java | 4 +- .../src/test/java/TestDeleteInvitation.java | 42 ++++++++ .../src/test/java/TestDeleteTopic.java | 8 +- .../snippets/src/test/java/TestGetCourse.java | 6 +- .../snippets/src/test/java/TestGetTopic.java | 4 +- .../src/test/java/TestListCourseAliases.java | 10 +- .../src/test/java/TestListCourses.java | 7 +- .../src/test/java/TestListSubmissions.java | 8 +- .../src/test/java/TestListTopics.java | 4 +- .../src/test/java/TestPatchCourse.java | 6 +- .../src/test/java/TestUpdateCourse.java | 6 +- .../src/test/java/TestUpdateTopic.java | 6 +- 48 files changed, 1200 insertions(+), 594 deletions(-) create mode 100644 classroom/snippets/src/main/java/AcceptInvitation.java create mode 100644 classroom/snippets/src/main/java/CreateInvitation.java create mode 100644 classroom/snippets/src/main/java/DeleteInvitation.java create mode 100644 classroom/snippets/src/main/java/GetInvitation.java create mode 100644 classroom/snippets/src/test/java/TestAcceptInvitation.java create mode 100644 classroom/snippets/src/test/java/TestCreateInvitation.java create mode 100644 classroom/snippets/src/test/java/TestDeleteInvitation.java diff --git a/classroom/snippets/src/main/java/AcceptInvitation.java b/classroom/snippets/src/main/java/AcceptInvitation.java new file mode 100644 index 00000000..137a23a0 --- /dev/null +++ b/classroom/snippets/src/main/java/AcceptInvitation.java @@ -0,0 +1,72 @@ +// Copyright 2023 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// [START classroom_accept_invitation] + +import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport; +import com.google.api.client.googleapis.json.GoogleJsonError; +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.classroom.Classroom; +import com.google.api.services.classroom.ClassroomScopes; +import java.io.IOException; +import java.security.GeneralSecurityException; +import java.util.ArrayList; +import java.util.Arrays; + +/* Class to demonstrate the use of Classroom Accept Invitation API. */ +public class AcceptInvitation { + + /* Scopes required by this API call. If modifying these scopes, delete your previously saved + tokens/ folder. */ + static ArrayList SCOPES = + new ArrayList<>(Arrays.asList(ClassroomScopes.CLASSROOM_ROSTERS)); + + /** + * Accepts an invitation to a course. + * + * @param id - the identifier of the invitation to accept. + * @throws IOException - if credentials file not found. + * @throws GeneralSecurityException - if a new instance of NetHttpTransport was not created. + */ + public static void acceptInvitation(String id) throws GeneralSecurityException, IOException { + + // Create the classroom API client. + final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport(); + Classroom service = + new Classroom.Builder( + HTTP_TRANSPORT, + GsonFactory.getDefaultInstance(), + ClassroomCredentials.getCredentials(HTTP_TRANSPORT, SCOPES)) + .setApplicationName("Classroom samples") + .build(); + + // [START classroom_accept_invitation_code_snippet] + try { + service.invitations().accept(id).execute(); + System.out.printf("Invitation (%s) was accepted.\n", id); + } catch (GoogleJsonResponseException e) { + GoogleJsonError error = e.getDetails(); + if (error.getCode() == 404) { + System.out.printf("The invitation id (%s) does not exist.\n", id); + } + throw e; + } catch (Exception e) { + throw e; + } + // [END classroom_accept_invitation_code_snippet] + } +} +// [END classroom_accept_invitation] diff --git a/classroom/snippets/src/main/java/AddAliasToCourse.java b/classroom/snippets/src/main/java/AddAliasToCourse.java index 10434391..720dccec 100644 --- a/classroom/snippets/src/main/java/AddAliasToCourse.java +++ b/classroom/snippets/src/main/java/AddAliasToCourse.java @@ -12,61 +12,61 @@ // See the License for the specific language governing permissions and // limitations under the License. - // [START classroom_add_alias_to_course_class] +import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport; import com.google.api.client.googleapis.json.GoogleJsonError; import com.google.api.client.googleapis.json.GoogleJsonResponseException; -import com.google.api.client.http.HttpRequestInitializer; import com.google.api.client.http.javanet.NetHttpTransport; import com.google.api.client.json.gson.GsonFactory; import com.google.api.services.classroom.Classroom; import com.google.api.services.classroom.ClassroomScopes; import com.google.api.services.classroom.model.CourseAlias; -import com.google.auth.http.HttpCredentialsAdapter; -import com.google.auth.oauth2.GoogleCredentials; import java.io.IOException; -import java.util.Collections; +import java.security.GeneralSecurityException; +import java.util.ArrayList; +import java.util.Arrays; /* Class to demonstrate the use of Classroom Create Alias API. */ public class AddAliasToCourse { + /* Scopes required by this API call. If modifying these scopes, delete your previously saved + tokens/ folder. */ + static ArrayList SCOPES = + new ArrayList<>(Arrays.asList(ClassroomScopes.CLASSROOM_COURSES)); + /** * Add an alias on an existing course. * * @param courseId - id of the course to add an alias to. * @return - newly created course alias. * @throws IOException - if credentials file not found. + * @throws GeneralSecurityException - if a new instance of NetHttpTransport was not created. */ - public static CourseAlias addAliasToCourse(String courseId) throws IOException { - /* Load pre-authorized user credentials from the environment. - TODO(developer) - See https://developers.google.com/identity for - guides on implementing OAuth2 for your application. */ - GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() - .createScoped(Collections.singleton(ClassroomScopes.CLASSROOM_COURSES)); - HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( - credentials); + public static CourseAlias addAliasToCourse(String courseId) + throws GeneralSecurityException, IOException { // Create the classroom API client. - Classroom service = new Classroom.Builder(new NetHttpTransport(), - GsonFactory.getDefaultInstance(), - requestInitializer) - .setApplicationName("Classroom samples") - .build(); + final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport(); + Classroom service = + new Classroom.Builder( + HTTP_TRANSPORT, + GsonFactory.getDefaultInstance(), + ClassroomCredentials.getCredentials(HTTP_TRANSPORT, SCOPES)) + .setApplicationName("Classroom samples") + .build(); // [START classroom_add_alias_to_course_code_snippet] /* Create a new CourseAlias object with a project-wide alias. Project-wide aliases use a prefix of "p:" and can only be seen and used by the application that created them. */ - CourseAlias content = new CourseAlias() - .setAlias("p:biology_10"); + CourseAlias content = new CourseAlias().setAlias("p:biology_10"); CourseAlias courseAlias = null; try { - courseAlias = service.courses().aliases().create(courseId, content) - .execute(); + courseAlias = service.courses().aliases().create(courseId, content).execute(); System.out.printf("Course alias created: %s \n", courseAlias.getAlias()); } catch (GoogleJsonResponseException e) { - //TODO (developer) - handle error appropriately + // TODO (developer) - handle error appropriately GoogleJsonError error = e.getDetails(); if (error.getCode() == 409) { System.out.printf("The course alias already exists: %s.\n", content); diff --git a/classroom/snippets/src/main/java/AddStudent.java b/classroom/snippets/src/main/java/AddStudent.java index c04c38fb..6331f3ed 100644 --- a/classroom/snippets/src/main/java/AddStudent.java +++ b/classroom/snippets/src/main/java/AddStudent.java @@ -12,57 +12,64 @@ // See the License for the specific language governing permissions and // limitations under the License. - // [START classroom_add_student] +import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport; import com.google.api.client.googleapis.json.GoogleJsonError; import com.google.api.client.googleapis.json.GoogleJsonResponseException; -import com.google.api.client.http.HttpRequestInitializer; import com.google.api.client.http.javanet.NetHttpTransport; import com.google.api.client.json.gson.GsonFactory; import com.google.api.services.classroom.Classroom; import com.google.api.services.classroom.ClassroomScopes; import com.google.api.services.classroom.model.Student; -import com.google.auth.http.HttpCredentialsAdapter; -import com.google.auth.oauth2.GoogleCredentials; import java.io.IOException; -import java.util.Collections; +import java.security.GeneralSecurityException; +import java.util.ArrayList; +import java.util.Arrays; /* Class to demonstrate the use of Classroom Add Student API */ public class AddStudent { + + /* Scopes required by this API call. If modifying these scopes, delete your previously saved + tokens/ folder. */ + static ArrayList SCOPES = + new ArrayList<>(Arrays.asList(ClassroomScopes.CLASSROOM_ROSTERS)); + /** * Add a student in a specified course. * - * @param courseId - Id of the course. + * @param courseId - Id of the course. * @param enrollmentCode - Code of the course to enroll. * @return newly added student * @throws IOException - if credentials file not found. + * @throws GeneralSecurityException - if a new instance of NetHttpTransport was not created. */ - public static Student addStudent(String courseId, String enrollmentCode) - throws IOException { - /* Load pre-authorized user credentials from the environment. - TODO(developer) - See https://developers.google.com/identity for - guides on implementing OAuth2 for your application. */ - GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() - .createScoped(Collections.singleton(ClassroomScopes.CLASSROOM_ROSTERS)); - HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( - credentials); + public static Student addStudent(String courseId, String enrollmentCode, String studentId) + throws GeneralSecurityException, IOException { - // Create the classroom API client - Classroom service = new Classroom.Builder(new NetHttpTransport(), - GsonFactory.getDefaultInstance(), - requestInitializer) - .setApplicationName("Classroom samples") - .build(); + // Create the classroom API client. + final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport(); + Classroom service = + new Classroom.Builder( + HTTP_TRANSPORT, + GsonFactory.getDefaultInstance(), + ClassroomCredentials.getCredentials(HTTP_TRANSPORT, SCOPES)) + .setApplicationName("Classroom samples") + .build(); - Student student = new Student().setUserId("gduser1@workspacesamples.dev"); + Student student = new Student().setUserId(studentId); try { // Enrolling a student to a specified course - student = service.courses().students().create(courseId, student) - .setEnrollmentCode(enrollmentCode) - .execute(); + student = + service + .courses() + .students() + .create(courseId, student) + .setEnrollmentCode(enrollmentCode) + .execute(); // Prints the course id with the Student name - System.out.printf("User '%s' was enrolled as a student in the course with ID '%s'.\n", + System.out.printf( + "User '%s' was enrolled as a student in the course with ID '%s'.\n", student.getProfile().getName().getFullName(), courseId); } catch (GoogleJsonResponseException e) { // TODO(developer) - handle error appropriately @@ -78,4 +85,4 @@ public static Student addStudent(String courseId, String enrollmentCode) return student; } } -// [END classroom_add_student] \ No newline at end of file +// [END classroom_add_student] diff --git a/classroom/snippets/src/main/java/AddTeacher.java b/classroom/snippets/src/main/java/AddTeacher.java index 9f5652e3..4c843721 100644 --- a/classroom/snippets/src/main/java/AddTeacher.java +++ b/classroom/snippets/src/main/java/AddTeacher.java @@ -12,55 +12,58 @@ // See the License for the specific language governing permissions and // limitations under the License. - // [START classroom_add_teacher] +import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport; import com.google.api.client.googleapis.json.GoogleJsonError; import com.google.api.client.googleapis.json.GoogleJsonResponseException; -import com.google.api.client.http.HttpRequestInitializer; import com.google.api.client.http.javanet.NetHttpTransport; import com.google.api.client.json.gson.GsonFactory; import com.google.api.services.classroom.Classroom; import com.google.api.services.classroom.ClassroomScopes; import com.google.api.services.classroom.model.Teacher; -import com.google.auth.http.HttpCredentialsAdapter; -import com.google.auth.oauth2.GoogleCredentials; import java.io.IOException; -import java.util.Collections; +import java.security.GeneralSecurityException; +import java.util.ArrayList; +import java.util.Arrays; /* Class to demonstrate the use of Classroom Add Teacher API */ public class AddTeacher { + + /* Scopes required by this API call. If modifying these scopes, delete your previously saved + tokens/ folder. */ + static ArrayList SCOPES = + new ArrayList<>(Arrays.asList(ClassroomScopes.CLASSROOM_ROSTERS)); + /** * Add teacher to a specific course. * - * @param courseId - Id of the course. + * @param courseId - Id of the course. * @param teacherEmail - Email address of the teacher. * @return newly created teacher * @throws IOException - if credentials file not found. + * @throws GeneralSecurityException - if a new instance of NetHttpTransport was not created. */ public static Teacher addTeacher(String courseId, String teacherEmail) - throws IOException { - /* Load pre-authorized user credentials from the environment. - TODO(developer) - See https://developers.google.com/identity for - guides on implementing OAuth2 for your application. */ - GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() - .createScoped(Collections.singleton(ClassroomScopes.CLASSROOM_ROSTERS)); - HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( - credentials); + throws GeneralSecurityException, IOException { - // Create the classroom API client - Classroom service = new Classroom.Builder(new NetHttpTransport(), - GsonFactory.getDefaultInstance(), - requestInitializer) - .setApplicationName("Classroom samples") - .build(); + // Create the classroom API client. + final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport(); + Classroom service = + new Classroom.Builder( + HTTP_TRANSPORT, + GsonFactory.getDefaultInstance(), + ClassroomCredentials.getCredentials(HTTP_TRANSPORT, SCOPES)) + .setApplicationName("Classroom samples") + .build(); Teacher teacher = new Teacher().setUserId(teacherEmail); try { // Add a teacher to a specified course teacher = service.courses().teachers().create(courseId, teacher).execute(); // Prints the course id with the teacher name - System.out.printf("User '%s' was added as a teacher to the course with ID '%s'.\n", + System.out.printf( + "User '%s' was added as a teacher to the course with ID '%s'.\n", teacher.getProfile().getName().getFullName(), courseId); } catch (GoogleJsonResponseException e) { // TODO(developer) - handle error appropriately @@ -76,4 +79,4 @@ public static Teacher addTeacher(String courseId, String teacherEmail) return teacher; } } -// [END classroom_add_teacher] \ No newline at end of file +// [END classroom_add_teacher] diff --git a/classroom/snippets/src/main/java/BatchAddStudents.java b/classroom/snippets/src/main/java/BatchAddStudents.java index 9588ec3d..d4a54c2e 100644 --- a/classroom/snippets/src/main/java/BatchAddStudents.java +++ b/classroom/snippets/src/main/java/BatchAddStudents.java @@ -12,62 +12,66 @@ // See the License for the specific language governing permissions and // limitations under the License. - // [START classroom_batch_add_students] import com.google.api.client.googleapis.batch.BatchRequest; import com.google.api.client.googleapis.batch.json.JsonBatchCallback; +import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport; import com.google.api.client.googleapis.json.GoogleJsonError; import com.google.api.client.http.HttpHeaders; -import com.google.api.client.http.HttpRequestInitializer; import com.google.api.client.http.javanet.NetHttpTransport; import com.google.api.client.json.gson.GsonFactory; import com.google.api.services.classroom.Classroom; import com.google.api.services.classroom.ClassroomScopes; import com.google.api.services.classroom.model.Student; -import com.google.auth.http.HttpCredentialsAdapter; -import com.google.auth.oauth2.GoogleCredentials; import java.io.IOException; -import java.util.Collections; +import java.security.GeneralSecurityException; +import java.util.ArrayList; +import java.util.Arrays; import java.util.List; /* Class to demonstrate the use of Classroom Batch Add Students API */ public class BatchAddStudents { + + /* Scopes required by this API call. If modifying these scopes, delete your previously saved + tokens/ folder. */ + static ArrayList SCOPES = + new ArrayList<>(Arrays.asList(ClassroomScopes.CLASSROOM_ROSTERS)); + /** * Add multiple students in a specified course. * - * @param courseId - Id of the course to add students. + * @param courseId - Id of the course to add students. * @param studentEmails - Email address of the students. * @throws IOException - if credentials file not found. + * @throws GeneralSecurityException - if a new instance of NetHttpTransport was not created. */ public static void batchAddStudents(String courseId, List studentEmails) - throws IOException { - /* Load pre-authorized user credentials from the environment. - TODO(developer) - See https://developers.google.com/identity for - guides on implementing OAuth2 for your application. */ - GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() - .createScoped(Collections.singleton(ClassroomScopes.CLASSROOM_ROSTERS)); - HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( - credentials); + throws GeneralSecurityException, IOException { - // Create the classroom API client - Classroom service = new Classroom.Builder(new NetHttpTransport(), - GsonFactory.getDefaultInstance(), - requestInitializer) - .setApplicationName("Classroom samples") - .build(); + // Create the classroom API client. + final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport(); + Classroom service = + new Classroom.Builder( + HTTP_TRANSPORT, + GsonFactory.getDefaultInstance(), + ClassroomCredentials.getCredentials(HTTP_TRANSPORT, SCOPES)) + .setApplicationName("Classroom samples") + .build(); BatchRequest batch = service.batch(); - JsonBatchCallback callback = new JsonBatchCallback<>() { - public void onSuccess(Student student, HttpHeaders responseHeaders) { - System.out.printf("User '%s' was added as a student to the course.\n", - student.getProfile().getName().getFullName()); - } + JsonBatchCallback callback = + new JsonBatchCallback<>() { + public void onSuccess(Student student, HttpHeaders responseHeaders) { + System.out.printf( + "User '%s' was added as a student to the course.\n", + student.getProfile().getName().getFullName()); + } - public void onFailure(GoogleJsonError error, HttpHeaders responseHeaders) { - System.out.printf("Error adding student to the course: %s\n", error.getMessage()); - } - }; + public void onFailure(GoogleJsonError error, HttpHeaders responseHeaders) { + System.out.printf("Error adding student to the course: %s\n", error.getMessage()); + } + }; for (String studentEmail : studentEmails) { Student student = new Student().setUserId(studentEmail); service.courses().students().create(courseId, student).queue(batch, callback); @@ -75,4 +79,4 @@ public void onFailure(GoogleJsonError error, HttpHeaders responseHeaders) { batch.execute(); } } -// [END classroom_batch_add_students] \ No newline at end of file +// [END classroom_batch_add_students] diff --git a/classroom/snippets/src/main/java/CreateCourse.java b/classroom/snippets/src/main/java/CreateCourse.java index ce33dd4d..95f7353c 100644 --- a/classroom/snippets/src/main/java/CreateCourse.java +++ b/classroom/snippets/src/main/java/CreateCourse.java @@ -12,59 +12,64 @@ // See the License for the specific language governing permissions and // limitations under the License. - // [START classroom_create_course] +import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport; import com.google.api.client.googleapis.json.GoogleJsonError; import com.google.api.client.googleapis.json.GoogleJsonResponseException; -import com.google.api.client.http.HttpRequestInitializer; import com.google.api.client.http.javanet.NetHttpTransport; import com.google.api.client.json.gson.GsonFactory; import com.google.api.services.classroom.Classroom; import com.google.api.services.classroom.ClassroomScopes; import com.google.api.services.classroom.model.Course; -import com.google.auth.http.HttpCredentialsAdapter; -import com.google.auth.oauth2.GoogleCredentials; import java.io.IOException; -import java.util.Collections; +import java.security.GeneralSecurityException; +import java.util.ArrayList; +import java.util.Arrays; /* Class to demonstrate the use of Classroom Create Course API */ public class CreateCourse { + /* Scopes required by this API call. If modifying these scopes, delete your previously saved + tokens/ folder. */ + static ArrayList SCOPES = + new ArrayList<>(Arrays.asList(ClassroomScopes.CLASSROOM_COURSES)); + /** * Creates a course * * @return newly created course * @throws IOException - if credentials file not found. + * @throws GeneralSecurityException - if a new instance of NetHttpTransport was not created. */ - public static Course createCourse() throws IOException { - /* Load pre-authorized user credentials from the environment. - TODO(developer) - See https://developers.google.com/identity for - guides on implementing OAuth2 for your application. */ - GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() - .createScoped(Collections.singleton(ClassroomScopes.CLASSROOM_COURSES)); - HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( - credentials); + public static Course createCourse() throws GeneralSecurityException, IOException { - // Create the classroom API client - Classroom service = new Classroom.Builder(new NetHttpTransport(), - GsonFactory.getDefaultInstance(), - requestInitializer) - .setApplicationName("Classroom samples") - .build(); + // Create the classroom API client. + final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport(); + Classroom service = + new Classroom.Builder( + HTTP_TRANSPORT, + GsonFactory.getDefaultInstance(), + ClassroomCredentials.getCredentials(HTTP_TRANSPORT, SCOPES)) + .setApplicationName("Classroom samples") + .build(); Course course = null; try { - // Adding a new course with description - course = new Course() - .setName("10th Grade Biology") - .setSection("Period 2") - .setDescriptionHeading("Welcome to 10th Grade Biology") - .setDescription("We'll be learning about about the structure of living creatures " - + "from a combination of textbooks, guest lectures, and lab work. Expect " - + "to be excited!") - .setRoom("301") - .setOwnerId("me") - .setCourseState("PROVISIONED"); + // Adding a new course with description. Set CourseState to `ACTIVE`. Possible values of + // CourseState can be found here: + // https://developers.google.com/classroom/reference/rest/v1/courses#coursestate + course = + new Course() + .setName("10th Grade Biology") + .setSection("Period 2") + .setDescriptionHeading("Welcome to 10th Grade Biology") + .setDescription( + "We'll be learning about about the structure of living creatures " + + "from a combination of textbooks, guest lectures, and lab work. Expect " + + "to be excited!") + .setRoom("301") + .setOwnerId("me") + .setCourseState("ACTIVE"); course = service.courses().create(course).execute(); // Prints the new created course Id and name System.out.printf("Course created: %s (%s)\n", course.getName(), course.getId()); @@ -79,4 +84,4 @@ public static Course createCourse() throws IOException { return course; } } -// [END classroom_create_course] \ No newline at end of file +// [END classroom_create_course] diff --git a/classroom/snippets/src/main/java/CreateCourseWithAlias.java b/classroom/snippets/src/main/java/CreateCourseWithAlias.java index 77a6521b..c676b973 100644 --- a/classroom/snippets/src/main/java/CreateCourseWithAlias.java +++ b/classroom/snippets/src/main/java/CreateCourseWithAlias.java @@ -12,44 +12,47 @@ // See the License for the specific language governing permissions and // limitations under the License. - // [START classroom_create_course_with_alias_class] + +import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport; import com.google.api.client.googleapis.json.GoogleJsonError; import com.google.api.client.googleapis.json.GoogleJsonResponseException; -import com.google.api.client.http.HttpRequestInitializer; import com.google.api.client.http.javanet.NetHttpTransport; import com.google.api.client.json.gson.GsonFactory; import com.google.api.services.classroom.Classroom; import com.google.api.services.classroom.ClassroomScopes; import com.google.api.services.classroom.model.Course; -import com.google.auth.http.HttpCredentialsAdapter; -import com.google.auth.oauth2.GoogleCredentials; import java.io.IOException; -import java.util.Collections; +import java.security.GeneralSecurityException; +import java.util.ArrayList; +import java.util.Arrays; /* Class to demonstrate how to create a course with an alias. */ public class CreateCourseWithAlias { + + /* Scopes required by this API call. If modifying these scopes, delete your previously saved + tokens/ folder. */ + static ArrayList SCOPES = + new ArrayList<>(Arrays.asList(ClassroomScopes.CLASSROOM_COURSES)); + /** * Create a new course with an alias. Set the new course id to the desired alias. * * @return - newly created course. * @throws IOException - if credentials file not found. + * @throws GeneralSecurityException - if a new instance of NetHttpTransport was not created. */ - public static Course createCourseWithAlias() throws IOException { - /* Load pre-authorized user credentials from the environment. - TODO(developer) - See https://developers.google.com/identity for - guides on implementing OAuth2 for your application. */ - GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() - .createScoped(Collections.singleton(ClassroomScopes.CLASSROOM_COURSES)); - HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( - credentials); + public static Course createCourseWithAlias() throws GeneralSecurityException, IOException { // Create the classroom API client. - Classroom service = new Classroom.Builder(new NetHttpTransport(), - GsonFactory.getDefaultInstance(), - requestInitializer) - .setApplicationName("Classroom samples") - .build(); + final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport(); + Classroom service = + new Classroom.Builder( + HTTP_TRANSPORT, + GsonFactory.getDefaultInstance(), + ClassroomCredentials.getCredentials(HTTP_TRANSPORT, SCOPES)) + .setApplicationName("Classroom samples") + .build(); // [START classroom_create_course_with_alias_code_snippet] @@ -57,20 +60,21 @@ public static Course createCourseWithAlias() throws IOException { /* Create a new Course with the alias set as the id field. Project-wide aliases use a prefix of "p:" and can only be seen and used by the application that created them. */ - Course content = new Course() - .setId("p:history_4_2022") - .setName("9th Grade History") - .setSection("Period 4") - .setDescriptionHeading("Welcome to 9th Grade History.") - .setOwnerId("me") - .setCourseState("PROVISIONED"); + Course content = + new Course() + .setId("p:history_4_2022") + .setName("9th Grade History") + .setSection("Period 4") + .setDescriptionHeading("Welcome to 9th Grade History.") + .setOwnerId("me") + .setCourseState("PROVISIONED"); try { course = service.courses().create(content).execute(); // Prints the new created course id and name System.out.printf("Course created: %s (%s)\n", course.getName(), course.getId()); } catch (GoogleJsonResponseException e) { - //TODO (developer) - handle error appropriately + // TODO (developer) - handle error appropriately GoogleJsonError error = e.getDetails(); if (error.getCode() == 409) { System.out.printf("The course alias already exists: %s.\n", content.getId()); diff --git a/classroom/snippets/src/main/java/CreateCourseWork.java b/classroom/snippets/src/main/java/CreateCourseWork.java index 7f9973ca..5d6c948d 100644 --- a/classroom/snippets/src/main/java/CreateCourseWork.java +++ b/classroom/snippets/src/main/java/CreateCourseWork.java @@ -12,60 +12,61 @@ // See the License for the specific language governing permissions and // limitations under the License. - // [START classroom_create_coursework_class] +import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport; import com.google.api.client.googleapis.json.GoogleJsonError; import com.google.api.client.googleapis.json.GoogleJsonResponseException; -import com.google.api.client.http.HttpRequestInitializer; import com.google.api.client.http.javanet.NetHttpTransport; import com.google.api.client.json.gson.GsonFactory; import com.google.api.services.classroom.Classroom; import com.google.api.services.classroom.ClassroomScopes; import com.google.api.services.classroom.model.CourseWork; -import com.google.api.services.classroom.model.Date; import com.google.api.services.classroom.model.Link; import com.google.api.services.classroom.model.Material; -import com.google.api.services.classroom.model.TimeOfDay; -import com.google.auth.http.HttpCredentialsAdapter; -import com.google.auth.oauth2.GoogleCredentials; import java.io.IOException; +import java.security.GeneralSecurityException; +import java.util.ArrayList; import java.util.Arrays; -import java.util.Collections; import java.util.List; /* Class to demonstrate the use of Classroom Create CourseWork API. */ public class CreateCourseWork { + + /* Scopes required by this API call. If modifying these scopes, delete your previously saved + tokens/ folder. */ + static ArrayList SCOPES = + new ArrayList<>(Arrays.asList(ClassroomScopes.CLASSROOM_COURSEWORK_STUDENTS)); + /** * Creates course work. * * @param courseId - id of the course to create coursework in. * @return - newly created CourseWork object. * @throws IOException - if credentials file not found. + * @throws GeneralSecurityException - if a new instance of NetHttpTransport was not created. */ - public static CourseWork createCourseWork(String courseId) throws IOException { - /* Load pre-authorized user credentials from the environment. - TODO(developer) - See https://developers.google.com/identity for - guides on implementing OAuth2 for your application. */ - GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() - .createScoped(Collections.singleton(ClassroomScopes.CLASSROOM_COURSEWORK_STUDENTS)); - HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( - credentials); + public static CourseWork createCourseWork(String courseId) + throws GeneralSecurityException, IOException { // Create the classroom API client. - Classroom service = new Classroom.Builder(new NetHttpTransport(), - GsonFactory.getDefaultInstance(), - requestInitializer) - .setApplicationName("Classroom samples") - .build(); + final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport(); + Classroom service = + new Classroom.Builder( + HTTP_TRANSPORT, + GsonFactory.getDefaultInstance(), + ClassroomCredentials.getCredentials(HTTP_TRANSPORT, SCOPES)) + .setApplicationName("Classroom samples") + .build(); // [START classroom_create_coursework_code_snippet] CourseWork courseWork = null; try { // Create a link to add as a material on course work. - Link articleLink = new Link() - .setTitle("SR-71 Blackbird") - .setUrl("https://www.lockheedmartin.com/en-us/news/features/history/blackbird.html"); + Link articleLink = + new Link() + .setTitle("SR-71 Blackbird") + .setUrl("https://www.lockheedmartin.com/en-us/news/features/history/blackbird.html"); // Create a list of Materials to add to course work. List materials = Arrays.asList(new Material().setLink(articleLink)); @@ -75,21 +76,22 @@ public static CourseWork createCourseWork(String courseId) throws IOException { https://developers.google.com/classroom/reference/rest/v1/CourseWorkType Set state to `PUBLISHED`. Possible values of state can be found here: https://developers.google.com/classroom/reference/rest/v1/courses.courseWork#courseworkstate */ - CourseWork content = new CourseWork() - .setTitle("Supersonic aviation") - .setDescription("Read about how the SR-71 Blackbird, the world’s fastest and " - + "highest-flying manned aircraft, was built.") - .setMaterials(materials) - .setWorkType("ASSIGNMENT") - .setState("PUBLISHED"); + CourseWork content = + new CourseWork() + .setTitle("Supersonic aviation") + .setDescription( + "Read about how the SR-71 Blackbird, the world’s fastest and " + + "highest-flying manned aircraft, was built.") + .setMaterials(materials) + .setWorkType("ASSIGNMENT") + .setState("PUBLISHED"); - courseWork = service.courses().courseWork().create(courseId, content) - .execute(); + courseWork = service.courses().courseWork().create(courseId, content).execute(); /* Prints the created courseWork. */ System.out.printf("CourseWork created: %s\n", courseWork.getTitle()); } catch (GoogleJsonResponseException e) { - //TODO (developer) - handle error appropriately + // TODO (developer) - handle error appropriately GoogleJsonError error = e.getDetails(); if (error.getCode() == 404) { System.out.printf("The courseId does not exist: %s.\n", courseId); @@ -105,4 +107,4 @@ public static CourseWork createCourseWork(String courseId) throws IOException { // [END classroom_create_coursework_code_snippet] } } -// [END classroom_create_coursework_class] \ No newline at end of file +// [END classroom_create_coursework_class] diff --git a/classroom/snippets/src/main/java/CreateInvitation.java b/classroom/snippets/src/main/java/CreateInvitation.java new file mode 100644 index 00000000..3e3d22ac --- /dev/null +++ b/classroom/snippets/src/main/java/CreateInvitation.java @@ -0,0 +1,89 @@ +// Copyright 2023 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// [START classroom_create_invitation] + +import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport; +import com.google.api.client.googleapis.json.GoogleJsonError; +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.classroom.Classroom; +import com.google.api.services.classroom.ClassroomScopes; +import com.google.api.services.classroom.model.Invitation; +import java.io.IOException; +import java.security.GeneralSecurityException; +import java.util.ArrayList; +import java.util.Arrays; + +/* Class to demonstrate the use of Classroom Create Invitation API. */ +public class CreateInvitation { + + /* Scopes required by this API call. If modifying these scopes, delete your previously saved + tokens/ folder. */ + static ArrayList SCOPES = + new ArrayList<>(Arrays.asList(ClassroomScopes.CLASSROOM_ROSTERS)); + + /** + * Create an invitation to allow a user to join a course. + * + * @param courseId - the course to invite the user to. + * @param userId - the user to be invited to the course. + * @return the created invitation. + * @throws IOException - if credentials file not found. + * @throws GeneralSecurityException - if a new instance of NetHttpTransport was not created. + */ + public static Invitation createInvitation(String courseId, String userId) + throws GeneralSecurityException, IOException { + + // Create the classroom API client. + final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport(); + Classroom service = + new Classroom.Builder( + HTTP_TRANSPORT, + GsonFactory.getDefaultInstance(), + ClassroomCredentials.getCredentials(HTTP_TRANSPORT, SCOPES)) + .setApplicationName("Classroom samples") + .build(); + + // [START classroom_create_invitation_code_snippet] + + Invitation invitation = null; + try { + /* Set the role the user is invited to have in the course. Possible values of CourseRole can be + found here: https://developers.google.com/classroom/reference/rest/v1/invitations#courserole.*/ + Invitation content = + new Invitation().setCourseId(courseId).setUserId(userId).setRole("TEACHER"); + + invitation = service.invitations().create(content).execute(); + + System.out.printf( + "User (%s) has been invited to course (%s).\n", + invitation.getUserId(), invitation.getCourseId()); + } catch (GoogleJsonResponseException e) { + // TODO (developer) - handle error appropriately + GoogleJsonError error = e.getDetails(); + if (error.getCode() == 404) { + System.out.printf("The course or user does not exist.\n"); + } + throw e; + } catch (Exception e) { + throw e; + } + return invitation; + + // [END classroom_create_invitation_code_snippet] + } +} +// [END classroom_create_invitation] diff --git a/classroom/snippets/src/main/java/CreateTopic.java b/classroom/snippets/src/main/java/CreateTopic.java index a46e573f..1be964a3 100644 --- a/classroom/snippets/src/main/java/CreateTopic.java +++ b/classroom/snippets/src/main/java/CreateTopic.java @@ -12,46 +12,48 @@ // See the License for the specific language governing permissions and // limitations under the License. - // [START classroom_create_topic_class] +import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport; import com.google.api.client.googleapis.json.GoogleJsonError; import com.google.api.client.googleapis.json.GoogleJsonResponseException; -import com.google.api.client.http.HttpRequestInitializer; import com.google.api.client.http.javanet.NetHttpTransport; import com.google.api.client.json.gson.GsonFactory; import com.google.api.services.classroom.Classroom; import com.google.api.services.classroom.ClassroomScopes; import com.google.api.services.classroom.model.Topic; -import com.google.auth.http.HttpCredentialsAdapter; -import com.google.auth.oauth2.GoogleCredentials; import java.io.IOException; -import java.util.Collections; +import java.security.GeneralSecurityException; +import java.util.ArrayList; +import java.util.Arrays; /* Class to demonstrate how to create a topic. */ public class CreateTopic { + + /* Scopes required by this API call. If modifying these scopes, delete your previously saved + tokens/ folder. */ + static ArrayList SCOPES = + new ArrayList<>(Arrays.asList(ClassroomScopes.CLASSROOM_TOPICS)); + /** * Create a new topic in a course. * * @param courseId - the id of the course to create a topic in. * @return - newly created topic. * @throws IOException - if credentials file not found. + * @throws GeneralSecurityException - if a new instance of NetHttpTransport was not created. */ - public static Topic createTopic(String courseId) throws IOException { - /* Load pre-authorized user credentials from the environment. - TODO(developer) - See https://developers.google.com/identity for - guides on implementing OAuth2 for your application. */ - GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() - .createScoped(Collections.singleton(ClassroomScopes.CLASSROOM_TOPICS)); - HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( - credentials); + public static Topic createTopic(String courseId) throws GeneralSecurityException, IOException { // Create the classroom API client. - Classroom service = new Classroom.Builder(new NetHttpTransport(), - GsonFactory.getDefaultInstance(), - requestInitializer) - .setApplicationName("Classroom samples") - .build(); + final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport(); + Classroom service = + new Classroom.Builder( + HTTP_TRANSPORT, + GsonFactory.getDefaultInstance(), + ClassroomCredentials.getCredentials(HTTP_TRANSPORT, SCOPES)) + .setApplicationName("Classroom samples") + .build(); // [START classroom_create_topic_code_snippet] @@ -62,7 +64,7 @@ public static Topic createTopic(String courseId) throws IOException { topic = service.courses().topics().create(courseId, content).execute(); System.out.println("Topic id: " + topic.getTopicId() + "\n" + "Course id: " + courseId); } catch (GoogleJsonResponseException e) { - //TODO (developer) - handle error appropriately + // TODO (developer) - handle error appropriately GoogleJsonError error = e.getDetails(); if (error.getCode() == 404) { System.out.printf("The courseId does not exist: %s.\n", courseId); diff --git a/classroom/snippets/src/main/java/DeleteInvitation.java b/classroom/snippets/src/main/java/DeleteInvitation.java new file mode 100644 index 00000000..eca59e92 --- /dev/null +++ b/classroom/snippets/src/main/java/DeleteInvitation.java @@ -0,0 +1,72 @@ +// Copyright 2023 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// [START classroom_delete_invitation] + +import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport; +import com.google.api.client.googleapis.json.GoogleJsonError; +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.classroom.Classroom; +import com.google.api.services.classroom.ClassroomScopes; +import java.io.IOException; +import java.security.GeneralSecurityException; +import java.util.ArrayList; +import java.util.Arrays; + +/* Class to demonstrate the use of Classroom Delete Invitation API. */ +public class DeleteInvitation { + + /* Scopes required by this API call. If modifying these scopes, delete your previously saved + tokens/ folder. */ + static ArrayList SCOPES = + new ArrayList<>(Arrays.asList(ClassroomScopes.CLASSROOM_ROSTERS)); + + /** + * Deletes an invitation. + * + * @param id - the identifier of the invitation to delete. + * @throws IOException - if credentials file not found. + * @throws GeneralSecurityException - if a new instance of NetHttpTransport was not created. + */ + public static void deleteInvitation(String id) throws GeneralSecurityException, IOException { + + // Create the classroom API client. + final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport(); + Classroom service = + new Classroom.Builder( + HTTP_TRANSPORT, + GsonFactory.getDefaultInstance(), + ClassroomCredentials.getCredentials(HTTP_TRANSPORT, SCOPES)) + .setApplicationName("Classroom samples") + .build(); + + // [START classroom_delete_invitation_code_snippet] + try { + service.invitations().delete(id).execute(); + System.out.printf("Invitation (%s) was deleted.\n", id); + } catch (GoogleJsonResponseException e) { + GoogleJsonError error = e.getDetails(); + if (error.getCode() == 404) { + System.out.printf("The invitation id (%s) does not exist.\n", id); + } + throw e; + } catch (Exception e) { + throw e; + } + // [END classroom_delete_invitation_code_snippet] + } +} +// [END classroom_delete_invitation] diff --git a/classroom/snippets/src/main/java/DeleteTopic.java b/classroom/snippets/src/main/java/DeleteTopic.java index b8ee8f73..15188de6 100644 --- a/classroom/snippets/src/main/java/DeleteTopic.java +++ b/classroom/snippets/src/main/java/DeleteTopic.java @@ -12,23 +12,27 @@ // See the License for the specific language governing permissions and // limitations under the License. - // [START classroom_delete_topic_class] -import com.google.api.client.googleapis.json.GoogleJsonError; +import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport; import com.google.api.client.googleapis.json.GoogleJsonResponseException; -import com.google.api.client.http.HttpRequestInitializer; import com.google.api.client.http.javanet.NetHttpTransport; import com.google.api.client.json.gson.GsonFactory; import com.google.api.services.classroom.Classroom; import com.google.api.services.classroom.ClassroomScopes; -import com.google.auth.http.HttpCredentialsAdapter; -import com.google.auth.oauth2.GoogleCredentials; import java.io.IOException; -import java.util.Collections; +import java.security.GeneralSecurityException; +import java.util.ArrayList; +import java.util.Arrays; /* Class to demonstrate how to delete a topic. */ public class DeleteTopic { + + /* Scopes required by this API call. If modifying these scopes, delete your previously saved + tokens/ folder. */ + static ArrayList SCOPES = + new ArrayList<>(Arrays.asList(ClassroomScopes.CLASSROOM_TOPICS)); + /** * Delete a topic in a course. * @@ -36,22 +40,20 @@ public class DeleteTopic { * @param topicId - the id of the topic to delete. * @return - updated topic. * @throws IOException - if credentials file not found. + * @throws GeneralSecurityException - if a new instance of NetHttpTransport was not created. */ - public static void deleteTopic(String courseId, String topicId) throws IOException { - /* Load pre-authorized user credentials from the environment. - TODO(developer) - See https://developers.google.com/identity for - guides on implementing OAuth2 for your application. */ - GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() - .createScoped(Collections.singleton(ClassroomScopes.CLASSROOM_TOPICS)); - HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( - credentials); + public static void deleteTopic(String courseId, String topicId) + throws GeneralSecurityException, IOException { // Create the classroom API client. - Classroom service = new Classroom.Builder(new NetHttpTransport(), - GsonFactory.getDefaultInstance(), - requestInitializer) - .setApplicationName("Classroom samples") - .build(); + final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport(); + Classroom service = + new Classroom.Builder( + HTTP_TRANSPORT, + GsonFactory.getDefaultInstance(), + ClassroomCredentials.getCredentials(HTTP_TRANSPORT, SCOPES)) + .setApplicationName("Classroom samples") + .build(); // [START classroom_delete_topic_code_snippet] @@ -59,12 +61,7 @@ public static void deleteTopic(String courseId, String topicId) throws IOExcepti service.courses().topics().delete(courseId, topicId).execute(); } catch (GoogleJsonResponseException e) { // TODO(developer) - handle error appropriately - GoogleJsonError error = e.getDetails(); - if (error.getCode() == 404) { - System.out.printf("The courseId or topicId does not exist: %s, %s.\n", courseId, topicId); - } else { - throw e; - } + throw e; } catch (Exception e) { throw e; } diff --git a/classroom/snippets/src/main/java/GetCourse.java b/classroom/snippets/src/main/java/GetCourse.java index 7955f1da..94d07f75 100644 --- a/classroom/snippets/src/main/java/GetCourse.java +++ b/classroom/snippets/src/main/java/GetCourse.java @@ -12,46 +12,48 @@ // See the License for the specific language governing permissions and // limitations under the License. - // [START classroom_get_course] +import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport; import com.google.api.client.googleapis.json.GoogleJsonError; import com.google.api.client.googleapis.json.GoogleJsonResponseException; -import com.google.api.client.http.HttpRequestInitializer; import com.google.api.client.http.javanet.NetHttpTransport; import com.google.api.client.json.gson.GsonFactory; import com.google.api.services.classroom.Classroom; import com.google.api.services.classroom.ClassroomScopes; import com.google.api.services.classroom.model.Course; -import com.google.auth.http.HttpCredentialsAdapter; -import com.google.auth.oauth2.GoogleCredentials; import java.io.IOException; -import java.util.Collections; +import java.security.GeneralSecurityException; +import java.util.ArrayList; +import java.util.Arrays; /* Class to demonstrate the use of Classroom Get Course API */ public class GetCourse { + + /* Scopes required by this API call. If modifying these scopes, delete your previously saved + tokens/ folder. */ + static ArrayList SCOPES = + new ArrayList<>(Arrays.asList(ClassroomScopes.CLASSROOM_COURSES)); + /** * Retrieve a single course's metadata. * * @param courseId - Id of the course to return. * @return a course * @throws IOException - if credentials file not found. + * @throws GeneralSecurityException - if a new instance of NetHttpTransport was not created. */ - public static Course getCourse(String courseId) throws IOException { - /* Load pre-authorized user credentials from the environment. - TODO(developer) - See https://developers.google.com/identity for - guides on implementing OAuth2 for your application. */ - GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() - .createScoped(Collections.singleton(ClassroomScopes.CLASSROOM_COURSES)); - HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( - credentials); + public static Course getCourse(String courseId) throws GeneralSecurityException, IOException { - // Create the classroom API client - Classroom service = new Classroom.Builder(new NetHttpTransport(), - GsonFactory.getDefaultInstance(), - requestInitializer) - .setApplicationName("Classroom samples") - .build(); + // Create the classroom API client. + final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport(); + Classroom service = + new Classroom.Builder( + HTTP_TRANSPORT, + GsonFactory.getDefaultInstance(), + ClassroomCredentials.getCredentials(HTTP_TRANSPORT, SCOPES)) + .setApplicationName("Classroom samples") + .build(); Course course = null; try { @@ -69,4 +71,4 @@ public static Course getCourse(String courseId) throws IOException { return course; } } -// [END classroom_get_course] \ No newline at end of file +// [END classroom_get_course] diff --git a/classroom/snippets/src/main/java/GetInvitation.java b/classroom/snippets/src/main/java/GetInvitation.java new file mode 100644 index 00000000..77d0598f --- /dev/null +++ b/classroom/snippets/src/main/java/GetInvitation.java @@ -0,0 +1,76 @@ +// Copyright 2023 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// [START classroom_get_invitation] + +import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport; +import com.google.api.client.googleapis.json.GoogleJsonError; +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.classroom.Classroom; +import com.google.api.services.classroom.ClassroomScopes; +import com.google.api.services.classroom.model.Invitation; +import java.io.IOException; +import java.security.GeneralSecurityException; +import java.util.ArrayList; +import java.util.Arrays; + +/* Class to demonstrate the use of Classroom Get Invitation API. */ +public class GetInvitation { + /* Scopes required by this API call. If modifying these scopes, delete your previously saved + tokens/ folder. */ + static ArrayList SCOPES = + new ArrayList<>(Arrays.asList(ClassroomScopes.CLASSROOM_ROSTERS)); + + /** + * Retrieves an invitation. + * + * @param id - the identifier of the invitation to retrieve. + * @return the specified invitation. + * @throws IOException - if credentials file not found. + * @throws GeneralSecurityException - if a new instance of NetHttpTransport was not created. + */ + public static Invitation getInvitation(String id) throws GeneralSecurityException, IOException { + // Create the classroom API client. + final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport(); + Classroom service = + new Classroom.Builder( + HTTP_TRANSPORT, + GsonFactory.getDefaultInstance(), + ClassroomCredentials.getCredentials(HTTP_TRANSPORT, SCOPES)) + .setApplicationName("Classroom samples") + .build(); + + // [START classroom_get_invitation_code_snippet] + Invitation invitation = null; + try { + invitation = service.invitations().get(id).execute(); + System.out.printf( + "Invitation (%s) for user (%s) in course (%s) retrieved.\n", + invitation.getId(), invitation.getUserId(), invitation.getCourseId()); + } catch (GoogleJsonResponseException e) { + GoogleJsonError error = e.getDetails(); + if (error.getCode() == 404) { + System.out.printf("The invitation id (%s) does not exist.\n", id); + } + throw e; + } catch (Exception e) { + throw e; + } + return invitation; + // [END classroom_get_invitation_code_snippet] + } +} +// [END classroom_get_invitation] diff --git a/classroom/snippets/src/main/java/GetTopic.java b/classroom/snippets/src/main/java/GetTopic.java index 140a0407..5fb42012 100644 --- a/classroom/snippets/src/main/java/GetTopic.java +++ b/classroom/snippets/src/main/java/GetTopic.java @@ -12,24 +12,29 @@ // See the License for the specific language governing permissions and // limitations under the License. - // [START classroom_get_topic_class] +import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport; import com.google.api.client.googleapis.json.GoogleJsonError; import com.google.api.client.googleapis.json.GoogleJsonResponseException; -import com.google.api.client.http.HttpRequestInitializer; import com.google.api.client.http.javanet.NetHttpTransport; import com.google.api.client.json.gson.GsonFactory; import com.google.api.services.classroom.Classroom; import com.google.api.services.classroom.ClassroomScopes; import com.google.api.services.classroom.model.Topic; -import com.google.auth.http.HttpCredentialsAdapter; -import com.google.auth.oauth2.GoogleCredentials; import java.io.IOException; -import java.util.Collections; +import java.security.GeneralSecurityException; +import java.util.ArrayList; +import java.util.Arrays; /* Class to demonstrate how to get a topic. */ public class GetTopic { + + /* Scopes required by this API call. If modifying these scopes, delete your previously saved + tokens/ folder. */ + static ArrayList SCOPES = + new ArrayList<>(Arrays.asList(ClassroomScopes.CLASSROOM_TOPICS)); + /** * Get a topic in a course. * @@ -37,22 +42,20 @@ public class GetTopic { * @param topicId - the id of the topic to retrieve. * @return - the topic to retrieve. * @throws IOException - if credentials file not found. + * @throws GeneralSecurityException - if a new instance of NetHttpTransport was not created. */ - public static Topic getTopic(String courseId, String topicId) throws IOException { - /* Load pre-authorized user credentials from the environment. - TODO(developer) - See https://developers.google.com/identity for - guides on implementing OAuth2 for your application. */ - GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() - .createScoped(Collections.singleton(ClassroomScopes.CLASSROOM_TOPICS)); - HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( - credentials); + public static Topic getTopic(String courseId, String topicId) + throws GeneralSecurityException, IOException { // Create the classroom API client. - Classroom service = new Classroom.Builder(new NetHttpTransport(), - GsonFactory.getDefaultInstance(), - requestInitializer) - .setApplicationName("Classroom samples") - .build(); + final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport(); + Classroom service = + new Classroom.Builder( + HTTP_TRANSPORT, + GsonFactory.getDefaultInstance(), + ClassroomCredentials.getCredentials(HTTP_TRANSPORT, SCOPES)) + .setApplicationName("Classroom samples") + .build(); // [START classroom_get_topic_code_snippet] @@ -62,13 +65,12 @@ public static Topic getTopic(String courseId, String topicId) throws IOException topic = service.courses().topics().get(courseId, topicId).execute(); System.out.printf("Topic '%s' found.\n", topic.getName()); } catch (GoogleJsonResponseException e) { - //TODO (developer) - handle error appropriately + // TODO (developer) - handle error appropriately GoogleJsonError error = e.getDetails(); if (error.getCode() == 404) { System.out.printf("The courseId or topicId does not exist: %s, %s.\n", courseId, topicId); - } else { - throw e; } + throw e; } catch (Exception e) { throw e; } diff --git a/classroom/snippets/src/main/java/ListCourseAliases.java b/classroom/snippets/src/main/java/ListCourseAliases.java index c3141cf1..dbec2299 100644 --- a/classroom/snippets/src/main/java/ListCourseAliases.java +++ b/classroom/snippets/src/main/java/ListCourseAliases.java @@ -12,50 +12,51 @@ // See the License for the specific language governing permissions and // limitations under the License. - // [START classroom_list_aliases_class] +import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport; import com.google.api.client.googleapis.json.GoogleJsonError; import com.google.api.client.googleapis.json.GoogleJsonResponseException; -import com.google.api.client.http.HttpRequestInitializer; import com.google.api.client.http.javanet.NetHttpTransport; import com.google.api.client.json.gson.GsonFactory; import com.google.api.services.classroom.Classroom; import com.google.api.services.classroom.ClassroomScopes; import com.google.api.services.classroom.model.CourseAlias; import com.google.api.services.classroom.model.ListCourseAliasesResponse; -import com.google.auth.http.HttpCredentialsAdapter; -import com.google.auth.oauth2.GoogleCredentials; import java.io.IOException; +import java.security.GeneralSecurityException; import java.util.ArrayList; -import java.util.Collections; +import java.util.Arrays; import java.util.List; /* Class to demonstrate the use of Classroom List Alias API */ public class ListCourseAliases { + + /* Scopes required by this API call. If modifying these scopes, delete your previously saved + tokens/ folder. */ + static ArrayList SCOPES = + new ArrayList<>(Arrays.asList(ClassroomScopes.CLASSROOM_COURSES)); + /** * Retrieve the aliases for a course. * * @param courseId - id of the course. * @return list of course aliases * @throws IOException - if credentials file not found. + * @throws GeneralSecurityException - if a new instance of NetHttpTransport was not created. */ public static List listCourseAliases(String courseId) - throws IOException { - /* Load pre-authorized user credentials from the environment. - TODO(developer) - See https://developers.google.com/identity for - guides on implementing OAuth2 for your application. */ - GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() - .createScoped(Collections.singleton(ClassroomScopes.CLASSROOM_COURSES)); - HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( - credentials); + throws GeneralSecurityException, IOException { - // Create the classroom API client - Classroom service = new Classroom.Builder(new NetHttpTransport(), - GsonFactory.getDefaultInstance(), - requestInitializer) - .setApplicationName("Classroom samples") - .build(); + // Create the classroom API client. + final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport(); + Classroom service = + new Classroom.Builder( + HTTP_TRANSPORT, + GsonFactory.getDefaultInstance(), + ClassroomCredentials.getCredentials(HTTP_TRANSPORT, SCOPES)) + .setApplicationName("Classroom samples") + .build(); // [START classroom_list_aliases_code_snippet] @@ -65,10 +66,14 @@ public static List listCourseAliases(String courseId) try { // List of aliases of specified course do { - ListCourseAliasesResponse response = service.courses().aliases().list(courseId) - .setPageSize(100) - .setPageToken(pageToken) - .execute(); + ListCourseAliasesResponse response = + service + .courses() + .aliases() + .list(courseId) + .setPageSize(100) + .setPageToken(pageToken) + .execute(); courseAliases.addAll(response.getAliases()); pageToken = response.getNextPageToken(); } while (pageToken != null); @@ -95,4 +100,4 @@ public static List listCourseAliases(String courseId) // [END classroom_list_aliases_code_snippet] } } -// [END classroom_list_aliases_class] \ No newline at end of file +// [END classroom_list_aliases_class] diff --git a/classroom/snippets/src/main/java/ListCourses.java b/classroom/snippets/src/main/java/ListCourses.java index 5b7bd58f..c5a00b25 100644 --- a/classroom/snippets/src/main/java/ListCourses.java +++ b/classroom/snippets/src/main/java/ListCourses.java @@ -12,57 +12,55 @@ // See the License for the specific language governing permissions and // limitations under the License. - // [START classroom_list_courses] -import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport; import com.google.api.client.http.javanet.NetHttpTransport; import com.google.api.client.json.gson.GsonFactory; import com.google.api.services.classroom.Classroom; import com.google.api.services.classroom.ClassroomScopes; import com.google.api.services.classroom.model.Course; import com.google.api.services.classroom.model.ListCoursesResponse; -import com.google.auth.http.HttpCredentialsAdapter; -import com.google.auth.oauth2.GoogleCredentials; - import java.io.IOException; +import java.security.GeneralSecurityException; import java.util.ArrayList; -import java.util.Collections; +import java.util.Arrays; import java.util.List; /* Class to demonstrate the use of Classroom List Course API */ public class ListCourses { + + /* Scopes required by this API call. If modifying these scopes, delete your previously saved + tokens/ folder. */ + static ArrayList SCOPES = + new ArrayList<>(Arrays.asList(ClassroomScopes.CLASSROOM_COURSES)); + /** * Retrieves all courses with metadata * * @return list of courses with its metadata * @throws IOException - if credentials file not found. + * @throws GeneralSecurityException - if a new instance of NetHttpTransport was not created. */ - public static List listCourses() throws IOException { - /* Load pre-authorized user credentials from the environment. - TODO(developer) - See https://developers.google.com/identity for - guides on implementing OAuth2 for your application. */ - GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() - .createScoped(Collections.singleton(ClassroomScopes.CLASSROOM_COURSES)); - HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( - credentials); + public static List listCourses() throws GeneralSecurityException, IOException { - // Create the classroom API client - Classroom service = new Classroom.Builder(new NetHttpTransport(), - GsonFactory.getDefaultInstance(), - requestInitializer) - .setApplicationName("Classroom samples") - .build(); + // Create the classroom API client. + final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport(); + Classroom service = + new Classroom.Builder( + HTTP_TRANSPORT, + GsonFactory.getDefaultInstance(), + ClassroomCredentials.getCredentials(HTTP_TRANSPORT, SCOPES)) + .setApplicationName("Classroom samples") + .build(); String pageToken = null; List courses = new ArrayList<>(); try { do { - ListCoursesResponse response = service.courses().list() - .setPageSize(100) - .setPageToken(pageToken) - .execute(); + ListCoursesResponse response = + service.courses().list().setPageSize(100).setPageToken(pageToken).execute(); courses.addAll(response.getCourses()); pageToken = response.getNextPageToken(); } while (pageToken != null); @@ -82,4 +80,4 @@ public static List listCourses() throws IOException { return courses; } } -// [END classroom_list_courses] \ No newline at end of file +// [END classroom_list_courses] diff --git a/classroom/snippets/src/main/java/ListStudentSubmissions.java b/classroom/snippets/src/main/java/ListStudentSubmissions.java index c5d8b29f..20e322a1 100644 --- a/classroom/snippets/src/main/java/ListStudentSubmissions.java +++ b/classroom/snippets/src/main/java/ListStudentSubmissions.java @@ -14,24 +14,29 @@ // [START classroom_list_student_submissions_class] +import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport; import com.google.api.client.googleapis.json.GoogleJsonError; import com.google.api.client.googleapis.json.GoogleJsonResponseException; -import com.google.api.client.http.HttpRequestInitializer; import com.google.api.client.http.javanet.NetHttpTransport; import com.google.api.client.json.gson.GsonFactory; import com.google.api.services.classroom.Classroom; import com.google.api.services.classroom.ClassroomScopes; import com.google.api.services.classroom.model.ListStudentSubmissionsResponse; import com.google.api.services.classroom.model.StudentSubmission; -import com.google.auth.http.HttpCredentialsAdapter; -import com.google.auth.oauth2.GoogleCredentials; import java.io.IOException; +import java.security.GeneralSecurityException; import java.util.ArrayList; -import java.util.Collections; +import java.util.Arrays; import java.util.List; /* Class to demonstrate the use of Classroom List StudentSubmissions API. */ public class ListStudentSubmissions { + + /* Scopes required by this API call. If modifying these scopes, delete your previously saved + tokens/ folder. */ + static ArrayList SCOPES = + new ArrayList<>(Arrays.asList(ClassroomScopes.CLASSROOM_COURSEWORK_STUDENTS)); + /** * Retrieves a specific student's submissions for the specified course work. * @@ -40,26 +45,23 @@ public class ListStudentSubmissions { * @param userId - identifier of the student whose work to return. * @return - list of student submissions. * @throws IOException - if credentials file not found. + * @throws GeneralSecurityException - if a new instance of NetHttpTransport was not created. */ public static List listStudentSubmissions( - String courseId, String courseWorkId, String userId) throws IOException { - /* Load pre-authorized user credentials from the environment. - TODO(developer) - See https://developers.google.com/identity for - guides on implementing OAuth2 for your application. */ - GoogleCredentials credentials = - GoogleCredentials.getApplicationDefault() - .createScoped(Collections.singleton(ClassroomScopes.CLASSROOM_COURSEWORK_STUDENTS)); - HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter(credentials); + String courseId, String courseWorkId, String userId) + throws GeneralSecurityException, IOException { // Create the classroom API client. + final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport(); Classroom service = new Classroom.Builder( - new NetHttpTransport(), GsonFactory.getDefaultInstance(), requestInitializer) + HTTP_TRANSPORT, + GsonFactory.getDefaultInstance(), + ClassroomCredentials.getCredentials(HTTP_TRANSPORT, SCOPES)) .setApplicationName("Classroom samples") .build(); // [START classroom_list_student_submissions_code_snippet] - List studentSubmissions = new ArrayList<>(); String pageToken = null; @@ -90,6 +92,7 @@ public static List listStudentSubmissions( System.out.printf("Student submission: %s.\n", submission.getId()); } } + // [END classroom_list_student_submissions_code_snippet] } catch (GoogleJsonResponseException e) { // TODO (developer) - handle error appropriately GoogleJsonError error = e.getDetails(); @@ -104,9 +107,73 @@ public static List listStudentSubmissions( throw e; } return studentSubmissions; + } - // [END classroom_list_student_submissions_code_snippet] + /** + * Lists all assigned grades for a particular coursework item. + * + * @param courseId - identifier of the course. + * @param courseWorkId - identifier of the course work. + * @throws IOException - if credentials file not found. + * @throws GeneralSecurityException - if a new instance of NetHttpTransport was not created. + */ + public static void listAssignedGrades(String courseId, String courseWorkId) + throws GeneralSecurityException, IOException { + // Create the classroom API client. + final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport(); + Classroom service = + new Classroom.Builder( + HTTP_TRANSPORT, + GsonFactory.getDefaultInstance(), + ClassroomCredentials.getCredentials(HTTP_TRANSPORT, SCOPES)) + .setApplicationName("Classroom samples") + .build(); + + List studentSubmissions = new ArrayList<>(); + String pageToken = null; + + try { + do { + // [START classroom_list_assigned_grades_code_snippet] + ListStudentSubmissionsResponse response = + service + .courses() + .courseWork() + .studentSubmissions() + .list(courseId, courseWorkId) + .setPageToken(pageToken) + .execute(); + + /* Ensure that the response is not null before retrieving data from it to avoid errors. */ + if (response.getStudentSubmissions() != null) { + studentSubmissions.addAll(response.getStudentSubmissions()); + pageToken = response.getNextPageToken(); + } + } while (pageToken != null); + + if (studentSubmissions.isEmpty()) { + System.out.println("No student submissions found."); + } else { + for (StudentSubmission submission : studentSubmissions) { + System.out.printf( + "User ID %s, Assigned grade: %s\n", + submission.getUserId(), submission.getAssignedGrade()); + } + } + // [END classroom_list_assigned_grades_code_snippet] + } catch (GoogleJsonResponseException e) { + // TODO (developer) - handle error appropriately + GoogleJsonError error = e.getDetails(); + if (error.getCode() == 404) { + System.out.printf( + "The courseId (%s) or courseWorkId (%s) does not exist.\n", courseId, courseWorkId); + } else { + throw e; + } + } catch (Exception e) { + throw e; + } } } // [END classroom_list_student_submissions_class] diff --git a/classroom/snippets/src/main/java/ListSubmissions.java b/classroom/snippets/src/main/java/ListSubmissions.java index d5356d70..105c9b41 100644 --- a/classroom/snippets/src/main/java/ListSubmissions.java +++ b/classroom/snippets/src/main/java/ListSubmissions.java @@ -14,24 +14,28 @@ // [START classroom_list_submissions_class] +import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport; import com.google.api.client.googleapis.json.GoogleJsonError; import com.google.api.client.googleapis.json.GoogleJsonResponseException; -import com.google.api.client.http.HttpRequestInitializer; import com.google.api.client.http.javanet.NetHttpTransport; import com.google.api.client.json.gson.GsonFactory; import com.google.api.services.classroom.Classroom; import com.google.api.services.classroom.ClassroomScopes; import com.google.api.services.classroom.model.ListStudentSubmissionsResponse; import com.google.api.services.classroom.model.StudentSubmission; -import com.google.auth.http.HttpCredentialsAdapter; -import com.google.auth.oauth2.GoogleCredentials; import java.io.IOException; +import java.security.GeneralSecurityException; import java.util.ArrayList; -import java.util.Collections; +import java.util.Arrays; import java.util.List; /* Class to demonstrate the use of Classroom List StudentSubmissions API. */ public class ListSubmissions { + + /* Scopes required by this API call. If modifying these scopes, delete your previously saved + tokens/ folder. */ + static ArrayList SCOPES = + new ArrayList<>(Arrays.asList(ClassroomScopes.CLASSROOM_COURSEWORK_STUDENTS)); /** * Retrieves submissions for all students for the specified course work in a course. * @@ -39,21 +43,18 @@ public class ListSubmissions { * @param courseWorkId - identifier of the course work. * @return - list of student submissions. * @throws IOException - if credentials file not found. + * @throws GeneralSecurityException - if a new instance of NetHttpTransport was not created. */ public static List listSubmissions(String courseId, String courseWorkId) - throws IOException { - /* Load pre-authorized user credentials from the environment. - TODO(developer) - See https://developers.google.com/identity for - guides on implementing OAuth2 for your application. */ - GoogleCredentials credentials = - GoogleCredentials.getApplicationDefault() - .createScoped(Collections.singleton(ClassroomScopes.CLASSROOM_COURSEWORK_STUDENTS)); - HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter(credentials); + throws GeneralSecurityException, IOException { // Create the classroom API client. + final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport(); Classroom service = new Classroom.Builder( - new NetHttpTransport(), GsonFactory.getDefaultInstance(), requestInitializer) + HTTP_TRANSPORT, + GsonFactory.getDefaultInstance(), + ClassroomCredentials.getCredentials(HTTP_TRANSPORT, SCOPES)) .setApplicationName("Classroom samples") .build(); diff --git a/classroom/snippets/src/main/java/ListTopics.java b/classroom/snippets/src/main/java/ListTopics.java index 6412a1cb..ea35cf90 100644 --- a/classroom/snippets/src/main/java/ListTopics.java +++ b/classroom/snippets/src/main/java/ListTopics.java @@ -14,44 +14,47 @@ // [START classroom_list_topic_class] +import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport; import com.google.api.client.googleapis.json.GoogleJsonError; import com.google.api.client.googleapis.json.GoogleJsonResponseException; -import com.google.api.client.http.HttpRequestInitializer; import com.google.api.client.http.javanet.NetHttpTransport; import com.google.api.client.json.gson.GsonFactory; import com.google.api.services.classroom.Classroom; import com.google.api.services.classroom.ClassroomScopes; import com.google.api.services.classroom.model.ListTopicResponse; import com.google.api.services.classroom.model.Topic; -import com.google.auth.http.HttpCredentialsAdapter; -import com.google.auth.oauth2.GoogleCredentials; import java.io.IOException; +import java.security.GeneralSecurityException; import java.util.ArrayList; -import java.util.Collections; +import java.util.Arrays; import java.util.List; /* Class to demonstrate how to list topics in a course. */ public class ListTopics { + + /* Scopes required by this API call. If modifying these scopes, delete your previously saved + tokens/ folder. */ + static ArrayList SCOPES = + new ArrayList<>(Arrays.asList(ClassroomScopes.CLASSROOM_TOPICS)); + /** * List topics in a course. * * @param courseId - the id of the course to retrieve topics for. * @return - the list of topics in the course that the caller is permitted to view. * @throws IOException - if credentials file not found. + * @throws GeneralSecurityException - if a new instance of NetHttpTransport was not created. */ - public static List listTopics(String courseId) throws IOException { - /* Load pre-authorized user credentials from the environment. - TODO(developer) - See https://developers.google.com/identity for - guides on implementing OAuth2 for your application. */ - GoogleCredentials credentials = - GoogleCredentials.getApplicationDefault() - .createScoped(Collections.singleton(ClassroomScopes.CLASSROOM_TOPICS)); - HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter(credentials); + public static List listTopics(String courseId) + throws GeneralSecurityException, IOException { // Create the classroom API client. + final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport(); Classroom service = new Classroom.Builder( - new NetHttpTransport(), GsonFactory.getDefaultInstance(), requestInitializer) + HTTP_TRANSPORT, + GsonFactory.getDefaultInstance(), + ClassroomCredentials.getCredentials(HTTP_TRANSPORT, SCOPES)) .setApplicationName("Classroom samples") .build(); diff --git a/classroom/snippets/src/main/java/ModifyAttachmentsStudentSubmission.java b/classroom/snippets/src/main/java/ModifyAttachmentsStudentSubmission.java index 252f51f5..d047ac2b 100644 --- a/classroom/snippets/src/main/java/ModifyAttachmentsStudentSubmission.java +++ b/classroom/snippets/src/main/java/ModifyAttachmentsStudentSubmission.java @@ -12,12 +12,11 @@ // See the License for the specific language governing permissions and // limitations under the License. - // [START classroom_modify_attachments_student_submissions_class] +import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport; import com.google.api.client.googleapis.json.GoogleJsonError; import com.google.api.client.googleapis.json.GoogleJsonResponseException; -import com.google.api.client.http.HttpRequestInitializer; import com.google.api.client.http.javanet.NetHttpTransport; import com.google.api.client.json.gson.GsonFactory; import com.google.api.services.classroom.Classroom; @@ -26,14 +25,19 @@ import com.google.api.services.classroom.model.Link; import com.google.api.services.classroom.model.ModifyAttachmentsRequest; import com.google.api.services.classroom.model.StudentSubmission; -import com.google.auth.http.HttpCredentialsAdapter; -import com.google.auth.oauth2.GoogleCredentials; import java.io.IOException; +import java.security.GeneralSecurityException; +import java.util.ArrayList; import java.util.Arrays; -import java.util.Collections; /* Class to demonstrate the use of Classroom ModifyAttachments StudentSubmissions API. */ public class ModifyAttachmentsStudentSubmission { + + /* Scopes required by this API call. If modifying these scopes, delete your previously saved + tokens/ folder. */ + static ArrayList SCOPES = + new ArrayList<>(Arrays.asList(ClassroomScopes.CLASSROOM_COURSEWORK_STUDENTS)); + /** * Modify attachments on a student submission. * @@ -42,23 +46,20 @@ public class ModifyAttachmentsStudentSubmission { * @param id - identifier of the student submission. * @return - the modified student submission. * @throws IOException - if credentials file not found. + * @throws GeneralSecurityException - if a new instance of NetHttpTransport was not created. */ public static StudentSubmission modifyAttachments(String courseId, String courseWorkId, String id) - throws IOException { - /* Load pre-authorized user credentials from the environment. - TODO(developer) - See https://developers.google.com/identity for - guides on implementing OAuth2 for your application. */ - GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() - .createScoped(Collections.singleton(ClassroomScopes.CLASSROOM_COURSEWORK_STUDENTS)); - HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( - credentials); + throws GeneralSecurityException, IOException { // Create the classroom API client. - Classroom service = new Classroom.Builder(new NetHttpTransport(), - GsonFactory.getDefaultInstance(), - requestInitializer) - .setApplicationName("Classroom samples") - .build(); + final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport(); + Classroom service = + new Classroom.Builder( + HTTP_TRANSPORT, + GsonFactory.getDefaultInstance(), + ClassroomCredentials.getCredentials(HTTP_TRANSPORT, SCOPES)) + .setApplicationName("Classroom samples") + .build(); // [START classroom_modify_attachments_student_submissions_code_snippet] @@ -67,28 +68,34 @@ public static StudentSubmission modifyAttachments(String courseId, String course // Create ModifyAttachmentRequest object that includes a new attachment with a link. Link link = new Link().setUrl("https://en.wikipedia.org/wiki/Irrational_number"); Attachment attachment = new Attachment().setLink(link); - ModifyAttachmentsRequest modifyAttachmentsRequest = new ModifyAttachmentsRequest() - .setAddAttachments(Arrays.asList(attachment)); + ModifyAttachmentsRequest modifyAttachmentsRequest = + new ModifyAttachmentsRequest().setAddAttachments(Arrays.asList(attachment)); // The modified studentSubmission object is returned with the new attachment added to it. - studentSubmission = service.courses().courseWork().studentSubmissions().modifyAttachments( - courseId, courseWorkId, id, modifyAttachmentsRequest) - .execute(); + studentSubmission = + service + .courses() + .courseWork() + .studentSubmissions() + .modifyAttachments(courseId, courseWorkId, id, modifyAttachmentsRequest) + .execute(); /* Prints the modified student submission. */ - System.out.printf("Modified student submission attachments: '%s'.\n", studentSubmission - .getAssignmentSubmission() - .getAttachments()); + System.out.printf( + "Modified student submission attachments: '%s'.\n", + studentSubmission.getAssignmentSubmission().getAttachments()); } catch (GoogleJsonResponseException e) { - //TODO (developer) - handle error appropriately + // TODO (developer) - handle error appropriately GoogleJsonError error = e.getDetails(); if (error.getCode() == 404) { - System.out.printf("The courseId (%s), courseWorkId (%s), or studentSubmissionId (%s) does " - + "not exist.\n", courseId, courseWorkId, id); + System.out.printf( + "The courseId (%s), courseWorkId (%s), or studentSubmissionId (%s) does " + + "not exist.\n", + courseId, courseWorkId, id); } else { throw e; } - } catch(Exception e) { + } catch (Exception e) { throw e; } return studentSubmission; @@ -97,4 +104,4 @@ public static StudentSubmission modifyAttachments(String courseId, String course } } -// [END classroom_modify_attachments_student_submissions_class] \ No newline at end of file +// [END classroom_modify_attachments_student_submissions_class] diff --git a/classroom/snippets/src/main/java/PatchCourse.java b/classroom/snippets/src/main/java/PatchCourse.java index e8c5d31b..05bc71ac 100644 --- a/classroom/snippets/src/main/java/PatchCourse.java +++ b/classroom/snippets/src/main/java/PatchCourse.java @@ -12,54 +12,53 @@ // See the License for the specific language governing permissions and // limitations under the License. - // [START classroom_patch_course] +import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport; import com.google.api.client.googleapis.json.GoogleJsonError; import com.google.api.client.googleapis.json.GoogleJsonResponseException; -import com.google.api.client.http.HttpRequestInitializer; import com.google.api.client.http.javanet.NetHttpTransport; import com.google.api.client.json.gson.GsonFactory; import com.google.api.services.classroom.Classroom; import com.google.api.services.classroom.ClassroomScopes; import com.google.api.services.classroom.model.Course; -import com.google.auth.http.HttpCredentialsAdapter; -import com.google.auth.oauth2.GoogleCredentials; import java.io.IOException; -import java.util.Collections; +import java.security.GeneralSecurityException; +import java.util.ArrayList; +import java.util.Arrays; /* Class to demonstrate the use of Classroom Patch Course API */ public class PatchCourse { + + /* Scopes required by this API call. If modifying these scopes, delete your previously saved + tokens/ folder. */ + static ArrayList SCOPES = + new ArrayList<>(Arrays.asList(ClassroomScopes.CLASSROOM_COURSES)); + /** * Updates one or more fields in a course. * * @param courseId - Id of the course to update. * @return updated course * @throws IOException - if credentials file not found. + * @throws GeneralSecurityException - if a new instance of NetHttpTransport was not created. */ - public static Course patchCourse(String courseId) throws IOException { - /* Load pre-authorized user credentials from the environment. - TODO(developer) - See https://developers.google.com/identity for - guides on implementing OAuth2 for your application. */ - GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() - .createScoped(Collections.singleton(ClassroomScopes.CLASSROOM_COURSES)); - HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( - credentials); + public static Course patchCourse(String courseId) throws GeneralSecurityException, IOException { + + // Create the classroom API client. + final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport(); + Classroom service = + new Classroom.Builder( + HTTP_TRANSPORT, + GsonFactory.getDefaultInstance(), + ClassroomCredentials.getCredentials(HTTP_TRANSPORT, SCOPES)) + .setApplicationName("Classroom samples") + .build(); - // Create the classroom API client - Classroom service = new Classroom.Builder(new NetHttpTransport(), - GsonFactory.getDefaultInstance(), - requestInitializer) - .setApplicationName("Classroom samples") - .build(); Course course = null; try { - course = new Course() - .setSection("Period 3") - .setRoom("302"); - course = service.courses().patch(courseId, course) - .setUpdateMask("section,room") - .execute(); + course = new Course().setSection("Period 3").setRoom("302"); + course = service.courses().patch(courseId, course).setUpdateMask("section,room").execute(); System.out.printf("Course '%s' updated.\n", course.getName()); } catch (GoogleJsonResponseException e) { // TODO(developer) - handle error appropriately @@ -73,4 +72,4 @@ public static Course patchCourse(String courseId) throws IOException { return course; } } -// [END classroom_patch_course] \ No newline at end of file +// [END classroom_patch_course] diff --git a/classroom/snippets/src/main/java/PatchStudentSubmission.java b/classroom/snippets/src/main/java/PatchStudentSubmission.java index 1690ef8e..33ed5165 100644 --- a/classroom/snippets/src/main/java/PatchStudentSubmission.java +++ b/classroom/snippets/src/main/java/PatchStudentSubmission.java @@ -12,24 +12,28 @@ // See the License for the specific language governing permissions and // limitations under the License. - // [START classroom_patch_student_submissions_class] +import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport; import com.google.api.client.googleapis.json.GoogleJsonError; import com.google.api.client.googleapis.json.GoogleJsonResponseException; -import com.google.api.client.http.HttpRequestInitializer; import com.google.api.client.http.javanet.NetHttpTransport; import com.google.api.client.json.gson.GsonFactory; import com.google.api.services.classroom.Classroom; import com.google.api.services.classroom.ClassroomScopes; import com.google.api.services.classroom.model.StudentSubmission; -import com.google.auth.http.HttpCredentialsAdapter; -import com.google.auth.oauth2.GoogleCredentials; import java.io.IOException; -import java.util.Collections; +import java.security.GeneralSecurityException; +import java.util.ArrayList; +import java.util.Arrays; /* Class to demonstrate the use of Classroom Patch StudentSubmissions API. */ public class PatchStudentSubmission { + + /* Scopes required by this API call. If modifying these scopes, delete your previously saved + tokens/ folder. */ + static ArrayList SCOPES = + new ArrayList<>(Arrays.asList(ClassroomScopes.CLASSROOM_COURSEWORK_STUDENTS)); /** * Updates the draft grade and/or assigned grade of a student submission. * @@ -38,51 +42,59 @@ public class PatchStudentSubmission { * @param id - identifier of the student submission. * @return - the updated student submission. * @throws IOException - if credentials file not found. + * @throws GeneralSecurityException - if a new instance of NetHttpTransport was not created. */ - public static StudentSubmission patchStudentSubmission(String courseId, String courseWorkId, - String id) throws IOException { - /* Load pre-authorized user credentials from the environment. - TODO(developer) - See https://developers.google.com/identity for - guides on implementing OAuth2 for your application. */ - GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() - .createScoped(Collections.singleton(ClassroomScopes.CLASSROOM_COURSEWORK_STUDENTS)); - HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( - credentials); + public static StudentSubmission patchStudentSubmission( + String courseId, String courseWorkId, String id) + throws GeneralSecurityException, IOException { // Create the classroom API client. - Classroom service = new Classroom.Builder(new NetHttpTransport(), - GsonFactory.getDefaultInstance(), - requestInitializer) - .setApplicationName("Classroom samples") - .build(); + final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport(); + Classroom service = + new Classroom.Builder( + HTTP_TRANSPORT, + GsonFactory.getDefaultInstance(), + ClassroomCredentials.getCredentials(HTTP_TRANSPORT, SCOPES)) + .setApplicationName("Classroom samples") + .build(); // [START classroom_patch_student_submissions_code_snippet] StudentSubmission studentSubmission = null; try { // Updating the draftGrade and assignedGrade fields for the specific student submission. - StudentSubmission content = service.courses().courseWork().studentSubmissions() - .get(courseId, courseWorkId, id) - .execute(); + StudentSubmission content = + service + .courses() + .courseWork() + .studentSubmissions() + .get(courseId, courseWorkId, id) + .execute(); content.setAssignedGrade(90.00); content.setDraftGrade(80.00); // The updated studentSubmission object is returned with the new draftGrade and assignedGrade. - studentSubmission = service.courses().courseWork().studentSubmissions() - .patch(courseId, courseWorkId, id, content) - .set("updateMask", "draftGrade,assignedGrade") - .execute(); + studentSubmission = + service + .courses() + .courseWork() + .studentSubmissions() + .patch(courseId, courseWorkId, id, content) + .set("updateMask", "draftGrade,assignedGrade") + .execute(); /* Prints the updated student submission. */ - System.out.printf("Updated student submission draft grade (%s) and assigned grade (%s).\n", - studentSubmission.getDraftGrade(), - studentSubmission.getAssignedGrade()); + System.out.printf( + "Updated student submission draft grade (%s) and assigned grade (%s).\n", + studentSubmission.getDraftGrade(), studentSubmission.getAssignedGrade()); } catch (GoogleJsonResponseException e) { - //TODO (developer) - handle error appropriately + // TODO (developer) - handle error appropriately GoogleJsonError error = e.getDetails(); if (error.getCode() == 404) { - System.out.printf("The courseId (%s), courseWorkId (%s), or studentSubmissionId (%s) does " - + "not exist.\n", courseId, courseWorkId, id); + System.out.printf( + "The courseId (%s), courseWorkId (%s), or studentSubmissionId (%s) does " + + "not exist.\n", + courseId, courseWorkId, id); } else { throw e; } @@ -95,4 +107,4 @@ public static StudentSubmission patchStudentSubmission(String courseId, String c } } -// [END classroom_patch_student_submissions_class] \ No newline at end of file +// [END classroom_patch_student_submissions_class] diff --git a/classroom/snippets/src/main/java/ReturnStudentSubmission.java b/classroom/snippets/src/main/java/ReturnStudentSubmission.java index 6b40fc96..61c891a0 100644 --- a/classroom/snippets/src/main/java/ReturnStudentSubmission.java +++ b/classroom/snippets/src/main/java/ReturnStudentSubmission.java @@ -12,60 +12,67 @@ // See the License for the specific language governing permissions and // limitations under the License. - // [START classroom_return_student_submissions_class] +import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport; import com.google.api.client.googleapis.json.GoogleJsonError; import com.google.api.client.googleapis.json.GoogleJsonResponseException; -import com.google.api.client.http.HttpRequestInitializer; import com.google.api.client.http.javanet.NetHttpTransport; import com.google.api.client.json.gson.GsonFactory; import com.google.api.services.classroom.Classroom; import com.google.api.services.classroom.ClassroomScopes; -import com.google.auth.http.HttpCredentialsAdapter; -import com.google.auth.oauth2.GoogleCredentials; import java.io.IOException; -import java.util.Collections; +import java.security.GeneralSecurityException; +import java.util.ArrayList; +import java.util.Arrays; /* Class to demonstrate the use of Classroom Return StudentSubmissions API. */ public class ReturnStudentSubmission { + + /* Scopes required by this API call. If modifying these scopes, delete your previously saved + tokens/ folder. */ + static ArrayList SCOPES = + new ArrayList<>(Arrays.asList(ClassroomScopes.CLASSROOM_COURSEWORK_STUDENTS)); /** - * Return a student submission back to the student which updates the submission state to `RETURNED`. + * Return a student submission back to the student which updates the submission state to + * `RETURNED`. * * @param courseId - identifier of the course. * @param courseWorkId - identifier of the course work. * @param id - identifier of the student submission. * @throws IOException - if credentials file not found. + * @throws GeneralSecurityException - if a new instance of NetHttpTransport was not created. */ public static void returnSubmission(String courseId, String courseWorkId, String id) - throws IOException { - /* Load pre-authorized user credentials from the environment. - TODO(developer) - See https://developers.google.com/identity for - guides on implementing OAuth2 for your application. */ - GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() - .createScoped(Collections.singleton(ClassroomScopes.CLASSROOM_COURSEWORK_STUDENTS)); - HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( - credentials); + throws GeneralSecurityException, IOException { // Create the classroom API client. - Classroom service = new Classroom.Builder(new NetHttpTransport(), - GsonFactory.getDefaultInstance(), - requestInitializer) - .setApplicationName("Classroom samples") - .build(); + final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport(); + Classroom service = + new Classroom.Builder( + HTTP_TRANSPORT, + GsonFactory.getDefaultInstance(), + ClassroomCredentials.getCredentials(HTTP_TRANSPORT, SCOPES)) + .setApplicationName("Classroom samples") + .build(); // [START classroom_return_student_submissions_code_snippet] try { - service.courses().courseWork().studentSubmissions() + service + .courses() + .courseWork() + .studentSubmissions() .classroomReturn(courseId, courseWorkId, id, null) .execute(); } catch (GoogleJsonResponseException e) { - //TODO (developer) - handle error appropriately + // TODO (developer) - handle error appropriately GoogleJsonError error = e.getDetails(); if (error.getCode() == 404) { - System.out.printf("The courseId (%s), courseWorkId (%s), or studentSubmissionId (%s) does " - + "not exist.\n", courseId, courseWorkId, id); + System.out.printf( + "The courseId (%s), courseWorkId (%s), or studentSubmissionId (%s) does " + + "not exist.\n", + courseId, courseWorkId, id); } else { throw e; } diff --git a/classroom/snippets/src/main/java/UpdateCourse.java b/classroom/snippets/src/main/java/UpdateCourse.java index 9e0d63ed..fdfd6062 100644 --- a/classroom/snippets/src/main/java/UpdateCourse.java +++ b/classroom/snippets/src/main/java/UpdateCourse.java @@ -12,46 +12,47 @@ // See the License for the specific language governing permissions and // limitations under the License. - // [START classroom_update_course] +import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport; import com.google.api.client.googleapis.json.GoogleJsonError; import com.google.api.client.googleapis.json.GoogleJsonResponseException; -import com.google.api.client.http.HttpRequestInitializer; import com.google.api.client.http.javanet.NetHttpTransport; import com.google.api.client.json.gson.GsonFactory; import com.google.api.services.classroom.Classroom; import com.google.api.services.classroom.ClassroomScopes; import com.google.api.services.classroom.model.Course; -import com.google.auth.http.HttpCredentialsAdapter; -import com.google.auth.oauth2.GoogleCredentials; import java.io.IOException; -import java.util.Collections; +import java.security.GeneralSecurityException; +import java.util.ArrayList; +import java.util.Arrays; /* Class to demonstrate the use of Classroom Update Course API */ public class UpdateCourse { + + /* Scopes required by this API call. If modifying these scopes, delete your previously saved + tokens/ folder. */ + static ArrayList SCOPES = + new ArrayList<>(Arrays.asList(ClassroomScopes.CLASSROOM_COURSES)); /** * Updates a course's metadata. * * @param courseId - Id of the course to update. * @return updated course * @throws IOException - if credentials file not found. + * @throws GeneralSecurityException - if a new instance of NetHttpTransport was not created. */ - public static Course updateCourse(String courseId) throws IOException { - /* Load pre-authorized user credentials from the environment. - TODO(developer) - See https://developers.google.com/identity for - guides on implementing OAuth2 for your application. */ - GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() - .createScoped(Collections.singleton(ClassroomScopes.CLASSROOM_COURSES)); - HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( - credentials); + public static Course updateCourse(String courseId) throws GeneralSecurityException, IOException { - // Create the classroom API client - Classroom service = new Classroom.Builder(new NetHttpTransport(), - GsonFactory.getDefaultInstance(), - requestInitializer) - .setApplicationName("Classroom samples") - .build(); + // Create the classroom API client. + final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport(); + Classroom service = + new Classroom.Builder( + HTTP_TRANSPORT, + GsonFactory.getDefaultInstance(), + ClassroomCredentials.getCredentials(HTTP_TRANSPORT, SCOPES)) + .setApplicationName("Classroom samples") + .build(); Course course = null; try { @@ -74,4 +75,4 @@ public static Course updateCourse(String courseId) throws IOException { return course; } } -// [END classroom_update_course] \ No newline at end of file +// [END classroom_update_course] diff --git a/classroom/snippets/src/main/java/UpdateTopic.java b/classroom/snippets/src/main/java/UpdateTopic.java index f45ffeca..e45c3cc8 100644 --- a/classroom/snippets/src/main/java/UpdateTopic.java +++ b/classroom/snippets/src/main/java/UpdateTopic.java @@ -12,24 +12,29 @@ // See the License for the specific language governing permissions and // limitations under the License. - // [START classroom_update_topic_class] +import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport; import com.google.api.client.googleapis.json.GoogleJsonError; import com.google.api.client.googleapis.json.GoogleJsonResponseException; -import com.google.api.client.http.HttpRequestInitializer; import com.google.api.client.http.javanet.NetHttpTransport; import com.google.api.client.json.gson.GsonFactory; import com.google.api.services.classroom.Classroom; import com.google.api.services.classroom.ClassroomScopes; import com.google.api.services.classroom.model.Topic; -import com.google.auth.http.HttpCredentialsAdapter; -import com.google.auth.oauth2.GoogleCredentials; import java.io.IOException; -import java.util.Collections; +import java.security.GeneralSecurityException; +import java.util.ArrayList; +import java.util.Arrays; /* Class to demonstrate how to update one or more fields in a topic. */ public class UpdateTopic { + + /* Scopes required by this API call. If modifying these scopes, delete your previously saved + tokens/ folder. */ + static ArrayList SCOPES = + new ArrayList<>(Arrays.asList(ClassroomScopes.CLASSROOM_TOPICS)); + /** * Update one or more fields in a topic in a course. * @@ -37,22 +42,19 @@ public class UpdateTopic { * @param topicId - the id of the topic to update. * @return - updated topic. * @throws IOException - if credentials file not found. + * @throws GeneralSecurityException - if a new instance of NetHttpTransport was not created. */ - public static Topic updateTopic(String courseId, String topicId) throws IOException { - /* Load pre-authorized user credentials from the environment. - TODO(developer) - See https://developers.google.com/identity for - guides on implementing OAuth2 for your application. */ - GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() - .createScoped(Collections.singleton(ClassroomScopes.CLASSROOM_TOPICS)); - HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( - credentials); - + public static Topic updateTopic(String courseId, String topicId) + throws GeneralSecurityException, IOException { // Create the classroom API client. - Classroom service = new Classroom.Builder(new NetHttpTransport(), - GsonFactory.getDefaultInstance(), - requestInitializer) - .setApplicationName("Classroom samples") - .build(); + final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport(); + Classroom service = + new Classroom.Builder( + HTTP_TRANSPORT, + GsonFactory.getDefaultInstance(), + ClassroomCredentials.getCredentials(HTTP_TRANSPORT, SCOPES)) + .setApplicationName("Classroom samples") + .build(); // [START classroom_update_topic_code_snippet] @@ -65,10 +67,14 @@ public static Topic updateTopic(String courseId, String topicId) throws IOExcept topicToUpdate.setName("Semester 2"); /* Call the patch endpoint and set the updateMask query parameter to the field that needs to - be updated. */ - topic = service.courses().topics().patch(courseId, topicId, topicToUpdate) - .set("updateMask", "name") - .execute(); + be updated. */ + topic = + service + .courses() + .topics() + .patch(courseId, topicId, topicToUpdate) + .set("updateMask", "name") + .execute(); /* Prints the updated topic. */ System.out.printf("Topic '%s' updated.\n", topic.getName()); diff --git a/classroom/snippets/src/test/java/BaseTest.java b/classroom/snippets/src/test/java/BaseTest.java index b0c5286e..1b2eb04d 100644 --- a/classroom/snippets/src/test/java/BaseTest.java +++ b/classroom/snippets/src/test/java/BaseTest.java @@ -19,13 +19,11 @@ import com.google.api.services.classroom.ClassroomScopes; import com.google.api.services.classroom.model.Course; import com.google.api.services.classroom.model.CourseAlias; -import java.util.Collections; -import java.util.List; -import org.junit.After; -import org.junit.Before; - import java.io.IOException; +import java.security.GeneralSecurityException; +import java.util.ArrayList; import java.util.UUID; +import org.junit.After; // Base class for integration tests. public class BaseTest { @@ -38,10 +36,11 @@ public class BaseTest { * @return an authorized Classroom client service * @throws IOException - if credentials file not found. */ - protected Classroom buildService() throws Exception { + protected Classroom buildService(ArrayList SCOPES) + throws GeneralSecurityException, IOException { /* Scopes required by this API call. If modifying these scopes, delete your previously saved tokens/ folder. */ - final List SCOPES = Collections.singletonList(ClassroomScopes.CLASSROOM_COURSES); + SCOPES.add(ClassroomScopes.CLASSROOM_COURSES); // Create the classroom API client final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport(); @@ -54,16 +53,17 @@ protected Classroom buildService() throws Exception { .build(); } - @Before - public void setup() throws Exception { - this.service = buildService(); + public void setup(ArrayList scopes) throws GeneralSecurityException, IOException { + this.service = buildService(scopes); this.testCourse = CreateCourse.createCourse(); createAlias(this.testCourse.getId()); } @After public void tearDown() throws IOException { - deleteCourse(this.testCourse.getId()); + if (this.testCourse != null) { + deleteCourse(this.testCourse.getId()); + } this.testCourse = null; } diff --git a/classroom/snippets/src/test/java/TestAcceptInvitation.java b/classroom/snippets/src/test/java/TestAcceptInvitation.java new file mode 100644 index 00000000..98a6fec3 --- /dev/null +++ b/classroom/snippets/src/test/java/TestAcceptInvitation.java @@ -0,0 +1,39 @@ +// Copyright 2023 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import java.io.IOException; +import java.security.GeneralSecurityException; +import org.junit.Assert; +import org.junit.Test; + +public class TestAcceptInvitation { + + private String invitationId = "insert_invitation_id"; + + @Test + public void testAcceptInvitation() throws GeneralSecurityException, IOException { + AcceptInvitation.acceptInvitation(invitationId); + /* Once an invitation is accepted, it is removed and the user is added to the course as a + teacher or a student. */ + Assert.assertThrows( + GoogleJsonResponseException.class, () -> GetInvitation.getInvitation(invitationId)); + } + + @Test + public void testAcceptInvitationWithInvalidId() { + Assert.assertThrows( + GoogleJsonResponseException.class, () -> AcceptInvitation.acceptInvitation("invalid-id")); + } +} diff --git a/classroom/snippets/src/test/java/TestAddAliasToCourse.java b/classroom/snippets/src/test/java/TestAddAliasToCourse.java index c5b85777..4eb659eb 100644 --- a/classroom/snippets/src/test/java/TestAddAliasToCourse.java +++ b/classroom/snippets/src/test/java/TestAddAliasToCourse.java @@ -14,6 +14,7 @@ import com.google.api.services.classroom.model.CourseAlias; import java.io.IOException; +import java.security.GeneralSecurityException; import java.util.List; import org.junit.Assert; import org.junit.Test; @@ -22,13 +23,13 @@ public class TestAddAliasToCourse extends BaseTest { @Test - public void testAddCourseAlias() throws IOException { + public void testAddCourseAlias() throws GeneralSecurityException, IOException { + // Include the scopes required to run the code example for testing purposes. + setup(AddAliasToCourse.SCOPES); CourseAlias courseAlias = AddAliasToCourse.addAliasToCourse(testCourse.getId()); - List courseAliases = service.courses().aliases() - .list(testCourse.getId() - ).execute() - .getAliases(); + List courseAliases = + service.courses().aliases().list(testCourse.getId()).execute().getAliases(); Assert.assertNotNull("Course alias not returned.", courseAlias); Assert.assertTrue("No course aliases exist.", courseAliases.size() > 0); } -} \ No newline at end of file +} diff --git a/classroom/snippets/src/test/java/TestAddStudent.java b/classroom/snippets/src/test/java/TestAddStudent.java index f023989a..2b185c9a 100644 --- a/classroom/snippets/src/test/java/TestAddStudent.java +++ b/classroom/snippets/src/test/java/TestAddStudent.java @@ -12,22 +12,26 @@ // See the License for the specific language governing permissions and // limitations under the License. -import com.google.api.services.classroom.model.Course; import com.google.api.services.classroom.model.Student; +import java.io.IOException; +import java.security.GeneralSecurityException; import org.junit.Assert; import org.junit.Test; -import java.io.IOException; // Unit test class for Add Student classroom snippet public class TestAddStudent extends BaseTest { + private String studentId = "insert_student_id"; + @Test - public void testAddStudent() throws IOException { - Course course = CreateCourse.createCourse(); - Student student = AddStudent.addStudent(course.getId(), course.getEnrollmentCode()); - deleteCourse(course.getId()); + public void testAddStudent() throws GeneralSecurityException, IOException { + // Include the scopes required to run the code example for testing purposes. + setup(AddStudent.SCOPES); + Student student = + AddStudent.addStudent(testCourse.getId(), testCourse.getEnrollmentCode(), this.studentId); Assert.assertNotNull("Student not returned.", student); - Assert.assertEquals("Student added to wrong course.", course.getId(), - student.getCourseId()); + Assert.assertNotNull("Course not returned.", student.getCourseId()); + Assert.assertEquals( + "Student added to wrong course.", testCourse.getId(), student.getCourseId()); } -} \ No newline at end of file +} diff --git a/classroom/snippets/src/test/java/TestAddTeacher.java b/classroom/snippets/src/test/java/TestAddTeacher.java index f2846ddf..58eaae57 100644 --- a/classroom/snippets/src/test/java/TestAddTeacher.java +++ b/classroom/snippets/src/test/java/TestAddTeacher.java @@ -13,19 +13,23 @@ // limitations under the License. import com.google.api.services.classroom.model.Teacher; +import java.io.IOException; +import java.security.GeneralSecurityException; import org.junit.Assert; import org.junit.Test; -import java.io.IOException; // Unit test class for Add Teacher classroom snippet public class TestAddTeacher extends BaseTest { - private String otherUser = "gduser1@workspacesamples.dev"; + + private String teacherEmail = "insert_teacher_email"; @Test - public void testAddTeacher() throws IOException { - Teacher teacher = AddTeacher.addTeacher(testCourse.getId(), this.otherUser); + public void testAddTeacher() throws GeneralSecurityException, IOException { + // Include the scopes required to run the code example for testing purposes. + setup(AddTeacher.SCOPES); + Teacher teacher = AddTeacher.addTeacher(testCourse.getId(), this.teacherEmail); Assert.assertNotNull("Teacher not returned.", teacher); - Assert.assertEquals("Teacher added to wrong course.", testCourse.getId(), - teacher.getCourseId()); + Assert.assertEquals( + "Teacher added to wrong course.", testCourse.getId(), teacher.getCourseId()); } -} \ No newline at end of file +} diff --git a/classroom/snippets/src/test/java/TestBatchAddStudents.java b/classroom/snippets/src/test/java/TestBatchAddStudents.java index 04ee930e..1f66874a 100644 --- a/classroom/snippets/src/test/java/TestBatchAddStudents.java +++ b/classroom/snippets/src/test/java/TestBatchAddStudents.java @@ -12,18 +12,19 @@ // See the License for the specific language governing permissions and // limitations under the License. -import org.junit.Test; import java.io.IOException; +import java.security.GeneralSecurityException; import java.util.Arrays; import java.util.List; +import org.junit.Test; // Unit test class for Batch Add Students classroom snippet public class TestBatchAddStudents extends BaseTest { @Test - public void testBatchAddStudents() throws IOException { - List studentEmails = Arrays.asList("gduser2@workpsacesamples.dev", - "gduser3@workpsacesamples.dev"); + public void testBatchAddStudents() throws GeneralSecurityException, IOException { + setup(BatchAddStudents.SCOPES); + List studentEmails = Arrays.asList("insert_student_1_email", "insert_student_2_email"); BatchAddStudents.batchAddStudents(testCourse.getId(), studentEmails); } -} \ No newline at end of file +} diff --git a/classroom/snippets/src/test/java/TestCreateCourse.java b/classroom/snippets/src/test/java/TestCreateCourse.java index 381f2c2c..a251f15c 100644 --- a/classroom/snippets/src/test/java/TestCreateCourse.java +++ b/classroom/snippets/src/test/java/TestCreateCourse.java @@ -13,15 +13,18 @@ // limitations under the License. import com.google.api.services.classroom.model.Course; +import java.io.IOException; +import java.security.GeneralSecurityException; import org.junit.Assert; import org.junit.Test; -import java.io.IOException; // Unit test class for Create Course classroom snippet public class TestCreateCourse extends BaseTest { @Test - public void testCreateCourse() throws IOException { + public void testCreateCourse() throws GeneralSecurityException, IOException { + // Include the scopes required to run the code example for testing purposes. + setup(CreateCourse.SCOPES); Course course = CreateCourse.createCourse(); Assert.assertNotNull("Course not returned.", course); deleteCourse(course.getId()); diff --git a/classroom/snippets/src/test/java/TestCreateCourseWithAlias.java b/classroom/snippets/src/test/java/TestCreateCourseWithAlias.java index 5152b984..2d906fbf 100644 --- a/classroom/snippets/src/test/java/TestCreateCourseWithAlias.java +++ b/classroom/snippets/src/test/java/TestCreateCourseWithAlias.java @@ -15,6 +15,7 @@ import com.google.api.services.classroom.model.Course; import com.google.api.services.classroom.model.CourseAlias; import java.io.IOException; +import java.security.GeneralSecurityException; import java.util.List; import org.junit.Assert; import org.junit.Test; @@ -23,14 +24,13 @@ public class TestCreateCourseWithAlias extends BaseTest { @Test - public void testCreateCourseWithAlias() throws IOException { + public void testCreateCourseWithAlias() throws GeneralSecurityException, IOException { + setup(CreateCourseWithAlias.SCOPES); Course course = CreateCourseWithAlias.createCourseWithAlias(); - List courseAliases = service.courses().aliases() - .list(course.getId() - ).execute() - .getAliases(); + List courseAliases = + service.courses().aliases().list(course.getId()).execute().getAliases(); Assert.assertNotNull("Course not returned.", course); Assert.assertTrue("No course aliases exist.", courseAliases.size() > 0); deleteCourse(course.getId()); } -} \ No newline at end of file +} diff --git a/classroom/snippets/src/test/java/TestCreateCourseWork.java b/classroom/snippets/src/test/java/TestCreateCourseWork.java index e3a25b6b..5a160af0 100644 --- a/classroom/snippets/src/test/java/TestCreateCourseWork.java +++ b/classroom/snippets/src/test/java/TestCreateCourseWork.java @@ -14,6 +14,7 @@ import com.google.api.services.classroom.model.CourseWork; import java.io.IOException; +import java.security.GeneralSecurityException; import org.junit.Assert; import org.junit.Test; @@ -21,7 +22,9 @@ public class TestCreateCourseWork extends BaseTest { @Test - public void testCreateCoursework() throws IOException { + public void testCreateCoursework() throws GeneralSecurityException, IOException { + // Include the scopes required to run the code example for testing purposes. + setup(CreateCourseWork.SCOPES); CourseWork courseWork = CreateCourseWork.createCourseWork(testCourse.getId()); Assert.assertNotNull("Coursework not returned.", courseWork); } diff --git a/classroom/snippets/src/test/java/TestCreateInvitation.java b/classroom/snippets/src/test/java/TestCreateInvitation.java new file mode 100644 index 00000000..13095342 --- /dev/null +++ b/classroom/snippets/src/test/java/TestCreateInvitation.java @@ -0,0 +1,43 @@ +// Copyright 2023 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.services.classroom.model.Invitation; +import java.io.IOException; +import java.security.GeneralSecurityException; +import org.junit.Assert; +import org.junit.Test; + +public class TestCreateInvitation extends BaseTest { + + private String userId = "insert_user_id"; + + @Test + public void testCreateInvitation() throws GeneralSecurityException, IOException { + setup(CreateInvitation.SCOPES); + Invitation invitation = CreateInvitation.createInvitation(testCourse.getId(), userId); + Assert.assertNotNull("Invitation not created", invitation); + Assert.assertEquals(invitation.getCourseId(), testCourse.getId()); + Assert.assertEquals(invitation.getUserId(), userId); + } + + @Test + public void testCreateInvitationWithInvalidCourseId() + throws GeneralSecurityException, IOException { + setup(CreateInvitation.SCOPES); + Assert.assertThrows( + GoogleJsonResponseException.class, + () -> CreateInvitation.createInvitation("invalid-course-id", userId)); + } +} diff --git a/classroom/snippets/src/test/java/TestCreateTopic.java b/classroom/snippets/src/test/java/TestCreateTopic.java index e2d77586..381921d9 100644 --- a/classroom/snippets/src/test/java/TestCreateTopic.java +++ b/classroom/snippets/src/test/java/TestCreateTopic.java @@ -14,6 +14,7 @@ import com.google.api.services.classroom.model.Topic; import java.io.IOException; +import java.security.GeneralSecurityException; import org.junit.Assert; import org.junit.Test; @@ -21,7 +22,8 @@ public class TestCreateTopic extends BaseTest { @Test - public void testCreateTopic() throws IOException { + public void testCreateTopic() throws GeneralSecurityException, IOException { + setup(CreateTopic.SCOPES); Topic topic = CreateTopic.createTopic(testCourse.getId()); Assert.assertNotNull("Topic not returned.", topic); } diff --git a/classroom/snippets/src/test/java/TestDeleteInvitation.java b/classroom/snippets/src/test/java/TestDeleteInvitation.java new file mode 100644 index 00000000..84448189 --- /dev/null +++ b/classroom/snippets/src/test/java/TestDeleteInvitation.java @@ -0,0 +1,42 @@ +// Copyright 2023 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.services.classroom.model.Invitation; +import java.io.IOException; +import java.security.GeneralSecurityException; +import org.junit.Assert; +import org.junit.Test; + +public class TestDeleteInvitation extends BaseTest { + + private String userId = "insert_user_id"; + + @Test + public void testDeleteInvitation() throws GeneralSecurityException, IOException { + setup(DeleteInvitation.SCOPES); + Invitation invitation = CreateInvitation.createInvitation(testCourse.getId(), userId); + DeleteInvitation.deleteInvitation(invitation.getId()); + Assert.assertThrows( + GoogleJsonResponseException.class, () -> GetInvitation.getInvitation(invitation.getId())); + } + + @Test + public void testDeleteInvitationWithInvalidId() throws GeneralSecurityException, IOException { + setup(DeleteInvitation.SCOPES); + Assert.assertThrows( + GoogleJsonResponseException.class, + () -> DeleteInvitation.deleteInvitation("invalid-invitation-id")); + } +} diff --git a/classroom/snippets/src/test/java/TestDeleteTopic.java b/classroom/snippets/src/test/java/TestDeleteTopic.java index b093865c..bffff20d 100644 --- a/classroom/snippets/src/test/java/TestDeleteTopic.java +++ b/classroom/snippets/src/test/java/TestDeleteTopic.java @@ -15,15 +15,19 @@ import com.google.api.client.googleapis.json.GoogleJsonResponseException; import com.google.api.services.classroom.model.Topic; import java.io.IOException; +import java.security.GeneralSecurityException; import org.junit.Assert; import org.junit.Test; public class TestDeleteTopic extends BaseTest { + @Test - public void testDeleteTopic() throws IOException { + public void testDeleteTopic() throws GeneralSecurityException, IOException { + setup(DeleteTopic.SCOPES); Topic topic = CreateTopic.createTopic(testCourse.getId()); DeleteTopic.deleteTopic(testCourse.getId(), topic.getTopicId()); - Assert.assertThrows(GoogleJsonResponseException.class, + Assert.assertThrows( + GoogleJsonResponseException.class, () -> GetTopic.getTopic(testCourse.getId(), topic.getTopicId())); } } diff --git a/classroom/snippets/src/test/java/TestGetCourse.java b/classroom/snippets/src/test/java/TestGetCourse.java index c43059f7..ac95bda5 100644 --- a/classroom/snippets/src/test/java/TestGetCourse.java +++ b/classroom/snippets/src/test/java/TestGetCourse.java @@ -13,15 +13,17 @@ // limitations under the License. import com.google.api.services.classroom.model.Course; +import java.io.IOException; +import java.security.GeneralSecurityException; import org.junit.Assert; import org.junit.Test; -import java.io.IOException; // Unit test class for Get Course classroom snippet public class TestGetCourse extends BaseTest { @Test - public void testGetCourse() throws IOException { + public void testGetCourse() throws GeneralSecurityException, IOException { + setup(GetCourse.SCOPES); Course course = GetCourse.getCourse(testCourse.getId()); Assert.assertNotNull("Course not returned.", course); Assert.assertEquals("Wrong course returned.", testCourse.getId(), course.getId()); diff --git a/classroom/snippets/src/test/java/TestGetTopic.java b/classroom/snippets/src/test/java/TestGetTopic.java index b7cb7840..39775ff2 100644 --- a/classroom/snippets/src/test/java/TestGetTopic.java +++ b/classroom/snippets/src/test/java/TestGetTopic.java @@ -14,6 +14,7 @@ import com.google.api.services.classroom.model.Topic; import java.io.IOException; +import java.security.GeneralSecurityException; import org.junit.Assert; import org.junit.Test; @@ -21,7 +22,8 @@ public class TestGetTopic extends BaseTest { @Test - public void testGetTopic() throws IOException { + public void testGetTopic() throws GeneralSecurityException, IOException { + setup(GetTopic.SCOPES); Topic topic = CreateTopic.createTopic(testCourse.getId()); Topic getTopic = GetTopic.getTopic(testCourse.getId(), topic.getTopicId()); Assert.assertNotNull("Topic could not be created.", topic); diff --git a/classroom/snippets/src/test/java/TestListCourseAliases.java b/classroom/snippets/src/test/java/TestListCourseAliases.java index f18c1cce..d3e357b5 100644 --- a/classroom/snippets/src/test/java/TestListCourseAliases.java +++ b/classroom/snippets/src/test/java/TestListCourseAliases.java @@ -13,17 +13,19 @@ // limitations under the License. import com.google.api.services.classroom.model.CourseAlias; -import org.junit.Assert; -import org.junit.Test; import java.io.IOException; +import java.security.GeneralSecurityException; import java.util.List; +import org.junit.Assert; +import org.junit.Test; // Unit test class for List Course Aliases classroom snippet public class TestListCourseAliases extends BaseTest { @Test - public void testListCourseAliases() throws IOException { + public void testListCourseAliases() throws GeneralSecurityException, IOException { + setup(ListCourseAliases.SCOPES); List courseAliases = ListCourseAliases.listCourseAliases(testCourse.getId()); Assert.assertTrue("Incorrect number of course aliases returned.", courseAliases.size() == 1); } -} \ No newline at end of file +} diff --git a/classroom/snippets/src/test/java/TestListCourses.java b/classroom/snippets/src/test/java/TestListCourses.java index fe254b76..7a4dd553 100644 --- a/classroom/snippets/src/test/java/TestListCourses.java +++ b/classroom/snippets/src/test/java/TestListCourses.java @@ -13,16 +13,17 @@ // limitations under the License. import com.google.api.services.classroom.model.Course; -import org.junit.Assert; -import org.junit.Test; import java.io.IOException; +import java.security.GeneralSecurityException; import java.util.List; +import org.junit.Assert; +import org.junit.Test; // Unit test class for List Course classroom snippet public class TestListCourses { @Test - public void testListCourses() throws IOException { + public void testListCourses() throws GeneralSecurityException, IOException { List courses = ListCourses.listCourses(); Assert.assertTrue("No courses returned.", courses.size() > 0); } diff --git a/classroom/snippets/src/test/java/TestListSubmissions.java b/classroom/snippets/src/test/java/TestListSubmissions.java index 148e9529..1649e926 100644 --- a/classroom/snippets/src/test/java/TestListSubmissions.java +++ b/classroom/snippets/src/test/java/TestListSubmissions.java @@ -14,6 +14,7 @@ import com.google.api.services.classroom.model.StudentSubmission; import java.io.IOException; +import java.security.GeneralSecurityException; import java.util.List; import org.junit.Assert; import org.junit.Test; @@ -22,10 +23,9 @@ public class TestListSubmissions extends BaseTest { @Test - public void testListSubmissions() throws IOException { - List submissions = ListSubmissions.listSubmissions( - testCourse.getId(), - "-"); + public void testListSubmissions() throws GeneralSecurityException, IOException { + setup(ListSubmissions.SCOPES); + List submissions = ListSubmissions.listSubmissions(testCourse.getId(), "-"); Assert.assertNotNull("No submissions returned.", submissions); } } diff --git a/classroom/snippets/src/test/java/TestListTopics.java b/classroom/snippets/src/test/java/TestListTopics.java index 081be57b..f0b0bc85 100644 --- a/classroom/snippets/src/test/java/TestListTopics.java +++ b/classroom/snippets/src/test/java/TestListTopics.java @@ -14,6 +14,7 @@ import com.google.api.services.classroom.model.Topic; import java.io.IOException; +import java.security.GeneralSecurityException; import java.util.List; import org.junit.Assert; import org.junit.Test; @@ -22,7 +23,8 @@ public class TestListTopics extends BaseTest { @Test - public void testListTopics() throws IOException { + public void testListTopics() throws GeneralSecurityException, IOException { + setup(ListTopics.SCOPES); CreateTopic.createTopic(testCourse.getId()); List listTopics = ListTopics.listTopics(testCourse.getId()); Assert.assertNotNull("Topics could not be retrieved.", listTopics); diff --git a/classroom/snippets/src/test/java/TestPatchCourse.java b/classroom/snippets/src/test/java/TestPatchCourse.java index 51e05a43..a7d0d92f 100644 --- a/classroom/snippets/src/test/java/TestPatchCourse.java +++ b/classroom/snippets/src/test/java/TestPatchCourse.java @@ -13,15 +13,17 @@ // limitations under the License. import com.google.api.services.classroom.model.Course; +import java.io.IOException; +import java.security.GeneralSecurityException; import org.junit.Assert; import org.junit.Test; -import java.io.IOException; // Unit test class for Patch Course classroom snippet public class TestPatchCourse extends BaseTest { @Test - public void testPatchCourse() throws IOException { + public void testPatchCourse() throws GeneralSecurityException, IOException { + setup(PatchCourse.SCOPES); Course course = PatchCourse.patchCourse(testCourse.getId()); Assert.assertNotNull("Course not returned.", course); Assert.assertEquals("Wrong course returned.", testCourse.getId(), course.getId()); diff --git a/classroom/snippets/src/test/java/TestUpdateCourse.java b/classroom/snippets/src/test/java/TestUpdateCourse.java index f5e0080d..3c7cbda2 100644 --- a/classroom/snippets/src/test/java/TestUpdateCourse.java +++ b/classroom/snippets/src/test/java/TestUpdateCourse.java @@ -13,15 +13,17 @@ // limitations under the License. import com.google.api.services.classroom.model.Course; +import java.io.IOException; +import java.security.GeneralSecurityException; import org.junit.Assert; import org.junit.Test; -import java.io.IOException; // Unit test class for Update Course classroom snippet public class TestUpdateCourse extends BaseTest { @Test - public void testUpdateCourse() throws IOException { + public void testUpdateCourse() throws GeneralSecurityException, IOException { + setup(UpdateCourse.SCOPES); Course course = UpdateCourse.updateCourse(testCourse.getId()); Assert.assertNotNull("Course not returned.", course); Assert.assertEquals("Wrong course returned.", testCourse.getId(), course.getId()); diff --git a/classroom/snippets/src/test/java/TestUpdateTopic.java b/classroom/snippets/src/test/java/TestUpdateTopic.java index 5b1b9eec..3144ff2d 100644 --- a/classroom/snippets/src/test/java/TestUpdateTopic.java +++ b/classroom/snippets/src/test/java/TestUpdateTopic.java @@ -11,15 +11,19 @@ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. + import com.google.api.services.classroom.model.Topic; import java.io.IOException; +import java.security.GeneralSecurityException; import org.junit.Assert; import org.junit.Test; // Unit test class for Update Topic classroom snippet public class TestUpdateTopic extends BaseTest { + @Test - public void testUpdateTopic() throws IOException { + public void testUpdateTopic() throws GeneralSecurityException, IOException { + setup(UpdateTopic.SCOPES); Topic topic = CreateTopic.createTopic(testCourse.getId()); System.out.println("New topic created: " + topic.getName()); Topic updatedTopic = UpdateTopic.updateTopic(testCourse.getId(), topic.getTopicId()); From e3102ab486f0c278d7d0fcc020f6dea02e286b3e Mon Sep 17 00:00:00 2001 From: Justin Poehnelt Date: Tue, 2 May 2023 11:06:51 -0600 Subject: [PATCH 248/262] fix: correct typo (#634) --- calendar/quickstart/src/main/java/CalendarQuickstart.java | 2 +- docs/quickstart/src/main/java/DocsQuickstart.java | 2 +- .../quickstart/src/main/java/DriveActivityQuickstart.java | 2 +- drive/quickstart/src/main/java/DriveQuickstart.java | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/calendar/quickstart/src/main/java/CalendarQuickstart.java b/calendar/quickstart/src/main/java/CalendarQuickstart.java index 3eb09e6d..19a50114 100644 --- a/calendar/quickstart/src/main/java/CalendarQuickstart.java +++ b/calendar/quickstart/src/main/java/CalendarQuickstart.java @@ -38,7 +38,7 @@ import java.util.Collections; import java.util.List; -/* class to demonstarte use of Calendar events list API */ +/* class to demonstrate use of Calendar events list API */ public class CalendarQuickstart { /** * Application name. diff --git a/docs/quickstart/src/main/java/DocsQuickstart.java b/docs/quickstart/src/main/java/DocsQuickstart.java index 431c8394..531e044b 100644 --- a/docs/quickstart/src/main/java/DocsQuickstart.java +++ b/docs/quickstart/src/main/java/DocsQuickstart.java @@ -36,7 +36,7 @@ import java.util.Collections; import java.util.List; -/* class to demonstarte use of Docs get documents API */ +/* class to demonstrate use of Docs get documents API */ public class DocsQuickstart { /** * Application name. diff --git a/drive/activity/quickstart/src/main/java/DriveActivityQuickstart.java b/drive/activity/quickstart/src/main/java/DriveActivityQuickstart.java index e72a2c24..4a5e4657 100644 --- a/drive/activity/quickstart/src/main/java/DriveActivityQuickstart.java +++ b/drive/activity/quickstart/src/main/java/DriveActivityQuickstart.java @@ -34,7 +34,7 @@ import java.util.Arrays; import java.util.List; -/* class to demonstarte use of Drive Activity list API */ +/* class to demonstrate use of Drive Activity list API */ public class DriveActivityQuickstart { /** * Application name. diff --git a/drive/quickstart/src/main/java/DriveQuickstart.java b/drive/quickstart/src/main/java/DriveQuickstart.java index c88f9063..62db72b8 100644 --- a/drive/quickstart/src/main/java/DriveQuickstart.java +++ b/drive/quickstart/src/main/java/DriveQuickstart.java @@ -36,7 +36,7 @@ import java.util.Collections; import java.util.List; -/* class to demonstarte use of Drive files list API */ +/* class to demonstrate use of Drive files list API */ public class DriveQuickstart { /** * Application name. From d492e92baf7a23b54b54b36f6f7fc386a28dfd14 Mon Sep 17 00:00:00 2001 From: Steve Bazyl Date: Thu, 7 Mar 2024 12:02:45 -0700 Subject: [PATCH 249/262] Feat: Meet API quickstart --- meet/README.md | 1 + meet/quickstart/build.gradle | 17 ++ meet/quickstart/settings.gradle | 18 ++ .../src/main/java/MeetQuickstart.java | 174 ++++++++++++++++++ 4 files changed, 210 insertions(+) create mode 100644 meet/README.md create mode 100644 meet/quickstart/build.gradle create mode 100644 meet/quickstart/settings.gradle create mode 100644 meet/quickstart/src/main/java/MeetQuickstart.java diff --git a/meet/README.md b/meet/README.md new file mode 100644 index 00000000..edc158da --- /dev/null +++ b/meet/README.md @@ -0,0 +1 @@ +Additional samples can be found at https://github.com/googleapis/google-cloud-java/tree/main/java-meet/google-cloud-meet \ No newline at end of file diff --git a/meet/quickstart/build.gradle b/meet/quickstart/build.gradle new file mode 100644 index 00000000..fbb8bc29 --- /dev/null +++ b/meet/quickstart/build.gradle @@ -0,0 +1,17 @@ +apply plugin: 'java' +apply plugin: 'application' + +mainClassName = 'MeetQuickstart' +sourceCompatibility = 11 +targetCompatibility = 11 +version = '1.0' + +repositories { + mavenCentral() +} + +dependencies { + implementation 'com.google.cloud:google-cloud-meet:0.3.0' + implementation 'com.google.auth:google-auth-library-oauth2-http:1.19.0' + implementation 'com.google.oauth-client:google-oauth-client-jetty:1.34.1' +} diff --git a/meet/quickstart/settings.gradle b/meet/quickstart/settings.gradle new file mode 100644 index 00000000..7bcc727d --- /dev/null +++ b/meet/quickstart/settings.gradle @@ -0,0 +1,18 @@ +/* + * This settings file was generated by the Gradle 'init' task. + * + * The settings file is used to specify which projects to include in your build. + * In a single project build this file can be empty or even removed. + * + * Detailed information about configuring a multi-project build in Gradle can be found + * in the user guide at https://docs.gradle.org/3.5/userguide/multi_project_builds.html + */ + +/* +// To declare projects as part of a multi-project build use the 'include' method +include 'shared' +include 'api' +include 'services:webservice' +*/ + +rootProject.name = 'quickstart' diff --git a/meet/quickstart/src/main/java/MeetQuickstart.java b/meet/quickstart/src/main/java/MeetQuickstart.java new file mode 100644 index 00000000..cd8aec6b --- /dev/null +++ b/meet/quickstart/src/main/java/MeetQuickstart.java @@ -0,0 +1,174 @@ +// Copyright 2024 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// [START meet_quickstart] + +import java.awt.Desktop; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.InputStream; +import java.net.URI; +import java.net.URL; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.Collections; +import java.util.List; + +import com.google.api.client.extensions.jetty.auth.oauth2.LocalServerReceiver; +import com.google.api.gax.core.FixedCredentialsProvider; +import com.google.apps.meet.v2.CreateSpaceRequest; +import com.google.apps.meet.v2.Space; +import com.google.apps.meet.v2.SpacesServiceClient; +import com.google.apps.meet.v2.SpacesServiceSettings; +import com.google.auth.Credentials; +import com.google.auth.oauth2.ClientId; +import com.google.auth.oauth2.DefaultPKCEProvider; +import com.google.auth.oauth2.TokenStore; +import com.google.auth.oauth2.UserAuthorizer; + +/* class to demonstrate use of Drive files list API */ +public class MeetQuickstart { + /** + * Directory to store authorization tokens for this application. + */ + private static final String TOKENS_DIRECTORY_PATH = "tokens"; + + /** + * Global instance of the scopes required by this quickstart. + * If modifying these scopes, delete your previously saved tokens/ folder. + */ + private static final List SCOPES = Collections + .singletonList("https://www.googleapis.com/auth/meetings.space.created"); + + private static final String CREDENTIALS_FILE_PATH = "/credentials.json"; + + private static final String USER = "default"; + + // Simple file-based token storage for storing oauth tokens + private static final TokenStore TOKEN_STORE = new TokenStore() { + private Path pathFor(String id) { + return Paths.get(".", TOKENS_DIRECTORY_PATH, id + ".json"); + } + + @Override + public String load(String id) throws IOException { + if (!Files.exists(pathFor(id))) { + return null; + } + return Files.readString(pathFor(id)); + } + + @Override + public void store(String id, String token) throws IOException { + Files.createDirectories(Paths.get(".", TOKENS_DIRECTORY_PATH)); + Files.writeString(pathFor(id), token); + } + + @Override + public void delete(String id) throws IOException { + if (!Files.exists(pathFor(id))) { + return; + } + Files.delete(pathFor(id)); + } + }; + + /** + * Initialize a UserAuthorizer for local authorization. + * + * @param callbackUri + * @return + */ + private static UserAuthorizer getAuthorizer(URI callbackUri) throws IOException { + // Load client secrets. + try (InputStream in = MeetQuickstart.class.getResourceAsStream(CREDENTIALS_FILE_PATH)) { + if (in == null) { + throw new FileNotFoundException("Resource not found: " + CREDENTIALS_FILE_PATH); + } + + ClientId clientId = ClientId.fromStream(in); + + UserAuthorizer authorizer = UserAuthorizer.newBuilder() + .setClientId(clientId) + .setCallbackUri(callbackUri) + .setScopes(SCOPES) + .setPKCEProvider(new DefaultPKCEProvider() { + // Temporary fix for https://github.com/googleapis/google-auth-library-java/issues/1373 + @Override + public String getCodeChallenge() { + return super.getCodeChallenge().split("=")[0]; + } + }) + .setTokenStore(TOKEN_STORE).build(); + return authorizer; + } + } + + /** + * Run the OAuth2 flow for local/installed app. + * + * @return An authorized Credential object. + * @throws IOException If the credentials.json file cannot be found. + */ + private static Credentials getCredentials() + throws Exception { + + LocalServerReceiver receiver = new LocalServerReceiver.Builder().build(); + try { + URI callbackUri = URI.create(receiver.getRedirectUri()); + UserAuthorizer authorizer = getAuthorizer(callbackUri); + + Credentials credentials = authorizer.getCredentials(USER); + if (credentials != null) { + return credentials; + } + + URL authorizationUrl = authorizer.getAuthorizationUrl(USER, "", null); + if (Desktop.isDesktopSupported() && + Desktop.getDesktop().isSupported(Desktop.Action.BROWSE)) { + Desktop.getDesktop().browse(authorizationUrl.toURI()); + } else { + System.out.printf("Open the following URL to authorize access: %s\n", + authorizationUrl.toExternalForm()); + } + + String code = receiver.waitForCode(); + credentials = authorizer.getAndStoreCredentialsFromCode(USER, code, callbackUri); + return credentials; + } finally { + receiver.stop(); + } + } + + public static void main(String... args) throws Exception { + // Override default service settings to supply user credentials. + Credentials credentials = getCredentials(); + SpacesServiceSettings settings = SpacesServiceSettings.newBuilder() + .setCredentialsProvider(FixedCredentialsProvider.create(credentials)) + .build(); + + try (SpacesServiceClient spacesServiceClient = SpacesServiceClient.create(settings)) { + CreateSpaceRequest request = CreateSpaceRequest.newBuilder() + .setSpace(Space.newBuilder().build()) + .build(); + Space response = spacesServiceClient.createSpace(request); + System.out.printf("Space created: %s\n", response.getMeetingUri()); + } catch (IOException e) { + // TODO(developer): Handle errors + e.printStackTrace(); + } + } +} +// [END meet_quickstart] From 86d64446787b80185a0e900f6766e69acb974327 Mon Sep 17 00:00:00 2001 From: Pierrick Voulet <6769971+PierrickVoulet@users.noreply.github.com> Date: Thu, 1 Aug 2024 14:42:33 -0400 Subject: [PATCH 250/262] feat: Add Google Chat API quickstart (#1061) * feat: Add Google Chat API quickstart * Fix Google Style --------- Co-authored-by: pierrick --- chat/quickstart/README.md | 12 ++ chat/quickstart/build.gradle | 20 +++ chat/quickstart/settings.gradle | 18 +++ .../src/main/java/ChatQuickstart.java | 130 ++++++++++++++++++ 4 files changed, 180 insertions(+) create mode 100644 chat/quickstart/README.md create mode 100644 chat/quickstart/build.gradle create mode 100644 chat/quickstart/settings.gradle create mode 100644 chat/quickstart/src/main/java/ChatQuickstart.java diff --git a/chat/quickstart/README.md b/chat/quickstart/README.md new file mode 100644 index 00000000..ccae2e71 --- /dev/null +++ b/chat/quickstart/README.md @@ -0,0 +1,12 @@ +# Google Chat Java Quickstart + +Complete the steps described in the [quickstart instructions]( +https://developers.google.com/workspace/chat/api/guides/quickstart/java), +and in about five minutes you'll have a simple Java command-line +application that makes requests to the Google Chat API. + +## Run + +After following the quickstart setup instructions, run the sample: + +`gradle run` diff --git a/chat/quickstart/build.gradle b/chat/quickstart/build.gradle new file mode 100644 index 00000000..a1a7d7ef --- /dev/null +++ b/chat/quickstart/build.gradle @@ -0,0 +1,20 @@ +apply plugin: 'java' +apply plugin: 'application' + +mainClassName = 'ChatQuickstart' +sourceCompatibility = 11 +targetCompatibility = 11 +version = '1.0' + +repositories { + mavenCentral() +} + +dependencies { + implementation 'com.google.auth:google-auth-library-oauth2-http:1.23.0' + implementation 'com.google.api-client:google-api-client:1.33.0' + implementation 'com.google.api.grpc:proto-google-cloud-chat-v1:0.8.0' + implementation 'com.google.api:gax:2.48.1' + implementation 'com.google.cloud:google-cloud-chat:0.1.0' + implementation 'com.google.oauth-client:google-oauth-client-jetty:1.34.1' +} diff --git a/chat/quickstart/settings.gradle b/chat/quickstart/settings.gradle new file mode 100644 index 00000000..7bcc727d --- /dev/null +++ b/chat/quickstart/settings.gradle @@ -0,0 +1,18 @@ +/* + * This settings file was generated by the Gradle 'init' task. + * + * The settings file is used to specify which projects to include in your build. + * In a single project build this file can be empty or even removed. + * + * Detailed information about configuring a multi-project build in Gradle can be found + * in the user guide at https://docs.gradle.org/3.5/userguide/multi_project_builds.html + */ + +/* +// To declare projects as part of a multi-project build use the 'include' method +include 'shared' +include 'api' +include 'services:webservice' +*/ + +rootProject.name = 'quickstart' diff --git a/chat/quickstart/src/main/java/ChatQuickstart.java b/chat/quickstart/src/main/java/ChatQuickstart.java new file mode 100644 index 00000000..4956be1d --- /dev/null +++ b/chat/quickstart/src/main/java/ChatQuickstart.java @@ -0,0 +1,130 @@ +// Copyright 2024 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// [START chat_quickstart] + +import com.google.api.client.auth.oauth2.Credential; +import com.google.api.client.extensions.java6.auth.oauth2.AuthorizationCodeInstalledApp; +import com.google.api.client.extensions.jetty.auth.oauth2.LocalServerReceiver; +import com.google.api.client.googleapis.auth.oauth2.GoogleAuthorizationCodeFlow; +import com.google.api.client.googleapis.auth.oauth2.GoogleClientSecrets; +import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport; +import com.google.api.client.json.JsonFactory; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.client.util.store.FileDataStoreFactory; +import com.google.api.gax.core.FixedCredentialsProvider; +import com.google.auth.Credentials; +import com.google.auth.oauth2.AccessToken; +import com.google.auth.oauth2.UserCredentials; +import com.google.chat.v1.ChatServiceClient; +import com.google.chat.v1.ChatServiceSettings; +import com.google.chat.v1.ListSpacesRequest; +import com.google.chat.v1.Space; +import com.google.protobuf.util.JsonFormat; +import java.io.File; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.util.Collections; +import java.util.Date; +import java.util.List; + +/* class to demonstrate use of Google Chat API spaces list API */ +public class ChatQuickstart { + /** Directory to store authorization tokens for this application. */ + private static final String TOKENS_DIRECTORY_PATH = "tokens"; + + /** + * Global instance of the scopes required by this quickstart. If modifying these scopes, delete + * your previously saved tokens/ folder. + */ + private static final List SCOPES = + Collections.singletonList("https://www.googleapis.com/auth/chat.spaces.readonly"); + + /** Global instance of the JSON factory. */ + private static final JsonFactory JSON_FACTORY = GsonFactory.getDefaultInstance(); + + private static final String CREDENTIALS_FILE_PATH = "/credentials.json"; + + /** + * Run the OAuth2 flow for local/installed app. + * + * @return An authorized Credential object. + * @throws IOException If the credentials.json file cannot be found. + */ + private static Credentials getCredentials() throws Exception { + // Load client secrets. + InputStream credentialsFileInputStream = + ChatQuickstart.class.getResourceAsStream(CREDENTIALS_FILE_PATH); + if (credentialsFileInputStream == null) { + throw new FileNotFoundException("Credentials file resource not found."); + } + GoogleClientSecrets clientSecrets = + GoogleClientSecrets.load(JSON_FACTORY, new InputStreamReader(credentialsFileInputStream)); + + // Set up authorization code flow. + GoogleAuthorizationCodeFlow flow = + new GoogleAuthorizationCodeFlow.Builder( + GoogleNetHttpTransport.newTrustedTransport(), JSON_FACTORY, clientSecrets, SCOPES) + // Set these two options to generate refresh token alongside access token. + .setDataStoreFactory(new FileDataStoreFactory(new File(TOKENS_DIRECTORY_PATH))) + .setAccessType("offline") + .build(); + + // Authorize. + Credential credential = + new AuthorizationCodeInstalledApp(flow, new LocalServerReceiver()).authorize("user"); + + // Build and return an authorized Credential object + AccessToken accessToken = + new AccessToken( + credential.getAccessToken(), + new Date( + // put the actual expiry date of access token here + System.currentTimeMillis())); + return UserCredentials.newBuilder() + .setAccessToken(accessToken) + .setRefreshToken(credential.getRefreshToken()) + .setClientId(clientSecrets.getInstalled().getClientId()) + .setClientSecret(clientSecrets.getInstalled().getClientSecret()) + .build(); + } + + public static void main(String... args) throws Exception { + // Override default service settings to supply user credentials. + Credentials credentials = getCredentials(); + + // Create the ChatServiceSettings with the credentials + ChatServiceSettings chatServiceSettings = + ChatServiceSettings.newBuilder() + .setCredentialsProvider(FixedCredentialsProvider.create(credentials)) + .build(); + + try (ChatServiceClient chatServiceClient = ChatServiceClient.create(chatServiceSettings)) { + ListSpacesRequest request = + ListSpacesRequest.newBuilder() + // Filter spaces by space type (SPACE or GROUP_CHAT or + // DIRECT_MESSAGE). + .setFilter("spaceType = \"SPACE\"") + .build(); + + // Iterate over results and resolve additional pages automatically. + for (Space response : chatServiceClient.listSpaces(request).iterateAll()) { + System.out.println(JsonFormat.printer().print(response)); + } + } + } +} +// [END chat_quickstart] From b59745f664d959d3d39fdf1b935d812e67c01c13 Mon Sep 17 00:00:00 2001 From: Pierrick Voulet <6769971+PierrickVoulet@users.noreply.github.com> Date: Fri, 16 Aug 2024 21:24:09 -0400 Subject: [PATCH 251/262] feat: add Cloud Client library samples for Chat (#1078) * feat: add Cloud Client library samples for Chat * README improvements --------- Co-authored-by: pierrick --- chat/client-libraries/cloud/README.md | 28 ++++ chat/client-libraries/cloud/build.gradle | 20 +++ chat/client-libraries/cloud/pom.xml | 59 +++++++++ .../api/chat/samples/AuthenticationUtils.java | 121 ++++++++++++++++++ .../samples/CreateMembershipUserCred.java | 60 +++++++++ .../CreateMembershipUserCredForApp.java | 60 +++++++++ .../chat/samples/CreateMessageAppCred.java | 46 +++++++ .../CreateMessageAppCredAtMention.java | 50 ++++++++ .../CreateMessageAppCredWithCards.java | 66 ++++++++++ .../chat/samples/CreateMessageUserCred.java | 52 ++++++++ .../CreateMessageUserCredWithMessageId.java | 56 ++++++++ .../CreateMessageUserCredWithRequestId.java | 55 ++++++++ .../CreateMessageUserCredWithThreadKey.java | 61 +++++++++ .../CreateMessageUserCredWithThreadName.java | 62 +++++++++ .../chat/samples/DeleteMessageAppCred.java | 38 ++++++ .../chat/samples/DeleteMessageUserCred.java | 44 +++++++ .../chat/samples/GetMembershipAppCred.java | 42 ++++++ .../chat/samples/GetMembershipUserCred.java | 47 +++++++ .../api/chat/samples/GetMessageAppCred.java | 42 ++++++ .../api/chat/samples/GetMessageUserCred.java | 47 +++++++ .../api/chat/samples/GetSpaceAppCred.java | 42 ++++++ .../api/chat/samples/GetSpaceUserCred.java | 47 +++++++ .../chat/samples/ListMembershipsAppCred.java | 51 ++++++++ .../chat/samples/ListMembershipsUserCred.java | 56 ++++++++ .../chat/samples/ListMessagesUserCred.java | 53 ++++++++ .../api/chat/samples/ListSpacesAppCred.java | 49 +++++++ .../api/chat/samples/ListSpacesUserCred.java | 54 ++++++++ .../chat/samples/UpdateMessageAppCred.java | 51 ++++++++ .../chat/samples/UpdateMessageUserCred.java | 56 ++++++++ .../api/chat/samples/UpdateSpaceUserCred.java | 56 ++++++++ 30 files changed, 1571 insertions(+) create mode 100644 chat/client-libraries/cloud/README.md create mode 100644 chat/client-libraries/cloud/build.gradle create mode 100644 chat/client-libraries/cloud/pom.xml create mode 100644 chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/AuthenticationUtils.java create mode 100644 chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMembershipUserCred.java create mode 100644 chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMembershipUserCredForApp.java create mode 100644 chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMessageAppCred.java create mode 100644 chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMessageAppCredAtMention.java create mode 100644 chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMessageAppCredWithCards.java create mode 100644 chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMessageUserCred.java create mode 100644 chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMessageUserCredWithMessageId.java create mode 100644 chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMessageUserCredWithRequestId.java create mode 100644 chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMessageUserCredWithThreadKey.java create mode 100644 chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMessageUserCredWithThreadName.java create mode 100644 chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/DeleteMessageAppCred.java create mode 100644 chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/DeleteMessageUserCred.java create mode 100644 chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/GetMembershipAppCred.java create mode 100644 chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/GetMembershipUserCred.java create mode 100644 chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/GetMessageAppCred.java create mode 100644 chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/GetMessageUserCred.java create mode 100644 chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/GetSpaceAppCred.java create mode 100644 chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/GetSpaceUserCred.java create mode 100644 chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/ListMembershipsAppCred.java create mode 100644 chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/ListMembershipsUserCred.java create mode 100644 chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/ListMessagesUserCred.java create mode 100644 chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/ListSpacesAppCred.java create mode 100644 chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/ListSpacesUserCred.java create mode 100644 chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/UpdateMessageAppCred.java create mode 100644 chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/UpdateMessageUserCred.java create mode 100644 chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/UpdateSpaceUserCred.java diff --git a/chat/client-libraries/cloud/README.md b/chat/client-libraries/cloud/README.md new file mode 100644 index 00000000..7ec1fce9 --- /dev/null +++ b/chat/client-libraries/cloud/README.md @@ -0,0 +1,28 @@ +# Google Chat API - Cloud Client library samples + +## Set up + +Add `service_account.json` and/or `client_secrets.json` to the current +folder depending on the credentials used by the samples to run: + +1. `service_account.json` for + [app credentials](https://developers.google.com/workspace/chat/authenticate-authorize-chat-app) + +1. `client_secrets.json` for + [user credentials](https://developers.google.com/workspace/chat/authenticate-authorize-chat-user) + +## Run with Maven + +Execute +`mvn exec:java -Dexec.mainClass="replace.with.the.sample.mainClass"` +wih the main class of the sample. + +For example, to run the sample `CreateMessageAppCred`, run +`mvn exec:java -Dexec.mainClass="com.google.workspace.api.chat.samples.CreateMessageAppCred"`. + +## Run with Gradle + +Execute `gradle run` after setting the main class of the sample in the `build.gradle` file. + +For example, to run the sample `CreateMessageAppCred`, use +`com.google.workspace.api.chat.samples.CreateMessageAppCred`. diff --git a/chat/client-libraries/cloud/build.gradle b/chat/client-libraries/cloud/build.gradle new file mode 100644 index 00000000..470b5e81 --- /dev/null +++ b/chat/client-libraries/cloud/build.gradle @@ -0,0 +1,20 @@ +apply plugin: 'java' +apply plugin: 'application' + +mainClassName = 'com.google.workspace.api.chat.samples.CreateMessageAppCred' +sourceCompatibility = 11 +targetCompatibility = 11 +version = '1.0' + +repositories { + mavenCentral() +} + +dependencies { + implementation 'com.google.auth:google-auth-library-oauth2-http:1.23.0' + implementation 'com.google.apis:google-api-services-chat:v1-rev20240509-2.0.0' + implementation 'com.google.api.grpc:proto-google-cloud-chat-v1:0.8.0' + implementation 'com.google.api:gax:2.48.1' + implementation 'com.google.cloud:google-cloud-chat:0.1.0' + implementation 'com.google.oauth-client:google-oauth-client-jetty:1.34.1' +} diff --git a/chat/client-libraries/cloud/pom.xml b/chat/client-libraries/cloud/pom.xml new file mode 100644 index 00000000..06af9826 --- /dev/null +++ b/chat/client-libraries/cloud/pom.xml @@ -0,0 +1,59 @@ + + 4.0.0 + + com.google.workspace.api.chat.samples + chat-api-samples + 0.0.1 + Google API Client Library Chat Samples For Java + + + + 21 + 1.8 + 1.8 + + + + + + + com.google.auth + google-auth-library-oauth2-http + 1.23.0 + + + com.google.oauth-client + google-oauth-client-jetty + 1.34.1 + + + + + + com.google.apis + google-api-services-chat + v1-rev20240509-2.0.0 + + + + + + com.google.api.grpc + proto-google-cloud-chat-v1 + 0.8.0 + + + com.google.api + gax + 2.48.1 + + + + com.google.cloud + google-cloud-chat + 0.1.0 + + + + + diff --git a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/AuthenticationUtils.java b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/AuthenticationUtils.java new file mode 100644 index 00000000..5ffd2ff2 --- /dev/null +++ b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/AuthenticationUtils.java @@ -0,0 +1,121 @@ +/* + * Copyright 2024 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.workspace.api.chat.samples; + +import com.google.auth.oauth2.AccessToken; +import com.google.auth.oauth2.GoogleCredentials; +import com.google.auth.oauth2.ServiceAccountCredentials; +import com.google.auth.oauth2.UserCredentials; +import com.google.api.client.auth.oauth2.Credential; +import com.google.api.client.extensions.java6.auth.oauth2.AuthorizationCodeInstalledApp; +import com.google.api.client.extensions.jetty.auth.oauth2.LocalServerReceiver; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.client.json.JsonFactory; +import com.google.api.client.googleapis.auth.oauth2.GoogleAuthorizationCodeFlow; +import com.google.api.client.googleapis.auth.oauth2.GoogleClientSecrets; +import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport; +import com.google.api.gax.core.GoogleCredentialsProvider; +import com.google.api.gax.core.FixedCredentialsProvider; +import com.google.chat.v1.ChatServiceClient; +import com.google.chat.v1.ChatServiceSettings; +import com.google.common.collect.ImmutableList; + +import java.io.FileInputStream; +import java.io.FileReader; +import java.util.Collections; +import java.util.Date; + +public class AuthenticationUtils{ + + private static final JsonFactory JSON_FACTORY = GsonFactory.getDefaultInstance(); + private static final String SERVICE_ACCOUNT_FILE = "service_account.json"; + private static final String CLIENT_SECRET_FILE = "client_secrets.json"; + private static final String APP_AUTH_OAUTH_SCOPE = + "https://www.googleapis.com/auth/chat.bot"; + + public static ChatServiceClient createClientWithAppCredentials() + throws Exception { + // For more information on service account authentication, see + // https://developers.google.com/workspace/chat/authenticate-authorize-chat-app + GoogleCredentials credential = ServiceAccountCredentials.fromStream( + new FileInputStream(SERVICE_ACCOUNT_FILE)) + .createScoped(ImmutableList.of(APP_AUTH_OAUTH_SCOPE)); + + // Create the ChatServiceSettings with the app credentials + ChatServiceSettings chatServiceSettings = + ChatServiceSettings.newBuilder() + .setCredentialsProvider( + FixedCredentialsProvider.create(credential)) + .build(); + + return ChatServiceClient.create(chatServiceSettings); + } + + public static ChatServiceClient createClientWithUserCredentials( + ImmutableList scopes) throws Exception { + // For more information on user authentication, see + // https://developers.google.com/workspace/chat/authenticate-authorize-chat-user + GoogleClientSecrets clientSecrets = GoogleClientSecrets.load( + JSON_FACTORY, new FileReader(CLIENT_SECRET_FILE)); + + Credential credential = authorize(scopes, clientSecrets); + + AccessToken accessToken = new AccessToken( + credential.getAccessToken(), + new Date( + // put the actual expiry date of access token here + System.currentTimeMillis())); + UserCredentials googleCredentials = + UserCredentials + .newBuilder() + .setAccessToken(accessToken) + .setRefreshToken(credential.getRefreshToken()) + .setClientId(clientSecrets.getInstalled().getClientId()) + .setClientSecret(clientSecrets.getInstalled().getClientSecret()) + .build(); + + // Create the ChatServiceSettings with the credentials + ChatServiceSettings chatServiceSettings = + ChatServiceSettings + .newBuilder() + .setCredentialsProvider( + FixedCredentialsProvider.create(googleCredentials)) + .build(); + + return ChatServiceClient.create(chatServiceSettings); + } + + // Generate access token and refresh token using scopes and client secrets. + private static Credential authorize( + ImmutableList scopes, GoogleClientSecrets clientSecrets) + throws Exception { + // Set up authorization code flow. + GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow.Builder( + GoogleNetHttpTransport.newTrustedTransport(), + JSON_FACTORY, + clientSecrets, + scopes) + // Set these two options to generate refresh token alongside access token. + .setAccessType("offline") + .setApprovalPrompt("force") + .build(); + + // Authorize. + return new AuthorizationCodeInstalledApp( + flow, new LocalServerReceiver()).authorize("user"); + } +} diff --git a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMembershipUserCred.java b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMembershipUserCred.java new file mode 100644 index 00000000..790a05eb --- /dev/null +++ b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMembershipUserCred.java @@ -0,0 +1,60 @@ +/* + * Copyright 2024 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.workspace.api.chat.samples; + +import com.google.common.collect.ImmutableList; +import com.google.protobuf.util.JsonFormat; +// [START chat_CreateMembershipUserCred] +import com.google.chat.v1.ChatServiceClient; +import com.google.chat.v1.CreateMembershipRequest; +import com.google.chat.v1.Membership; +import com.google.chat.v1.SpaceName; +import com.google.chat.v1.User; + +// This sample shows how to create membership with user credential for a human +// user. +public class CreateMembershipUserCred { + + private static final String SCOPE = + "https://www.googleapis.com/auth/chat.memberships"; + + public static void main(String[] args) throws Exception { + try (ChatServiceClient chatServiceClient = + AuthenticationUtils.createClientWithUserCredentials( + ImmutableList.of(SCOPE))) { + CreateMembershipRequest request = + CreateMembershipRequest.newBuilder() + // replace SPACE_NAME here + .setParent("spaces/SPACE_NAME") + .setMembership( + Membership.newBuilder() + .setMember( + User.newBuilder() + // replace USER_NAME here + .setName("users/USER_NAME") + // user type for the membership + .setType(User.Type.HUMAN) + .build()) + .build()) + .build(); + Membership response = chatServiceClient.createMembership(request); + + System.out.println(JsonFormat.printer().print(response)); + } + } +} +// [END chat_CreateMembershipUserCred] diff --git a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMembershipUserCredForApp.java b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMembershipUserCredForApp.java new file mode 100644 index 00000000..e751f20b --- /dev/null +++ b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMembershipUserCredForApp.java @@ -0,0 +1,60 @@ +/* + * Copyright 2024 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.workspace.api.chat.samples; + +import com.google.common.collect.ImmutableList; +import com.google.protobuf.util.JsonFormat; +// [START chat_CreateMembershipUserCredForApp] +import com.google.chat.v1.ChatServiceClient; +import com.google.chat.v1.CreateMembershipRequest; +import com.google.chat.v1.Membership; +import com.google.chat.v1.SpaceName; +import com.google.chat.v1.User; + +// This sample shows how to create membership with user credential for the +// calling app. +public class CreateMembershipUserCredForApp { + + private static final String SCOPE = + "https://www.googleapis.com/auth/chat.memberships.app"; + + public static void main(String[] args) throws Exception { + try (ChatServiceClient chatServiceClient = + AuthenticationUtils.createClientWithUserCredentials( + ImmutableList.of(SCOPE))) { + CreateMembershipRequest request = + CreateMembershipRequest.newBuilder() + // replace SPACE_NAME here + .setParent("spaces/SPACE_NAME") + .setMembership( + Membership.newBuilder() + .setMember( + User.newBuilder() + // member name for app membership, do not change this. + .setName("users/app") + // user type for the membership + .setType(User.Type.BOT) + .build()) + .build()) + .build(); + Membership response = chatServiceClient.createMembership(request); + + System.out.println(JsonFormat.printer().print(response)); + } + } +} +// [END chat_CreateMembershipUserCredForApp] diff --git a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMessageAppCred.java b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMessageAppCred.java new file mode 100644 index 00000000..24b85bca --- /dev/null +++ b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMessageAppCred.java @@ -0,0 +1,46 @@ +/* + * Copyright 2024 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.workspace.api.chat.samples; + +import com.google.protobuf.util.JsonFormat; +// [START chat_CreateMessageAppCred] +import com.google.chat.v1.ChatServiceClient; +import com.google.chat.v1.CreateMessageRequest; +import com.google.chat.v1.Message; + +// This sample shows how to create message with app credential. +public class CreateMessageAppCred { + + public static void main(String[] args) throws Exception { + try (ChatServiceClient chatServiceClient = + AuthenticationUtils.createClientWithAppCredentials()) { + CreateMessageRequest request = + CreateMessageRequest.newBuilder() + // Replace SPACE_NAME here. + .setParent("spaces/SPACE_NAME") + .setMessage( + Message.newBuilder() + .setText("Hello with app credentials!") + .build()) + .build(); + Message response = chatServiceClient.createMessage(request); + + System.out.println(JsonFormat.printer().print(response)); + } + } +} +// [END chat_CreateMessageAppCred] diff --git a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMessageAppCredAtMention.java b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMessageAppCredAtMention.java new file mode 100644 index 00000000..b8fb8291 --- /dev/null +++ b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMessageAppCredAtMention.java @@ -0,0 +1,50 @@ +/* + * Copyright 2024 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.workspace.api.chat.samples; + +import com.google.protobuf.util.JsonFormat; +// [START chat_CreateMessageAppCredAtMention] +import com.google.chat.v1.ChatServiceClient; +import com.google.chat.v1.CreateMessageRequest; +import com.google.chat.v1.Message; + +// This sample shows how to create message that mentions a user with app +// credential. +public class CreateMessageAppCredAtMention { + + public static void main(String[] args) throws Exception { + try (ChatServiceClient chatServiceClient = + AuthenticationUtils.createClientWithAppCredentials()) { + CreateMessageRequest request = + CreateMessageRequest.newBuilder() + // Replace SPACE_NAME here. + .setParent("spaces/SPACE_NAME") + .setMessage( + Message.newBuilder() + // The user with USER_NAME will be mentioned if they are in the + // space. + // Replace USER_NAME here + .setText("Hello !") + .build()) + .build(); + Message response = chatServiceClient.createMessage(request); + + System.out.println(JsonFormat.printer().print(response)); + } + } +} +// [END chat_CreateMessageAppCredAtMention] diff --git a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMessageAppCredWithCards.java b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMessageAppCredWithCards.java new file mode 100644 index 00000000..c47e3169 --- /dev/null +++ b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMessageAppCredWithCards.java @@ -0,0 +1,66 @@ +/* + * Copyright 2024 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.workspace.api.chat.samples; + +import com.google.protobuf.util.JsonFormat; +// [START chat_CreateMessageAppCredWithCards] +import com.google.apps.card.v1.Card; +import com.google.apps.card.v1.Card.CardHeader; +import com.google.apps.card.v1.Card.Section; +import com.google.apps.card.v1.TextParagraph; +import com.google.apps.card.v1.Widget; +import com.google.chat.v1.CardWithId; +import com.google.chat.v1.ChatServiceClient; +import com.google.chat.v1.CreateMessageRequest; +import com.google.chat.v1.Message; + +// This sample shows how to create message with a card with app credential. +public class CreateMessageAppCredWithCards { + + public static void main(String[] args) throws Exception { + try (ChatServiceClient chatServiceClient = + AuthenticationUtils.createClientWithAppCredentials()) { + CreateMessageRequest request = + CreateMessageRequest.newBuilder() + // Replace SPACE_NAME here. + .setParent("spaces/SPACE_NAME") + .setMessage( + Message.newBuilder() + .setText("Hello with app credentials!") + .addCardsV2( + CardWithId.newBuilder().setCard( + Card.newBuilder() + .addSections( + Section.newBuilder() + .addWidgets( + Widget.newBuilder() + .setTextParagraph( + TextParagraph.newBuilder().setText("Hello")) + .build()) + .build()) + .build() + ) + ) + .build()) + .build(); + Message response = chatServiceClient.createMessage(request); + + System.out.println(JsonFormat.printer().print(response)); + } + } +} +// [END chat_CreateMessageAppCredWithCards] diff --git a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMessageUserCred.java b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMessageUserCred.java new file mode 100644 index 00000000..fe08c4b1 --- /dev/null +++ b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMessageUserCred.java @@ -0,0 +1,52 @@ +/* + * Copyright 2024 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.workspace.api.chat.samples; + +import com.google.common.collect.ImmutableList; +import com.google.protobuf.util.JsonFormat; +// [START chat_CreateMessageUserCred] +import com.google.chat.v1.ChatServiceClient; +import com.google.chat.v1.CreateMessageRequest; +import com.google.chat.v1.Message; + +// This sample shows how to create message with user credential. +public class CreateMessageUserCred { + + private static final String SCOPE = + "https://www.googleapis.com/auth/chat.messages.create"; + + public static void main(String[] args) throws Exception { + try (ChatServiceClient chatServiceClient = + AuthenticationUtils.createClientWithUserCredentials( + ImmutableList.of(SCOPE))) { + CreateMessageRequest request = + CreateMessageRequest.newBuilder() + // Replace SPACE_NAME here. + .setParent("spaces/SPACE_NAME") + .setMessage( + Message + .newBuilder() + .setText("Hello with user credentials!") + .build()) + .build(); + Message response = chatServiceClient.createMessage(request); + + System.out.println(JsonFormat.printer().print(response)); + } + } +} +// [END chat_CreateMessageUserCred] diff --git a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMessageUserCredWithMessageId.java b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMessageUserCredWithMessageId.java new file mode 100644 index 00000000..0e37bbe3 --- /dev/null +++ b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMessageUserCredWithMessageId.java @@ -0,0 +1,56 @@ +/* + * Copyright 2024 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.workspace.api.chat.samples; + +import com.google.common.collect.ImmutableList; +import com.google.protobuf.util.JsonFormat; +// [START chat_CreateMessageUserCredWithMessageId] +import com.google.chat.v1.ChatServiceClient; +import com.google.chat.v1.CreateMessageRequest; +import com.google.chat.v1.Message; + +// This sample shows how to create message with message id specified with user +// credential. +public class CreateMessageUserCredWithMessageId { + + private static final String SCOPE = + "https://www.googleapis.com/auth/chat.messages.create"; + + public static void main(String[] args) throws Exception { + try (ChatServiceClient chatServiceClient = + AuthenticationUtils.createClientWithUserCredentials( + ImmutableList.of(SCOPE))) { + CreateMessageRequest request = + CreateMessageRequest.newBuilder() + // Replace SPACE_NAME here. + .setParent("spaces/SPACE_NAME") + .setMessage( + Message.newBuilder() + .setText("Hello with user credentials!") + .build()) + // Message ID lets chat apps get, update or delete a message without + // needing to store the system assigned ID in the message's resource + // name. + .setMessageId("client-MESSAGE-ID") + .build(); + Message response = chatServiceClient.createMessage(request); + + System.out.println(JsonFormat.printer().print(response)); + } + } +} +// [END chat_CreateMessageUserCredWithMessageId] diff --git a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMessageUserCredWithRequestId.java b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMessageUserCredWithRequestId.java new file mode 100644 index 00000000..fe46232a --- /dev/null +++ b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMessageUserCredWithRequestId.java @@ -0,0 +1,55 @@ +/* + * Copyright 2024 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.workspace.api.chat.samples; + +import com.google.common.collect.ImmutableList; +import com.google.protobuf.util.JsonFormat; +// [START chat_CreateMessageUserCredWithRequestId] +import com.google.chat.v1.ChatServiceClient; +import com.google.chat.v1.CreateMessageRequest; +import com.google.chat.v1.Message; + +// This sample shows how to create message with request id specified with user +// credential. +public class CreateMessageUserCredWithRequestId { + + private static final String SCOPE = + "https://www.googleapis.com/auth/chat.messages.create"; + + public static void main(String[] args) throws Exception { + try (ChatServiceClient chatServiceClient = + AuthenticationUtils.createClientWithUserCredentials( + ImmutableList.of(SCOPE))) { + CreateMessageRequest request = + CreateMessageRequest.newBuilder() + // Replace SPACE_NAME here. + .setParent("spaces/SPACE_NAME") + .setMessage( + Message.newBuilder() + .setText("Hello with user credentials!") + .build()) + // Specifying an existing request ID returns the message created with + // that ID instead of creating a new message. + .setRequestId("REQUEST_ID") + .build(); + Message response = chatServiceClient.createMessage(request); + + System.out.println(JsonFormat.printer().print(response)); + } + } +} +// [END chat_CreateMessageUserCredWithRequestId] diff --git a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMessageUserCredWithThreadKey.java b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMessageUserCredWithThreadKey.java new file mode 100644 index 00000000..40aa327f --- /dev/null +++ b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMessageUserCredWithThreadKey.java @@ -0,0 +1,61 @@ +/* + * Copyright 2024 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.workspace.api.chat.samples; + +import com.google.common.collect.ImmutableList; +import com.google.protobuf.util.JsonFormat; +// [START chat_CreateMessageUserCredWithThreadKey] +import com.google.chat.v1.ChatServiceClient; +import com.google.chat.v1.CreateMessageRequest; +import com.google.chat.v1.CreateMessageRequest.MessageReplyOption; +import com.google.chat.v1.Message; +import com.google.chat.v1.Thread; + +// This sample shows how to create message with a thread key with user +// credential. +public class CreateMessageUserCredWithThreadKey { + + private static final String SCOPE = + "https://www.googleapis.com/auth/chat.messages.create"; + + public static void main(String[] args) throws Exception { + try (ChatServiceClient chatServiceClient = + AuthenticationUtils.createClientWithUserCredentials( + ImmutableList.of(SCOPE))) { + CreateMessageRequest request = + CreateMessageRequest.newBuilder() + // Replace SPACE_NAME here. + .setParent("spaces/SPACE_NAME") + // Creates the message as a reply to the thread specified by thread_key. + // If it fails, the message starts a new thread instead. + .setMessageReplyOption( + MessageReplyOption.REPLY_MESSAGE_FALLBACK_TO_NEW_THREAD) + .setMessage( + Message.newBuilder() + .setText("Hello with user credentials!") + // Thread key specifies a thread and is unique to the chat app + // that sets it. + .setThread(Thread.newBuilder().setThreadKey("THREAD_KEY").build()) + .build()) + .build(); + Message response = chatServiceClient.createMessage(request); + + System.out.println(JsonFormat.printer().print(response)); + } + } +} +// [END chat_CreateMessageUserCredWithThreadKey] diff --git a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMessageUserCredWithThreadName.java b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMessageUserCredWithThreadName.java new file mode 100644 index 00000000..3c8f10c5 --- /dev/null +++ b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMessageUserCredWithThreadName.java @@ -0,0 +1,62 @@ +/* + * Copyright 2024 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.workspace.api.chat.samples; + +import com.google.common.collect.ImmutableList; +import com.google.protobuf.util.JsonFormat; +// [START chat_CreateMessageUserCredWithThreadName] +import com.google.chat.v1.ChatServiceClient; +import com.google.chat.v1.CreateMessageRequest; +import com.google.chat.v1.CreateMessageRequest.MessageReplyOption; +import com.google.chat.v1.Message; +import com.google.chat.v1.Thread; + +// This sample shows how to create message with thread name specified with user +// credential. +public class CreateMessageUserCredWithThreadName { + + private static final String SCOPE = + "https://www.googleapis.com/auth/chat.messages.create"; + + public static void main(String[] args) throws Exception { + try (ChatServiceClient chatServiceClient = + AuthenticationUtils.createClientWithUserCredentials( + ImmutableList.of(SCOPE))) { + CreateMessageRequest request = + CreateMessageRequest.newBuilder() + // Replace SPACE_NAME here. + .setParent("spaces/SPACE_NAME") + // Creates the message as a reply to the thread specified by thread name. + // If it fails, the message starts a new thread instead. + .setMessageReplyOption( + MessageReplyOption.REPLY_MESSAGE_FALLBACK_TO_NEW_THREAD) + .setMessage( + Message.newBuilder() + .setText("Hello with user credentials!") + // Resource name of a thread that uniquely identify a thread. + .setThread(Thread.newBuilder().setName( + // replace SPACE_NAME and THREAD_NAME here + "spaces/SPACE_NAME/threads/THREAD_NAME").build()) + .build()) + .build(); + Message response = chatServiceClient.createMessage(request); + + System.out.println(JsonFormat.printer().print(response)); + } + } +} +// [END chat_CreateMessageUserCredWithThreadName] diff --git a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/DeleteMessageAppCred.java b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/DeleteMessageAppCred.java new file mode 100644 index 00000000..66e44af8 --- /dev/null +++ b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/DeleteMessageAppCred.java @@ -0,0 +1,38 @@ +/* + * Copyright 2024 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.workspace.api.chat.samples; + +// [START chat_DeleteMessageAppCred] +import com.google.chat.v1.ChatServiceClient; +import com.google.chat.v1.DeleteMessageRequest; + +// This sample shows how to delete message with app credential. +public class DeleteMessageAppCred { + + public static void main(String[] args) throws Exception { + try (ChatServiceClient chatServiceClient = + AuthenticationUtils.createClientWithAppCredentials()) { + DeleteMessageRequest request = + DeleteMessageRequest.newBuilder() + // replace SPACE_NAME and MESSAGE_NAME here + .setName("spaces/SPACE_NAME/messages/MESSAGE_NAME") + .build(); + chatServiceClient.deleteMessage(request); + } + } +} +// [END chat_DeleteMessageAppCred] diff --git a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/DeleteMessageUserCred.java b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/DeleteMessageUserCred.java new file mode 100644 index 00000000..43f7f713 --- /dev/null +++ b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/DeleteMessageUserCred.java @@ -0,0 +1,44 @@ +/* + * Copyright 2024 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.workspace.api.chat.samples; + +import com.google.common.collect.ImmutableList; +// [START chat_DeleteMessageUserCred] +import com.google.chat.v1.ChatServiceClient; +import com.google.chat.v1.DeleteMessageRequest; +import com.google.chat.v1.SpaceName; + +// This sample shows how to delete message with user credential. +public class DeleteMessageUserCred { + + private static final String SCOPE = + "https://www.googleapis.com/auth/chat.messages"; + + public static void main(String[] args) throws Exception { + try (ChatServiceClient chatServiceClient = + AuthenticationUtils.createClientWithUserCredentials( + ImmutableList.of(SCOPE))) { + DeleteMessageRequest request = + DeleteMessageRequest.newBuilder() + // replace SPACE_NAME and MESSAGE_NAME here + .setName("spaces/SPACE_NAME/messages/MESSAGE_NAME") + .build(); + chatServiceClient.deleteMessage(request); + } + } +} +// [END chat_DeleteMessageUserCred] diff --git a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/GetMembershipAppCred.java b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/GetMembershipAppCred.java new file mode 100644 index 00000000..fd5bb8ca --- /dev/null +++ b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/GetMembershipAppCred.java @@ -0,0 +1,42 @@ +/* + * Copyright 2024 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.workspace.api.chat.samples; + +import com.google.protobuf.util.JsonFormat; +// [START chat_GetMembershipAppCred] +import com.google.chat.v1.ChatServiceClient; +import com.google.chat.v1.GetMembershipRequest; +import com.google.chat.v1.Membership; + +// This sample shows how to get membership with app credential. +public class GetMembershipAppCred { + + public static void main(String[] args) throws Exception { + try (ChatServiceClient chatServiceClient = + AuthenticationUtils.createClientWithAppCredentials()) { + GetMembershipRequest request = + GetMembershipRequest.newBuilder() + // replace SPACE_NAME and MEMBERSHIP_NAME here + .setName("spaces/SPACE_NAME/members/MEMBERSHIP_NAME") + .build(); + Membership response = chatServiceClient.getMembership(request); + + System.out.println(JsonFormat.printer().print(response)); + } + } +} +// [END chat_GetMembershipAppCred] diff --git a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/GetMembershipUserCred.java b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/GetMembershipUserCred.java new file mode 100644 index 00000000..d4cb18d5 --- /dev/null +++ b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/GetMembershipUserCred.java @@ -0,0 +1,47 @@ +/* + * Copyright 2024 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.workspace.api.chat.samples; + +import com.google.common.collect.ImmutableList; +import com.google.protobuf.util.JsonFormat; +// [START chat_GetMembershipUserCred] +import com.google.chat.v1.ChatServiceClient; +import com.google.chat.v1.GetMembershipRequest; +import com.google.chat.v1.Membership; + +// This sample shows how to get membership with user credential. +public class GetMembershipUserCred { + + private static final String SCOPE = + "https://www.googleapis.com/auth/chat.memberships.readonly"; + + public static void main(String[] args) throws Exception { + try (ChatServiceClient chatServiceClient = + AuthenticationUtils.createClientWithUserCredentials( + ImmutableList.of(SCOPE))) { + GetMembershipRequest request = + GetMembershipRequest.newBuilder() + // replace SPACE_NAME and MEMBERSHIP_NAME here + .setName("spaces/SPACE_NAME/members/MEMBERSHIP_NAME") + .build(); + Membership response = chatServiceClient.getMembership(request); + + System.out.println(JsonFormat.printer().print(response)); + } + } +} +// [END chat_GetMembershipUserCred] diff --git a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/GetMessageAppCred.java b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/GetMessageAppCred.java new file mode 100644 index 00000000..c505680e --- /dev/null +++ b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/GetMessageAppCred.java @@ -0,0 +1,42 @@ +/* + * Copyright 2024 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.workspace.api.chat.samples; + +import com.google.protobuf.util.JsonFormat; +// [START chat_GetMessageAppCred] +import com.google.chat.v1.ChatServiceClient; +import com.google.chat.v1.GetMessageRequest; +import com.google.chat.v1.Message; + +// This sample shows how to get message with app credential. +public class GetMessageAppCred { + + public static void main(String[] args) throws Exception { + try (ChatServiceClient chatServiceClient = + AuthenticationUtils.createClientWithAppCredentials()) { + GetMessageRequest request = + GetMessageRequest.newBuilder() + // replace SPACE_NAME and MESSAGE_NAME here + .setName("spaces/SPACE_NAME/members/MESSAGE_NAME") + .build(); + Message response = chatServiceClient.getMessage(request); + + System.out.println(JsonFormat.printer().print(response)); + } + } +} +// [END chat_GetMessageAppCred] diff --git a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/GetMessageUserCred.java b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/GetMessageUserCred.java new file mode 100644 index 00000000..e58872d6 --- /dev/null +++ b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/GetMessageUserCred.java @@ -0,0 +1,47 @@ +/* + * Copyright 2024 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.workspace.api.chat.samples; + +import com.google.common.collect.ImmutableList; +import com.google.protobuf.util.JsonFormat; +// [START chat_GetMessageUserCred] +import com.google.chat.v1.ChatServiceClient; +import com.google.chat.v1.GetMessageRequest; +import com.google.chat.v1.Message; + +// This sample shows how to get message with user credential. +public class GetMessageUserCred { + + private static final String SCOPE = + "https://www.googleapis.com/auth/chat.messages.readonly"; + + public static void main(String[] args) throws Exception { + try (ChatServiceClient chatServiceClient = + AuthenticationUtils.createClientWithUserCredentials( + ImmutableList.of(SCOPE))) { + GetMessageRequest request = + GetMessageRequest.newBuilder() + // replace SPACE_NAME and MESSAGE_NAME here + .setName("spaces/SPACE_NAME/members/MESSAGE_NAME") + .build(); + Message response = chatServiceClient.getMessage(request); + + System.out.println(JsonFormat.printer().print(response)); + } + } +} +// [END chat_GetMessageUserCred] diff --git a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/GetSpaceAppCred.java b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/GetSpaceAppCred.java new file mode 100644 index 00000000..df5da3d4 --- /dev/null +++ b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/GetSpaceAppCred.java @@ -0,0 +1,42 @@ +/* + * Copyright 2024 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.workspace.api.chat.samples; + +import com.google.protobuf.util.JsonFormat; +// [START chat_GetSpaceAppCred] +import com.google.chat.v1.ChatServiceClient; +import com.google.chat.v1.GetSpaceRequest; +import com.google.chat.v1.Space; + +// This sample shows how to get space with app credential. +public class GetSpaceAppCred { + + public static void main(String[] args) throws Exception { + try (ChatServiceClient chatServiceClient = + AuthenticationUtils.createClientWithAppCredentials()) { + GetSpaceRequest request = + GetSpaceRequest.newBuilder() + // Replace SPACE_NAME here + .setName("spaces/SPACE_NAME") + .build(); + Space response = chatServiceClient.getSpace(request); + + System.out.println(JsonFormat.printer().print(response)); + } + } +} +// [END chat_GetSpaceAppCred] diff --git a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/GetSpaceUserCred.java b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/GetSpaceUserCred.java new file mode 100644 index 00000000..e9ed0a45 --- /dev/null +++ b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/GetSpaceUserCred.java @@ -0,0 +1,47 @@ +/* + * Copyright 2024 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.workspace.api.chat.samples; + +import com.google.common.collect.ImmutableList; +import com.google.protobuf.util.JsonFormat; +// [START chat_GetSpaceUserCred] +import com.google.chat.v1.ChatServiceClient; +import com.google.chat.v1.GetSpaceRequest; +import com.google.chat.v1.Space; + +// This sample shows how to get space with user credential. +public class GetSpaceUserCred { + + private static final String SCOPE = + "https://www.googleapis.com/auth/chat.spaces.readonly"; + + public static void main(String[] args) throws Exception { + try (ChatServiceClient chatServiceClient = + AuthenticationUtils.createClientWithUserCredentials( + ImmutableList.of(SCOPE))) { + GetSpaceRequest request = + GetSpaceRequest.newBuilder() + // Replace SPACE_NAME here + .setName("spaces/SPACE_NAME") + .build(); + Space response = chatServiceClient.getSpace(request); + + System.out.println(JsonFormat.printer().print(response)); + } + } +} +// [END chat_GetSpaceUserCred] diff --git a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/ListMembershipsAppCred.java b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/ListMembershipsAppCred.java new file mode 100644 index 00000000..cae23771 --- /dev/null +++ b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/ListMembershipsAppCred.java @@ -0,0 +1,51 @@ +/* + * Copyright 2024 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.workspace.api.chat.samples; + +import com.google.protobuf.util.JsonFormat; +// [START chat_ListMembershipsAppCred] +import com.google.chat.v1.ChatServiceClient; +import com.google.chat.v1.ListMembershipsRequest; +import com.google.chat.v1.ListMembershipsResponse; +import com.google.chat.v1.Membership; + +// This sample shows how to list memberships with app credential. +public class ListMembershipsAppCred { + + public static void main(String[] args) throws Exception { + try (ChatServiceClient chatServiceClient = + AuthenticationUtils.createClientWithAppCredentials()) { + ListMembershipsRequest request = + ListMembershipsRequest.newBuilder() + // Replace SPACE_NAME here. + .setParent("spaces/SPACE_NAME") + // Filter membership by type (HUMAN or BOT) or role + // (ROLE_MEMBER or ROLE_MANAGER). + .setFilter("member.type = \"HUMAN\"") + // Number of results that will be returned at once. + .setPageSize(10) + .build(); + + // Iterate over results and resolve additional pages automatically. + for (Membership response : + chatServiceClient.listMemberships(request).iterateAll()) { + System.out.println(JsonFormat.printer().print(response)); + } + } + } +} +// [END chat_ListMembershipsAppCred] diff --git a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/ListMembershipsUserCred.java b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/ListMembershipsUserCred.java new file mode 100644 index 00000000..d60e2725 --- /dev/null +++ b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/ListMembershipsUserCred.java @@ -0,0 +1,56 @@ +/* + * Copyright 2024 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.workspace.api.chat.samples; + +import com.google.common.collect.ImmutableList; +import com.google.protobuf.util.JsonFormat; +// [START chat_ListMembershipsUserCred] +import com.google.chat.v1.ChatServiceClient; +import com.google.chat.v1.ListMembershipsRequest; +import com.google.chat.v1.ListMembershipsResponse; +import com.google.chat.v1.Membership; + +// This sample shows how to list memberships with user credential. +public class ListMembershipsUserCred { + + private static final String SCOPE = + "https://www.googleapis.com/auth/chat.memberships.readonly"; + + public static void main(String[] args) throws Exception { + try (ChatServiceClient chatServiceClient = + AuthenticationUtils.createClientWithUserCredentials( + ImmutableList.of(SCOPE))) { + ListMembershipsRequest request = + ListMembershipsRequest.newBuilder() + // Replace SPACE_NAME here. + .setParent("spaces/SPACE_NAME") + // Filter membership by type (HUMAN or BOT) or role + // (ROLE_MEMBER or ROLE_MANAGER). + .setFilter("member.type = \"HUMAN\"") + // Number of results that will be returned at once. + .setPageSize(10) + .build(); + + // Iterating over results and resolve additional pages automatically. + for (Membership response : + chatServiceClient.listMemberships(request).iterateAll()) { + System.out.println(JsonFormat.printer().print(response)); + } + } + } +} +// [END chat_ListMembershipsUserCred] diff --git a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/ListMessagesUserCred.java b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/ListMessagesUserCred.java new file mode 100644 index 00000000..1a984607 --- /dev/null +++ b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/ListMessagesUserCred.java @@ -0,0 +1,53 @@ +/* + * Copyright 2024 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.workspace.api.chat.samples; + +import com.google.common.collect.ImmutableList; +import com.google.protobuf.util.JsonFormat; +// [START chat_ListMessagesUserCred] +import com.google.chat.v1.ChatServiceClient; +import com.google.chat.v1.ListMessagesRequest; +import com.google.chat.v1.ListMessagesResponse; +import com.google.chat.v1.Message; + +// This sample shows how to list messages with user credential. +public class ListMessagesUserCred { + + private static final String SCOPE = + "https://www.googleapis.com/auth/chat.messages.readonly"; + + public static void main(String[] args) throws Exception { + try (ChatServiceClient chatServiceClient = + AuthenticationUtils.createClientWithUserCredentials( + ImmutableList.of(SCOPE))) { + ListMessagesRequest request = + ListMessagesRequest.newBuilder() + // Replace SPACE_NAME here. + .setParent("spaces/SPACE_NAME") + // Number of results that will be returned at once. + .setPageSize(10) + .build(); + + // Iterate over results and resolve additional pages automatically. + for (Message response : + chatServiceClient.listMessages(request).iterateAll()) { + System.out.println(JsonFormat.printer().print(response)); + } + } + } +} +// [END chat_ListMessagesUserCred] diff --git a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/ListSpacesAppCred.java b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/ListSpacesAppCred.java new file mode 100644 index 00000000..00494729 --- /dev/null +++ b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/ListSpacesAppCred.java @@ -0,0 +1,49 @@ +/* + * Copyright 2024 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.workspace.api.chat.samples; + +import com.google.protobuf.util.JsonFormat; +// [START chat_ListSpacesAppCred] +import com.google.chat.v1.ChatServiceClient; +import com.google.chat.v1.ListSpacesRequest; +import com.google.chat.v1.ListSpacesResponse; +import com.google.chat.v1.Space; + +// This sample shows how to list spaces with app credential. +public class ListSpacesAppCred { + + public static void main(String[] args) throws Exception { + try (ChatServiceClient chatServiceClient = + AuthenticationUtils.createClientWithAppCredentials()) { + ListSpacesRequest request = + ListSpacesRequest.newBuilder() + // Filter spaces by space type (SPACE or GROUP_CHAT or + // DIRECT_MESSAGE). + .setFilter("spaceType = \"SPACE\"") + // Number of results that will be returned at once. + .setPageSize(10) + .build(); + + // Iterate over results and resolve additional pages automatically. + for (Space response : + chatServiceClient.listSpaces(request).iterateAll()) { + System.out.println(JsonFormat.printer().print(response)); + } + } + } +} +// [END chat_ListSpacesAppCred] diff --git a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/ListSpacesUserCred.java b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/ListSpacesUserCred.java new file mode 100644 index 00000000..2d9410aa --- /dev/null +++ b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/ListSpacesUserCred.java @@ -0,0 +1,54 @@ +/* + * Copyright 2024 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.workspace.api.chat.samples; + +import com.google.common.collect.ImmutableList; +import com.google.protobuf.util.JsonFormat; +// [START chat_ListSpacesUserCred] +import com.google.chat.v1.ChatServiceClient; +import com.google.chat.v1.ListSpacesRequest; +import com.google.chat.v1.ListSpacesResponse; +import com.google.chat.v1.Space; + +// This sample shows how to list spaces with user credential. +public class ListSpacesUserCred{ + + private static final String SCOPE = + "https://www.googleapis.com/auth/chat.spaces.readonly"; + + public static void main(String[] args) throws Exception { + try (ChatServiceClient chatServiceClient = + AuthenticationUtils.createClientWithUserCredentials( + ImmutableList.of(SCOPE))) { + ListSpacesRequest request = + ListSpacesRequest.newBuilder() + // Filter spaces by space type (SPACE or GROUP_CHAT or + // DIRECT_MESSAGE). + .setFilter("spaceType = \"SPACE\"") + // Number of results that will be returned at once. + .setPageSize(10) + .build(); + + // Iterate over results and resolve additional pages automatically. + for (Space response : + chatServiceClient.listSpaces(request).iterateAll()) { + System.out.println(JsonFormat.printer().print(response)); + } + } + } +} +// [END chat_ListSpacesUserCred] diff --git a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/UpdateMessageAppCred.java b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/UpdateMessageAppCred.java new file mode 100644 index 00000000..5f946545 --- /dev/null +++ b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/UpdateMessageAppCred.java @@ -0,0 +1,51 @@ +/* + * Copyright 2024 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.workspace.api.chat.samples; + +import com.google.protobuf.util.JsonFormat; +// [START chat_UpdateMessageAppCred] +import com.google.chat.v1.ChatServiceClient; +import com.google.chat.v1.UpdateMessageRequest; +import com.google.chat.v1.Message; +import com.google.protobuf.FieldMask; + +// This sample shows how to update message with app credential. +public class UpdateMessageAppCred { + + public static void main(String[] args) throws Exception { + try (ChatServiceClient chatServiceClient = + AuthenticationUtils.createClientWithAppCredentials()) { + UpdateMessageRequest request = + UpdateMessageRequest.newBuilder() + .setMessage( + Message.newBuilder() + // replace SPACE_NAME and MESSAGE_NAME here + .setName("spaces/SPACE_NAME/messages/MESSAGE_NAME") + .setText("Updated with app credential!") + .build() + ) + .setUpdateMask( + // The field paths to update. + FieldMask.newBuilder().addPaths("text").build()) + .build(); + Message response = chatServiceClient.updateMessage(request); + + System.out.println(JsonFormat.printer().print(response)); + } + } +} +// [END chat_UpdateMessageAppCred] diff --git a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/UpdateMessageUserCred.java b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/UpdateMessageUserCred.java new file mode 100644 index 00000000..9f2dd016 --- /dev/null +++ b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/UpdateMessageUserCred.java @@ -0,0 +1,56 @@ +/* + * Copyright 2024 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.workspace.api.chat.samples; + +import com.google.common.collect.ImmutableList; +import com.google.protobuf.util.JsonFormat; +// [START chat_UpdateMessageUserCred] +import com.google.chat.v1.ChatServiceClient; +import com.google.chat.v1.UpdateMessageRequest; +import com.google.chat.v1.Message; +import com.google.protobuf.FieldMask; + +// This sample shows how to update message with user credential. +public class UpdateMessageUserCred { + + private static final String SCOPE = + "https://www.googleapis.com/auth/chat.messages"; + + public static void main(String[] args) throws Exception { + try (ChatServiceClient chatServiceClient = + AuthenticationUtils.createClientWithUserCredentials( + ImmutableList.of(SCOPE))) { + UpdateMessageRequest request = + UpdateMessageRequest.newBuilder() + .setMessage( + Message.newBuilder() + // replace SPACE_NAME and MESSAGE_NAME here + .setName("spaces/SPACE_NAME/messages/MESSAGE_NAME") + .setText("Updated with user credential!") + .build() + ) + .setUpdateMask( + // The field paths to update. + FieldMask.newBuilder().addPaths("text").build()) + .build(); + Message response = chatServiceClient.updateMessage(request); + + System.out.println(JsonFormat.printer().print(response)); + } + } +} +// [END chat_UpdateMessageUserCred] diff --git a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/UpdateSpaceUserCred.java b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/UpdateSpaceUserCred.java new file mode 100644 index 00000000..cd5d67cd --- /dev/null +++ b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/UpdateSpaceUserCred.java @@ -0,0 +1,56 @@ +/* + * Copyright 2024 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.workspace.api.chat.samples; + +import com.google.common.collect.ImmutableList; +import com.google.protobuf.util.JsonFormat; +// [START chat_UpdateSpaceUserCred] +import com.google.chat.v1.ChatServiceClient; +import com.google.chat.v1.UpdateSpaceRequest; +import com.google.chat.v1.Space; +import com.google.protobuf.FieldMask; + +// This sample shows how to update space with user credential. +public class UpdateSpaceUserCred { + + private static final String SCOPE = + "https://www.googleapis.com/auth/chat.spaces"; + + public static void main(String[] args) throws Exception { + try (ChatServiceClient chatServiceClient = + AuthenticationUtils.createClientWithUserCredentials( + ImmutableList.of(SCOPE))) { + UpdateSpaceRequest request = + UpdateSpaceRequest.newBuilder() + .setSpace( + Space.newBuilder() + // Replace SPACE_NAME here. + .setName("spaces/SPACE_NAME") + .setDisplayName("New space display name") + .build() + ) + .setUpdateMask( + // The field paths to update. + FieldMask.newBuilder().addPaths("display_name").build()) + .build(); + Space response = chatServiceClient.updateSpace(request); + + System.out.println(JsonFormat.printer().print(response)); + } + } +} +// [END chat_UpdateSpaceUserCred] From 22656cb15988abaf546e5606e0f4cc47ac6d8e18 Mon Sep 17 00:00:00 2001 From: Pierrick Voulet <6769971+PierrickVoulet@users.noreply.github.com> Date: Wed, 21 Aug 2024 13:45:07 -0400 Subject: [PATCH 252/262] feat: update GAPIC samples to be featured in create message guide (#1092) * feat: update GAPIC samples to be featured in create message guide * Fix style --------- Co-authored-by: pierrick --- .../chat/samples/CreateMessageAppCred.java | 60 ++++++++++++++--- .../CreateMessageAppCredWithCards.java | 66 ------------------- .../chat/samples/CreateMessageUserCred.java | 20 +++--- 3 files changed, 63 insertions(+), 83 deletions(-) delete mode 100644 chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMessageAppCredWithCards.java diff --git a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMessageAppCred.java b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMessageAppCred.java index 24b85bca..c17303f2 100644 --- a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMessageAppCred.java +++ b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMessageAppCred.java @@ -18,6 +18,19 @@ import com.google.protobuf.util.JsonFormat; // [START chat_CreateMessageAppCred] +import com.google.apps.card.v1.Button; +import com.google.apps.card.v1.ButtonList; +import com.google.apps.card.v1.Card; +import com.google.apps.card.v1.Icon; +import com.google.apps.card.v1.MaterialIcon; +import com.google.apps.card.v1.OnClick; +import com.google.apps.card.v1.OpenLink; +import com.google.apps.card.v1.TextParagraph; +import com.google.apps.card.v1.Widget; +import com.google.apps.card.v1.Card.CardHeader; +import com.google.apps.card.v1.Card.Section; +import com.google.chat.v1.AccessoryWidget; +import com.google.chat.v1.CardWithId; import com.google.chat.v1.ChatServiceClient; import com.google.chat.v1.CreateMessageRequest; import com.google.chat.v1.Message; @@ -28,16 +41,47 @@ public class CreateMessageAppCred { public static void main(String[] args) throws Exception { try (ChatServiceClient chatServiceClient = AuthenticationUtils.createClientWithAppCredentials()) { - CreateMessageRequest request = - CreateMessageRequest.newBuilder() + CreateMessageRequest.Builder request = CreateMessageRequest.newBuilder() // Replace SPACE_NAME here. .setParent("spaces/SPACE_NAME") - .setMessage( - Message.newBuilder() - .setText("Hello with app credentials!") - .build()) - .build(); - Message response = chatServiceClient.createMessage(request); + .setMessage(Message.newBuilder() + .setText( "👋🌎 Hello world! I created this message by calling " + + "the Chat API\'s `messages.create()` method.") + .addCardsV2(CardWithId.newBuilder().setCard(Card.newBuilder() + .setHeader(CardHeader.newBuilder() + .setTitle("About this message") + .setImageUrl("https://fonts.gstatic.com/s/i/short-term/release/googlesymbols/info/default/24px.svg")) + .addSections(Section.newBuilder() + .setHeader("Contents") + .addWidgets(Widget.newBuilder().setTextParagraph(TextParagraph.newBuilder().setText( + "🔡 Text which can include " + + "hyperlinks 🔗, emojis 😄🎉, and @mentions 🗣️."))) + .addWidgets(Widget.newBuilder().setTextParagraph(TextParagraph.newBuilder().setText( + "🖼️ A card to display visual elements " + + "and request information such as text 🔤, " + + "dates and times 📅, and selections ☑️."))) + .addWidgets(Widget.newBuilder().setTextParagraph(TextParagraph.newBuilder().setText( + "👉🔘 An accessory widget which adds " + + "a button to the bottom of a message.")))) + .addSections(Section.newBuilder() + .setHeader("What's next") + .setCollapsible(true) + .addWidgets(Widget.newBuilder().setTextParagraph(TextParagraph.newBuilder().setText( + "❤️ Add a reaction."))) + .addWidgets(Widget.newBuilder().setTextParagraph(TextParagraph.newBuilder().setText( + "🔄 Update " + + "or ❌ delete " + + "the message.")))))) + .addAccessoryWidgets(AccessoryWidget.newBuilder() + .setButtonList(ButtonList.newBuilder() + .addButtons(Button.newBuilder() + .setText("View documentation") + .setIcon(Icon.newBuilder() + .setMaterialIcon(MaterialIcon.newBuilder().setName("link"))) + .setOnClick(OnClick.newBuilder() + .setOpenLink(OpenLink.newBuilder() + .setUrl("https://developers.google.com/workspace/chat/create-messages"))))))); + Message response = chatServiceClient.createMessage(request.build()); System.out.println(JsonFormat.printer().print(response)); } diff --git a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMessageAppCredWithCards.java b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMessageAppCredWithCards.java deleted file mode 100644 index c47e3169..00000000 --- a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMessageAppCredWithCards.java +++ /dev/null @@ -1,66 +0,0 @@ -/* - * Copyright 2024 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.google.workspace.api.chat.samples; - -import com.google.protobuf.util.JsonFormat; -// [START chat_CreateMessageAppCredWithCards] -import com.google.apps.card.v1.Card; -import com.google.apps.card.v1.Card.CardHeader; -import com.google.apps.card.v1.Card.Section; -import com.google.apps.card.v1.TextParagraph; -import com.google.apps.card.v1.Widget; -import com.google.chat.v1.CardWithId; -import com.google.chat.v1.ChatServiceClient; -import com.google.chat.v1.CreateMessageRequest; -import com.google.chat.v1.Message; - -// This sample shows how to create message with a card with app credential. -public class CreateMessageAppCredWithCards { - - public static void main(String[] args) throws Exception { - try (ChatServiceClient chatServiceClient = - AuthenticationUtils.createClientWithAppCredentials()) { - CreateMessageRequest request = - CreateMessageRequest.newBuilder() - // Replace SPACE_NAME here. - .setParent("spaces/SPACE_NAME") - .setMessage( - Message.newBuilder() - .setText("Hello with app credentials!") - .addCardsV2( - CardWithId.newBuilder().setCard( - Card.newBuilder() - .addSections( - Section.newBuilder() - .addWidgets( - Widget.newBuilder() - .setTextParagraph( - TextParagraph.newBuilder().setText("Hello")) - .build()) - .build()) - .build() - ) - ) - .build()) - .build(); - Message response = chatServiceClient.createMessage(request); - - System.out.println(JsonFormat.printer().print(response)); - } - } -} -// [END chat_CreateMessageAppCredWithCards] diff --git a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMessageUserCred.java b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMessageUserCred.java index fe08c4b1..fa53ed57 100644 --- a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMessageUserCred.java +++ b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMessageUserCred.java @@ -33,17 +33,19 @@ public static void main(String[] args) throws Exception { try (ChatServiceClient chatServiceClient = AuthenticationUtils.createClientWithUserCredentials( ImmutableList.of(SCOPE))) { - CreateMessageRequest request = - CreateMessageRequest.newBuilder() + CreateMessageRequest.Builder request = CreateMessageRequest.newBuilder() // Replace SPACE_NAME here. .setParent("spaces/SPACE_NAME") - .setMessage( - Message - .newBuilder() - .setText("Hello with user credentials!") - .build()) - .build(); - Message response = chatServiceClient.createMessage(request); + .setMessage(Message.newBuilder() + .setText( "👋🌎 Hello world!" + + "Text messages can contain things like:\n\n" + + "* Hyperlinks 🔗\n" + + "* Emojis 😄🎉\n" + + "* Mentions of other Chat users `@` \n\n" + + "For details, see the " + + ".")); + Message response = chatServiceClient.createMessage(request.build()); System.out.println(JsonFormat.printer().print(response)); } From 9d94f3a5d98ae8544f6b6ac20b1e8d564735fb9d Mon Sep 17 00:00:00 2001 From: Pierrick Voulet <6769971+PierrickVoulet@users.noreply.github.com> Date: Wed, 21 Aug 2024 16:24:44 -0400 Subject: [PATCH 253/262] feat: fix style for builders (#1093) Co-authored-by: pierrick --- .../samples/CreateMembershipUserCred.java | 26 +++++++------------ .../CreateMembershipUserCredForApp.java | 26 +++++++------------ .../CreateMessageAppCredAtMention.java | 18 +++++-------- .../CreateMessageUserCredWithMessageId.java | 14 ++++------ .../CreateMessageUserCredWithRequestId.java | 14 ++++------ .../CreateMessageUserCredWithThreadKey.java | 20 ++++++-------- .../CreateMessageUserCredWithThreadName.java | 22 +++++++--------- .../chat/samples/DeleteMessageAppCred.java | 10 +++---- .../chat/samples/DeleteMessageUserCred.java | 10 +++---- .../chat/samples/GetMembershipAppCred.java | 10 +++---- .../chat/samples/GetMembershipUserCred.java | 10 +++---- .../api/chat/samples/GetMessageAppCred.java | 10 +++---- .../api/chat/samples/GetMessageUserCred.java | 10 +++---- .../api/chat/samples/GetSpaceAppCred.java | 8 +++--- .../api/chat/samples/GetSpaceUserCred.java | 8 +++--- .../chat/samples/ListMembershipsAppCred.java | 20 +++++++------- .../chat/samples/ListMembershipsUserCred.java | 20 +++++++------- .../chat/samples/ListMessagesUserCred.java | 14 +++++----- .../api/chat/samples/ListSpacesAppCred.java | 16 +++++------- .../api/chat/samples/ListSpacesUserCred.java | 16 +++++------- .../chat/samples/UpdateMessageAppCred.java | 23 +++++++--------- .../chat/samples/UpdateMessageUserCred.java | 23 +++++++--------- .../api/chat/samples/UpdateSpaceUserCred.java | 23 +++++++--------- 23 files changed, 149 insertions(+), 222 deletions(-) diff --git a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMembershipUserCred.java b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMembershipUserCred.java index 790a05eb..c04b15fc 100644 --- a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMembershipUserCred.java +++ b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMembershipUserCred.java @@ -36,22 +36,16 @@ public static void main(String[] args) throws Exception { try (ChatServiceClient chatServiceClient = AuthenticationUtils.createClientWithUserCredentials( ImmutableList.of(SCOPE))) { - CreateMembershipRequest request = - CreateMembershipRequest.newBuilder() - // replace SPACE_NAME here - .setParent("spaces/SPACE_NAME") - .setMembership( - Membership.newBuilder() - .setMember( - User.newBuilder() - // replace USER_NAME here - .setName("users/USER_NAME") - // user type for the membership - .setType(User.Type.HUMAN) - .build()) - .build()) - .build(); - Membership response = chatServiceClient.createMembership(request); + CreateMembershipRequest.Builder request = CreateMembershipRequest.newBuilder() + // replace SPACE_NAME here + .setParent("spaces/SPACE_NAME") + .setMembership(Membership.newBuilder() + .setMember(User.newBuilder() + // replace USER_NAME here + .setName("users/USER_NAME") + // user type for the membership + .setType(User.Type.HUMAN))); + Membership response = chatServiceClient.createMembership(request.build()); System.out.println(JsonFormat.printer().print(response)); } diff --git a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMembershipUserCredForApp.java b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMembershipUserCredForApp.java index e751f20b..3edb889d 100644 --- a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMembershipUserCredForApp.java +++ b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMembershipUserCredForApp.java @@ -36,22 +36,16 @@ public static void main(String[] args) throws Exception { try (ChatServiceClient chatServiceClient = AuthenticationUtils.createClientWithUserCredentials( ImmutableList.of(SCOPE))) { - CreateMembershipRequest request = - CreateMembershipRequest.newBuilder() - // replace SPACE_NAME here - .setParent("spaces/SPACE_NAME") - .setMembership( - Membership.newBuilder() - .setMember( - User.newBuilder() - // member name for app membership, do not change this. - .setName("users/app") - // user type for the membership - .setType(User.Type.BOT) - .build()) - .build()) - .build(); - Membership response = chatServiceClient.createMembership(request); + CreateMembershipRequest.Builder request = CreateMembershipRequest.newBuilder() + // replace SPACE_NAME here + .setParent("spaces/SPACE_NAME") + .setMembership(Membership.newBuilder() + .setMember(User.newBuilder() + // member name for app membership, do not change this. + .setName("users/app") + // user type for the membership + .setType(User.Type.BOT))); + Membership response = chatServiceClient.createMembership(request.build()); System.out.println(JsonFormat.printer().print(response)); } diff --git a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMessageAppCredAtMention.java b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMessageAppCredAtMention.java index b8fb8291..5830de3c 100644 --- a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMessageAppCredAtMention.java +++ b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMessageAppCredAtMention.java @@ -29,19 +29,15 @@ public class CreateMessageAppCredAtMention { public static void main(String[] args) throws Exception { try (ChatServiceClient chatServiceClient = AuthenticationUtils.createClientWithAppCredentials()) { - CreateMessageRequest request = - CreateMessageRequest.newBuilder() + CreateMessageRequest.Builder request = CreateMessageRequest.newBuilder() // Replace SPACE_NAME here. .setParent("spaces/SPACE_NAME") - .setMessage( - Message.newBuilder() - // The user with USER_NAME will be mentioned if they are in the - // space. - // Replace USER_NAME here - .setText("Hello !") - .build()) - .build(); - Message response = chatServiceClient.createMessage(request); + .setMessage(Message.newBuilder() + // The user with USER_NAME will be mentioned if they are in the + // space. + // Replace USER_NAME here + .setText("Hello !")); + Message response = chatServiceClient.createMessage(request.build()); System.out.println(JsonFormat.printer().print(response)); } diff --git a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMessageUserCredWithMessageId.java b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMessageUserCredWithMessageId.java index 0e37bbe3..d76475c7 100644 --- a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMessageUserCredWithMessageId.java +++ b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMessageUserCredWithMessageId.java @@ -34,20 +34,16 @@ public static void main(String[] args) throws Exception { try (ChatServiceClient chatServiceClient = AuthenticationUtils.createClientWithUserCredentials( ImmutableList.of(SCOPE))) { - CreateMessageRequest request = - CreateMessageRequest.newBuilder() + CreateMessageRequest.Builder request = CreateMessageRequest.newBuilder() // Replace SPACE_NAME here. .setParent("spaces/SPACE_NAME") - .setMessage( - Message.newBuilder() - .setText("Hello with user credentials!") - .build()) + .setMessage(Message.newBuilder() + .setText("Hello with user credentials!")) // Message ID lets chat apps get, update or delete a message without // needing to store the system assigned ID in the message's resource // name. - .setMessageId("client-MESSAGE-ID") - .build(); - Message response = chatServiceClient.createMessage(request); + .setMessageId("client-MESSAGE-ID"); + Message response = chatServiceClient.createMessage(request.build()); System.out.println(JsonFormat.printer().print(response)); } diff --git a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMessageUserCredWithRequestId.java b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMessageUserCredWithRequestId.java index fe46232a..1d05d950 100644 --- a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMessageUserCredWithRequestId.java +++ b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMessageUserCredWithRequestId.java @@ -34,19 +34,15 @@ public static void main(String[] args) throws Exception { try (ChatServiceClient chatServiceClient = AuthenticationUtils.createClientWithUserCredentials( ImmutableList.of(SCOPE))) { - CreateMessageRequest request = - CreateMessageRequest.newBuilder() + CreateMessageRequest.Builder request = CreateMessageRequest.newBuilder() // Replace SPACE_NAME here. .setParent("spaces/SPACE_NAME") - .setMessage( - Message.newBuilder() - .setText("Hello with user credentials!") - .build()) + .setMessage(Message.newBuilder() + .setText("Hello with user credentials!")) // Specifying an existing request ID returns the message created with // that ID instead of creating a new message. - .setRequestId("REQUEST_ID") - .build(); - Message response = chatServiceClient.createMessage(request); + .setRequestId("REQUEST_ID"); + Message response = chatServiceClient.createMessage(request.build()); System.out.println(JsonFormat.printer().print(response)); } diff --git a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMessageUserCredWithThreadKey.java b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMessageUserCredWithThreadKey.java index 40aa327f..897df800 100644 --- a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMessageUserCredWithThreadKey.java +++ b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMessageUserCredWithThreadKey.java @@ -36,23 +36,19 @@ public static void main(String[] args) throws Exception { try (ChatServiceClient chatServiceClient = AuthenticationUtils.createClientWithUserCredentials( ImmutableList.of(SCOPE))) { - CreateMessageRequest request = - CreateMessageRequest.newBuilder() + CreateMessageRequest.Builder request = CreateMessageRequest.newBuilder() // Replace SPACE_NAME here. .setParent("spaces/SPACE_NAME") // Creates the message as a reply to the thread specified by thread_key. // If it fails, the message starts a new thread instead. .setMessageReplyOption( - MessageReplyOption.REPLY_MESSAGE_FALLBACK_TO_NEW_THREAD) - .setMessage( - Message.newBuilder() - .setText("Hello with user credentials!") - // Thread key specifies a thread and is unique to the chat app - // that sets it. - .setThread(Thread.newBuilder().setThreadKey("THREAD_KEY").build()) - .build()) - .build(); - Message response = chatServiceClient.createMessage(request); + MessageReplyOption.REPLY_MESSAGE_FALLBACK_TO_NEW_THREAD) + .setMessage(Message.newBuilder() + .setText("Hello with user credentials!") + // Thread key specifies a thread and is unique to the chat app + // that sets it. + .setThread(Thread.newBuilder().setThreadKey("THREAD_KEY"))); + Message response = chatServiceClient.createMessage(request.build()); System.out.println(JsonFormat.printer().print(response)); } diff --git a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMessageUserCredWithThreadName.java b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMessageUserCredWithThreadName.java index 3c8f10c5..69bfba1e 100644 --- a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMessageUserCredWithThreadName.java +++ b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMessageUserCredWithThreadName.java @@ -36,24 +36,20 @@ public static void main(String[] args) throws Exception { try (ChatServiceClient chatServiceClient = AuthenticationUtils.createClientWithUserCredentials( ImmutableList.of(SCOPE))) { - CreateMessageRequest request = - CreateMessageRequest.newBuilder() + CreateMessageRequest.Builder request = CreateMessageRequest.newBuilder() // Replace SPACE_NAME here. .setParent("spaces/SPACE_NAME") // Creates the message as a reply to the thread specified by thread name. // If it fails, the message starts a new thread instead. .setMessageReplyOption( - MessageReplyOption.REPLY_MESSAGE_FALLBACK_TO_NEW_THREAD) - .setMessage( - Message.newBuilder() - .setText("Hello with user credentials!") - // Resource name of a thread that uniquely identify a thread. - .setThread(Thread.newBuilder().setName( - // replace SPACE_NAME and THREAD_NAME here - "spaces/SPACE_NAME/threads/THREAD_NAME").build()) - .build()) - .build(); - Message response = chatServiceClient.createMessage(request); + MessageReplyOption.REPLY_MESSAGE_FALLBACK_TO_NEW_THREAD) + .setMessage(Message.newBuilder() + .setText("Hello with user credentials!") + // Resource name of a thread that uniquely identify a thread. + .setThread(Thread.newBuilder().setName( + // replace SPACE_NAME and THREAD_NAME here + "spaces/SPACE_NAME/threads/THREAD_NAME"))); + Message response = chatServiceClient.createMessage(request.build()); System.out.println(JsonFormat.printer().print(response)); } diff --git a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/DeleteMessageAppCred.java b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/DeleteMessageAppCred.java index 66e44af8..abda2ae1 100644 --- a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/DeleteMessageAppCred.java +++ b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/DeleteMessageAppCred.java @@ -26,12 +26,10 @@ public class DeleteMessageAppCred { public static void main(String[] args) throws Exception { try (ChatServiceClient chatServiceClient = AuthenticationUtils.createClientWithAppCredentials()) { - DeleteMessageRequest request = - DeleteMessageRequest.newBuilder() - // replace SPACE_NAME and MESSAGE_NAME here - .setName("spaces/SPACE_NAME/messages/MESSAGE_NAME") - .build(); - chatServiceClient.deleteMessage(request); + DeleteMessageRequest.Builder request = DeleteMessageRequest.newBuilder() + // replace SPACE_NAME and MESSAGE_NAME here + .setName("spaces/SPACE_NAME/messages/MESSAGE_NAME"); + chatServiceClient.deleteMessage(request.build()); } } } diff --git a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/DeleteMessageUserCred.java b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/DeleteMessageUserCred.java index 43f7f713..491a3dd6 100644 --- a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/DeleteMessageUserCred.java +++ b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/DeleteMessageUserCred.java @@ -32,12 +32,10 @@ public static void main(String[] args) throws Exception { try (ChatServiceClient chatServiceClient = AuthenticationUtils.createClientWithUserCredentials( ImmutableList.of(SCOPE))) { - DeleteMessageRequest request = - DeleteMessageRequest.newBuilder() - // replace SPACE_NAME and MESSAGE_NAME here - .setName("spaces/SPACE_NAME/messages/MESSAGE_NAME") - .build(); - chatServiceClient.deleteMessage(request); + DeleteMessageRequest.Builder request = DeleteMessageRequest.newBuilder() + // replace SPACE_NAME and MESSAGE_NAME here + .setName("spaces/SPACE_NAME/messages/MESSAGE_NAME"); + chatServiceClient.deleteMessage(request.build()); } } } diff --git a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/GetMembershipAppCred.java b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/GetMembershipAppCred.java index fd5bb8ca..fcd7ae69 100644 --- a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/GetMembershipAppCred.java +++ b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/GetMembershipAppCred.java @@ -28,12 +28,10 @@ public class GetMembershipAppCred { public static void main(String[] args) throws Exception { try (ChatServiceClient chatServiceClient = AuthenticationUtils.createClientWithAppCredentials()) { - GetMembershipRequest request = - GetMembershipRequest.newBuilder() - // replace SPACE_NAME and MEMBERSHIP_NAME here - .setName("spaces/SPACE_NAME/members/MEMBERSHIP_NAME") - .build(); - Membership response = chatServiceClient.getMembership(request); + GetMembershipRequest.Builder request = GetMembershipRequest.newBuilder() + // replace SPACE_NAME and MEMBERSHIP_NAME here + .setName("spaces/SPACE_NAME/members/MEMBERSHIP_NAME"); + Membership response = chatServiceClient.getMembership(request.build()); System.out.println(JsonFormat.printer().print(response)); } diff --git a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/GetMembershipUserCred.java b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/GetMembershipUserCred.java index d4cb18d5..f54b8633 100644 --- a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/GetMembershipUserCred.java +++ b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/GetMembershipUserCred.java @@ -33,12 +33,10 @@ public static void main(String[] args) throws Exception { try (ChatServiceClient chatServiceClient = AuthenticationUtils.createClientWithUserCredentials( ImmutableList.of(SCOPE))) { - GetMembershipRequest request = - GetMembershipRequest.newBuilder() - // replace SPACE_NAME and MEMBERSHIP_NAME here - .setName("spaces/SPACE_NAME/members/MEMBERSHIP_NAME") - .build(); - Membership response = chatServiceClient.getMembership(request); + GetMembershipRequest.Builder request = GetMembershipRequest.newBuilder() + // replace SPACE_NAME and MEMBERSHIP_NAME here + .setName("spaces/SPACE_NAME/members/MEMBERSHIP_NAME"); + Membership response = chatServiceClient.getMembership(request.build()); System.out.println(JsonFormat.printer().print(response)); } diff --git a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/GetMessageAppCred.java b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/GetMessageAppCred.java index c505680e..b80a28e9 100644 --- a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/GetMessageAppCred.java +++ b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/GetMessageAppCred.java @@ -28,12 +28,10 @@ public class GetMessageAppCred { public static void main(String[] args) throws Exception { try (ChatServiceClient chatServiceClient = AuthenticationUtils.createClientWithAppCredentials()) { - GetMessageRequest request = - GetMessageRequest.newBuilder() - // replace SPACE_NAME and MESSAGE_NAME here - .setName("spaces/SPACE_NAME/members/MESSAGE_NAME") - .build(); - Message response = chatServiceClient.getMessage(request); + GetMessageRequest.Builder request = GetMessageRequest.newBuilder() + // replace SPACE_NAME and MESSAGE_NAME here + .setName("spaces/SPACE_NAME/members/MESSAGE_NAME"); + Message response = chatServiceClient.getMessage(request.build()); System.out.println(JsonFormat.printer().print(response)); } diff --git a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/GetMessageUserCred.java b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/GetMessageUserCred.java index e58872d6..7db70657 100644 --- a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/GetMessageUserCred.java +++ b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/GetMessageUserCred.java @@ -33,12 +33,10 @@ public static void main(String[] args) throws Exception { try (ChatServiceClient chatServiceClient = AuthenticationUtils.createClientWithUserCredentials( ImmutableList.of(SCOPE))) { - GetMessageRequest request = - GetMessageRequest.newBuilder() - // replace SPACE_NAME and MESSAGE_NAME here - .setName("spaces/SPACE_NAME/members/MESSAGE_NAME") - .build(); - Message response = chatServiceClient.getMessage(request); + GetMessageRequest.Builder request = GetMessageRequest.newBuilder() + // replace SPACE_NAME and MESSAGE_NAME here + .setName("spaces/SPACE_NAME/members/MESSAGE_NAME"); + Message response = chatServiceClient.getMessage(request.build()); System.out.println(JsonFormat.printer().print(response)); } diff --git a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/GetSpaceAppCred.java b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/GetSpaceAppCred.java index df5da3d4..a01027a1 100644 --- a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/GetSpaceAppCred.java +++ b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/GetSpaceAppCred.java @@ -28,12 +28,10 @@ public class GetSpaceAppCred { public static void main(String[] args) throws Exception { try (ChatServiceClient chatServiceClient = AuthenticationUtils.createClientWithAppCredentials()) { - GetSpaceRequest request = - GetSpaceRequest.newBuilder() + GetSpaceRequest.Builder request = GetSpaceRequest.newBuilder() // Replace SPACE_NAME here - .setName("spaces/SPACE_NAME") - .build(); - Space response = chatServiceClient.getSpace(request); + .setName("spaces/SPACE_NAME"); + Space response = chatServiceClient.getSpace(request.build()); System.out.println(JsonFormat.printer().print(response)); } diff --git a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/GetSpaceUserCred.java b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/GetSpaceUserCred.java index e9ed0a45..c84cce81 100644 --- a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/GetSpaceUserCred.java +++ b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/GetSpaceUserCred.java @@ -33,12 +33,10 @@ public static void main(String[] args) throws Exception { try (ChatServiceClient chatServiceClient = AuthenticationUtils.createClientWithUserCredentials( ImmutableList.of(SCOPE))) { - GetSpaceRequest request = - GetSpaceRequest.newBuilder() + GetSpaceRequest.Builder request = GetSpaceRequest.newBuilder() // Replace SPACE_NAME here - .setName("spaces/SPACE_NAME") - .build(); - Space response = chatServiceClient.getSpace(request); + .setName("spaces/SPACE_NAME"); + Space response = chatServiceClient.getSpace(request.build()); System.out.println(JsonFormat.printer().print(response)); } diff --git a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/ListMembershipsAppCred.java b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/ListMembershipsAppCred.java index cae23771..7618ce43 100644 --- a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/ListMembershipsAppCred.java +++ b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/ListMembershipsAppCred.java @@ -29,20 +29,18 @@ public class ListMembershipsAppCred { public static void main(String[] args) throws Exception { try (ChatServiceClient chatServiceClient = AuthenticationUtils.createClientWithAppCredentials()) { - ListMembershipsRequest request = - ListMembershipsRequest.newBuilder() - // Replace SPACE_NAME here. - .setParent("spaces/SPACE_NAME") - // Filter membership by type (HUMAN or BOT) or role - // (ROLE_MEMBER or ROLE_MANAGER). - .setFilter("member.type = \"HUMAN\"") - // Number of results that will be returned at once. - .setPageSize(10) - .build(); + ListMembershipsRequest.Builder request = ListMembershipsRequest.newBuilder() + // Replace SPACE_NAME here. + .setParent("spaces/SPACE_NAME") + // Filter membership by type (HUMAN or BOT) or role + // (ROLE_MEMBER or ROLE_MANAGER). + .setFilter("member.type = \"HUMAN\"") + // Number of results that will be returned at once. + .setPageSize(10); // Iterate over results and resolve additional pages automatically. for (Membership response : - chatServiceClient.listMemberships(request).iterateAll()) { + chatServiceClient.listMemberships(request.build()).iterateAll()) { System.out.println(JsonFormat.printer().print(response)); } } diff --git a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/ListMembershipsUserCred.java b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/ListMembershipsUserCred.java index d60e2725..08f772de 100644 --- a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/ListMembershipsUserCred.java +++ b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/ListMembershipsUserCred.java @@ -34,20 +34,18 @@ public static void main(String[] args) throws Exception { try (ChatServiceClient chatServiceClient = AuthenticationUtils.createClientWithUserCredentials( ImmutableList.of(SCOPE))) { - ListMembershipsRequest request = - ListMembershipsRequest.newBuilder() - // Replace SPACE_NAME here. - .setParent("spaces/SPACE_NAME") - // Filter membership by type (HUMAN or BOT) or role - // (ROLE_MEMBER or ROLE_MANAGER). - .setFilter("member.type = \"HUMAN\"") - // Number of results that will be returned at once. - .setPageSize(10) - .build(); + ListMembershipsRequest.Builder request = ListMembershipsRequest.newBuilder() + // Replace SPACE_NAME here. + .setParent("spaces/SPACE_NAME") + // Filter membership by type (HUMAN or BOT) or role + // (ROLE_MEMBER or ROLE_MANAGER). + .setFilter("member.type = \"HUMAN\"") + // Number of results that will be returned at once. + .setPageSize(10); // Iterating over results and resolve additional pages automatically. for (Membership response : - chatServiceClient.listMemberships(request).iterateAll()) { + chatServiceClient.listMemberships(request.build()).iterateAll()) { System.out.println(JsonFormat.printer().print(response)); } } diff --git a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/ListMessagesUserCred.java b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/ListMessagesUserCred.java index 1a984607..b99b0abf 100644 --- a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/ListMessagesUserCred.java +++ b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/ListMessagesUserCred.java @@ -34,17 +34,15 @@ public static void main(String[] args) throws Exception { try (ChatServiceClient chatServiceClient = AuthenticationUtils.createClientWithUserCredentials( ImmutableList.of(SCOPE))) { - ListMessagesRequest request = - ListMessagesRequest.newBuilder() - // Replace SPACE_NAME here. - .setParent("spaces/SPACE_NAME") - // Number of results that will be returned at once. - .setPageSize(10) - .build(); + ListMessagesRequest.Builder request = ListMessagesRequest.newBuilder() + // Replace SPACE_NAME here. + .setParent("spaces/SPACE_NAME") + // Number of results that will be returned at once. + .setPageSize(10); // Iterate over results and resolve additional pages automatically. for (Message response : - chatServiceClient.listMessages(request).iterateAll()) { + chatServiceClient.listMessages(request.build()).iterateAll()) { System.out.println(JsonFormat.printer().print(response)); } } diff --git a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/ListSpacesAppCred.java b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/ListSpacesAppCred.java index 00494729..cb35a5b0 100644 --- a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/ListSpacesAppCred.java +++ b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/ListSpacesAppCred.java @@ -29,18 +29,16 @@ public class ListSpacesAppCred { public static void main(String[] args) throws Exception { try (ChatServiceClient chatServiceClient = AuthenticationUtils.createClientWithAppCredentials()) { - ListSpacesRequest request = - ListSpacesRequest.newBuilder() - // Filter spaces by space type (SPACE or GROUP_CHAT or - // DIRECT_MESSAGE). - .setFilter("spaceType = \"SPACE\"") - // Number of results that will be returned at once. - .setPageSize(10) - .build(); + ListSpacesRequest.Builder request = ListSpacesRequest.newBuilder() + // Filter spaces by space type (SPACE or GROUP_CHAT or + // DIRECT_MESSAGE). + .setFilter("spaceType = \"SPACE\"") + // Number of results that will be returned at once. + .setPageSize(10); // Iterate over results and resolve additional pages automatically. for (Space response : - chatServiceClient.listSpaces(request).iterateAll()) { + chatServiceClient.listSpaces(request.build()).iterateAll()) { System.out.println(JsonFormat.printer().print(response)); } } diff --git a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/ListSpacesUserCred.java b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/ListSpacesUserCred.java index 2d9410aa..ea3af6f9 100644 --- a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/ListSpacesUserCred.java +++ b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/ListSpacesUserCred.java @@ -34,18 +34,16 @@ public static void main(String[] args) throws Exception { try (ChatServiceClient chatServiceClient = AuthenticationUtils.createClientWithUserCredentials( ImmutableList.of(SCOPE))) { - ListSpacesRequest request = - ListSpacesRequest.newBuilder() - // Filter spaces by space type (SPACE or GROUP_CHAT or - // DIRECT_MESSAGE). - .setFilter("spaceType = \"SPACE\"") - // Number of results that will be returned at once. - .setPageSize(10) - .build(); + ListSpacesRequest.Builder request = ListSpacesRequest.newBuilder() + // Filter spaces by space type (SPACE or GROUP_CHAT or + // DIRECT_MESSAGE). + .setFilter("spaceType = \"SPACE\"") + // Number of results that will be returned at once. + .setPageSize(10); // Iterate over results and resolve additional pages automatically. for (Space response : - chatServiceClient.listSpaces(request).iterateAll()) { + chatServiceClient.listSpaces(request.build()).iterateAll()) { System.out.println(JsonFormat.printer().print(response)); } } diff --git a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/UpdateMessageAppCred.java b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/UpdateMessageAppCred.java index 5f946545..fc62c5c0 100644 --- a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/UpdateMessageAppCred.java +++ b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/UpdateMessageAppCred.java @@ -29,20 +29,15 @@ public class UpdateMessageAppCred { public static void main(String[] args) throws Exception { try (ChatServiceClient chatServiceClient = AuthenticationUtils.createClientWithAppCredentials()) { - UpdateMessageRequest request = - UpdateMessageRequest.newBuilder() - .setMessage( - Message.newBuilder() - // replace SPACE_NAME and MESSAGE_NAME here - .setName("spaces/SPACE_NAME/messages/MESSAGE_NAME") - .setText("Updated with app credential!") - .build() - ) - .setUpdateMask( - // The field paths to update. - FieldMask.newBuilder().addPaths("text").build()) - .build(); - Message response = chatServiceClient.updateMessage(request); + UpdateMessageRequest.Builder request = UpdateMessageRequest.newBuilder() + .setMessage(Message.newBuilder() + // replace SPACE_NAME and MESSAGE_NAME here + .setName("spaces/SPACE_NAME/messages/MESSAGE_NAME") + .setText("Updated with app credential!")) + .setUpdateMask(FieldMask.newBuilder() + // The field paths to update. + .addPaths("text")); + Message response = chatServiceClient.updateMessage(request.build()); System.out.println(JsonFormat.printer().print(response)); } diff --git a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/UpdateMessageUserCred.java b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/UpdateMessageUserCred.java index 9f2dd016..5d0b4908 100644 --- a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/UpdateMessageUserCred.java +++ b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/UpdateMessageUserCred.java @@ -34,20 +34,15 @@ public static void main(String[] args) throws Exception { try (ChatServiceClient chatServiceClient = AuthenticationUtils.createClientWithUserCredentials( ImmutableList.of(SCOPE))) { - UpdateMessageRequest request = - UpdateMessageRequest.newBuilder() - .setMessage( - Message.newBuilder() - // replace SPACE_NAME and MESSAGE_NAME here - .setName("spaces/SPACE_NAME/messages/MESSAGE_NAME") - .setText("Updated with user credential!") - .build() - ) - .setUpdateMask( - // The field paths to update. - FieldMask.newBuilder().addPaths("text").build()) - .build(); - Message response = chatServiceClient.updateMessage(request); + UpdateMessageRequest.Builder request = UpdateMessageRequest.newBuilder() + .setMessage(Message.newBuilder() + // replace SPACE_NAME and MESSAGE_NAME here + .setName("spaces/SPACE_NAME/messages/MESSAGE_NAME") + .setText("Updated with user credential!")) + .setUpdateMask(FieldMask.newBuilder() + // The field paths to update. + .addPaths("text")); + Message response = chatServiceClient.updateMessage(request.build()); System.out.println(JsonFormat.printer().print(response)); } diff --git a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/UpdateSpaceUserCred.java b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/UpdateSpaceUserCred.java index cd5d67cd..8b009703 100644 --- a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/UpdateSpaceUserCred.java +++ b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/UpdateSpaceUserCred.java @@ -34,20 +34,15 @@ public static void main(String[] args) throws Exception { try (ChatServiceClient chatServiceClient = AuthenticationUtils.createClientWithUserCredentials( ImmutableList.of(SCOPE))) { - UpdateSpaceRequest request = - UpdateSpaceRequest.newBuilder() - .setSpace( - Space.newBuilder() - // Replace SPACE_NAME here. - .setName("spaces/SPACE_NAME") - .setDisplayName("New space display name") - .build() - ) - .setUpdateMask( - // The field paths to update. - FieldMask.newBuilder().addPaths("display_name").build()) - .build(); - Space response = chatServiceClient.updateSpace(request); + UpdateSpaceRequest.Builder request = UpdateSpaceRequest.newBuilder() + .setSpace(Space.newBuilder() + // Replace SPACE_NAME here. + .setName("spaces/SPACE_NAME") + .setDisplayName("New space display name")) + .setUpdateMask(FieldMask.newBuilder() + // The field paths to update. + .addPaths("display_name")); + Space response = chatServiceClient.updateSpace(request.build()); System.out.println(JsonFormat.printer().print(response)); } From 67f9f30c878b6fe16d9a3febf974e29afdcabb0a Mon Sep 17 00:00:00 2001 From: Pierrick Voulet <6769971+PierrickVoulet@users.noreply.github.com> Date: Thu, 22 Aug 2024 16:39:44 -0400 Subject: [PATCH 254/262] feat: fix class names and region tags for consistency (#1094) Co-authored-by: pierrick --- .../chat/samples/CreateMembershipUserCred.java | 4 ++-- .../samples/CreateMembershipUserCredForApp.java | 4 ++-- .../api/chat/samples/CreateMessageAppCred.java | 4 ++-- .../api/chat/samples/CreateMessageUserCred.java | 4 ++-- ...java => CreateMessageUserCredAtMention.java} | 17 +++++++++++------ ...java => CreateMessageUserCredMessageId.java} | 6 +++--- ...java => CreateMessageUserCredRequestId.java} | 6 +++--- ...java => CreateMessageUserCredThreadKey.java} | 6 +++--- ...ava => CreateMessageUserCredThreadName.java} | 6 +++--- .../api/chat/samples/DeleteMessageAppCred.java | 4 ++-- .../api/chat/samples/DeleteMessageUserCred.java | 4 ++-- .../api/chat/samples/GetMembershipAppCred.java | 4 ++-- .../api/chat/samples/GetMembershipUserCred.java | 4 ++-- .../api/chat/samples/GetMessageAppCred.java | 4 ++-- .../api/chat/samples/GetMessageUserCred.java | 4 ++-- .../api/chat/samples/GetSpaceAppCred.java | 4 ++-- .../api/chat/samples/GetSpaceUserCred.java | 4 ++-- .../chat/samples/ListMembershipsAppCred.java | 4 ++-- .../chat/samples/ListMembershipsUserCred.java | 4 ++-- .../api/chat/samples/ListMessagesUserCred.java | 4 ++-- .../api/chat/samples/ListSpacesAppCred.java | 4 ++-- .../api/chat/samples/ListSpacesUserCred.java | 4 ++-- .../api/chat/samples/UpdateMessageAppCred.java | 4 ++-- .../api/chat/samples/UpdateMessageUserCred.java | 4 ++-- .../api/chat/samples/UpdateSpaceUserCred.java | 4 ++-- 25 files changed, 63 insertions(+), 58 deletions(-) rename chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/{CreateMessageAppCredAtMention.java => CreateMessageUserCredAtMention.java} (75%) rename chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/{CreateMessageUserCredWithMessageId.java => CreateMessageUserCredMessageId.java} (92%) rename chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/{CreateMessageUserCredWithRequestId.java => CreateMessageUserCredRequestId.java} (92%) rename chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/{CreateMessageUserCredWithThreadKey.java => CreateMessageUserCredThreadKey.java} (93%) rename chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/{CreateMessageUserCredWithThreadName.java => CreateMessageUserCredThreadName.java} (93%) diff --git a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMembershipUserCred.java b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMembershipUserCred.java index c04b15fc..c10605bd 100644 --- a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMembershipUserCred.java +++ b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMembershipUserCred.java @@ -18,7 +18,7 @@ import com.google.common.collect.ImmutableList; import com.google.protobuf.util.JsonFormat; -// [START chat_CreateMembershipUserCred] +// [START chat_create_membership_user_cred] import com.google.chat.v1.ChatServiceClient; import com.google.chat.v1.CreateMembershipRequest; import com.google.chat.v1.Membership; @@ -51,4 +51,4 @@ public static void main(String[] args) throws Exception { } } } -// [END chat_CreateMembershipUserCred] +// [END chat_create_membership_user_cred] diff --git a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMembershipUserCredForApp.java b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMembershipUserCredForApp.java index 3edb889d..1572da40 100644 --- a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMembershipUserCredForApp.java +++ b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMembershipUserCredForApp.java @@ -18,7 +18,7 @@ import com.google.common.collect.ImmutableList; import com.google.protobuf.util.JsonFormat; -// [START chat_CreateMembershipUserCredForApp] +// [START chat_create_membership_user_cred_for_app] import com.google.chat.v1.ChatServiceClient; import com.google.chat.v1.CreateMembershipRequest; import com.google.chat.v1.Membership; @@ -51,4 +51,4 @@ public static void main(String[] args) throws Exception { } } } -// [END chat_CreateMembershipUserCredForApp] +// [END chat_create_membership_user_cred_for_app] diff --git a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMessageAppCred.java b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMessageAppCred.java index c17303f2..b32bd8dd 100644 --- a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMessageAppCred.java +++ b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMessageAppCred.java @@ -17,7 +17,7 @@ package com.google.workspace.api.chat.samples; import com.google.protobuf.util.JsonFormat; -// [START chat_CreateMessageAppCred] +// [START chat_create_message_app_cred] import com.google.apps.card.v1.Button; import com.google.apps.card.v1.ButtonList; import com.google.apps.card.v1.Card; @@ -87,4 +87,4 @@ public static void main(String[] args) throws Exception { } } } -// [END chat_CreateMessageAppCred] +// [END chat_create_message_app_cred] diff --git a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMessageUserCred.java b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMessageUserCred.java index fa53ed57..cef822a1 100644 --- a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMessageUserCred.java +++ b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMessageUserCred.java @@ -18,7 +18,7 @@ import com.google.common.collect.ImmutableList; import com.google.protobuf.util.JsonFormat; -// [START chat_CreateMessageUserCred] +// [START chat_create_message_user_cred] import com.google.chat.v1.ChatServiceClient; import com.google.chat.v1.CreateMessageRequest; import com.google.chat.v1.Message; @@ -51,4 +51,4 @@ public static void main(String[] args) throws Exception { } } } -// [END chat_CreateMessageUserCred] +// [END chat_create_message_user_cred] diff --git a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMessageAppCredAtMention.java b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMessageUserCredAtMention.java similarity index 75% rename from chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMessageAppCredAtMention.java rename to chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMessageUserCredAtMention.java index 5830de3c..a52874bd 100644 --- a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMessageAppCredAtMention.java +++ b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMessageUserCredAtMention.java @@ -16,19 +16,24 @@ package com.google.workspace.api.chat.samples; +import com.google.common.collect.ImmutableList; import com.google.protobuf.util.JsonFormat; -// [START chat_CreateMessageAppCredAtMention] +// [START chat_create_message_user_cred_at_mention] import com.google.chat.v1.ChatServiceClient; import com.google.chat.v1.CreateMessageRequest; import com.google.chat.v1.Message; -// This sample shows how to create message that mentions a user with app -// credential. -public class CreateMessageAppCredAtMention { +// This sample shows how to create message with user credential with a user +// mention. +public class CreateMessageUserCredAtMention { + + private static final String SCOPE = + "https://www.googleapis.com/auth/chat.messages.create"; public static void main(String[] args) throws Exception { try (ChatServiceClient chatServiceClient = - AuthenticationUtils.createClientWithAppCredentials()) { + AuthenticationUtils.createClientWithUserCredentials( + ImmutableList.of(SCOPE))) { CreateMessageRequest.Builder request = CreateMessageRequest.newBuilder() // Replace SPACE_NAME here. .setParent("spaces/SPACE_NAME") @@ -43,4 +48,4 @@ public static void main(String[] args) throws Exception { } } } -// [END chat_CreateMessageAppCredAtMention] +// [END chat_create_message_user_cred_at_mention] diff --git a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMessageUserCredWithMessageId.java b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMessageUserCredMessageId.java similarity index 92% rename from chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMessageUserCredWithMessageId.java rename to chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMessageUserCredMessageId.java index d76475c7..0312ce07 100644 --- a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMessageUserCredWithMessageId.java +++ b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMessageUserCredMessageId.java @@ -18,14 +18,14 @@ import com.google.common.collect.ImmutableList; import com.google.protobuf.util.JsonFormat; -// [START chat_CreateMessageUserCredWithMessageId] +// [START chat_create_message_user_cred_message_id] import com.google.chat.v1.ChatServiceClient; import com.google.chat.v1.CreateMessageRequest; import com.google.chat.v1.Message; // This sample shows how to create message with message id specified with user // credential. -public class CreateMessageUserCredWithMessageId { +public class CreateMessageUserCredMessageId { private static final String SCOPE = "https://www.googleapis.com/auth/chat.messages.create"; @@ -49,4 +49,4 @@ public static void main(String[] args) throws Exception { } } } -// [END chat_CreateMessageUserCredWithMessageId] +// [END chat_create_message_user_cred_message_id] diff --git a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMessageUserCredWithRequestId.java b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMessageUserCredRequestId.java similarity index 92% rename from chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMessageUserCredWithRequestId.java rename to chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMessageUserCredRequestId.java index 1d05d950..c9acce76 100644 --- a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMessageUserCredWithRequestId.java +++ b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMessageUserCredRequestId.java @@ -18,14 +18,14 @@ import com.google.common.collect.ImmutableList; import com.google.protobuf.util.JsonFormat; -// [START chat_CreateMessageUserCredWithRequestId] +// [START chat_create_message_user_cred_request_id] import com.google.chat.v1.ChatServiceClient; import com.google.chat.v1.CreateMessageRequest; import com.google.chat.v1.Message; // This sample shows how to create message with request id specified with user // credential. -public class CreateMessageUserCredWithRequestId { +public class CreateMessageUserCredRequestId { private static final String SCOPE = "https://www.googleapis.com/auth/chat.messages.create"; @@ -48,4 +48,4 @@ public static void main(String[] args) throws Exception { } } } -// [END chat_CreateMessageUserCredWithRequestId] +// [END chat_create_message_user_cred_request_id] diff --git a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMessageUserCredWithThreadKey.java b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMessageUserCredThreadKey.java similarity index 93% rename from chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMessageUserCredWithThreadKey.java rename to chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMessageUserCredThreadKey.java index 897df800..8fa51135 100644 --- a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMessageUserCredWithThreadKey.java +++ b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMessageUserCredThreadKey.java @@ -18,7 +18,7 @@ import com.google.common.collect.ImmutableList; import com.google.protobuf.util.JsonFormat; -// [START chat_CreateMessageUserCredWithThreadKey] +// [START chat_create_message_user_cred_thread_key] import com.google.chat.v1.ChatServiceClient; import com.google.chat.v1.CreateMessageRequest; import com.google.chat.v1.CreateMessageRequest.MessageReplyOption; @@ -27,7 +27,7 @@ // This sample shows how to create message with a thread key with user // credential. -public class CreateMessageUserCredWithThreadKey { +public class CreateMessageUserCredThreadKey { private static final String SCOPE = "https://www.googleapis.com/auth/chat.messages.create"; @@ -54,4 +54,4 @@ public static void main(String[] args) throws Exception { } } } -// [END chat_CreateMessageUserCredWithThreadKey] +// [END chat_create_message_user_cred_thread_key] diff --git a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMessageUserCredWithThreadName.java b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMessageUserCredThreadName.java similarity index 93% rename from chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMessageUserCredWithThreadName.java rename to chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMessageUserCredThreadName.java index 69bfba1e..e27387fb 100644 --- a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMessageUserCredWithThreadName.java +++ b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMessageUserCredThreadName.java @@ -18,7 +18,7 @@ import com.google.common.collect.ImmutableList; import com.google.protobuf.util.JsonFormat; -// [START chat_CreateMessageUserCredWithThreadName] +// [START chat_create_message_user_cred_thread_name] import com.google.chat.v1.ChatServiceClient; import com.google.chat.v1.CreateMessageRequest; import com.google.chat.v1.CreateMessageRequest.MessageReplyOption; @@ -27,7 +27,7 @@ // This sample shows how to create message with thread name specified with user // credential. -public class CreateMessageUserCredWithThreadName { +public class CreateMessageUserCredThreadName { private static final String SCOPE = "https://www.googleapis.com/auth/chat.messages.create"; @@ -55,4 +55,4 @@ public static void main(String[] args) throws Exception { } } } -// [END chat_CreateMessageUserCredWithThreadName] +// [END chat_create_message_user_cred_thread_name] diff --git a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/DeleteMessageAppCred.java b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/DeleteMessageAppCred.java index abda2ae1..f0fea33b 100644 --- a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/DeleteMessageAppCred.java +++ b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/DeleteMessageAppCred.java @@ -16,7 +16,7 @@ package com.google.workspace.api.chat.samples; -// [START chat_DeleteMessageAppCred] +// [START chat_delete_message_app_cred] import com.google.chat.v1.ChatServiceClient; import com.google.chat.v1.DeleteMessageRequest; @@ -33,4 +33,4 @@ public static void main(String[] args) throws Exception { } } } -// [END chat_DeleteMessageAppCred] +// [END chat_delete_message_app_cred] diff --git a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/DeleteMessageUserCred.java b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/DeleteMessageUserCred.java index 491a3dd6..34d5adc2 100644 --- a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/DeleteMessageUserCred.java +++ b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/DeleteMessageUserCred.java @@ -17,7 +17,7 @@ package com.google.workspace.api.chat.samples; import com.google.common.collect.ImmutableList; -// [START chat_DeleteMessageUserCred] +// [START chat_delete_message_user_cred] import com.google.chat.v1.ChatServiceClient; import com.google.chat.v1.DeleteMessageRequest; import com.google.chat.v1.SpaceName; @@ -39,4 +39,4 @@ public static void main(String[] args) throws Exception { } } } -// [END chat_DeleteMessageUserCred] +// [END chat_delete_message_user_cred] diff --git a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/GetMembershipAppCred.java b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/GetMembershipAppCred.java index fcd7ae69..52c2e86f 100644 --- a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/GetMembershipAppCred.java +++ b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/GetMembershipAppCred.java @@ -17,7 +17,7 @@ package com.google.workspace.api.chat.samples; import com.google.protobuf.util.JsonFormat; -// [START chat_GetMembershipAppCred] +// [START chat_get_membership_app_cred] import com.google.chat.v1.ChatServiceClient; import com.google.chat.v1.GetMembershipRequest; import com.google.chat.v1.Membership; @@ -37,4 +37,4 @@ public static void main(String[] args) throws Exception { } } } -// [END chat_GetMembershipAppCred] +// [END chat_get_membership_app_cred] diff --git a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/GetMembershipUserCred.java b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/GetMembershipUserCred.java index f54b8633..55637384 100644 --- a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/GetMembershipUserCred.java +++ b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/GetMembershipUserCred.java @@ -18,7 +18,7 @@ import com.google.common.collect.ImmutableList; import com.google.protobuf.util.JsonFormat; -// [START chat_GetMembershipUserCred] +// [START chat_get_membership_user_cred] import com.google.chat.v1.ChatServiceClient; import com.google.chat.v1.GetMembershipRequest; import com.google.chat.v1.Membership; @@ -42,4 +42,4 @@ public static void main(String[] args) throws Exception { } } } -// [END chat_GetMembershipUserCred] +// [END chat_get_membership_user_cred] diff --git a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/GetMessageAppCred.java b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/GetMessageAppCred.java index b80a28e9..f79e8a79 100644 --- a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/GetMessageAppCred.java +++ b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/GetMessageAppCred.java @@ -17,7 +17,7 @@ package com.google.workspace.api.chat.samples; import com.google.protobuf.util.JsonFormat; -// [START chat_GetMessageAppCred] +// [START chat_get_message_app_cred] import com.google.chat.v1.ChatServiceClient; import com.google.chat.v1.GetMessageRequest; import com.google.chat.v1.Message; @@ -37,4 +37,4 @@ public static void main(String[] args) throws Exception { } } } -// [END chat_GetMessageAppCred] +// [END chat_get_message_app_cred] diff --git a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/GetMessageUserCred.java b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/GetMessageUserCred.java index 7db70657..f8a99a70 100644 --- a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/GetMessageUserCred.java +++ b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/GetMessageUserCred.java @@ -18,7 +18,7 @@ import com.google.common.collect.ImmutableList; import com.google.protobuf.util.JsonFormat; -// [START chat_GetMessageUserCred] +// [START chat_get_message_user_cred] import com.google.chat.v1.ChatServiceClient; import com.google.chat.v1.GetMessageRequest; import com.google.chat.v1.Message; @@ -42,4 +42,4 @@ public static void main(String[] args) throws Exception { } } } -// [END chat_GetMessageUserCred] +// [END chat_get_message_user_cred] diff --git a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/GetSpaceAppCred.java b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/GetSpaceAppCred.java index a01027a1..4b76c13d 100644 --- a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/GetSpaceAppCred.java +++ b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/GetSpaceAppCred.java @@ -17,7 +17,7 @@ package com.google.workspace.api.chat.samples; import com.google.protobuf.util.JsonFormat; -// [START chat_GetSpaceAppCred] +// [START chat_get_space_app_cred] import com.google.chat.v1.ChatServiceClient; import com.google.chat.v1.GetSpaceRequest; import com.google.chat.v1.Space; @@ -37,4 +37,4 @@ public static void main(String[] args) throws Exception { } } } -// [END chat_GetSpaceAppCred] +// [END chat_get_space_app_cred] diff --git a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/GetSpaceUserCred.java b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/GetSpaceUserCred.java index c84cce81..ab85d9ce 100644 --- a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/GetSpaceUserCred.java +++ b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/GetSpaceUserCred.java @@ -18,7 +18,7 @@ import com.google.common.collect.ImmutableList; import com.google.protobuf.util.JsonFormat; -// [START chat_GetSpaceUserCred] +// [START chat_get_space_user_cred] import com.google.chat.v1.ChatServiceClient; import com.google.chat.v1.GetSpaceRequest; import com.google.chat.v1.Space; @@ -42,4 +42,4 @@ public static void main(String[] args) throws Exception { } } } -// [END chat_GetSpaceUserCred] +// [END chat_get_space_user_cred] diff --git a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/ListMembershipsAppCred.java b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/ListMembershipsAppCred.java index 7618ce43..8a4a56f0 100644 --- a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/ListMembershipsAppCred.java +++ b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/ListMembershipsAppCred.java @@ -17,7 +17,7 @@ package com.google.workspace.api.chat.samples; import com.google.protobuf.util.JsonFormat; -// [START chat_ListMembershipsAppCred] +// [START chat_list_memberships_app_cred] import com.google.chat.v1.ChatServiceClient; import com.google.chat.v1.ListMembershipsRequest; import com.google.chat.v1.ListMembershipsResponse; @@ -46,4 +46,4 @@ public static void main(String[] args) throws Exception { } } } -// [END chat_ListMembershipsAppCred] +// [END chat_list_memberships_app_cred] diff --git a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/ListMembershipsUserCred.java b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/ListMembershipsUserCred.java index 08f772de..8ddeb7dd 100644 --- a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/ListMembershipsUserCred.java +++ b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/ListMembershipsUserCred.java @@ -18,7 +18,7 @@ import com.google.common.collect.ImmutableList; import com.google.protobuf.util.JsonFormat; -// [START chat_ListMembershipsUserCred] +// [START chat_list_memberships_user_cred] import com.google.chat.v1.ChatServiceClient; import com.google.chat.v1.ListMembershipsRequest; import com.google.chat.v1.ListMembershipsResponse; @@ -51,4 +51,4 @@ public static void main(String[] args) throws Exception { } } } -// [END chat_ListMembershipsUserCred] +// [END chat_list_memberships_user_cred] diff --git a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/ListMessagesUserCred.java b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/ListMessagesUserCred.java index b99b0abf..d9081b24 100644 --- a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/ListMessagesUserCred.java +++ b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/ListMessagesUserCred.java @@ -18,7 +18,7 @@ import com.google.common.collect.ImmutableList; import com.google.protobuf.util.JsonFormat; -// [START chat_ListMessagesUserCred] +// [START chat_list_messages_user_cred] import com.google.chat.v1.ChatServiceClient; import com.google.chat.v1.ListMessagesRequest; import com.google.chat.v1.ListMessagesResponse; @@ -48,4 +48,4 @@ public static void main(String[] args) throws Exception { } } } -// [END chat_ListMessagesUserCred] +// [END chat_list_messages_user_cred] diff --git a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/ListSpacesAppCred.java b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/ListSpacesAppCred.java index cb35a5b0..8fd15cc3 100644 --- a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/ListSpacesAppCred.java +++ b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/ListSpacesAppCred.java @@ -17,7 +17,7 @@ package com.google.workspace.api.chat.samples; import com.google.protobuf.util.JsonFormat; -// [START chat_ListSpacesAppCred] +// [START chat_list_spaces_app_cred] import com.google.chat.v1.ChatServiceClient; import com.google.chat.v1.ListSpacesRequest; import com.google.chat.v1.ListSpacesResponse; @@ -44,4 +44,4 @@ public static void main(String[] args) throws Exception { } } } -// [END chat_ListSpacesAppCred] +// [END chat_list_spaces_app_cred] diff --git a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/ListSpacesUserCred.java b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/ListSpacesUserCred.java index ea3af6f9..bffdf6cb 100644 --- a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/ListSpacesUserCred.java +++ b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/ListSpacesUserCred.java @@ -18,7 +18,7 @@ import com.google.common.collect.ImmutableList; import com.google.protobuf.util.JsonFormat; -// [START chat_ListSpacesUserCred] +// [START chat_list_spaces_user_cred] import com.google.chat.v1.ChatServiceClient; import com.google.chat.v1.ListSpacesRequest; import com.google.chat.v1.ListSpacesResponse; @@ -49,4 +49,4 @@ public static void main(String[] args) throws Exception { } } } -// [END chat_ListSpacesUserCred] +// [END chat_list_spaces_user_cred] diff --git a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/UpdateMessageAppCred.java b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/UpdateMessageAppCred.java index fc62c5c0..8eaf3dd7 100644 --- a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/UpdateMessageAppCred.java +++ b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/UpdateMessageAppCred.java @@ -17,7 +17,7 @@ package com.google.workspace.api.chat.samples; import com.google.protobuf.util.JsonFormat; -// [START chat_UpdateMessageAppCred] +// [START chat_update_message_app_cred] import com.google.chat.v1.ChatServiceClient; import com.google.chat.v1.UpdateMessageRequest; import com.google.chat.v1.Message; @@ -43,4 +43,4 @@ public static void main(String[] args) throws Exception { } } } -// [END chat_UpdateMessageAppCred] +// [END chat_update_message_app_cred] diff --git a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/UpdateMessageUserCred.java b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/UpdateMessageUserCred.java index 5d0b4908..abda65c7 100644 --- a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/UpdateMessageUserCred.java +++ b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/UpdateMessageUserCred.java @@ -18,7 +18,7 @@ import com.google.common.collect.ImmutableList; import com.google.protobuf.util.JsonFormat; -// [START chat_UpdateMessageUserCred] +// [START chat_update_message_user_cred] import com.google.chat.v1.ChatServiceClient; import com.google.chat.v1.UpdateMessageRequest; import com.google.chat.v1.Message; @@ -48,4 +48,4 @@ public static void main(String[] args) throws Exception { } } } -// [END chat_UpdateMessageUserCred] +// [END chat_update_message_user_cred] diff --git a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/UpdateSpaceUserCred.java b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/UpdateSpaceUserCred.java index 8b009703..73b5cec3 100644 --- a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/UpdateSpaceUserCred.java +++ b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/UpdateSpaceUserCred.java @@ -18,7 +18,7 @@ import com.google.common.collect.ImmutableList; import com.google.protobuf.util.JsonFormat; -// [START chat_UpdateSpaceUserCred] +// [START chat_update_space_user_cred] import com.google.chat.v1.ChatServiceClient; import com.google.chat.v1.UpdateSpaceRequest; import com.google.chat.v1.Space; @@ -48,4 +48,4 @@ public static void main(String[] args) throws Exception { } } } -// [END chat_UpdateSpaceUserCred] +// [END chat_update_space_user_cred] From b2f6faef4fb7b1cf2d9b35dfb5206736e1e0bb11 Mon Sep 17 00:00:00 2001 From: Pierrick Voulet <6769971+PierrickVoulet@users.noreply.github.com> Date: Wed, 2 Oct 2024 20:52:19 -0400 Subject: [PATCH 255/262] feat: add create membership for group code sample (#1164) Co-authored-by: pierrick --- .../CreateMembershipUserCredForGroup.java | 51 +++++++++++++++++++ 1 file changed, 51 insertions(+) create mode 100644 chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMembershipUserCredForGroup.java diff --git a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMembershipUserCredForGroup.java b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMembershipUserCredForGroup.java new file mode 100644 index 00000000..43e20ac0 --- /dev/null +++ b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateMembershipUserCredForGroup.java @@ -0,0 +1,51 @@ +/* + * Copyright 2024 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.workspace.api.chat.samples; + +import com.google.common.collect.ImmutableList; +import com.google.protobuf.util.JsonFormat; +// [START chat_create_membership_user_cred_for_group] +import com.google.chat.v1.ChatServiceClient; +import com.google.chat.v1.CreateMembershipRequest; +import com.google.chat.v1.Membership; +import com.google.chat.v1.SpaceName; +import com.google.chat.v1.Group; + +// This sample shows how to create membership with user credential for a group. +public class CreateMembershipUserCredForGroup { + + private static final String SCOPE = + "https://www.googleapis.com/auth/chat.memberships"; + + public static void main(String[] args) throws Exception { + try (ChatServiceClient chatServiceClient = + AuthenticationUtils.createClientWithUserCredentials( + ImmutableList.of(SCOPE))) { + CreateMembershipRequest.Builder request = CreateMembershipRequest.newBuilder() + // replace SPACE_NAME here + .setParent("spaces/SPACE_NAME") + .setMembership(Membership.newBuilder() + .setGroupMember(Group.newBuilder() + // replace GROUP_NAME here + .setName("groups/GROUP_NAME"))); + Membership response = chatServiceClient.createMembership(request.build()); + + System.out.println(JsonFormat.printer().print(response)); + } + } +} +// [END chat_create_membership_user_cred_for_group] From cfb3a31befe7e5c90bbcd3dd5ef4cb7d9548378d Mon Sep 17 00:00:00 2001 From: Pierrick Voulet <6769971+PierrickVoulet@users.noreply.github.com> Date: Thu, 3 Oct 2024 10:11:01 -0400 Subject: [PATCH 256/262] feat: add create and set up space code samples (#1165) * feat: add create and set up space code samples * Change for immutable list --------- Co-authored-by: pierrick --- .../api/chat/samples/CreateSpaceUserCred.java | 47 ++++++++++++++++ .../api/chat/samples/SetUpSpaceUserCred.java | 56 +++++++++++++++++++ 2 files changed, 103 insertions(+) create mode 100644 chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateSpaceUserCred.java create mode 100644 chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/SetUpSpaceUserCred.java diff --git a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateSpaceUserCred.java b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateSpaceUserCred.java new file mode 100644 index 00000000..713f64a9 --- /dev/null +++ b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/CreateSpaceUserCred.java @@ -0,0 +1,47 @@ +/* + * Copyright 2024 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.workspace.api.chat.samples; + +import com.google.common.collect.ImmutableList; +import com.google.protobuf.util.JsonFormat; +// [START chat_create_space_user_cred] +import com.google.chat.v1.ChatServiceClient; +import com.google.chat.v1.CreateSpaceRequest; +import com.google.chat.v1.Space; + +// This sample shows how to create space with user credential. +public class CreateSpaceUserCred { + + private static final String SCOPE = + "https://www.googleapis.com/auth/chat.spaces.create"; + + public static void main(String[] args) throws Exception { + try (ChatServiceClient chatServiceClient = + AuthenticationUtils.createClientWithUserCredentials( + ImmutableList.of(SCOPE))) { + CreateSpaceRequest.Builder request = CreateSpaceRequest.newBuilder() + .setSpace(Space.newBuilder() + .setSpaceType(Space.SpaceType.SPACE) + // Replace DISPLAY_NAME here. + .setDisplayName("DISPLAY_NAME")); + Space response = chatServiceClient.createSpace(request.build()); + + System.out.println(JsonFormat.printer().print(response)); + } + } +} +// [END chat_create_space_user_cred] diff --git a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/SetUpSpaceUserCred.java b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/SetUpSpaceUserCred.java new file mode 100644 index 00000000..d39b6192 --- /dev/null +++ b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/SetUpSpaceUserCred.java @@ -0,0 +1,56 @@ +/* + * Copyright 2024 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.workspace.api.chat.samples; + +import com.google.common.collect.ImmutableList; +import com.google.protobuf.util.JsonFormat; + +// [START chat_set_up_space_user_cred] +import com.google.chat.v1.ChatServiceClient; +import com.google.chat.v1.Membership; +import com.google.chat.v1.SetUpSpaceRequest; +import com.google.chat.v1.Space; +import com.google.chat.v1.User; + +// This sample shows how to set up a named space with one initial member with +// user credential. +public class SetUpSpaceUserCred { + + private static final String SCOPE = + "https://www.googleapis.com/auth/chat.spaces.create"; + + public static void main(String[] args) throws Exception { + try (ChatServiceClient chatServiceClient = + AuthenticationUtils.createClientWithUserCredentials( + ImmutableList.of(SCOPE))) { + SetUpSpaceRequest.Builder request = SetUpSpaceRequest.newBuilder() + .setSpace(Space.newBuilder() + .setSpaceType(Space.SpaceType.SPACE) + // Replace DISPLAY_NAME here. + .setDisplayName("DISPLAY_NAME")) + .addAllMemberships(ImmutableList.of(Membership.newBuilder() + .setMember(User.newBuilder() + // Replace USER_NAME here. + .setName("users/USER_NAME") + .setType(User.Type.HUMAN)).build())); + Space response = chatServiceClient.setUpSpace(request.build()); + + System.out.println(JsonFormat.printer().print(response)); + } + } +} +// [END chat_set_up_space_user_cred] From 26cb124371d51cb5cb8e6c4a3db6422bbef586fb Mon Sep 17 00:00:00 2001 From: Pierrick Voulet <6769971+PierrickVoulet@users.noreply.github.com> Date: Thu, 3 Oct 2024 13:49:43 -0400 Subject: [PATCH 257/262] feat: update message with app creds (#1166) Co-authored-by: pierrick --- .../api/chat/samples/UpdateMessageAppCred.java | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/UpdateMessageAppCred.java b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/UpdateMessageAppCred.java index 8eaf3dd7..559ad13f 100644 --- a/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/UpdateMessageAppCred.java +++ b/chat/client-libraries/cloud/src/main/java/com/google/workspace/api/chat/samples/UpdateMessageAppCred.java @@ -17,7 +17,13 @@ package com.google.workspace.api.chat.samples; import com.google.protobuf.util.JsonFormat; + +import java.util.List; + // [START chat_update_message_app_cred] +import com.google.apps.card.v1.Card; +import com.google.apps.card.v1.Card.CardHeader; +import com.google.chat.v1.CardWithId; import com.google.chat.v1.ChatServiceClient; import com.google.chat.v1.UpdateMessageRequest; import com.google.chat.v1.Message; @@ -33,10 +39,14 @@ public static void main(String[] args) throws Exception { .setMessage(Message.newBuilder() // replace SPACE_NAME and MESSAGE_NAME here .setName("spaces/SPACE_NAME/messages/MESSAGE_NAME") - .setText("Updated with app credential!")) + .setText("Text updated with app credential!") + .addCardsV2(CardWithId.newBuilder().setCard(Card.newBuilder() + .setHeader(CardHeader.newBuilder() + .setTitle("Card updated with app credential!") + .setImageUrl("https://fonts.gstatic.com/s/i/short-term/release/googlesymbols/info/default/24px.svg"))))) .setUpdateMask(FieldMask.newBuilder() // The field paths to update. - .addPaths("text")); + .addAllPaths(List.of("text", "cards_v2"))); Message response = chatServiceClient.updateMessage(request.build()); System.out.println(JsonFormat.printer().print(response)); From b30298095f654ff9952a691333f0aa5862ab935c Mon Sep 17 00:00:00 2001 From: sce-taid Date: Thu, 11 Sep 2025 01:06:16 +0200 Subject: [PATCH 258/262] fix: updating FileList query field name (#1473) renaming `items` (v2) to `files` (v3) --- drive/snippets/drive_v3/src/main/java/SearchFile.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drive/snippets/drive_v3/src/main/java/SearchFile.java b/drive/snippets/drive_v3/src/main/java/SearchFile.java index 08f574b1..2e5e7f01 100644 --- a/drive/snippets/drive_v3/src/main/java/SearchFile.java +++ b/drive/snippets/drive_v3/src/main/java/SearchFile.java @@ -60,7 +60,7 @@ public static List searchFile() throws IOException { FileList result = service.files().list() .setQ("mimeType='image/jpeg'") .setSpaces("drive") - .setFields("nextPageToken, items(id, title)") + .setFields("nextPageToken, files(id, title)") .setPageToken(pageToken) .execute(); for (File file : result.getFiles()) { From d219a446eaace9ce6d53fd58ca764d1b63bf2a16 Mon Sep 17 00:00:00 2001 From: googleworkspace-bot <109114539+googleworkspace-bot@users.noreply.github.com> Date: Tue, 18 Nov 2025 15:43:28 -0700 Subject: [PATCH 259/262] chore: Created local '.gemini/' from remote 'sync-files/defaults/.gemini/' (#1692) --- .gemini/GEMINI.md | 12 ++++++++++++ .gemini/config.yaml | 12 ++++++++++++ .gemini/settings.json | 8 ++++++++ 3 files changed, 32 insertions(+) create mode 100644 .gemini/GEMINI.md create mode 100644 .gemini/config.yaml create mode 100644 .gemini/settings.json diff --git a/.gemini/GEMINI.md b/.gemini/GEMINI.md new file mode 100644 index 00000000..0f175c59 --- /dev/null +++ b/.gemini/GEMINI.md @@ -0,0 +1,12 @@ +# Overview + +This codebase is part of the Google Workspace GitHub organization, https://github.com/googleworkspace. + +## Style Guide + +Use open source best practices for code style and formatting with a preference for Google's style guides. + +## Tools + +- Verify against Google Workspace documentation with the `workspace-developer` MCP server tools. +- Use `gh` for GitHub interactions. diff --git a/.gemini/config.yaml b/.gemini/config.yaml new file mode 100644 index 00000000..a4814a5f --- /dev/null +++ b/.gemini/config.yaml @@ -0,0 +1,12 @@ +# Config for the Gemini Pull Request Review Bot. +# https://github.com/marketplace/gemini-code-assist +have_fun: false +code_review: + disable: false + comment_severity_threshold: "HIGH" + max_review_comments: -1 + pull_request_opened: + help: false + summary: true + code_review: true +ignore_patterns: [] diff --git a/.gemini/settings.json b/.gemini/settings.json new file mode 100644 index 00000000..ec3565d5 --- /dev/null +++ b/.gemini/settings.json @@ -0,0 +1,8 @@ +{ + "mcpServers": { + "workspace-developer": { + "httpUrl": "https://workspace-developer.goog/mcp", + "trust": true + } + } +} \ No newline at end of file From 43971ae6e90c0ac95dea1842d432eccc916a5a48 Mon Sep 17 00:00:00 2001 From: googleworkspace-bot <109114539+googleworkspace-bot@users.noreply.github.com> Date: Tue, 18 Nov 2025 15:47:46 -0700 Subject: [PATCH 260/262] chore: Synced file(s) with googleworkspace/.github --- .vscode/extensions.json | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .vscode/extensions.json diff --git a/.vscode/extensions.json b/.vscode/extensions.json new file mode 100644 index 00000000..4a9deaa4 --- /dev/null +++ b/.vscode/extensions.json @@ -0,0 +1,5 @@ +{ + "recommendations": [ + "google-workspace.google-workspace-developer-tools" + ] +} \ No newline at end of file From e8ba9fd71688ee75119f4e13c175239ca88291ff Mon Sep 17 00:00:00 2001 From: Pierrick Voulet <6769971+PierrickVoulet@users.noreply.github.com> Date: Mon, 8 Dec 2025 23:43:33 -0500 Subject: [PATCH 261/262] feat: add webhook chat app (#1715) Co-authored-by: pierrick --- solutions/webhook-chat-app/README.md | 4 ++ solutions/webhook-chat-app/pom.xml | 52 +++++++++++++++++++ .../java/com/google/chat/webhook/App.java | 45 ++++++++++++++++ .../com/google/chat/webhook/AppThread.java | 48 +++++++++++++++++ 4 files changed, 149 insertions(+) create mode 100644 solutions/webhook-chat-app/README.md create mode 100644 solutions/webhook-chat-app/pom.xml create mode 100644 solutions/webhook-chat-app/src/main/java/com/google/chat/webhook/App.java create mode 100644 solutions/webhook-chat-app/src/main/java/com/google/chat/webhook/AppThread.java diff --git a/solutions/webhook-chat-app/README.md b/solutions/webhook-chat-app/README.md new file mode 100644 index 00000000..59643860 --- /dev/null +++ b/solutions/webhook-chat-app/README.md @@ -0,0 +1,4 @@ +# Google Chat App Webhook + +Please see related guide on how to +[send messages to Google Chat with incoming webhooks](https://developers.google.com/workspace/chat/quickstart/webhooks). diff --git a/solutions/webhook-chat-app/pom.xml b/solutions/webhook-chat-app/pom.xml new file mode 100644 index 00000000..be47addd --- /dev/null +++ b/solutions/webhook-chat-app/pom.xml @@ -0,0 +1,52 @@ + + + + + + 4.0.0 + + com.google.chat.webhook + webhook-app + 0.1.0 + webhook-app + + + 11 + 11 + + + + + com.google.code.gson + gson + 2.9.1 + + + + + + + + maven-compiler-plugin + 3.8.0 + + + + + + diff --git a/solutions/webhook-chat-app/src/main/java/com/google/chat/webhook/App.java b/solutions/webhook-chat-app/src/main/java/com/google/chat/webhook/App.java new file mode 100644 index 00000000..3f9f4032 --- /dev/null +++ b/solutions/webhook-chat-app/src/main/java/com/google/chat/webhook/App.java @@ -0,0 +1,45 @@ +/** + * Copyright 2022 Google LLC. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.google.chat.webhook; + +// [START chat_webhook] +import com.google.gson.Gson; +import java.net.http.HttpClient; +import java.net.http.HttpRequest; +import java.net.http.HttpResponse; +import java.util.Map; +import java.net.URI; + +public class App { + private static final String URL = "https://chat.googleapis.com/v1/spaces/SPACE_ID/messages?key=KEY&token=TOKEN"; + private static final Gson gson = new Gson(); + private static final HttpClient client = HttpClient.newHttpClient(); + + public static void main(String[] args) throws Exception { + String message = gson.toJson(Map.of( + "text", "Hello from Java!" + )); + + HttpRequest request = HttpRequest.newBuilder(URI.create(URL)) + .header("accept", "application/json; charset=UTF-8") + .POST(HttpRequest.BodyPublishers.ofString(message)).build(); + + HttpResponse response = client.send(request, HttpResponse.BodyHandlers.ofString()); + + System.out.println(response.body()); + } +} +// [END chat_webhook] diff --git a/solutions/webhook-chat-app/src/main/java/com/google/chat/webhook/AppThread.java b/solutions/webhook-chat-app/src/main/java/com/google/chat/webhook/AppThread.java new file mode 100644 index 00000000..d5c5fb52 --- /dev/null +++ b/solutions/webhook-chat-app/src/main/java/com/google/chat/webhook/AppThread.java @@ -0,0 +1,48 @@ +/** + * Copyright 2025 Google LLC. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.google.chat.webhook; + +// [START chat_webhook_thread] +import com.google.gson.Gson; +import java.net.http.HttpClient; +import java.net.http.HttpRequest; +import java.net.http.HttpResponse; +import java.util.Map; +import java.net.URI; + +public class App { + private static final String URL = "https://chat.googleapis.com/v1/spaces/SPACE_ID/messages?key=KEY&token=TOKEN&messageReplyOption=REPLY_MESSAGE_FALLBACK_TO_NEW_THREAD"; + private static final Gson gson = new Gson(); + private static final HttpClient client = HttpClient.newHttpClient(); + + public static void main(String[] args) throws Exception { + String message = gson.toJson(Map.of( + "text", "Hello from Java!", + "thread", Map.of( + "threadKey", "THREAD_KEY_VALUE" + ) + )); + + HttpRequest request = HttpRequest.newBuilder(URI.create(URL)) + .header("accept", "application/json; charset=UTF-8") + .POST(HttpRequest.BodyPublishers.ofString(message)).build(); + + HttpResponse response = client.send(request, HttpResponse.BodyHandlers.ofString()); + + System.out.println(response.body()); + } +} +// [END chat_webhook_thread] From 19db17de8d3d018de067c5c8bbe50753b9f2055c Mon Sep 17 00:00:00 2001 From: Ken Cenerelli Date: Tue, 17 Feb 2026 11:54:57 -0800 Subject: [PATCH 262/262] docs: add SheetsFilterViews Java sample (#1747) * docs: add SheetsFilterViews Java sample Adds Java sample for filter views. Based on the `sheets_filter_views` sample from Python. * Fix comment formatting in SheetsFilterViews.java * Implement error handling for filter view operations Added error handling for Add and Duplicate Filter View requests to ensure valid responses. * Update copyright year in SheetsFilterViews.java Updated copyright year from 2022 to 2026. --- .../src/main/java/SheetsFilterViews.java | 175 ++++++++++++++++++ 1 file changed, 175 insertions(+) create mode 100644 sheets/snippets/src/main/java/SheetsFilterViews.java diff --git a/sheets/snippets/src/main/java/SheetsFilterViews.java b/sheets/snippets/src/main/java/SheetsFilterViews.java new file mode 100644 index 00000000..06a1f939 --- /dev/null +++ b/sheets/snippets/src/main/java/SheetsFilterViews.java @@ -0,0 +1,175 @@ +/ * +Copyright 2026 Google LLC + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +* / + +// [START sheets_filter_views] + +/* + * Dependencies (Maven): + * com.google.apis:google-api-services-sheets:v4-rev20220927-2.0.0 + * com.google.auth:google-auth-library-oauth2-http:1.19.0 + */ + +import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import com.google.api.services.sheets.v4.Sheets; +import com.google.api.services.sheets.v4.SheetsScopes; +import com.google.api.services.sheets.v4.model.*; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; + +import java.io.IOException; +import java.security.GeneralSecurityException; +import java.util.*; + +public class SheetsFilterViews { + + public static void main(String... args) { + filterViews("1CM29gwKIzeXsAppeNwrc8lbYaVMmUclprLuLYuHog4k"); + } + + public static void filterViews(String spreadsheetId) { + try { + // Load pre-authorized user credentials from the environment. + // TODO(developer) - See https://developers.google.com/identity for guides on implementing OAuth2. + GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() + .createScoped(Collections.singleton(SheetsScopes.SPREADSHEETS)); + + Sheets service = new Sheets.Builder( + GoogleNetHttpTransport.newTrustedTransport(), + GsonFactory.getDefaultInstance(), + new HttpCredentialsAdapter(credentials)) + .setApplicationName("Sheets Filter Views Sample") + .build(); + + // --- Step 1: Add Filter View --- + GridRange myRange = new GridRange() + .setSheetId(0) + .setStartRowIndex(0) + .setStartColumnIndex(0); + + // Construct Criteria for Column 0 (Hidden Values) + FilterCriteria criteria0 = new FilterCriteria() + .setHiddenValues(Collections.singletonList("Panel")); + + // Construct Criteria for Column 6 (Date Condition) + ConditionValue dateValue = new ConditionValue().setUserEnteredValue("4/30/2016"); + BooleanCondition dateCondition = new BooleanCondition() + .setType("DATE_BEFORE") + .setValues(Collections.singletonList(dateValue)); + FilterCriteria criteria6 = new FilterCriteria().setCondition(dateCondition); + + // Map criteria to column indices (Note: keys are Strings in Java map) + Map criteriaMap = new HashMap<>(); + criteriaMap.put("0", criteria0); + criteriaMap.put("6", criteria6); + + FilterView filterView = new FilterView() + .setTitle("Sample Filter") + .setRange(myRange) + .setSortSpecs(Collections.singletonList( + new SortSpec().setDimensionIndex(3).setSortOrder("DESCENDING") + )) + .setCriteria(criteriaMap); + + // --- Step 1: Add Filter View --- + // (Request construction remains the same) + // ... + AddFilterViewRequest addFilterViewRequest = new AddFilterViewRequest().setFilter(filterView); + + BatchUpdateSpreadsheetRequest batchRequest1 = new BatchUpdateSpreadsheetRequest() + .setRequests(Collections.singletonList(new Request().setAddFilterView(addFilterViewRequest))); + + BatchUpdateSpreadsheetResponse response1 = service.spreadsheets() + .batchUpdate(spreadsheetId, batchRequest1) + .execute(); + + if (response1.getReplies() == null || response1.getReplies().isEmpty()) { + System.err.println("Error: No replies returned from AddFilterView request."); + return; + } + + Response reply1 = response1.getReplies().get(0); + if (reply1.getAddFilterView() == null || reply1.getAddFilterView().getFilter() == null) { + System.err.println("Error: Response did not contain AddFilterView data."); + return; + } + + int filterId = reply1.getAddFilterView().getFilter().getFilterViewId(); + + // --- Step 2: Duplicate Filter View --- + DuplicateFilterViewRequest duplicateRequest = new DuplicateFilterViewRequest() + .setFilterId(filterId); + + BatchUpdateSpreadsheetRequest batchRequest2 = new BatchUpdateSpreadsheetRequest() + .setRequests(Collections.singletonList(new Request().setDuplicateFilterView(duplicateRequest))); + + BatchUpdateSpreadsheetResponse response2 = service.spreadsheets() + .batchUpdate(spreadsheetId, batchRequest2) + .execute(); + + if (response2.getReplies() == null || response2.getReplies().isEmpty()) { + System.err.println("Error: No replies returned from DuplicateFilterView request."); + return; + } + + Response reply2 = response2.getReplies().get(0); + if (reply2.getDuplicateFilterView() == null || reply2.getDuplicateFilterView().getFilter() == null) { + System.err.println("Error: Response did not contain DuplicateFilterView data."); + return; + } + + int newFilterId = reply2.getDuplicateFilterView().getFilter().getFilterViewId(); + + // --- Step 3: Update Filter View --- + // Extract the new ID from the duplicate response + int newFilterId = response2.getReplies().get(0) + .getDuplicateFilterView().getFilter().getFilterViewId(); + + // Create update criteria + Map updateCriteriaMap = new HashMap<>(); + updateCriteriaMap.put("0", new FilterCriteria()); // Empty criteria + + ConditionValue numValue = new ConditionValue().setUserEnteredValue("5"); + BooleanCondition numCondition = new BooleanCondition() + .setType("NUMBER_GREATER") + .setValues(Collections.singletonList(numValue)); + updateCriteriaMap.put("3", new FilterCriteria().setCondition(numCondition)); + + FilterView updateFilterView = new FilterView() + .setFilterViewId(newFilterId) + .setTitle("Updated Filter") + .setCriteria(updateCriteriaMap); + + UpdateFilterViewRequest updateRequest = new UpdateFilterViewRequest() + .setFilter(updateFilterView) + .setFields("criteria,title"); + + BatchUpdateSpreadsheetRequest batchRequest3 = new BatchUpdateSpreadsheetRequest() + .setRequests(Collections.singletonList(new Request().setUpdateFilterView(updateRequest))); + + BatchUpdateSpreadsheetResponse response3 = service.spreadsheets() + .batchUpdate(spreadsheetId, batchRequest3) + .execute(); + + System.out.println(response3.toPrettyString()); + + } catch (IOException | GeneralSecurityException e) { + System.err.println("An error occurred: " + e); + } + } +} + +// [END sheets_filter_views]