From dd30b1828593c8ab26cefe6b65d4d0a8dd34df24 Mon Sep 17 00:00:00 2001 From: Dominik Klein Date: Wed, 20 Oct 2021 11:43:35 +0200 Subject: [PATCH] Fixes #3698 - Import for kayako during the setup. --- .rubocop/cop/zammad/exists_db_strategy.rb | 2 +- .../app/controllers/import_freshdesk.coffee | 1 - .../app/controllers/import_kayako.coffee | 194 + .../app/views/import/kayako.jst.eco | 113 + app/controllers/import_kayako_controller.rb | 146 + config/routes/import_kayako.rb | 12 + ...et_article_type_facebook_direct_message.rb | 15 + db/seeds/settings.rb | 55 + db/seeds/ticket_article_types.rb | 1 + lib/import/kayako.rb | 15 + lib/sequencer/sequence/import/kayako/case.rb | 45 + .../sequence/import/kayako/case_field.rb | 24 + .../sequence/import/kayako/connection_test.rb | 21 + lib/sequencer/sequence/import/kayako/full.rb | 34 + .../sequence/import/kayako/generic_field.rb | 20 + .../sequence/import/kayako/generic_object.rb | 24 + .../sequence/import/kayako/organization.rb | 29 + .../import/kayako/organization_field.rb | 24 + lib/sequencer/sequence/import/kayako/post.rb | 30 + lib/sequencer/sequence/import/kayako/posts.rb | 21 + lib/sequencer/sequence/import/kayako/team.rb | 28 + .../sequence/import/kayako/time_entries.rb | 21 + .../sequence/import/kayako/time_entry.rb | 26 + lib/sequencer/sequence/import/kayako/user.rb | 37 + .../sequence/import/kayako/user_field.rb | 24 + .../model_class/object_manager/attribute.rb | 14 + .../import/freshdesk/ticket/conversations.rb | 4 - .../unit/import/kayako/case/customer_id.rb | 22 + .../unit/import/kayako/case/group_id.rb | 22 + .../unit/import/kayako/case/mapping.rb | 37 + .../import/kayako/case/organization_id.rb | 28 + .../unit/import/kayako/case/owner_id.rb | 22 + .../unit/import/kayako/case/posts.rb | 35 + .../unit/import/kayako/case/priority_id.rb | 36 + .../unit/import/kayako/case/skip/deleted.rb | 26 + .../unit/import/kayako/case/skip/suspended.rb | 26 + .../unit/import/kayako/case/state_id.rb | 37 + lib/sequencer/unit/import/kayako/case/tags.rb | 22 + lib/sequencer/unit/import/kayako/case/type.rb | 23 + .../unit/import/kayako/case/updated_by_id.rb | 22 + .../unit/import/kayako/case_fields.rb | 12 + lib/sequencer/unit/import/kayako/cases.rb | 12 + .../import/kayako/common/article_sender_id.rb | 33 + .../kayako/common/article_source_channel.rb | 26 + .../import/kayako/common/created_by_id.rb | 22 + .../unit/import/kayako/default_language.rb | 43 + lib/sequencer/unit/import/kayako/field_map.rb | 16 + lib/sequencer/unit/import/kayako/id_map.rb | 16 + .../import/kayako/import_settings_unset.rb | 16 + lib/sequencer/unit/import/kayako/map_id.rb | 24 + .../import/kayako/mapping/custom_fields.rb | 48 + .../unit/import/kayako/mapping/timestamps.rb | 26 + .../unit/import/kayako/model_class.rb | 29 + .../import/kayako/object_attribute/add.rb | 23 + .../object_attribute/attribute_type/base.rb | 91 + .../attribute_type/cascadingselect.rb | 64 + .../object_attribute/attribute_type/date.rb | 25 + .../attribute_type/decimal.rb | 16 + .../attribute_type/numeric.rb | 28 + .../object_attribute/attribute_type/radio.rb | 16 + .../object_attribute/attribute_type/regex.rb | 23 + .../object_attribute/attribute_type/select.rb | 44 + .../object_attribute/attribute_type/text.rb | 28 + .../attribute_type/textarea.rb | 24 + .../object_attribute/attribute_type/type.rb | 26 + .../object_attribute/attribute_type/yesno.rb | 35 + .../import/kayako/object_attribute/config.rb | 41 + .../kayako/object_attribute/field_map.rb | 26 + .../object_attribute/migration_execute.rb | 21 + .../kayako/object_attribute/sanitized_name.rb | 25 + .../import/kayako/object_attribute/skip.rb | 33 + .../unit/import/kayako/object_count.rb | 32 + .../import/kayako/organization/mapping.rb | 36 + .../unit/import/kayako/organization_fields.rb | 12 + .../unit/import/kayako/organizations.rb | 12 + lib/sequencer/unit/import/kayako/perform.rb | 33 + .../unit/import/kayako/post/attachments.rb | 71 + .../unit/import/kayako/post/channel/base.rb | 60 + .../import/kayako/post/channel/facebook.rb | 42 + .../import/kayako/post/channel/helpcenter.rb | 21 + .../unit/import/kayako/post/channel/mail.rb | 65 + .../import/kayako/post/channel/messenger.rb | 21 + .../unit/import/kayako/post/channel/note.rb | 36 + .../import/kayako/post/channel/twitter.rb | 41 + .../kayako/post/email_address_fields.rb | 24 + .../unit/import/kayako/post/inline_images.rb | 77 + .../unit/import/kayako/post/mapping.rb | 29 + .../unit/import/kayako/post/unset_instance.rb | 15 + lib/sequencer/unit/import/kayako/request.rb | 40 + .../unit/import/kayako/request/case.rb | 20 + .../unit/import/kayako/request/generic.rb | 30 + .../import/kayako/request/generic_field.rb | 19 + .../import/kayako/request/organization.rb | 19 + .../unit/import/kayako/request/post.rb | 30 + .../unit/import/kayako/request/time_entry.rb | 17 + .../unit/import/kayako/request/user.rb | 19 + lib/sequencer/unit/import/kayako/requester.rb | 86 + lib/sequencer/unit/import/kayako/resources.rb | 26 + .../unit/import/kayako/sub_sequence/field.rb | 18 + .../import/kayako/sub_sequence/generic.rb | 99 + .../unit/import/kayako/sub_sequence/object.rb | 18 + .../import/kayako/sub_sequence/sub_object.rb | 22 + .../unit/import/kayako/team/mapping.rb | 25 + lib/sequencer/unit/import/kayako/teams.rb | 12 + .../unit/import/kayako/time_entries.rb | 15 + .../unit/import/kayako/time_entry/mapping.rb | 38 + .../unit/import/kayako/time_entry/skip.rb | 22 + .../unit/import/kayako/user/group_ids.rb | 24 + .../unit/import/kayako/user/identifier.rb | 32 + .../unit/import/kayako/user/initiator.rb | 24 + .../unit/import/kayako/user/login.rb | 23 + .../unit/import/kayako/user/mapping.rb | 40 + .../import/kayako/user/organization_id.rb | 25 + .../unit/import/kayako/user/password.rb | 29 + .../unit/import/kayako/user/roles.rb | 71 + .../unit/import/kayako/user_fields.rb | 12 + lib/sequencer/unit/import/kayako/users.rb | 12 + lib/sequencer/unit/kayako/connected.rb | 23 + spec/factories/object_manager_attribute.rb | 15 + spec/integration/kayako_spec.rb | 71 + .../sequence/import/kayako/case_field_spec.rb | 54 + .../sequence/import/kayako/case_spec.rb | 292 ++ .../object_custom_field_values_examples.rb | 459 +++ .../examples/object_custom_fields_examples.rb | 235 ++ .../import/kayako/generic_object_spec.rb | 72 + .../import/kayako/organization_field_spec.rb | 12 + .../import/kayako/organization_spec.rb | 87 + .../sequence/import/kayako/post_spec.rb | 170 + .../sequence/import/kayako/team_spec.rb | 47 + .../sequence/import/kayako/time_entry_spec.rb | 84 + .../sequence/import/kayako/user_field_spec.rb | 12 + .../sequence/import/kayako/user_spec.rb | 150 + .../sequencer/unit/kayako/connected_spec.rb | 31 + spec/requests/import_kayako_spec.rb | 22 + spec/support/vcr_mask_kayako_endpoint_auth.rb | 11 + spec/system/import/kayako_spec.rb | 124 + test/data/vcr_cassettes/kayako_import.yml | 3549 +++++++++++++++++ ...yako_url_check_check_invalid_subdomain.yml | 40 + ...kayako_url_check_check_valid_subdomain.yml | 57 + ..._fields_validation_invalid_credentials.yml | 187 + ...ako_fields_validation_invalid_hostname.yml | 40 + ...o_fields_validation_shows_start_button.yml | 340 ++ ...ko_fields_validation_valid_credentials.yml | 187 + ...ayako_fields_validation_valid_hostname.yml | 40 + .../import/kayako/import_progress_setup.yml | 340 ++ 145 files changed, 10489 insertions(+), 6 deletions(-) create mode 100644 app/assets/javascripts/app/controllers/import_kayako.coffee create mode 100644 app/assets/javascripts/app/views/import/kayako.jst.eco create mode 100644 app/controllers/import_kayako_controller.rb create mode 100644 config/routes/import_kayako.rb create mode 100644 db/migrate/20210827095053_add_ticket_article_type_facebook_direct_message.rb create mode 100644 lib/import/kayako.rb create mode 100644 lib/sequencer/sequence/import/kayako/case.rb create mode 100644 lib/sequencer/sequence/import/kayako/case_field.rb create mode 100644 lib/sequencer/sequence/import/kayako/connection_test.rb create mode 100644 lib/sequencer/sequence/import/kayako/full.rb create mode 100644 lib/sequencer/sequence/import/kayako/generic_field.rb create mode 100644 lib/sequencer/sequence/import/kayako/generic_object.rb create mode 100644 lib/sequencer/sequence/import/kayako/organization.rb create mode 100644 lib/sequencer/sequence/import/kayako/organization_field.rb create mode 100644 lib/sequencer/sequence/import/kayako/post.rb create mode 100644 lib/sequencer/sequence/import/kayako/posts.rb create mode 100644 lib/sequencer/sequence/import/kayako/team.rb create mode 100644 lib/sequencer/sequence/import/kayako/time_entries.rb create mode 100644 lib/sequencer/sequence/import/kayako/time_entry.rb create mode 100644 lib/sequencer/sequence/import/kayako/user.rb create mode 100644 lib/sequencer/sequence/import/kayako/user_field.rb create mode 100644 lib/sequencer/unit/common/model_class/object_manager/attribute.rb create mode 100644 lib/sequencer/unit/import/kayako/case/customer_id.rb create mode 100644 lib/sequencer/unit/import/kayako/case/group_id.rb create mode 100644 lib/sequencer/unit/import/kayako/case/mapping.rb create mode 100644 lib/sequencer/unit/import/kayako/case/organization_id.rb create mode 100644 lib/sequencer/unit/import/kayako/case/owner_id.rb create mode 100644 lib/sequencer/unit/import/kayako/case/posts.rb create mode 100644 lib/sequencer/unit/import/kayako/case/priority_id.rb create mode 100644 lib/sequencer/unit/import/kayako/case/skip/deleted.rb create mode 100644 lib/sequencer/unit/import/kayako/case/skip/suspended.rb create mode 100644 lib/sequencer/unit/import/kayako/case/state_id.rb create mode 100644 lib/sequencer/unit/import/kayako/case/tags.rb create mode 100644 lib/sequencer/unit/import/kayako/case/type.rb create mode 100644 lib/sequencer/unit/import/kayako/case/updated_by_id.rb create mode 100644 lib/sequencer/unit/import/kayako/case_fields.rb create mode 100644 lib/sequencer/unit/import/kayako/cases.rb create mode 100644 lib/sequencer/unit/import/kayako/common/article_sender_id.rb create mode 100644 lib/sequencer/unit/import/kayako/common/article_source_channel.rb create mode 100644 lib/sequencer/unit/import/kayako/common/created_by_id.rb create mode 100644 lib/sequencer/unit/import/kayako/default_language.rb create mode 100644 lib/sequencer/unit/import/kayako/field_map.rb create mode 100644 lib/sequencer/unit/import/kayako/id_map.rb create mode 100644 lib/sequencer/unit/import/kayako/import_settings_unset.rb create mode 100644 lib/sequencer/unit/import/kayako/map_id.rb create mode 100644 lib/sequencer/unit/import/kayako/mapping/custom_fields.rb create mode 100644 lib/sequencer/unit/import/kayako/mapping/timestamps.rb create mode 100644 lib/sequencer/unit/import/kayako/model_class.rb create mode 100644 lib/sequencer/unit/import/kayako/object_attribute/add.rb create mode 100644 lib/sequencer/unit/import/kayako/object_attribute/attribute_type/base.rb create mode 100644 lib/sequencer/unit/import/kayako/object_attribute/attribute_type/cascadingselect.rb create mode 100644 lib/sequencer/unit/import/kayako/object_attribute/attribute_type/date.rb create mode 100644 lib/sequencer/unit/import/kayako/object_attribute/attribute_type/decimal.rb create mode 100644 lib/sequencer/unit/import/kayako/object_attribute/attribute_type/numeric.rb create mode 100644 lib/sequencer/unit/import/kayako/object_attribute/attribute_type/radio.rb create mode 100644 lib/sequencer/unit/import/kayako/object_attribute/attribute_type/regex.rb create mode 100644 lib/sequencer/unit/import/kayako/object_attribute/attribute_type/select.rb create mode 100644 lib/sequencer/unit/import/kayako/object_attribute/attribute_type/text.rb create mode 100644 lib/sequencer/unit/import/kayako/object_attribute/attribute_type/textarea.rb create mode 100644 lib/sequencer/unit/import/kayako/object_attribute/attribute_type/type.rb create mode 100644 lib/sequencer/unit/import/kayako/object_attribute/attribute_type/yesno.rb create mode 100644 lib/sequencer/unit/import/kayako/object_attribute/config.rb create mode 100644 lib/sequencer/unit/import/kayako/object_attribute/field_map.rb create mode 100644 lib/sequencer/unit/import/kayako/object_attribute/migration_execute.rb create mode 100644 lib/sequencer/unit/import/kayako/object_attribute/sanitized_name.rb create mode 100644 lib/sequencer/unit/import/kayako/object_attribute/skip.rb create mode 100644 lib/sequencer/unit/import/kayako/object_count.rb create mode 100644 lib/sequencer/unit/import/kayako/organization/mapping.rb create mode 100644 lib/sequencer/unit/import/kayako/organization_fields.rb create mode 100644 lib/sequencer/unit/import/kayako/organizations.rb create mode 100644 lib/sequencer/unit/import/kayako/perform.rb create mode 100644 lib/sequencer/unit/import/kayako/post/attachments.rb create mode 100644 lib/sequencer/unit/import/kayako/post/channel/base.rb create mode 100644 lib/sequencer/unit/import/kayako/post/channel/facebook.rb create mode 100644 lib/sequencer/unit/import/kayako/post/channel/helpcenter.rb create mode 100644 lib/sequencer/unit/import/kayako/post/channel/mail.rb create mode 100644 lib/sequencer/unit/import/kayako/post/channel/messenger.rb create mode 100644 lib/sequencer/unit/import/kayako/post/channel/note.rb create mode 100644 lib/sequencer/unit/import/kayako/post/channel/twitter.rb create mode 100644 lib/sequencer/unit/import/kayako/post/email_address_fields.rb create mode 100644 lib/sequencer/unit/import/kayako/post/inline_images.rb create mode 100644 lib/sequencer/unit/import/kayako/post/mapping.rb create mode 100644 lib/sequencer/unit/import/kayako/post/unset_instance.rb create mode 100644 lib/sequencer/unit/import/kayako/request.rb create mode 100644 lib/sequencer/unit/import/kayako/request/case.rb create mode 100644 lib/sequencer/unit/import/kayako/request/generic.rb create mode 100644 lib/sequencer/unit/import/kayako/request/generic_field.rb create mode 100644 lib/sequencer/unit/import/kayako/request/organization.rb create mode 100644 lib/sequencer/unit/import/kayako/request/post.rb create mode 100644 lib/sequencer/unit/import/kayako/request/time_entry.rb create mode 100644 lib/sequencer/unit/import/kayako/request/user.rb create mode 100644 lib/sequencer/unit/import/kayako/requester.rb create mode 100644 lib/sequencer/unit/import/kayako/resources.rb create mode 100644 lib/sequencer/unit/import/kayako/sub_sequence/field.rb create mode 100644 lib/sequencer/unit/import/kayako/sub_sequence/generic.rb create mode 100644 lib/sequencer/unit/import/kayako/sub_sequence/object.rb create mode 100644 lib/sequencer/unit/import/kayako/sub_sequence/sub_object.rb create mode 100644 lib/sequencer/unit/import/kayako/team/mapping.rb create mode 100644 lib/sequencer/unit/import/kayako/teams.rb create mode 100644 lib/sequencer/unit/import/kayako/time_entries.rb create mode 100644 lib/sequencer/unit/import/kayako/time_entry/mapping.rb create mode 100644 lib/sequencer/unit/import/kayako/time_entry/skip.rb create mode 100644 lib/sequencer/unit/import/kayako/user/group_ids.rb create mode 100644 lib/sequencer/unit/import/kayako/user/identifier.rb create mode 100644 lib/sequencer/unit/import/kayako/user/initiator.rb create mode 100644 lib/sequencer/unit/import/kayako/user/login.rb create mode 100644 lib/sequencer/unit/import/kayako/user/mapping.rb create mode 100644 lib/sequencer/unit/import/kayako/user/organization_id.rb create mode 100644 lib/sequencer/unit/import/kayako/user/password.rb create mode 100644 lib/sequencer/unit/import/kayako/user/roles.rb create mode 100644 lib/sequencer/unit/import/kayako/user_fields.rb create mode 100644 lib/sequencer/unit/import/kayako/users.rb create mode 100644 lib/sequencer/unit/kayako/connected.rb create mode 100644 spec/integration/kayako_spec.rb create mode 100644 spec/lib/sequencer/sequence/import/kayako/case_field_spec.rb create mode 100644 spec/lib/sequencer/sequence/import/kayako/case_spec.rb create mode 100644 spec/lib/sequencer/sequence/import/kayako/examples/object_custom_field_values_examples.rb create mode 100644 spec/lib/sequencer/sequence/import/kayako/examples/object_custom_fields_examples.rb create mode 100644 spec/lib/sequencer/sequence/import/kayako/generic_object_spec.rb create mode 100644 spec/lib/sequencer/sequence/import/kayako/organization_field_spec.rb create mode 100644 spec/lib/sequencer/sequence/import/kayako/organization_spec.rb create mode 100644 spec/lib/sequencer/sequence/import/kayako/post_spec.rb create mode 100644 spec/lib/sequencer/sequence/import/kayako/team_spec.rb create mode 100644 spec/lib/sequencer/sequence/import/kayako/time_entry_spec.rb create mode 100644 spec/lib/sequencer/sequence/import/kayako/user_field_spec.rb create mode 100644 spec/lib/sequencer/sequence/import/kayako/user_spec.rb create mode 100644 spec/lib/sequencer/unit/kayako/connected_spec.rb create mode 100644 spec/requests/import_kayako_spec.rb create mode 100644 spec/support/vcr_mask_kayako_endpoint_auth.rb create mode 100644 spec/system/import/kayako_spec.rb create mode 100644 test/data/vcr_cassettes/kayako_import.yml create mode 100644 test/data/vcr_cassettes/requests/import_kayako/importkayako_post_api_v1_import_kayako_url_check_check_invalid_subdomain.yml create mode 100644 test/data/vcr_cassettes/requests/import_kayako/importkayako_post_api_v1_import_kayako_url_check_check_valid_subdomain.yml create mode 100644 test/data/vcr_cassettes/system/import/kayako/import_kayako_fields_validation_invalid_credentials.yml create mode 100644 test/data/vcr_cassettes/system/import/kayako/import_kayako_fields_validation_invalid_hostname.yml create mode 100644 test/data/vcr_cassettes/system/import/kayako/import_kayako_fields_validation_shows_start_button.yml create mode 100644 test/data/vcr_cassettes/system/import/kayako/import_kayako_fields_validation_valid_credentials.yml create mode 100644 test/data/vcr_cassettes/system/import/kayako/import_kayako_fields_validation_valid_hostname.yml create mode 100644 test/data/vcr_cassettes/system/import/kayako/import_progress_setup.yml diff --git a/.rubocop/cop/zammad/exists_db_strategy.rb b/.rubocop/cop/zammad/exists_db_strategy.rb index f825e2bfc..e2b4dddc8 100644 --- a/.rubocop/cop/zammad/exists_db_strategy.rb +++ b/.rubocop/cop/zammad/exists_db_strategy.rb @@ -17,7 +17,7 @@ module RuboCop PATTERN def_node_matcher :has_reset?, <<-PATTERN - $(send _ {:describe :context :it} (_ ...) (hash ... (pair (sym :db_strategy) (sym {:reset :reset_all})))) + $(send _ {:describe :context :it :shared_examples} (_ ...) (hash ... (pair (sym :db_strategy) (sym {:reset :reset_all})))) PATTERN MSG = 'Add a `db_strategy: :reset` to your context/decribe when you are creating object manager attributes!'.freeze diff --git a/app/assets/javascripts/app/controllers/import_freshdesk.coffee b/app/assets/javascripts/app/controllers/import_freshdesk.coffee index 42b16e066..f464449a0 100644 --- a/app/assets/javascripts/app/controllers/import_freshdesk.coffee +++ b/app/assets/javascripts/app/controllers/import_freshdesk.coffee @@ -8,7 +8,6 @@ class ImportFreshdesk extends App.ControllerWizardFullScreen '#freshdesk-subdomain-addon': 'freshdeskSubdomainAddon' '.freshdesk-subdomain-error': 'linkErrorMessage' '.freshdesk-api-token-error': 'apiTokenErrorMessage' - '#freshdesk-email': 'freshdeskEmail' '#freshdesk-api-token': 'freshdeskApiToken' '.js-ticket-count-info': 'ticketCountInfo' updateMigrationDisplayLoop: 0 diff --git a/app/assets/javascripts/app/controllers/import_kayako.coffee b/app/assets/javascripts/app/controllers/import_kayako.coffee new file mode 100644 index 000000000..49ebb5765 --- /dev/null +++ b/app/assets/javascripts/app/controllers/import_kayako.coffee @@ -0,0 +1,194 @@ +class ImportKayako extends App.ControllerWizardFullScreen + className: 'getstarted fit' + elements: + '.input-feedback': 'urlStatus' + '[data-target=kayako-credentials]': 'nextEnterCredentials' + '[data-target=kayako-start-migration]': 'nextStartMigration' + '#kayako-subdomain': 'kayakoSubdomain' + '#kayako-subdomain-addon': 'kayakoSubdomainAddon' + '.kayako-subdomain-error': 'linkErrorMessage' + '.kayako-password-error': 'apiTokenErrorMessage' + '#kayako-email': 'kayakoEmail' + '#kayako-password': 'kayakoPassword' + '.js-ticket-count-info': 'ticketCountInfo' + updateMigrationDisplayLoop: 0 + + events: + 'click .js-kayako-credentials': 'showCredentials' + 'click .js-migration-start': 'startMigration' + 'keyup #kayako-subdomain': 'updateUrl' + 'keyup #kayako-password': 'updateCredentials' + + constructor: -> + super + + # set title + @title 'Import' + + @kayakoDomain = '.kayako.com' + + # redirect to login if admin user already exists + if @Config.get('system_init_done') + @navigate '#login' + return + + @fetch() + + fetch: -> + + # get data + @ajax( + id: 'getting_started' + type: 'GET' + url: "#{@apiPath}/getting_started" + processData: true + success: (data, status, xhr) => + + # check if import is active + if data.import_mode == true && data.import_backend != 'kayako' + @navigate "#import/#{data.import_backend}", { emptyEl: true } + return + + # render page + @render() + + if data.import_mode == true + @showImportState() + @updateMigration() + ) + + render: -> + @replaceWith App.view('import/kayako')( + kayakoDomain: @kayakoDomain + ) + + updateUrl: (e) => + @urlStatus.attr('data-state', 'loading') + @kayakoSubdomainAddon.attr('style', 'padding-right: 42px') + @linkErrorMessage.text('') + + # get data + callback = => + @ajax( + id: 'import_kayako_url' + type: 'POST' + url: "#{@apiPath}/import/kayako/url_check" + data: JSON.stringify(url: "https://#{@kayakoSubdomain.val()}#{@kayakoDomain}") + processData: true + success: (data, status, xhr) => + + # validate form + if data.result is 'ok' + @urlStatus.attr('data-state', 'success') + @linkErrorMessage.text('') + @nextEnterCredentials.removeClass('hide') + else + @urlStatus.attr('data-state', 'error') + @linkErrorMessage.text( data.message_human || data.message) + @nextEnterCredentials.addClass('hide') + + ) + @delay( callback, 700, 'import_kayako_url' ) + + updateCredentials: (e) => + @urlStatus.attr('data-state', 'loading') + @apiTokenErrorMessage.text('') + + # get data + callback = => + @ajax( + id: 'import_kayako_api_token' + type: 'POST' + url: "#{@apiPath}/import/kayako/credentials_check" + data: JSON.stringify(username: @kayakoEmail.val(), password: @kayakoPassword.val()) + processData: true + success: (data, status, xhr) => + + # validate form + if data.result is 'ok' + @urlStatus.attr('data-state', 'success') + @apiTokenErrorMessage.text('') + @nextStartMigration.removeClass('hide') + else + @urlStatus.attr('data-state', 'error') + @apiTokenErrorMessage.text(data.message_human || data.message) + @nextStartMigration.addClass('hide') + + ) + @delay(callback, 700, 'import_kayako_api_token') + + showCredentials: (e) => + e.preventDefault() + @urlStatus.attr('data-state', '') + @$('[data-slide=kayako-subdomain]').toggleClass('hide') + @$('[data-slide=kayako-credentials]').toggleClass('hide') + + showImportState: => + @$('[data-slide=kayako-subdomain]').addClass('hide') + @$('[data-slide=kayako-credentials]').addClass('hide') + @$('[data-slide=kayako-import]').removeClass('hide') + + startMigration: (e) => + e.preventDefault() + @showImportState() + @ajax( + id: 'import_start' + type: 'POST' + url: "#{@apiPath}/import/kayako/import_start" + processData: true + success: (data, status, xhr) => + + # validate form + if data.result is 'ok' + @delay(@updateMigration, 3000) + ) + + updateMigration: => + @updateMigrationDisplayLoop += 1 + @showImportState() + @ajax( + id: 'import_status' + type: 'GET' + url: "#{@apiPath}/import/kayako/import_status" + processData: true + success: (data, status, xhr) => + + if _.isEmpty(data.result) && @updateMigrationDisplayLoop > 16 + @$('.js-error').removeClass('hide') + @$('.js-error').html(App.i18n.translateContent('Background process did not start or has not finished! Please contact your support.')) + return + + if !_.isEmpty(data.result['error']) + @$('.js-error').removeClass('hide') + @$('.js-error').html(App.i18n.translateContent(data.result['error'])) + else + @$('.js-error').addClass('hide') + + if !_.isEmpty(data.finished_at) && _.isEmpty(data.result['error']) + window.location.reload() + return + + if !_.isEmpty(data.result) + for model, stats of data.result + if stats.sum > stats.total + stats.sum = stats.total + + element = @$('.js-' + model.toLowerCase() ) + element.find('.js-done').text(stats.sum) + element.find('.js-total').text(stats.total) + element.find('progress').attr('max', stats.total ) + element.find('progress').attr('value', stats.sum ) + if stats.total <= stats.sum + element.addClass('is-done') + else + element.removeClass('is-done') + @delay(@updateMigration, 5000) + ) + +App.Config.set('import/kayako', ImportKayako, 'Routes') +App.Config.set('kayako', { + title: 'Kayako' + name: 'Kayako' + class: 'js-kayako' + url: '#import/kayako' +}, 'ImportPlugins') diff --git a/app/assets/javascripts/app/views/import/kayako.jst.eco b/app/assets/javascripts/app/views/import/kayako.jst.eco new file mode 100644 index 000000000..d4659d33b --- /dev/null +++ b/app/assets/javascripts/app/views/import/kayako.jst.eco @@ -0,0 +1,113 @@ +
+ <%- @Icon('full-logo', 'wizard-logo') %> +
+
+

<%- @T('%s URL', 'Kayako') %>

+
+

+ <%- @T('Enter the Subdomain of your %s system', 'Kayako') %>: +

+
+ +
+
+ + <%- @kayakoDomain %> +
+
+
+ <%- @Icon('diagonal-cross', 'icon-error') %> + <%- @Icon('checkmark') %> +
+
+
+
+
+
+ <%- @T('Go Back') %> +
<%- @T('Enter credentials') %>
+
+
+ +
+

<%- @T('%s credentials', 'Kayako') %>

+
+

+ <%- @T('Enter your email address and password from your %s account which should be used for the import.', 'Kayako') %> +

+

+ <%- @T('Attention: These will also your login password after the import is completed.') %> +

+
+ +
+ +
+ +
+ +
+
+ <%- @Icon('diagonal-cross', 'icon-error') %> + <%- @Icon('checkmark') %> +
+
+
+
+
+
+ <%- @T('Go Back') %> +
<%- @T('Migrate %s Data', 'Kayako') %>
+
+
+ +
+

<%- @T('%s Migration', 'Kayako') %>

+ +
+ + + + + + + + + +
-/- + <%- @T('Groups') %> + +
+
+ <%- @Icon('checkmark') %> +
+
-/- + <%- @T('Organizations') %> + +
+
+ <%- @Icon('checkmark') %> +
+
-/- + <%- @T('Users') %> + +
+
+ <%- @Icon('checkmark') %> +
+
-/- + <%- @T('Tickets') %> + +
+
+ <%- @Icon('checkmark') %> +
+
+
+ +
+ +
+
diff --git a/app/controllers/import_kayako_controller.rb b/app/controllers/import_kayako_controller.rb new file mode 100644 index 000000000..9a72ebc5b --- /dev/null +++ b/app/controllers/import_kayako_controller.rb @@ -0,0 +1,146 @@ +# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/ + +class ImportKayakoController < ApplicationController + def url_check + return if setup_done_response + + url = params[:url] + + # validate + if !valid_url_syntax?(url) + render json: { + result: 'invalid', + message: 'Invalid URL!', + } + return + end + + endpoint = build_endpoint_url(url) + + return if !valid_endpoint?(endpoint) + + Setting.set('import_kayako_endpoint', endpoint) + + render json: { + result: 'ok', + url: url, + } + end + + def credentials_check + return if setup_done_response + + if !params[:username] || !params[:password] + render json: { + result: 'invalid', + message_human: 'Incomplete credentials', + } + return + end + + save_endpoint_settings(params[:username], params[:password]) + + return if !valid_connection? + + render json: { + result: 'ok', + } + end + + def import_start + return if setup_done_response + + Setting.set('import_mode', true) + Setting.set('import_backend', 'kayako') + + job = ImportJob.create(name: 'Import::Kayako') + AsyncImportJob.perform_later(job) + + render json: { + result: 'ok', + } + end + + def import_status + job = ImportJob.find_by(name: 'Import::Kayako') + + if job.finished_at.present? + Setting.reload + end + + model_show_render_item(job) + end + + private + + def setup_done + count = User.all.count() + done = true + if count <= 2 + done = false + end + done + end + + def setup_done_response + if !setup_done + return false + end + + render json: { + setup_done: true, + } + true + end + + def valid_url_syntax?(url) + return false if url.blank? || url !~ %r{^(http|https)://.+?$} + + true + end + + def valid_endpoint?(endpoint) + response = UserAgent.request("#{endpoint}/teams", verify_ssl: true) + + if response.header.nil? || !response.header['x-api-version'] + render json: { + result: 'invalid', + message: response.error.to_s, + message_human: 'Hostname not found!', + } + return false + end + + true + end + + def build_endpoint_url(url) + endpoint = "#{url}/api/v1" + endpoint.gsub(%r{([^:])//+}, '\\1/') + end + + def valid_connection? + result = Sequencer.process('Import::Kayako::ConnectionTest') + + if !result[:connected] + reset_endpoint_settings + + render json: { + result: 'invalid', + message_human: 'Invalid credentials!', + } + return false + end + + true + end + + def save_endpoint_settings(username, possword) + Setting.set('import_kayako_endpoint_username', username) + Setting.set('import_kayako_endpoint_password', possword) + end + + def reset_endpoint_settings + save_endpoint_settings(nil, nil) + end +end diff --git a/config/routes/import_kayako.rb b/config/routes/import_kayako.rb new file mode 100644 index 000000000..0a84d519d --- /dev/null +++ b/config/routes/import_kayako.rb @@ -0,0 +1,12 @@ +# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/ + +Zammad::Application.routes.draw do + api_path = Rails.configuration.api_path + + # import kayako + match api_path + '/import/kayako/url_check', to: 'import_kayako#url_check', via: :post + match api_path + '/import/kayako/credentials_check', to: 'import_kayako#credentials_check', via: :post + match api_path + '/import/kayako/import_start', to: 'import_kayako#import_start', via: :post + match api_path + '/import/kayako/import_status', to: 'import_kayako#import_status', via: :get + +end diff --git a/db/migrate/20210827095053_add_ticket_article_type_facebook_direct_message.rb b/db/migrate/20210827095053_add_ticket_article_type_facebook_direct_message.rb new file mode 100644 index 000000000..667b82e04 --- /dev/null +++ b/db/migrate/20210827095053_add_ticket_article_type_facebook_direct_message.rb @@ -0,0 +1,15 @@ +# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/ + +class AddTicketArticleTypeFacebookDirectMessage < ActiveRecord::Migration[6.0] + def change + # return if it's a new setup + return if !Setting.exists?(name: 'system_init_done') + + Ticket::Article::Type.create_if_not_exists( + name: 'facebook direct-message', + communication: true, + updated_by_id: 1, + created_by_id: 1, + ) + end +end diff --git a/db/seeds/settings.rb b/db/seeds/settings.rb index 6704464d5..5d2b7b606 100644 --- a/db/seeds/settings.rb +++ b/db/seeds/settings.rb @@ -3282,6 +3282,61 @@ Setting.create_if_not_exists( frontend: false ) +Setting.create_if_not_exists( + title: 'Import Endpoint', + name: 'import_kayako_endpoint', + area: 'Import::Kayako', + description: 'Defines Kayako endpoint to import users, ticket, states and articles.', + options: { + form: [ + { + display: '', + null: false, + name: 'import_kayako_endpoint', + tag: 'input', + }, + ], + }, + state: 'https://yours.kayako.com/api/v1', + frontend: false +) +Setting.create_if_not_exists( + title: 'Import User for requesting the Kayako API', + name: 'import_kayako_endpoint_username', + area: 'Import::Kayako', + description: 'Defines Kayako endpoint authentication user.', + options: { + form: [ + { + display: '', + null: false, + name: 'import_kayako_endpoint_username', + tag: 'input', + }, + ], + }, + state: '', + frontend: false +) +Setting.create_if_not_exists( + title: 'Import Password for requesting the Kayako API', + name: 'import_kayako_endpoint_password', + area: 'Import::Kayako', + description: 'Defines Kayako endpoint authentication password.', + options: { + form: [ + { + display: '', + null: false, + name: 'import_kayako_endpoint_password', + tag: 'input', + }, + ], + }, + state: '', + frontend: false +) + Setting.create_if_not_exists( title: 'Import Backends', name: 'import_backends', diff --git a/db/seeds/ticket_article_types.rb b/db/seeds/ticket_article_types.rb index e29f59b20..071230974 100644 --- a/db/seeds/ticket_article_types.rb +++ b/db/seeds/ticket_article_types.rb @@ -12,3 +12,4 @@ Ticket::Article::Type.create_if_not_exists(id: 9, name: 'facebook feed comment', Ticket::Article::Type.create_if_not_exists(id: 10, name: 'note', communication: false) Ticket::Article::Type.create_if_not_exists(id: 11, name: 'web', communication: true) Ticket::Article::Type.create_if_not_exists(id: 12, name: 'telegram personal-message', communication: true) +Ticket::Article::Type.create_if_not_exists(id: 13, name: 'facebook direct-message', communication: true) diff --git a/lib/import/kayako.rb b/lib/import/kayako.rb new file mode 100644 index 000000000..0ad5b71e7 --- /dev/null +++ b/lib/import/kayako.rb @@ -0,0 +1,15 @@ +# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/ + +module Import + class Kayako < Import::Base + include Import::Mixin::Sequence + + def start + process + end + + def sequence_name + 'Import::Kayako::Full' + end + end +end diff --git a/lib/sequencer/sequence/import/kayako/case.rb b/lib/sequencer/sequence/import/kayako/case.rb new file mode 100644 index 000000000..3ff571407 --- /dev/null +++ b/lib/sequencer/sequence/import/kayako/case.rb @@ -0,0 +1,45 @@ +# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/ + +class Sequencer + class Sequence + module Import + module Kayako + class Case < Sequencer::Sequence::Base + + def self.sequence + [ + 'Common::ModelClass::Ticket', + 'Import::Kayako::Case::Skip::Deleted', + 'Import::Kayako::Case::Skip::Suspended', + 'Import::Kayako::Common::CreatedById', + 'Import::Kayako::Common::ArticleSenderId', + 'Import::Kayako::Case::UpdatedById', + 'Import::Kayako::Case::CustomerId', + 'Import::Kayako::Case::OwnerId', + 'Import::Kayako::Case::GroupId', + 'Import::Kayako::Case::OrganizationId', + 'Import::Kayako::Case::PriorityId', + 'Import::Kayako::Case::StateId', + 'Import::Kayako::Case::Type', + 'Import::Kayako::Common::ArticleSourceChannel', + 'Import::Kayako::Case::Mapping', + 'Import::Kayako::Mapping::Timestamps', + 'Import::Kayako::Mapping::CustomFields', + 'Import::Common::Model::FindBy::Id', + 'Import::Common::Model::Update', + 'Import::Common::Model::Create', + 'Import::Common::Model::Save', + 'Import::Common::Model::ResetPrimaryKeySequence', + 'Import::Kayako::MapId', + 'Import::Kayako::Case::Tags', + 'Import::Kayako::Case::Posts', + 'Import::Common::Model::Statistics::Diff::ModelKey', + 'Import::Common::ImportJob::Statistics::Update', + 'Import::Common::ImportJob::Statistics::Store', + ] + end + end + end + end + end +end diff --git a/lib/sequencer/sequence/import/kayako/case_field.rb b/lib/sequencer/sequence/import/kayako/case_field.rb new file mode 100644 index 000000000..2d51421a4 --- /dev/null +++ b/lib/sequencer/sequence/import/kayako/case_field.rb @@ -0,0 +1,24 @@ +# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/ + +class Sequencer + class Sequence + module Import + module Kayako + class CaseField < Sequencer::Sequence::Base + + def self.sequence + [ + 'Common::ModelClass::Ticket', + 'Import::Kayako::ObjectAttribute::Skip', + 'Import::Kayako::ObjectAttribute::SanitizedName', + 'Import::Kayako::ObjectAttribute::Config', + 'Import::Kayako::ObjectAttribute::Add', + 'Import::Kayako::ObjectAttribute::MigrationExecute', + 'Import::Kayako::ObjectAttribute::FieldMap', + ] + end + end + end + end + end +end diff --git a/lib/sequencer/sequence/import/kayako/connection_test.rb b/lib/sequencer/sequence/import/kayako/connection_test.rb new file mode 100644 index 000000000..968504bdb --- /dev/null +++ b/lib/sequencer/sequence/import/kayako/connection_test.rb @@ -0,0 +1,21 @@ +# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/ + +class Sequencer + class Sequence + module Import + module Kayako + class ConnectionTest < Sequencer::Sequence::Base + def self.expecting + [:connected] + end + + def self.sequence + [ + 'Kayako::Connected', + ] + end + end + end + end + end +end diff --git a/lib/sequencer/sequence/import/kayako/full.rb b/lib/sequencer/sequence/import/kayako/full.rb new file mode 100644 index 000000000..8c58bc079 --- /dev/null +++ b/lib/sequencer/sequence/import/kayako/full.rb @@ -0,0 +1,34 @@ +# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/ + +class Sequencer + class Sequence + module Import + module Kayako + class Full < Sequencer::Sequence::Base + + def self.sequence + [ + 'Import::Common::ImportMode::Check', + 'Import::Common::SystemInitDone::Check', + 'Import::Common::ImportJob::DryRun', + 'Import::Kayako::DefaultLanguage', + 'Import::Kayako::IdMap', + 'Import::Kayako::Teams', + 'Import::Kayako::FieldMap', + 'Import::Kayako::OrganizationFields', + 'Import::Kayako::Organizations', + 'Import::Kayako::UserFields', + 'Import::Kayako::Users', + 'Import::Kayako::CaseFields', + 'Import::Kayako::Cases', + 'Import::Kayako::TimeEntries', + 'Import::Common::SystemInitDone::Set', + 'Import::Kayako::ImportSettingsUnset', + 'Import::Common::ImportMode::Unset', + ] + end + end + end + end + end +end diff --git a/lib/sequencer/sequence/import/kayako/generic_field.rb b/lib/sequencer/sequence/import/kayako/generic_field.rb new file mode 100644 index 000000000..cb18b971b --- /dev/null +++ b/lib/sequencer/sequence/import/kayako/generic_field.rb @@ -0,0 +1,20 @@ +# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/ + +class Sequencer + class Sequence + module Import + module Kayako + class GenericField < Sequencer::Sequence::Base + + def self.sequence + [ + 'Import::Kayako::Request', + 'Import::Kayako::Resources', + 'Import::Kayako::Perform', + ] + end + end + end + end + end +end diff --git a/lib/sequencer/sequence/import/kayako/generic_object.rb b/lib/sequencer/sequence/import/kayako/generic_object.rb new file mode 100644 index 000000000..ac834052f --- /dev/null +++ b/lib/sequencer/sequence/import/kayako/generic_object.rb @@ -0,0 +1,24 @@ +# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/ + +class Sequencer + class Sequence + module Import + module Kayako + class GenericObject < Sequencer::Sequence::Base + + def self.sequence + [ + 'Import::Kayako::Request', + 'Import::Kayako::Resources', + 'Import::Kayako::ModelClass', + 'Import::Kayako::ObjectCount', + 'Import::Common::ImportJob::Statistics::Update', + 'Import::Common::ImportJob::Statistics::Store', + 'Import::Kayako::Perform', + ] + end + end + end + end + end +end diff --git a/lib/sequencer/sequence/import/kayako/organization.rb b/lib/sequencer/sequence/import/kayako/organization.rb new file mode 100644 index 000000000..30a63a693 --- /dev/null +++ b/lib/sequencer/sequence/import/kayako/organization.rb @@ -0,0 +1,29 @@ +# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/ + +class Sequencer + class Sequence + module Import + module Kayako + class Organization < Sequencer::Sequence::Base + + def self.sequence + [ + 'Common::ModelClass::Organization', + 'Import::Kayako::Organization::Mapping', + 'Import::Kayako::Mapping::CustomFields', + 'Import::Common::Model::Attributes::AddByIds', + 'Import::Common::Model::FindBy::Name', + 'Import::Common::Model::Update', + 'Import::Common::Model::Create', + 'Import::Common::Model::Save', + 'Import::Kayako::MapId', + 'Import::Common::Model::Statistics::Diff::ModelKey', + 'Import::Common::ImportJob::Statistics::Update', + 'Import::Common::ImportJob::Statistics::Store', + ] + end + end + end + end + end +end diff --git a/lib/sequencer/sequence/import/kayako/organization_field.rb b/lib/sequencer/sequence/import/kayako/organization_field.rb new file mode 100644 index 000000000..0b16dc23a --- /dev/null +++ b/lib/sequencer/sequence/import/kayako/organization_field.rb @@ -0,0 +1,24 @@ +# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/ + +class Sequencer + class Sequence + module Import + module Kayako + class OrganizationField < Sequencer::Sequence::Base + + def self.sequence + [ + 'Common::ModelClass::Organization', + 'Import::Kayako::ObjectAttribute::Skip', + 'Import::Kayako::ObjectAttribute::SanitizedName', + 'Import::Kayako::ObjectAttribute::Config', + 'Import::Kayako::ObjectAttribute::Add', + 'Import::Kayako::ObjectAttribute::MigrationExecute', + 'Import::Kayako::ObjectAttribute::FieldMap', + ] + end + end + end + end + end +end diff --git a/lib/sequencer/sequence/import/kayako/post.rb b/lib/sequencer/sequence/import/kayako/post.rb new file mode 100644 index 000000000..3a94daebc --- /dev/null +++ b/lib/sequencer/sequence/import/kayako/post.rb @@ -0,0 +1,30 @@ +# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/ + +class Sequencer + class Sequence + module Import + module Kayako + class Post < Sequencer::Sequence::Base + def self.sequence + [ + 'Common::ModelClass::Ticket::Article', + 'Import::Kayako::Common::CreatedById', + 'Import::Kayako::Common::ArticleSenderId', + 'Import::Kayako::Common::ArticleSourceChannel', + 'Import::Kayako::Post::Mapping', + 'Import::Kayako::Post::InlineImages', + 'Import::Kayako::Mapping::Timestamps', + 'Import::Kayako::Post::UnsetInstance', + 'Import::Common::Model::FindBy::MessageId', + 'Import::Common::Model::Update', + 'Import::Common::Model::Create', + 'Import::Common::Model::Save', + 'Import::Kayako::MapId', + 'Import::Kayako::Post::Attachments', + ] + end + end + end + end + end +end diff --git a/lib/sequencer/sequence/import/kayako/posts.rb b/lib/sequencer/sequence/import/kayako/posts.rb new file mode 100644 index 000000000..48252ecdf --- /dev/null +++ b/lib/sequencer/sequence/import/kayako/posts.rb @@ -0,0 +1,21 @@ +# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/ + +class Sequencer + class Sequence + module Import + module Kayako + class Posts < Sequencer::Sequence::Base + + def self.sequence + [ + 'Import::Kayako::Request', + 'Import::Kayako::Resources', + 'Import::Kayako::ModelClass', + 'Import::Kayako::Perform', + ] + end + end + end + end + end +end diff --git a/lib/sequencer/sequence/import/kayako/team.rb b/lib/sequencer/sequence/import/kayako/team.rb new file mode 100644 index 000000000..fd3aa1945 --- /dev/null +++ b/lib/sequencer/sequence/import/kayako/team.rb @@ -0,0 +1,28 @@ +# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/ + +class Sequencer + class Sequence + module Import + module Kayako + class Team < Sequencer::Sequence::Base + + def self.sequence + [ + 'Common::ModelClass::Group', + 'Import::Kayako::Team::Mapping', + 'Import::Common::Model::Attributes::AddByIds', + 'Import::Common::Model::FindBy::Name', + 'Import::Common::Model::Update', + 'Import::Common::Model::Create', + 'Import::Common::Model::Save', + 'Import::Kayako::MapId', + 'Import::Common::Model::Statistics::Diff::ModelKey', + 'Import::Common::ImportJob::Statistics::Update', + 'Import::Common::ImportJob::Statistics::Store', + ] + end + end + end + end + end +end diff --git a/lib/sequencer/sequence/import/kayako/time_entries.rb b/lib/sequencer/sequence/import/kayako/time_entries.rb new file mode 100644 index 000000000..f19156a2f --- /dev/null +++ b/lib/sequencer/sequence/import/kayako/time_entries.rb @@ -0,0 +1,21 @@ +# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/ + +class Sequencer + class Sequence + module Import + module Kayako + class TimeEntries < Sequencer::Sequence::Base + + def self.sequence + [ + 'Import::Kayako::Request', + 'Import::Kayako::Resources', + 'Import::Kayako::ModelClass', + 'Import::Kayako::Perform', + ] + end + end + end + end + end +end diff --git a/lib/sequencer/sequence/import/kayako/time_entry.rb b/lib/sequencer/sequence/import/kayako/time_entry.rb new file mode 100644 index 000000000..f2311f93c --- /dev/null +++ b/lib/sequencer/sequence/import/kayako/time_entry.rb @@ -0,0 +1,26 @@ +# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/ + +class Sequencer + class Sequence + module Import + module Kayako + class TimeEntry < Sequencer::Sequence::Base + + def self.sequence + [ + 'Common::ModelClass::Ticket::TimeAccounting', + 'Import::Kayako::TimeEntry::Skip', + 'Import::Kayako::Common::CreatedById', + 'Import::Kayako::TimeEntry::Mapping', + 'Import::Kayako::Mapping::Timestamps', + 'Import::Common::Model::FindBy::TimeAccountingAttributes', + 'Import::Common::Model::Update', + 'Import::Common::Model::Create', + 'Import::Common::Model::Save', + ] + end + end + end + end + end +end diff --git a/lib/sequencer/sequence/import/kayako/user.rb b/lib/sequencer/sequence/import/kayako/user.rb new file mode 100644 index 000000000..0aa7d8c9d --- /dev/null +++ b/lib/sequencer/sequence/import/kayako/user.rb @@ -0,0 +1,37 @@ +# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/ + +class Sequencer + class Sequence + module Import + module Kayako + class User < Sequencer::Sequence::Base + + def self.sequence + [ + 'Import::Kayako::User::Identifier', + 'Import::Kayako::User::Login', + 'Import::Kayako::User::Initiator', + 'Import::Kayako::User::Password', + 'Import::Kayako::User::Roles', + 'Import::Kayako::User::GroupIds', + 'Import::Kayako::User::OrganizationId', + 'Common::ModelClass::User', + 'Import::Kayako::User::Mapping', + 'Import::Kayako::Mapping::Timestamps', + 'Import::Kayako::Mapping::CustomFields', + 'Import::Common::Model::Attributes::AddByIds', + 'Import::Common::Model::FindBy::UserAttributes', + 'Import::Common::Model::Update', + 'Import::Common::Model::Create', + 'Import::Common::Model::Save', + 'Import::Kayako::MapId', + 'Import::Common::Model::Statistics::Diff::ModelKey', + 'Import::Common::ImportJob::Statistics::Update', + 'Import::Common::ImportJob::Statistics::Store', + ] + end + end + end + end + end +end diff --git a/lib/sequencer/sequence/import/kayako/user_field.rb b/lib/sequencer/sequence/import/kayako/user_field.rb new file mode 100644 index 000000000..eb0a6490d --- /dev/null +++ b/lib/sequencer/sequence/import/kayako/user_field.rb @@ -0,0 +1,24 @@ +# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/ + +class Sequencer + class Sequence + module Import + module Kayako + class UserField < Sequencer::Sequence::Base + + def self.sequence + [ + 'Common::ModelClass::User', + 'Import::Kayako::ObjectAttribute::Skip', + 'Import::Kayako::ObjectAttribute::SanitizedName', + 'Import::Kayako::ObjectAttribute::Config', + 'Import::Kayako::ObjectAttribute::Add', + 'Import::Kayako::ObjectAttribute::MigrationExecute', + 'Import::Kayako::ObjectAttribute::FieldMap', + ] + end + end + end + end + end +end diff --git a/lib/sequencer/unit/common/model_class/object_manager/attribute.rb b/lib/sequencer/unit/common/model_class/object_manager/attribute.rb new file mode 100644 index 000000000..0868401be --- /dev/null +++ b/lib/sequencer/unit/common/model_class/object_manager/attribute.rb @@ -0,0 +1,14 @@ +# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/ + +class Sequencer + class Unit + module Common + module ModelClass + module ObjectManager + class Attribute < Sequencer::Unit::Common::ModelClass::Base + end + end + end + end + end +end diff --git a/lib/sequencer/unit/import/freshdesk/ticket/conversations.rb b/lib/sequencer/unit/import/freshdesk/ticket/conversations.rb index 01c5701f9..d1c8b7bba 100644 --- a/lib/sequencer/unit/import/freshdesk/ticket/conversations.rb +++ b/lib/sequencer/unit/import/freshdesk/ticket/conversations.rb @@ -14,10 +14,6 @@ class Sequencer uses :resource - def object - 'Conversation' - end - def sequence_name 'Sequencer::Sequence::Import::Freshdesk::Conversations'.freeze end diff --git a/lib/sequencer/unit/import/kayako/case/customer_id.rb b/lib/sequencer/unit/import/kayako/case/customer_id.rb new file mode 100644 index 000000000..8da3a0581 --- /dev/null +++ b/lib/sequencer/unit/import/kayako/case/customer_id.rb @@ -0,0 +1,22 @@ +# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/ + +class Sequencer + class Unit + module Import + module Kayako + module Case + class CustomerId < Sequencer::Unit::Common::Provider::Named + + uses :resource, :id_map + + private + + def customer_id + id_map['User'].fetch(resource['requester']&.fetch('id'), 1) + end + end + end + end + end + end +end diff --git a/lib/sequencer/unit/import/kayako/case/group_id.rb b/lib/sequencer/unit/import/kayako/case/group_id.rb new file mode 100644 index 000000000..708b4f901 --- /dev/null +++ b/lib/sequencer/unit/import/kayako/case/group_id.rb @@ -0,0 +1,22 @@ +# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/ + +class Sequencer + class Unit + module Import + module Kayako + module Case + class GroupId < Sequencer::Unit::Common::Provider::Named + + uses :resource, :id_map + + private + + def group_id + id_map['Group'].fetch(resource['assigned_team']&.fetch('id'), 1) + end + end + end + end + end + end +end diff --git a/lib/sequencer/unit/import/kayako/case/mapping.rb b/lib/sequencer/unit/import/kayako/case/mapping.rb new file mode 100644 index 000000000..d3227b942 --- /dev/null +++ b/lib/sequencer/unit/import/kayako/case/mapping.rb @@ -0,0 +1,37 @@ +# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/ + +class Sequencer + class Unit + module Import + module Kayako + module Case + class Mapping < Sequencer::Unit::Base + include ::Sequencer::Unit::Import::Common::Mapping::Mixin::ProvideMapped + + uses :resource, :customer_id, :owner_id, :group_id, :organization_id, :priority_id, :state_id, + :created_by_id, :updated_by_id, :type + + def process + provide_mapped do + { + id: resource['id'], + number: resource['id'], + title: resource['subject'], + owner_id: owner_id, + group_id: group_id, + customer_id: customer_id, + organization_id: organization_id, + priority_id: priority_id, + state_id: state_id, + type: type, + updated_by_id: updated_by_id, + created_by_id: created_by_id, + } + end + end + end + end + end + end + end +end diff --git a/lib/sequencer/unit/import/kayako/case/organization_id.rb b/lib/sequencer/unit/import/kayako/case/organization_id.rb new file mode 100644 index 000000000..feb4340c6 --- /dev/null +++ b/lib/sequencer/unit/import/kayako/case/organization_id.rb @@ -0,0 +1,28 @@ +# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/ + +class Sequencer + class Unit + module Import + module Kayako + module Case + class OrganizationId < Sequencer::Unit::Common::Provider::Named + + uses :resource, :id_map + + private + + def organization_id + return if organization.nil? + + id_map['Organization'][organization['id']] + end + + def organization + resource['requester']&.fetch('organization') + end + end + end + end + end + end +end diff --git a/lib/sequencer/unit/import/kayako/case/owner_id.rb b/lib/sequencer/unit/import/kayako/case/owner_id.rb new file mode 100644 index 000000000..b1eae5ea3 --- /dev/null +++ b/lib/sequencer/unit/import/kayako/case/owner_id.rb @@ -0,0 +1,22 @@ +# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/ + +class Sequencer + class Unit + module Import + module Kayako + module Case + class OwnerId < Sequencer::Unit::Common::Provider::Named + + uses :resource, :id_map + + private + + def owner_id + id_map['User'].fetch(resource['assigned_agent']&.fetch('id'), 1) + end + end + end + end + end + end +end diff --git a/lib/sequencer/unit/import/kayako/case/posts.rb b/lib/sequencer/unit/import/kayako/case/posts.rb new file mode 100644 index 000000000..64d73a3f3 --- /dev/null +++ b/lib/sequencer/unit/import/kayako/case/posts.rb @@ -0,0 +1,35 @@ +# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/ + +class Sequencer + class Unit + module Import + module Kayako + module Case + class Posts < Sequencer::Unit::Import::Kayako::SubSequence::SubObject + prepend ::Sequencer::Unit::Import::Common::Model::Mixin::Skip::Action + + optional :action + + skip_action :skipped, :failed + + uses :resource + + def object + 'Post' + end + + def sequence_name + 'Sequencer::Sequence::Import::Kayako::Posts'.freeze + end + + def request_params + super.merge( + ticket: resource, + ) + end + end + end + end + end + end +end diff --git a/lib/sequencer/unit/import/kayako/case/priority_id.rb b/lib/sequencer/unit/import/kayako/case/priority_id.rb new file mode 100644 index 000000000..d0ca0f755 --- /dev/null +++ b/lib/sequencer/unit/import/kayako/case/priority_id.rb @@ -0,0 +1,36 @@ +# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/ + +class Sequencer + class Unit + module Import + module Kayako + module Case + class PriorityId < Sequencer::Unit::Common::Provider::Named + + uses :resource + + private + + def priority_id + ::Ticket::Priority.select(:id).find_by(name: local).id + end + + def local + mapping.fetch(resource['priority']&.fetch('level'), mapping[nil]) + end + + def mapping + { + 1 => '1 low', + nil => '2 normal', + 2 => '2 normal', + 3 => '3 high', + 4 => '3 high', + }.freeze + end + end + end + end + end + end +end diff --git a/lib/sequencer/unit/import/kayako/case/skip/deleted.rb b/lib/sequencer/unit/import/kayako/case/skip/deleted.rb new file mode 100644 index 000000000..18924aa39 --- /dev/null +++ b/lib/sequencer/unit/import/kayako/case/skip/deleted.rb @@ -0,0 +1,26 @@ +# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/ + +class Sequencer + class Unit + module Import + module Kayako + module Case + module Skip + class Deleted < Sequencer::Unit::Base + + uses :resource + provides :action + + def process + return if resource['state'] != 'TRASH' + + logger.info { "Skipping. Kayako Case ID '#{resource['id']}' is in 'TRASH' state." } + state.provide(:action, :skipped) + end + end + end + end + end + end + end +end diff --git a/lib/sequencer/unit/import/kayako/case/skip/suspended.rb b/lib/sequencer/unit/import/kayako/case/skip/suspended.rb new file mode 100644 index 000000000..d16030d80 --- /dev/null +++ b/lib/sequencer/unit/import/kayako/case/skip/suspended.rb @@ -0,0 +1,26 @@ +# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/ + +class Sequencer + class Unit + module Import + module Kayako + module Case + module Skip + class Suspended < Sequencer::Unit::Base + + uses :resource + provides :action + + def process + return if resource['state'] != 'SUSPENDED' + + logger.info { "Skipping. Kayako Case ID '#{resource['id']}' is in 'SUSPENDED' state." } + state.provide(:action, :skipped) + end + end + end + end + end + end + end +end diff --git a/lib/sequencer/unit/import/kayako/case/state_id.rb b/lib/sequencer/unit/import/kayako/case/state_id.rb new file mode 100644 index 000000000..8ea079033 --- /dev/null +++ b/lib/sequencer/unit/import/kayako/case/state_id.rb @@ -0,0 +1,37 @@ +# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/ + +class Sequencer + class Unit + module Import + module Kayako + module Case + class StateId < Sequencer::Unit::Common::Provider::Named + + uses :resource + + private + + def state_id + ::Ticket::State.select(:id).find_by(name: local).id + end + + def local + mapping.fetch(resource['status']['type'], 'open') + end + + def mapping + { + 'NEW' => 'new', + 'OPEN' => 'open', + 'PENDING' => 'pending reminder', + 'COMPLETED' => 'closed', + 'CLOSED' => 'closed', + 'CUSTOM' => 'open', + }.freeze + end + end + end + end + end + end +end diff --git a/lib/sequencer/unit/import/kayako/case/tags.rb b/lib/sequencer/unit/import/kayako/case/tags.rb new file mode 100644 index 000000000..78b0a3136 --- /dev/null +++ b/lib/sequencer/unit/import/kayako/case/tags.rb @@ -0,0 +1,22 @@ +# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/ + +class Sequencer + class Unit + module Import + module Kayako + module Case + class Tags < Sequencer::Unit::Common::Model::Tags + + uses :resource + + private + + def tags + resource['tags']&.map { |tag| tag['name'] } + end + end + end + end + end + end +end diff --git a/lib/sequencer/unit/import/kayako/case/type.rb b/lib/sequencer/unit/import/kayako/case/type.rb new file mode 100644 index 000000000..3914237ea --- /dev/null +++ b/lib/sequencer/unit/import/kayako/case/type.rb @@ -0,0 +1,23 @@ +# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/ + +class Sequencer + class Unit + module Import + module Kayako + module Case + class Type < Sequencer::Unit::Common::Provider::Named + + uses :resource + + private + + def type + type = resource['type']&.fetch('type') + type&.capitalize + end + end + end + end + end + end +end diff --git a/lib/sequencer/unit/import/kayako/case/updated_by_id.rb b/lib/sequencer/unit/import/kayako/case/updated_by_id.rb new file mode 100644 index 000000000..ab82beb9d --- /dev/null +++ b/lib/sequencer/unit/import/kayako/case/updated_by_id.rb @@ -0,0 +1,22 @@ +# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/ + +class Sequencer + class Unit + module Import + module Kayako + module Case + class UpdatedById < Sequencer::Unit::Common::Provider::Named + + uses :resource, :id_map, :created_by_id + + private + + def updated_by_id + id_map['User'].fetch(resource['last_updated_by']&.fetch('id'), created_by_id) + end + end + end + end + end + end +end diff --git a/lib/sequencer/unit/import/kayako/case_fields.rb b/lib/sequencer/unit/import/kayako/case_fields.rb new file mode 100644 index 000000000..ffb40f5c3 --- /dev/null +++ b/lib/sequencer/unit/import/kayako/case_fields.rb @@ -0,0 +1,12 @@ +# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/ + +class Sequencer + class Unit + module Import + module Kayako + class CaseFields < Sequencer::Unit::Import::Kayako::SubSequence::Field + end + end + end + end +end diff --git a/lib/sequencer/unit/import/kayako/cases.rb b/lib/sequencer/unit/import/kayako/cases.rb new file mode 100644 index 000000000..966f8ca55 --- /dev/null +++ b/lib/sequencer/unit/import/kayako/cases.rb @@ -0,0 +1,12 @@ +# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/ + +class Sequencer + class Unit + module Import + module Kayako + class Cases < Sequencer::Unit::Import::Kayako::SubSequence::Object + end + end + end + end +end diff --git a/lib/sequencer/unit/import/kayako/common/article_sender_id.rb b/lib/sequencer/unit/import/kayako/common/article_sender_id.rb new file mode 100644 index 000000000..6dd94b7b9 --- /dev/null +++ b/lib/sequencer/unit/import/kayako/common/article_sender_id.rb @@ -0,0 +1,33 @@ +# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/ + +class Sequencer + class Unit + module Import + module Kayako + module Common + class ArticleSenderId < Sequencer::Unit::Common::Provider::Named + + uses :created_by_id + + private + + def article_sender_id + return article_sender('Customer') if author.role?('Customer') + return article_sender('Agent') if author.role?('Agent') + + article_sender('System') + end + + def author + @author ||= ::User.find(created_by_id) + end + + def article_sender(name) + ::Ticket::Article::Sender.select(:id).find_by(name: name).id + end + end + end + end + end + end +end diff --git a/lib/sequencer/unit/import/kayako/common/article_source_channel.rb b/lib/sequencer/unit/import/kayako/common/article_source_channel.rb new file mode 100644 index 000000000..3d52c5f92 --- /dev/null +++ b/lib/sequencer/unit/import/kayako/common/article_source_channel.rb @@ -0,0 +1,26 @@ +# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/ + +class Sequencer + class Unit + module Import + module Kayako + module Common + class ArticleSourceChannel < Sequencer::Unit::Common::Provider::Named + + uses :resource, :id_map + + private + + def article_source_channel + channel = resource['source_channel']&.fetch('type') + + return if !channel + + "Sequencer::Unit::Import::Kayako::Post::Channel::#{channel.capitalize}".constantize.new(resource) + end + end + end + end + end + end +end diff --git a/lib/sequencer/unit/import/kayako/common/created_by_id.rb b/lib/sequencer/unit/import/kayako/common/created_by_id.rb new file mode 100644 index 000000000..326a93fe0 --- /dev/null +++ b/lib/sequencer/unit/import/kayako/common/created_by_id.rb @@ -0,0 +1,22 @@ +# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/ + +class Sequencer + class Unit + module Import + module Kayako + module Common + class CreatedById < Sequencer::Unit::Common::Provider::Named + + uses :resource, :id_map + + private + + def created_by_id + id_map['User'].fetch(resource['creator']&.fetch('id'), 1) + end + end + end + end + end + end +end diff --git a/lib/sequencer/unit/import/kayako/default_language.rb b/lib/sequencer/unit/import/kayako/default_language.rb new file mode 100644 index 000000000..42bab6c1b --- /dev/null +++ b/lib/sequencer/unit/import/kayako/default_language.rb @@ -0,0 +1,43 @@ +# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/ + +class Sequencer + class Unit + module Import + module Kayako + class DefaultLanguage < Sequencer::Unit::Base + include ::Sequencer::Unit::Import::Kayako::Requester + + provides :default_language + + def process + state.provide(:default_language, default_language) + end + + private + + def default_language + settings = fetch_settings + + default_language_setting = settings.detect { |item| item['name'] == 'default_language' } + + default_language_setting['value'] || 'en-us' + end + + def fetch_settings + response = request( + api_path: 'settings' + ) + + body = JSON.parse(response.body) + body['data'] + rescue => e + logger.error 'Error when fetching settings for default language' + logger.error e + + nil + end + end + end + end + end +end diff --git a/lib/sequencer/unit/import/kayako/field_map.rb b/lib/sequencer/unit/import/kayako/field_map.rb new file mode 100644 index 000000000..639d1704f --- /dev/null +++ b/lib/sequencer/unit/import/kayako/field_map.rb @@ -0,0 +1,16 @@ +# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/ + +class Sequencer + class Unit + module Import + module Kayako + class FieldMap < Sequencer::Unit::Common::Provider::Named + + def field_map + {} + end + end + end + end + end +end diff --git a/lib/sequencer/unit/import/kayako/id_map.rb b/lib/sequencer/unit/import/kayako/id_map.rb new file mode 100644 index 000000000..19770e77c --- /dev/null +++ b/lib/sequencer/unit/import/kayako/id_map.rb @@ -0,0 +1,16 @@ +# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/ + +class Sequencer + class Unit + module Import + module Kayako + class IdMap < Sequencer::Unit::Common::Provider::Named + + def id_map + {} + end + end + end + end + end +end diff --git a/lib/sequencer/unit/import/kayako/import_settings_unset.rb b/lib/sequencer/unit/import/kayako/import_settings_unset.rb new file mode 100644 index 000000000..074f49dd6 --- /dev/null +++ b/lib/sequencer/unit/import/kayako/import_settings_unset.rb @@ -0,0 +1,16 @@ +# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/ + +class Sequencer + class Unit + module Import + module Kayako + class ImportSettingsUnset < Sequencer::Unit::Base + def process + Setting.set('import_kayako_endpoint_username', nil) + Setting.set('import_kayako_endpoint_password', nil) + end + end + end + end + end +end diff --git a/lib/sequencer/unit/import/kayako/map_id.rb b/lib/sequencer/unit/import/kayako/map_id.rb new file mode 100644 index 000000000..a43abf9e9 --- /dev/null +++ b/lib/sequencer/unit/import/kayako/map_id.rb @@ -0,0 +1,24 @@ +# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/ + +class Sequencer + class Unit + module Import + module Kayako + class MapId < Sequencer::Unit::Base + prepend ::Sequencer::Unit::Import::Common::Model::Mixin::Skip::Action + + optional :action + + skip_action :skipped, :failed + + uses :id_map, :model_class, :resource, :instance + + def process + id_map[model_class.name] ||= {} + id_map[model_class.name][resource['id']] = instance.id + end + end + end + end + end +end diff --git a/lib/sequencer/unit/import/kayako/mapping/custom_fields.rb b/lib/sequencer/unit/import/kayako/mapping/custom_fields.rb new file mode 100644 index 000000000..4ab910abc --- /dev/null +++ b/lib/sequencer/unit/import/kayako/mapping/custom_fields.rb @@ -0,0 +1,48 @@ +# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/ + +class Sequencer + class Unit + module Import + module Kayako + module Mapping + class CustomFields < Sequencer::Unit::Base + include ::Sequencer::Unit::Import::Common::Mapping::Mixin::ProvideMapped + + uses :resource, :field_map, :model_class, :default_language + + def process + provide_mapped do + custom_fields || {} + end + end + + private + + def custom_fields + resource['custom_fields']&.each_with_object({}) do |item, result| + field = item['field'] + local_name = custom_fields_map[field['key']] + + next if local_name.nil? || item['value'].empty? + + field_type_instance = attribute_type_instance(field) + + result[ local_name.to_sym ] = field_type_instance.local_value(item['value']) + end + end + + def custom_fields_map + @custom_fields_map ||= field_map[model_class.name] + end + + def attribute_type_instance(field) + "Sequencer::Unit::Import::Kayako::ObjectAttribute::AttributeType::#{field['type'].capitalize}".constantize.new(field, default_language) + rescue + nil + end + end + end + end + end + end +end diff --git a/lib/sequencer/unit/import/kayako/mapping/timestamps.rb b/lib/sequencer/unit/import/kayako/mapping/timestamps.rb new file mode 100644 index 000000000..0fe5a0e9f --- /dev/null +++ b/lib/sequencer/unit/import/kayako/mapping/timestamps.rb @@ -0,0 +1,26 @@ +# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/ + +class Sequencer + class Unit + module Import + module Kayako + module Mapping + class Timestamps < Sequencer::Unit::Base + include ::Sequencer::Unit::Import::Common::Mapping::Mixin::ProvideMapped + + uses :resource + + def process + provide_mapped do + { + created_at: resource['created_at'], + updated_at: resource['updated_at'], + } + end + end + end + end + end + end + end +end diff --git a/lib/sequencer/unit/import/kayako/model_class.rb b/lib/sequencer/unit/import/kayako/model_class.rb new file mode 100644 index 000000000..1d18be336 --- /dev/null +++ b/lib/sequencer/unit/import/kayako/model_class.rb @@ -0,0 +1,29 @@ +# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/ + +class Sequencer + class Unit + module Import + module Kayako + class ModelClass < Sequencer::Unit::Common::Provider::Named + + uses :object + + MAP = { + 'Organization' => ::Organization, + 'User' => ::User, + 'Team' => ::Group, + 'Case' => ::Ticket, + 'Post' => ::Ticket::Article, + 'TimeEntry' => ::Ticket::TimeAccounting, + }.freeze + + private + + def model_class + MAP[object] + end + end + end + end + end +end diff --git a/lib/sequencer/unit/import/kayako/object_attribute/add.rb b/lib/sequencer/unit/import/kayako/object_attribute/add.rb new file mode 100644 index 000000000..08295809c --- /dev/null +++ b/lib/sequencer/unit/import/kayako/object_attribute/add.rb @@ -0,0 +1,23 @@ +# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/ + +class Sequencer + class Unit + module Import + module Kayako + module ObjectAttribute + class Add < Sequencer::Unit::Base + prepend ::Sequencer::Unit::Import::Common::Model::Mixin::Skip::Action + + skip_any_action + + uses :config + + def process + ObjectManager::Attribute.add(config) + end + end + end + end + end + end +end diff --git a/lib/sequencer/unit/import/kayako/object_attribute/attribute_type/base.rb b/lib/sequencer/unit/import/kayako/object_attribute/attribute_type/base.rb new file mode 100644 index 000000000..da879199a --- /dev/null +++ b/lib/sequencer/unit/import/kayako/object_attribute/attribute_type/base.rb @@ -0,0 +1,91 @@ +# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/ + +class Sequencer + class Unit + module Import + module Kayako + module ObjectAttribute + module AttributeType + class Base + attr_reader :attribute, :default_language + + def initialize(attribute, default_language) + @attribute = attribute + @default_language = default_language + end + + def config + { + display: attribute['title'], + data_type: data_type, + data_option: data_option, + editable: true, + active: attribute['is_enabled'], + screens: screens, + position: attribute['sort_order'], + created_by_id: 1, + updated_by_id: 1, + } + end + + def local_value(value) + value + end + + private + + def screens + default = { + view: { + '-all-' => { + shown: true, + null: true, + }, + Customer: { + shown: attribute['is_visible_to_customers'], + null: true, + }, + }, + edit: { + '-all-' => { + shown: true, + null: true, + }, + Customer: { + shown: attribute['is_customer_editable'], + null: !attribute['is_required_for_customers'], + }, + } + } + + if attribute['is_required_for_agents'] + default[:edit]['ticket.agent'] = { + shown: true, + required: true, + } + end + + default + end + + def data_option + { + null: true, + note: '', + }.merge(data_type_specific_options) + end + + def data_type_specific_options + {} + end + + def data_type + attribute['type'].downcase + end + end + end + end + end + end + end +end diff --git a/lib/sequencer/unit/import/kayako/object_attribute/attribute_type/cascadingselect.rb b/lib/sequencer/unit/import/kayako/object_attribute/attribute_type/cascadingselect.rb new file mode 100644 index 000000000..8d87a0ab7 --- /dev/null +++ b/lib/sequencer/unit/import/kayako/object_attribute/attribute_type/cascadingselect.rb @@ -0,0 +1,64 @@ +# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/ + +class Sequencer + class Unit + module Import + module Kayako + module ObjectAttribute + module AttributeType + class Cascadingselect < Sequencer::Unit::Import::Kayako::ObjectAttribute::AttributeType::Select + def local_value(value) + super.gsub('\\', '::') + end + + private + + def data_type + 'tree_select' + end + + def options + result = [] + + attribute['options'].each do |item| + locale_item = item['values'].detect { |value| value['locale'] == default_language } + + next if locale_item['translation'].nil? + + transformed_tree_path = locale_item['translation'].gsub('\\', '::') + + process_option(transformed_tree_path, result) + end + + result + end + + def process_option(tree_path, current_options, parent_tree_path = nil) + fragments = tree_path.split('::') + + current_fragment = fragments.shift + + current_tree_path = parent_tree_path.nil? ? current_fragment : "#{parent_tree_path}::#{current_fragment}" + + current_option = current_options.detect { |option| option[:value] == current_tree_path } + + remaining_tree_path = fragments.join('::') + + if current_option.nil? + current_options.push({ name: current_fragment, value: current_tree_path }) + + current_option = current_options.last + end + + return if remaining_tree_path.empty? + + current_option[:children] ||= [] + process_option(remaining_tree_path, current_option[:children], current_tree_path) + end + end + end + end + end + end + end +end diff --git a/lib/sequencer/unit/import/kayako/object_attribute/attribute_type/date.rb b/lib/sequencer/unit/import/kayako/object_attribute/attribute_type/date.rb new file mode 100644 index 000000000..7682758ce --- /dev/null +++ b/lib/sequencer/unit/import/kayako/object_attribute/attribute_type/date.rb @@ -0,0 +1,25 @@ +# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/ + +class Sequencer + class Unit + module Import + module Kayako + module ObjectAttribute + module AttributeType + class Date < Sequencer::Unit::Import::Kayako::ObjectAttribute::AttributeType::Base + private + + def data_type_specific_options + { + future: true, + past: true, + diff: 0, + } + end + end + end + end + end + end + end +end diff --git a/lib/sequencer/unit/import/kayako/object_attribute/attribute_type/decimal.rb b/lib/sequencer/unit/import/kayako/object_attribute/attribute_type/decimal.rb new file mode 100644 index 000000000..b4c1c13a1 --- /dev/null +++ b/lib/sequencer/unit/import/kayako/object_attribute/attribute_type/decimal.rb @@ -0,0 +1,16 @@ +# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/ + +class Sequencer + class Unit + module Import + module Kayako + module ObjectAttribute + module AttributeType + class Decimal < Sequencer::Unit::Import::Kayako::ObjectAttribute::AttributeType::Text + end + end + end + end + end + end +end diff --git a/lib/sequencer/unit/import/kayako/object_attribute/attribute_type/numeric.rb b/lib/sequencer/unit/import/kayako/object_attribute/attribute_type/numeric.rb new file mode 100644 index 000000000..17b1bfc7d --- /dev/null +++ b/lib/sequencer/unit/import/kayako/object_attribute/attribute_type/numeric.rb @@ -0,0 +1,28 @@ +# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/ + +class Sequencer + class Unit + module Import + module Kayako + module ObjectAttribute + module AttributeType + class Numeric < Sequencer::Unit::Import::Kayako::ObjectAttribute::AttributeType::Base + private + + def data_type + 'integer' + end + + def data_type_specific_options + { + min: 0, + max: 999_999_999, + } + end + end + end + end + end + end + end +end diff --git a/lib/sequencer/unit/import/kayako/object_attribute/attribute_type/radio.rb b/lib/sequencer/unit/import/kayako/object_attribute/attribute_type/radio.rb new file mode 100644 index 000000000..4586ca7d9 --- /dev/null +++ b/lib/sequencer/unit/import/kayako/object_attribute/attribute_type/radio.rb @@ -0,0 +1,16 @@ +# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/ + +class Sequencer + class Unit + module Import + module Kayako + module ObjectAttribute + module AttributeType + class Radio < Sequencer::Unit::Import::Kayako::ObjectAttribute::AttributeType::Select + end + end + end + end + end + end +end diff --git a/lib/sequencer/unit/import/kayako/object_attribute/attribute_type/regex.rb b/lib/sequencer/unit/import/kayako/object_attribute/attribute_type/regex.rb new file mode 100644 index 000000000..cb768f0c6 --- /dev/null +++ b/lib/sequencer/unit/import/kayako/object_attribute/attribute_type/regex.rb @@ -0,0 +1,23 @@ +# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/ + +class Sequencer + class Unit + module Import + module Kayako + module ObjectAttribute + module AttributeType + class Regex < Sequencer::Unit::Import::Kayako::ObjectAttribute::AttributeType::Text + private + + def data_type_specific_options + super.merge( + regex: attribute['regular_expression'], + ) + end + end + end + end + end + end + end +end diff --git a/lib/sequencer/unit/import/kayako/object_attribute/attribute_type/select.rb b/lib/sequencer/unit/import/kayako/object_attribute/attribute_type/select.rb new file mode 100644 index 000000000..f4e55ec48 --- /dev/null +++ b/lib/sequencer/unit/import/kayako/object_attribute/attribute_type/select.rb @@ -0,0 +1,44 @@ +# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/ + +class Sequencer + class Unit + module Import + module Kayako + module ObjectAttribute + module AttributeType + class Select < Sequencer::Unit::Import::Kayako::ObjectAttribute::AttributeType::Base + def local_value(value) + option_value = attribute['options'].detect { |option| option['id'] == value.to_i } + value_locale = option_value['values'].detect { |locale_item| locale_item['locale'] == default_language } + + value_locale['translation'] + end + + private + + def data_type + 'select' + end + + def data_type_specific_options + { + default: '', + options: options, + } + end + + def options + result = {} + attribute['options'].each do |item| + locale_item = item['values'].detect { |value| value['locale'] == default_language } + result[ locale_item['translation'] ] = locale_item['translation'] + end + result + end + end + end + end + end + end + end +end diff --git a/lib/sequencer/unit/import/kayako/object_attribute/attribute_type/text.rb b/lib/sequencer/unit/import/kayako/object_attribute/attribute_type/text.rb new file mode 100644 index 000000000..22e36abed --- /dev/null +++ b/lib/sequencer/unit/import/kayako/object_attribute/attribute_type/text.rb @@ -0,0 +1,28 @@ +# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/ + +class Sequencer + class Unit + module Import + module Kayako + module ObjectAttribute + module AttributeType + class Text < Sequencer::Unit::Import::Kayako::ObjectAttribute::AttributeType::Base + private + + def data_type + 'input' + end + + def data_type_specific_options + { + type: 'text', + maxlength: 255, + } + end + end + end + end + end + end + end +end diff --git a/lib/sequencer/unit/import/kayako/object_attribute/attribute_type/textarea.rb b/lib/sequencer/unit/import/kayako/object_attribute/attribute_type/textarea.rb new file mode 100644 index 000000000..5024d6120 --- /dev/null +++ b/lib/sequencer/unit/import/kayako/object_attribute/attribute_type/textarea.rb @@ -0,0 +1,24 @@ +# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/ + +class Sequencer + class Unit + module Import + module Kayako + module ObjectAttribute + module AttributeType + class Textarea < Sequencer::Unit::Import::Kayako::ObjectAttribute::AttributeType::Base + private + + def data_type_specific_options + { + type: 'textarea', + maxlength: 255, + } + end + end + end + end + end + end + end +end diff --git a/lib/sequencer/unit/import/kayako/object_attribute/attribute_type/type.rb b/lib/sequencer/unit/import/kayako/object_attribute/attribute_type/type.rb new file mode 100644 index 000000000..68b1177e2 --- /dev/null +++ b/lib/sequencer/unit/import/kayako/object_attribute/attribute_type/type.rb @@ -0,0 +1,26 @@ +# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/ + +class Sequencer + class Unit + module Import + module Kayako + module ObjectAttribute + module AttributeType + class Type < Sequencer::Unit::Import::Kayako::ObjectAttribute::AttributeType::Select + private + + def options + super.merge( + 'Question' => 'Question', + 'Task' => 'Task', + 'Problem' => 'Problem', + 'Incident' => 'Incident', + ) + end + end + end + end + end + end + end +end diff --git a/lib/sequencer/unit/import/kayako/object_attribute/attribute_type/yesno.rb b/lib/sequencer/unit/import/kayako/object_attribute/attribute_type/yesno.rb new file mode 100644 index 000000000..a59c41a17 --- /dev/null +++ b/lib/sequencer/unit/import/kayako/object_attribute/attribute_type/yesno.rb @@ -0,0 +1,35 @@ +# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/ + +class Sequencer + class Unit + module Import + module Kayako + module ObjectAttribute + module AttributeType + class Yesno < Sequencer::Unit::Import::Kayako::ObjectAttribute::AttributeType::Base + def local_value(value) + value == 'yes' + end + + private + + def data_type + 'boolean' + end + + def data_type_specific_options + { + default: false, + options: { + true => 'yes', + false => 'no', + }, + } + end + end + end + end + end + end + end +end diff --git a/lib/sequencer/unit/import/kayako/object_attribute/config.rb b/lib/sequencer/unit/import/kayako/object_attribute/config.rb new file mode 100644 index 000000000..9b8e2903d --- /dev/null +++ b/lib/sequencer/unit/import/kayako/object_attribute/config.rb @@ -0,0 +1,41 @@ +# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/ + +class Sequencer + class Unit + module Import + module Kayako + module ObjectAttribute + class Config < Sequencer::Unit::Base + prepend ::Sequencer::Unit::Import::Common::Model::Mixin::Skip::Action + include ::Sequencer::Unit::Import::Common::Model::Mixin::HandleFailure + + skip_any_action + + uses :resource, :sanitized_name, :model_class, :default_language + provides :config + + def process + attribute_config = attribute_type.config + + state.provide(:config) do + { + object: model_class.to_s, + name: sanitized_name, + }.merge(attribute_config) + end + rescue => e + logger.error "The custom field type '#{resource['type']}' can not be mapped to an internal field." + handle_failure(e) + end + + private + + def attribute_type + "Sequencer::Unit::Import::Kayako::ObjectAttribute::AttributeType::#{resource['type'].capitalize}".constantize.new(resource, default_language) + end + end + end + end + end + end +end diff --git a/lib/sequencer/unit/import/kayako/object_attribute/field_map.rb b/lib/sequencer/unit/import/kayako/object_attribute/field_map.rb new file mode 100644 index 000000000..9c9cf1c4b --- /dev/null +++ b/lib/sequencer/unit/import/kayako/object_attribute/field_map.rb @@ -0,0 +1,26 @@ +# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/ + +class Sequencer + class Unit + module Import + module Kayako + module ObjectAttribute + class FieldMap < Sequencer::Unit::Base + prepend ::Sequencer::Unit::Import::Common::Model::Mixin::Skip::Action + + skip_any_action + + optional :action + + uses :field_map, :model_class, :resource, :sanitized_name + + def process + field_map[model_class.name] ||= {} + field_map[model_class.name][ resource['key'] ] = sanitized_name + end + end + end + end + end + end +end diff --git a/lib/sequencer/unit/import/kayako/object_attribute/migration_execute.rb b/lib/sequencer/unit/import/kayako/object_attribute/migration_execute.rb new file mode 100644 index 000000000..85c762c87 --- /dev/null +++ b/lib/sequencer/unit/import/kayako/object_attribute/migration_execute.rb @@ -0,0 +1,21 @@ +# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/ + +class Sequencer + class Unit + module Import + module Kayako + module ObjectAttribute + class MigrationExecute < Sequencer::Unit::Base + prepend ::Sequencer::Unit::Import::Common::Model::Mixin::Skip::Action + + skip_any_action + + def process + ObjectManager::Attribute.migration_execute(false) + end + end + end + end + end + end +end diff --git a/lib/sequencer/unit/import/kayako/object_attribute/sanitized_name.rb b/lib/sequencer/unit/import/kayako/object_attribute/sanitized_name.rb new file mode 100644 index 000000000..807c8ca1f --- /dev/null +++ b/lib/sequencer/unit/import/kayako/object_attribute/sanitized_name.rb @@ -0,0 +1,25 @@ +# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/ + +class Sequencer + class Unit + module Import + module Kayako + module ObjectAttribute + class SanitizedName < Sequencer::Unit::Import::Common::ObjectAttribute::SanitizedName + prepend ::Sequencer::Unit::Import::Common::Model::Mixin::Skip::Action + + skip_any_action + + uses :resource + + private + + def unsanitized_name + resource['key'] + end + end + end + end + end + end +end diff --git a/lib/sequencer/unit/import/kayako/object_attribute/skip.rb b/lib/sequencer/unit/import/kayako/object_attribute/skip.rb new file mode 100644 index 000000000..d1bcf3740 --- /dev/null +++ b/lib/sequencer/unit/import/kayako/object_attribute/skip.rb @@ -0,0 +1,33 @@ +# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/ + +class Sequencer + class Unit + module Import + module Kayako + module ObjectAttribute + class Skip < Sequencer::Unit::Base + + uses :resource + provides :action + + def process + return if (!resource['is_system'] && skip_attribute_types.exclude?(resource['type'])) || allowed_system_attributes.include?(resource['key']) + + state.provide(:action, :skipped) + end + + private + + def skip_attribute_types + @skip_attribute_types ||= %w[FILE CHECKBOX] + end + + def allowed_system_attributes + @allowed_system_attributes ||= %w[type] + end + end + end + end + end + end +end diff --git a/lib/sequencer/unit/import/kayako/object_count.rb b/lib/sequencer/unit/import/kayako/object_count.rb new file mode 100644 index 000000000..1f97c4f6a --- /dev/null +++ b/lib/sequencer/unit/import/kayako/object_count.rb @@ -0,0 +1,32 @@ +# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/ + +class Sequencer + class Unit + module Import + module Kayako + class ObjectCount < Sequencer::Unit::Common::Provider::Attribute + include ::Sequencer::Unit::Import::Common::Model::Statistics::Mixin::EmptyDiff + prepend ::Sequencer::Unit::Import::Common::Model::Mixin::Skip::Action + + skip_action :skipped, :failed + + uses :model_class, :resources + + private + + def statistics_diff + { + model_key => empty_diff.merge!( + total: resources.count + ) + } + end + + def model_key + model_class.name.pluralize.to_sym + end + end + end + end + end +end diff --git a/lib/sequencer/unit/import/kayako/organization/mapping.rb b/lib/sequencer/unit/import/kayako/organization/mapping.rb new file mode 100644 index 000000000..c63e90213 --- /dev/null +++ b/lib/sequencer/unit/import/kayako/organization/mapping.rb @@ -0,0 +1,36 @@ +# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/ + +class Sequencer + class Unit + module Import + module Kayako + module Organization + class Mapping < Sequencer::Unit::Base + include ::Sequencer::Unit::Import::Common::Mapping::Mixin::ProvideMapped + + uses :resource + + def process + provide_mapped do + { + name: resource['name'], + domain: domain, + domain_assignment: domain.present?, + } + end + end + + private + + def domain + @domain ||= begin + primary_domain = resource['domains']&.detect { |item| item['is_primary'] } + primary_domain&.fetch('domain') + end + end + end + end + end + end + end +end diff --git a/lib/sequencer/unit/import/kayako/organization_fields.rb b/lib/sequencer/unit/import/kayako/organization_fields.rb new file mode 100644 index 000000000..5414b5b5f --- /dev/null +++ b/lib/sequencer/unit/import/kayako/organization_fields.rb @@ -0,0 +1,12 @@ +# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/ + +class Sequencer + class Unit + module Import + module Kayako + class OrganizationFields < Sequencer::Unit::Import::Kayako::SubSequence::Field + end + end + end + end +end diff --git a/lib/sequencer/unit/import/kayako/organizations.rb b/lib/sequencer/unit/import/kayako/organizations.rb new file mode 100644 index 000000000..fa89b37a9 --- /dev/null +++ b/lib/sequencer/unit/import/kayako/organizations.rb @@ -0,0 +1,12 @@ +# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/ + +class Sequencer + class Unit + module Import + module Kayako + class Organizations < Sequencer::Unit::Import::Kayako::SubSequence::Object + end + end + end + end +end diff --git a/lib/sequencer/unit/import/kayako/perform.rb b/lib/sequencer/unit/import/kayako/perform.rb new file mode 100644 index 000000000..418620545 --- /dev/null +++ b/lib/sequencer/unit/import/kayako/perform.rb @@ -0,0 +1,33 @@ +# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/ + +class Sequencer + class Unit + module Import + module Kayako + class Perform < Sequencer::Unit::Base + prepend ::Sequencer::Unit::Import::Common::Model::Mixin::Skip::Action + + skip_action :skipped, :failed + + uses :resources, :object, :import_job, :dry_run, :field_map, :id_map, :default_language + optional :instance + + def process + resources.each do |resource| + ::Sequencer.process("Import::Kayako::#{object}", + parameters: { + import_job: import_job, + dry_run: dry_run, + resource: resource, + default_language: default_language, + field_map: field_map, + id_map: id_map, + instance: instance, + }) + end + end + end + end + end + end +end diff --git a/lib/sequencer/unit/import/kayako/post/attachments.rb b/lib/sequencer/unit/import/kayako/post/attachments.rb new file mode 100644 index 000000000..cfebd3646 --- /dev/null +++ b/lib/sequencer/unit/import/kayako/post/attachments.rb @@ -0,0 +1,71 @@ +# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/ + +class Sequencer + class Unit + module Import + module Kayako + module Post + class Attachments < Sequencer::Unit::Base + include ::Sequencer::Unit::Import::Kayako::Requester + prepend ::Sequencer::Unit::Import::Common::Model::Mixin::Skip::Action + + optional :action + + skip_action :skipped, :failed + + uses :resource, :instance, :model_class, :dry_run + + def self.mutex + @mutex ||= Mutex.new + end + + def process + return if resource['attachments'].blank? + + download_threads.each(&:join) + end + + private + + def download_threads + resource['attachments'].map do |attachment| + Thread.new do + sync(attachment) + end + end + end + + def sync(attachment) + logger.debug { "Downloading attachment #{attachment}" } + + response = request( + api_path: attachment['url_download'].gsub("#{Setting.get('import_kayako_endpoint')}/", ''), + ) + + return if dry_run + + store_attachment(attachment, response) + rescue => e + logger.error(e) + end + + def store_attachment(attachment, response) + self.class.mutex.synchronize do + ::Store.add( + object: model_class.name, + o_id: instance.id, + data: response.body, + filename: attachment['name'], + preferences: { + 'Content-Type' => attachment['type'] + }, + created_by_id: 1 + ) + end + end + end + end + end + end + end +end diff --git a/lib/sequencer/unit/import/kayako/post/channel/base.rb b/lib/sequencer/unit/import/kayako/post/channel/base.rb new file mode 100644 index 000000000..0f2739a15 --- /dev/null +++ b/lib/sequencer/unit/import/kayako/post/channel/base.rb @@ -0,0 +1,60 @@ +# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/ + +class Sequencer + class Unit + module Import + module Kayako + module Post + module Channel + class Base + attr_reader :resource + + def initialize(resource) + @resource = resource + end + + def mapping + { + message_id: resource['id'], + internal: internal?, + from: from, + type_id: article_type_id, + } + end + + def article_type_id + return if article_type_name.nil? + + ::Ticket::Article::Type.select(:id).find_by(name: article_type_name).id + end + + private + + def internal? + false + end + + def original_post + resource['original'] + end + + def article_type_name + raise NotImplementedError + end + + def identify_key + raise NotImplementedError + end + + def from + return if resource['identity'].nil? + + resource['identity'][identify_key] + end + end + end + end + end + end + end +end diff --git a/lib/sequencer/unit/import/kayako/post/channel/facebook.rb b/lib/sequencer/unit/import/kayako/post/channel/facebook.rb new file mode 100644 index 000000000..3a2dbcaaf --- /dev/null +++ b/lib/sequencer/unit/import/kayako/post/channel/facebook.rb @@ -0,0 +1,42 @@ +# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/ + +class Sequencer + class Unit + module Import + module Kayako + module Post + module Channel + class Facebook < Sequencer::Unit::Import::Kayako::Post::Channel::Base + def mapping + super.merge( + message_id: original_post['id'], + to: to, + body: original_post['contents'], + ) + end + + private + + def article_type_name + return 'facebook direct-message' if original_post['resource_type'] == 'facebook_message' + return 'facebook feed comment' if original_post['resource_type'] == 'facebook_post_comment' + + 'facebook feed post' + end + + def identify_key + 'facebook_id' + end + + def to + return if original_post['recipient'].nil? + + original_post['recipient'][identify_key] + end + end + end + end + end + end + end +end diff --git a/lib/sequencer/unit/import/kayako/post/channel/helpcenter.rb b/lib/sequencer/unit/import/kayako/post/channel/helpcenter.rb new file mode 100644 index 000000000..3dcfc1a31 --- /dev/null +++ b/lib/sequencer/unit/import/kayako/post/channel/helpcenter.rb @@ -0,0 +1,21 @@ +# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/ + +class Sequencer + class Unit + module Import + module Kayako + module Post + module Channel + class Helpcenter < Sequencer::Unit::Import::Kayako::Post::Channel::Mail + private + + def article_type_name + 'web' + end + end + end + end + end + end + end +end diff --git a/lib/sequencer/unit/import/kayako/post/channel/mail.rb b/lib/sequencer/unit/import/kayako/post/channel/mail.rb new file mode 100644 index 000000000..75a0559aa --- /dev/null +++ b/lib/sequencer/unit/import/kayako/post/channel/mail.rb @@ -0,0 +1,65 @@ +# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/ + +class Sequencer + class Unit + module Import + module Kayako + module Post + module Channel + class Mail < Sequencer::Unit::Import::Kayako::Post::Channel::Base + def mapping + super.merge( + to: to, + cc: cc, + body: original_post['body_html'] || original_post['body_text'] || '', + content_type: 'text/html', + ) + end + + private + + def article_type_name + 'email' + end + + def identify_key + 'email' + end + + def from + return super if resource['is_requester'] || original_post['mailbox'].blank? + + original_post['mailbox']['address'] + end + + def to + recipients = build_recipients('TO') + + # Add the mailbox address to the 'TO' field if it's a requester post. + if resource['is_requester'] && original_post['mailbox'].present? + recipients = "#{original_post['mailbox']['address']}#{", #{recipients}" if recipients.present?}" + end + + recipients + end + + def cc + build_recipients('CC') + end + + def build_recipients(field_type) + return if !original_post.key?('recipients') || original_post['recipients'].empty? + + original_post['recipients'].filter_map do |recipient| + next if recipient['type'] != field_type + + recipient[identify_key] + end.join(', ') + end + end + end + end + end + end + end +end diff --git a/lib/sequencer/unit/import/kayako/post/channel/messenger.rb b/lib/sequencer/unit/import/kayako/post/channel/messenger.rb new file mode 100644 index 000000000..ce9f2f887 --- /dev/null +++ b/lib/sequencer/unit/import/kayako/post/channel/messenger.rb @@ -0,0 +1,21 @@ +# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/ + +class Sequencer + class Unit + module Import + module Kayako + module Post + module Channel + class Messenger < Sequencer::Unit::Import::Kayako::Post::Channel::Mail + private + + def article_type_name + 'chat' + end + end + end + end + end + end + end +end diff --git a/lib/sequencer/unit/import/kayako/post/channel/note.rb b/lib/sequencer/unit/import/kayako/post/channel/note.rb new file mode 100644 index 000000000..b6ba9830d --- /dev/null +++ b/lib/sequencer/unit/import/kayako/post/channel/note.rb @@ -0,0 +1,36 @@ +# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/ + +class Sequencer + class Unit + module Import + module Kayako + module Post + module Channel + class Note < Sequencer::Unit::Import::Kayako::Post::Channel::Base + def mapping + super.merge( + body: original_post['body_html'] || original_post['body_text'] || '', + content_type: 'text/html', + ) + end + + private + + def identify_key + 'email' + end + + def article_type_name + 'note' + end + + def internal? + true + end + end + end + end + end + end + end +end diff --git a/lib/sequencer/unit/import/kayako/post/channel/twitter.rb b/lib/sequencer/unit/import/kayako/post/channel/twitter.rb new file mode 100644 index 000000000..10815ccd5 --- /dev/null +++ b/lib/sequencer/unit/import/kayako/post/channel/twitter.rb @@ -0,0 +1,41 @@ +# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/ + +class Sequencer + class Unit + module Import + module Kayako + module Post + module Channel + class Twitter < Sequencer::Unit::Import::Kayako::Post::Channel::Base + def mapping + super.merge( + message_id: original_post['id'], + to: to, + body: original_post['contents'], + ) + end + + private + + def article_type_name + return 'twitter direct-message' if original_post['resource_type'] == 'twitter_message' + + 'twitter status' + end + + def identify_key + 'screen_name' + end + + def to + return if original_post['recipient'].nil? + + original_post['recipient'][identify_key] + end + end + end + end + end + end + end +end diff --git a/lib/sequencer/unit/import/kayako/post/email_address_fields.rb b/lib/sequencer/unit/import/kayako/post/email_address_fields.rb new file mode 100644 index 000000000..e3374571f --- /dev/null +++ b/lib/sequencer/unit/import/kayako/post/email_address_fields.rb @@ -0,0 +1,24 @@ +# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/ + +class Sequencer + class Unit + module Import + module Kayako + module Post + class EmailAddressFields < Sequencer::Unit::Base + + uses :resource, :id_map + provides :from, :to, :cc + + def process + state.provide(:user_id) do + user_map.fetch(resource.author_id, 1) + end + end + + end + end + end + end + end +end diff --git a/lib/sequencer/unit/import/kayako/post/inline_images.rb b/lib/sequencer/unit/import/kayako/post/inline_images.rb new file mode 100644 index 000000000..734ce072e --- /dev/null +++ b/lib/sequencer/unit/import/kayako/post/inline_images.rb @@ -0,0 +1,77 @@ +# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/ + +class Sequencer + class Unit + module Import + module Kayako + module Post + class InlineImages < Sequencer::Unit::Base + include ::Sequencer::Unit::Import::Common::Mapping::Mixin::ProvideMapped + + uses :mapped + + def process + return if !contains_inline_image?(mapped[:body]) + + provide_mapped do + { + body: replaced_inline_images, + } + end + end + + def self.inline_data(kayako_url) + @cache ||= {} + return @cache[kayako_url] if @cache[kayako_url] + + image_data = download(kayako_url) + return if image_data.blank? + + @cache[kayako_url] = "data:image/png;base64,#{Base64.strict_encode64(image_data)}" + @cache[kayako_url] + end + + def self.download(kayako_url) + logger.debug { "Downloading inline image from #{kayako_url}" } + + response = UserAgent.get( + kayako_url, + {}, + { + open_timeout: 20, + read_timeout: 240, + verify_ssl: true, + }, + ) + + return response.body if response.success? + + logger.error response.error + nil + end + + private + + def contains_inline_image?(string) + return false if string.blank? + + string.include?('kayako.com/media/url') + end + + def replaced_inline_images + body_html = Nokogiri::HTML(mapped[:body]) + + body_html.css('img').each do |node| + next if !contains_inline_image?(node['src']) + + node.attributes['src'].value = self.class.inline_data(node['src']) + end + + body_html.to_html + end + end + end + end + end + end +end diff --git a/lib/sequencer/unit/import/kayako/post/mapping.rb b/lib/sequencer/unit/import/kayako/post/mapping.rb new file mode 100644 index 000000000..8c3411eff --- /dev/null +++ b/lib/sequencer/unit/import/kayako/post/mapping.rb @@ -0,0 +1,29 @@ +# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/ + +class Sequencer + class Unit + module Import + module Kayako + module Post + class Mapping < Sequencer::Unit::Base + include ::Sequencer::Unit::Import::Common::Mapping::Mixin::ProvideMapped + + uses :instance, :resource, :created_by_id, :article_sender_id, :article_source_channel + provides :mapped + + def process + provide_mapped do + { + ticket_id: instance.id, + sender_id: article_sender_id, + created_by_id: created_by_id, + updated_by_id: created_by_id, + }.merge(article_source_channel.mapping) + end + end + end + end + end + end + end +end diff --git a/lib/sequencer/unit/import/kayako/post/unset_instance.rb b/lib/sequencer/unit/import/kayako/post/unset_instance.rb new file mode 100644 index 000000000..4b9eda937 --- /dev/null +++ b/lib/sequencer/unit/import/kayako/post/unset_instance.rb @@ -0,0 +1,15 @@ +# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/ + +class Sequencer + class Unit + module Import + module Kayako + module Post + class UnsetInstance < Sequencer::Unit::Common::UnsetAttributes + uses :instance + end + end + end + end + end +end diff --git a/lib/sequencer/unit/import/kayako/request.rb b/lib/sequencer/unit/import/kayako/request.rb new file mode 100644 index 000000000..1cb2cacab --- /dev/null +++ b/lib/sequencer/unit/import/kayako/request.rb @@ -0,0 +1,40 @@ +# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/ + +class Sequencer + class Unit + module Import + module Kayako + class Request < Sequencer::Unit::Common::Provider::Attribute + extend ::Sequencer::Unit::Import::Kayako::Requester + + uses :object, :request_params + provides :response + + private + + def response + + builder = backend.new( + object: object, + request_params: request_params + ) + + self.class.request( + api_path: builder.api_path, + params: builder.params, + ) + end + + def backend + request_class = "::Sequencer::Unit::Import::Kayako::Request::#{object}".safe_constantize + + return request_class if request_class.present? + return ::Sequencer::Unit::Import::Kayako::Request::GenericField if object.include?('Field') + + ::Sequencer::Unit::Import::Kayako::Request::Generic + end + end + end + end + end +end diff --git a/lib/sequencer/unit/import/kayako/request/case.rb b/lib/sequencer/unit/import/kayako/request/case.rb new file mode 100644 index 000000000..2497291c8 --- /dev/null +++ b/lib/sequencer/unit/import/kayako/request/case.rb @@ -0,0 +1,20 @@ +# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/ + +class Sequencer + class Unit + module Import + module Kayako + class Request < Sequencer::Unit::Common::Provider::Attribute + class Case < Sequencer::Unit::Import::Kayako::Request::Generic + def params + super.merge( + include: 'user,case_priority,case_status,channel,tag,case_type', + fields: '+tags', + ) + end + end + end + end + end + end +end diff --git a/lib/sequencer/unit/import/kayako/request/generic.rb b/lib/sequencer/unit/import/kayako/request/generic.rb new file mode 100644 index 000000000..357854e0e --- /dev/null +++ b/lib/sequencer/unit/import/kayako/request/generic.rb @@ -0,0 +1,30 @@ +# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/ + +class Sequencer + class Unit + module Import + module Kayako + class Request < Sequencer::Unit::Common::Provider::Attribute + class Generic + attr_reader :object, :request_params + + def initialize(object:, request_params:) + @object = object + @request_params = request_params + end + + def api_path + object.underscore.split('_').map(&:pluralize).join('/') + end + + def params + request_params.merge( + limit: 100, + ) + end + end + end + end + end + end +end diff --git a/lib/sequencer/unit/import/kayako/request/generic_field.rb b/lib/sequencer/unit/import/kayako/request/generic_field.rb new file mode 100644 index 000000000..ba34439cf --- /dev/null +++ b/lib/sequencer/unit/import/kayako/request/generic_field.rb @@ -0,0 +1,19 @@ +# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/ + +class Sequencer + class Unit + module Import + module Kayako + class Request < Sequencer::Unit::Common::Provider::Attribute + class GenericField < Sequencer::Unit::Import::Kayako::Request::Generic + def params + super.merge( + include: 'field_option,locale_field', + ) + end + end + end + end + end + end +end diff --git a/lib/sequencer/unit/import/kayako/request/organization.rb b/lib/sequencer/unit/import/kayako/request/organization.rb new file mode 100644 index 000000000..bf00c3dc7 --- /dev/null +++ b/lib/sequencer/unit/import/kayako/request/organization.rb @@ -0,0 +1,19 @@ +# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/ + +class Sequencer + class Unit + module Import + module Kayako + class Request < Sequencer::Unit::Common::Provider::Attribute + class Organization < Sequencer::Unit::Import::Kayako::Request::Generic + def params + super.merge( + include: 'organization_field,field_option,locale_field,identity_domain', + ) + end + end + end + end + end + end +end diff --git a/lib/sequencer/unit/import/kayako/request/post.rb b/lib/sequencer/unit/import/kayako/request/post.rb new file mode 100644 index 000000000..6f0935887 --- /dev/null +++ b/lib/sequencer/unit/import/kayako/request/post.rb @@ -0,0 +1,30 @@ +# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/ + +class Sequencer + class Unit + module Import + module Kayako + class Request < Sequencer::Unit::Common::Provider::Attribute + class Post < Sequencer::Unit::Import::Kayako::Request::Generic + attr_reader :ticket + + def initialize(...) + super + @ticket = request_params.delete(:ticket) + end + + def api_path + "cases/#{ticket['id']}/posts" + end + + def params + super.merge( + include: 'mailbox,message_recipient,channel,attachment,case_message,note,chat_message,identity_email,identity_twitter,identity_facebook,facebook_message,facebook_post,facebook_post_comment,twitter_message,twitter_tweet', + ) + end + end + end + end + end + end +end diff --git a/lib/sequencer/unit/import/kayako/request/time_entry.rb b/lib/sequencer/unit/import/kayako/request/time_entry.rb new file mode 100644 index 000000000..9890aac8e --- /dev/null +++ b/lib/sequencer/unit/import/kayako/request/time_entry.rb @@ -0,0 +1,17 @@ +# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/ + +class Sequencer + class Unit + module Import + module Kayako + class Request < Sequencer::Unit::Common::Provider::Attribute + class TimeEntry < Sequencer::Unit::Import::Kayako::Request::Generic + def api_path + 'timetracking' + end + end + end + end + end + end +end diff --git a/lib/sequencer/unit/import/kayako/request/user.rb b/lib/sequencer/unit/import/kayako/request/user.rb new file mode 100644 index 000000000..c9dc60c13 --- /dev/null +++ b/lib/sequencer/unit/import/kayako/request/user.rb @@ -0,0 +1,19 @@ +# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/ + +class Sequencer + class Unit + module Import + module Kayako + class Request < Sequencer::Unit::Common::Provider::Attribute + class User < Sequencer::Unit::Import::Kayako::Request::Generic + def params + super.merge( + include: 'user_field,field_option,locale_field,identity_email,identify_phone,identity_twitter,identity_facebook,role', + ) + end + end + end + end + end + end +end diff --git a/lib/sequencer/unit/import/kayako/requester.rb b/lib/sequencer/unit/import/kayako/requester.rb new file mode 100644 index 000000000..06b37f126 --- /dev/null +++ b/lib/sequencer/unit/import/kayako/requester.rb @@ -0,0 +1,86 @@ +# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/ + +class Sequencer + class Unit + module Import + module Kayako + module Requester + mattr_accessor :session_id + + def request(api_path:, params: nil) + 10.times do |iteration| + response = perform_request( + api_path: api_path, + params: params, + ) + + if response.is_a? Net::HTTPOK + refresh_session_id(response) + return response + end + + handle_error response, iteration + rescue Net::HTTPClientError => e + handle_exception e, iteration + end + + nil + end + + def handle_error(response, iteration) + reset_session_id if response.is_a? Net::HTTPUnauthorized + + sleep_for = 10 + case response + when Net::HTTPTooManyRequests + sleep_for = response.header['retry-after'].to_i + 10 + logger.info "Rate limit: #{response.header.to_hash} (429 Too Many Requests). Sleeping #{sleep_for} seconds and retry (##{iteration + 1}/10)." + else + logger.info "Unknown response: #{response.inspect}. Sleeping 10 seconds and retry (##{iteration + 1}/10)." + end + sleep sleep_for + end + + def handle_exception(e, iteration) + logger.error e + logger.info "Sleeping 10 seconds after #{e.class.name} and retry (##{iteration + 1}/10)." + sleep 10 + end + + def refresh_session_id(response) + return if response.header['content-type'] != 'application/json' + + body = JSON.parse(response.body) + + return if body['session_id'].blank? + + self.session_id = body['session_id'] + end + + def reset_session_id + self.session_id = nil + end + + def perform_request(api_path:, params: nil) + uri = URI("#{Setting.get('import_kayako_endpoint')}/#{api_path}") + uri.query = URI.encode_www_form(params) if params.present? + headers = { + 'Content-Type' => 'application/json', + 'X-Session-ID' => session_id + } + + Net::HTTP.start(uri.host, uri.port, use_ssl: true, read_timeout: 600) do |http| + # for those special moments... + # http.set_debug_output($stdout) + request = Net::HTTP::Get.new(uri, headers) + if session_id.blank? + request.basic_auth(Setting.get('import_kayako_endpoint_username'), Setting.get('import_kayako_endpoint_password')) + end + return http.request(request) + end + end + end + end + end + end +end diff --git a/lib/sequencer/unit/import/kayako/resources.rb b/lib/sequencer/unit/import/kayako/resources.rb new file mode 100644 index 000000000..eba0f41d8 --- /dev/null +++ b/lib/sequencer/unit/import/kayako/resources.rb @@ -0,0 +1,26 @@ +# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/ + +class Sequencer + class Unit + module Import + module Kayako + class Resources < Sequencer::Unit::Common::Provider::Named + include ::Sequencer::Unit::Import::Common::Model::Mixin::HandleFailure + + uses :response + + private + + def resources + body = JSON.parse(response.body) + + body['data'] + rescue => e + logger.error "Won't be continued, because no response is available." + handle_failure(e) + end + end + end + end + end +end diff --git a/lib/sequencer/unit/import/kayako/sub_sequence/field.rb b/lib/sequencer/unit/import/kayako/sub_sequence/field.rb new file mode 100644 index 000000000..4bb8a8ec2 --- /dev/null +++ b/lib/sequencer/unit/import/kayako/sub_sequence/field.rb @@ -0,0 +1,18 @@ +# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/ + +class Sequencer + class Unit + module Import + module Kayako + module SubSequence + class Field < Sequencer::Unit::Import::Kayako::SubSequence::Generic + + def sequence_name + 'Sequencer::Sequence::Import::Kayako::GenericField'.freeze + end + end + end + end + end + end +end diff --git a/lib/sequencer/unit/import/kayako/sub_sequence/generic.rb b/lib/sequencer/unit/import/kayako/sub_sequence/generic.rb new file mode 100644 index 000000000..f068351f4 --- /dev/null +++ b/lib/sequencer/unit/import/kayako/sub_sequence/generic.rb @@ -0,0 +1,99 @@ +# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/ + +class Sequencer + class Unit + module Import + module Kayako + module SubSequence + class Generic < Sequencer::Unit::Base + + uses :dry_run, :import_job, :field_map, :id_map, :default_language + + attr_accessor :iteration, :result + + EXPECTING = %i[action response].freeze + + def process + loop.each_with_index do |_, iteration| + @iteration = iteration + @result = ::Sequencer.process(sequence_name, + parameters: sequence_params, + expecting: self.class.const_get(:EXPECTING)) + break if iteration_should_stop? + end + end + + def sequence_params + { + request_params: request_params, + import_job: import_job, + dry_run: dry_run, + object: object, + default_language: default_language, + field_map: field_map, + id_map: id_map, + } + end + + def request_params + return {} if iteration.zero? + + if cursor_pagination? + return cursor_pagination + end + + offset_pagination + end + + def object + @object ||= self.class.name.demodulize.singularize + end + + def sequence_name + raise NotImplementedError + end + + private + + def offset_pagination + { + offset: offset, + } + end + + def offset + iteration * 5 # TODO: only ddebug, normally 100 + end + + def cursor_pagination? + return if result.nil? + + @cursor_pagination ||= result[:response].header['link'].include?('after_id') + end + + def cursor_pagination + { + after_id: cursor_after_id + } + end + + def cursor_after_id + unescaped_header_next_link.match(%r{after_id=(\d+)})[1] + end + + def unescaped_header_next_link + CGI.unescape(CGI.unescape(result[:response].header['link'])) + end + + def iteration_should_stop? + return true if result[:action] == :failed + return true if result[:response].header['link'].blank? || result[:response].header['link'].exclude?('rel="next"') + + false + end + end + end + end + end + end +end diff --git a/lib/sequencer/unit/import/kayako/sub_sequence/object.rb b/lib/sequencer/unit/import/kayako/sub_sequence/object.rb new file mode 100644 index 000000000..8a48de5ee --- /dev/null +++ b/lib/sequencer/unit/import/kayako/sub_sequence/object.rb @@ -0,0 +1,18 @@ +# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/ + +class Sequencer + class Unit + module Import + module Kayako + module SubSequence + class Object < Sequencer::Unit::Import::Kayako::SubSequence::Generic + + def sequence_name + 'Sequencer::Sequence::Import::Kayako::GenericObject'.freeze + end + end + end + end + end + end +end diff --git a/lib/sequencer/unit/import/kayako/sub_sequence/sub_object.rb b/lib/sequencer/unit/import/kayako/sub_sequence/sub_object.rb new file mode 100644 index 000000000..3ce424a36 --- /dev/null +++ b/lib/sequencer/unit/import/kayako/sub_sequence/sub_object.rb @@ -0,0 +1,22 @@ +# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/ + +class Sequencer + class Unit + module Import + module Kayako + module SubSequence + class SubObject < Sequencer::Unit::Import::Kayako::SubSequence::Generic + + uses :instance + + def sequence_params + super.merge( + instance: instance, + ) + end + end + end + end + end + end +end diff --git a/lib/sequencer/unit/import/kayako/team/mapping.rb b/lib/sequencer/unit/import/kayako/team/mapping.rb new file mode 100644 index 000000000..68a22604e --- /dev/null +++ b/lib/sequencer/unit/import/kayako/team/mapping.rb @@ -0,0 +1,25 @@ +# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/ + +class Sequencer + class Unit + module Import + module Kayako + module Team + class Mapping < Sequencer::Unit::Base + include ::Sequencer::Unit::Import::Common::Mapping::Mixin::ProvideMapped + + uses :resource + + def process + provide_mapped do + { + name: resource['title'], + } + end + end + end + end + end + end + end +end diff --git a/lib/sequencer/unit/import/kayako/teams.rb b/lib/sequencer/unit/import/kayako/teams.rb new file mode 100644 index 000000000..19258653a --- /dev/null +++ b/lib/sequencer/unit/import/kayako/teams.rb @@ -0,0 +1,12 @@ +# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/ + +class Sequencer + class Unit + module Import + module Kayako + class Teams < Sequencer::Unit::Import::Kayako::SubSequence::Object + end + end + end + end +end diff --git a/lib/sequencer/unit/import/kayako/time_entries.rb b/lib/sequencer/unit/import/kayako/time_entries.rb new file mode 100644 index 000000000..c0ae3b5c3 --- /dev/null +++ b/lib/sequencer/unit/import/kayako/time_entries.rb @@ -0,0 +1,15 @@ +# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/ + +class Sequencer + class Unit + module Import + module Kayako + class TimeEntries < Sequencer::Unit::Import::Kayako::SubSequence::Object + def sequence_name + 'Sequencer::Sequence::Import::Kayako::TimeEntries'.freeze + end + end + end + end + end +end diff --git a/lib/sequencer/unit/import/kayako/time_entry/mapping.rb b/lib/sequencer/unit/import/kayako/time_entry/mapping.rb new file mode 100644 index 000000000..bfc0a22b3 --- /dev/null +++ b/lib/sequencer/unit/import/kayako/time_entry/mapping.rb @@ -0,0 +1,38 @@ +# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/ + +class Sequencer + class Unit + module Import + module Kayako + module TimeEntry + class Mapping < Sequencer::Unit::Base + include ::Sequencer::Unit::Import::Common::Mapping::Mixin::ProvideMapped + + uses :resource, :id_map, :created_by_id + provides :action + + def process + provide_mapped do + { + time_unit: time_unit, + ticket_id: ticket_id, + created_by_id: created_by_id, + } + end + end + + private + + def time_unit + resource['time_spent'].to_i / 60 + end + + def ticket_id + id_map['Ticket'][resource['case']['id']] + end + end + end + end + end + end +end diff --git a/lib/sequencer/unit/import/kayako/time_entry/skip.rb b/lib/sequencer/unit/import/kayako/time_entry/skip.rb new file mode 100644 index 000000000..91e69a8b9 --- /dev/null +++ b/lib/sequencer/unit/import/kayako/time_entry/skip.rb @@ -0,0 +1,22 @@ +# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/ + +class Sequencer + class Unit + module Import + module Kayako + module TimeEntry + class Skip < Sequencer::Unit::Base + uses :resource + provides :action + + def process + return if resource['log_type'] != 'VIEWED' + + state.provide(:action, :skipped) + end + end + end + end + end + end +end diff --git a/lib/sequencer/unit/import/kayako/user/group_ids.rb b/lib/sequencer/unit/import/kayako/user/group_ids.rb new file mode 100644 index 000000000..13715d501 --- /dev/null +++ b/lib/sequencer/unit/import/kayako/user/group_ids.rb @@ -0,0 +1,24 @@ +# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/ + +class Sequencer + class Unit + module Import + module Kayako + module User + class GroupIds < Sequencer::Unit::Common::Provider::Named + + uses :resource, :id_map + + private + + def group_ids + Array(resource['teams']).map do |team| + id_map['Group'][team['id']] + end + end + end + end + end + end + end +end diff --git a/lib/sequencer/unit/import/kayako/user/identifier.rb b/lib/sequencer/unit/import/kayako/user/identifier.rb new file mode 100644 index 000000000..d80943d25 --- /dev/null +++ b/lib/sequencer/unit/import/kayako/user/identifier.rb @@ -0,0 +1,32 @@ +# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/ + +class Sequencer + class Unit + module Import + module Kayako + module User + class Identifier < Sequencer::Unit::Common::Provider::Named + + uses :resource + + private + + def identifier + { + email: primary_value('emails', 'email'), + phone: primary_value('phones', 'number'), + twitter: primary_value('twitter', 'screen_name'), + facebook: primary_value('facebook', 'facebook_id'), + } + end + + def primary_value(type, field_name) + primary_item = resource[type]&.detect { |item| item['is_primary'] } + primary_item&.fetch(field_name) + end + end + end + end + end + end +end diff --git a/lib/sequencer/unit/import/kayako/user/initiator.rb b/lib/sequencer/unit/import/kayako/user/initiator.rb new file mode 100644 index 000000000..0b2e5ec75 --- /dev/null +++ b/lib/sequencer/unit/import/kayako/user/initiator.rb @@ -0,0 +1,24 @@ +# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/ + +class Sequencer + class Unit + module Import + module Kayako + module User + class Initiator < Sequencer::Unit::Common::Provider::Named + + uses :login + + private + + def initiator + return false if login.blank? + + login == Setting.get('import_kayako_endpoint_username') + end + end + end + end + end + end +end diff --git a/lib/sequencer/unit/import/kayako/user/login.rb b/lib/sequencer/unit/import/kayako/user/login.rb new file mode 100644 index 000000000..63fbbdd30 --- /dev/null +++ b/lib/sequencer/unit/import/kayako/user/login.rb @@ -0,0 +1,23 @@ +# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/ + +class Sequencer + class Unit + module Import + module Kayako + module User + class Login < Sequencer::Unit::Common::Provider::Named + + uses :identifier + + private + + def login + # Check the differnt identifier types + identifier[:email] || identifier[:phone] || identifier[:twitter] || identifier[:facebook] + end + end + end + end + end + end +end diff --git a/lib/sequencer/unit/import/kayako/user/mapping.rb b/lib/sequencer/unit/import/kayako/user/mapping.rb new file mode 100644 index 000000000..62b778f34 --- /dev/null +++ b/lib/sequencer/unit/import/kayako/user/mapping.rb @@ -0,0 +1,40 @@ +# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/ + +class Sequencer + class Unit + module Import + module Kayako + module User + class Mapping < Sequencer::Unit::Base + include ::Sequencer::Unit::Import::Common::Mapping::Mixin::ProvideMapped + + uses :resource, :login, :password, :roles, :group_ids, :organization_id, :identifier + + def process + provide_mapped do + { + login: login, + firstname: resource['full_name'], + email: identifier[:email], + phone: identifier[:phone], + password: password, + active: active?, + group_ids: group_ids, + roles: roles, + organization_id: organization_id, + last_login: resource['last_logged_in_at'], + } + end + end + + private + + def active? + resource['is_enabled'] + end + end + end + end + end + end +end diff --git a/lib/sequencer/unit/import/kayako/user/organization_id.rb b/lib/sequencer/unit/import/kayako/user/organization_id.rb new file mode 100644 index 000000000..42eab556f --- /dev/null +++ b/lib/sequencer/unit/import/kayako/user/organization_id.rb @@ -0,0 +1,25 @@ +# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/ + +class Sequencer + class Unit + module Import + module Kayako + module User + class OrganizationId < Sequencer::Unit::Common::Provider::Named + + uses :resource, :id_map + + private + + def organization_id + remote_id = resource['organization']&.fetch('id') + return if remote_id.blank? + + id_map['Organization'][remote_id] + end + end + end + end + end + end +end diff --git a/lib/sequencer/unit/import/kayako/user/password.rb b/lib/sequencer/unit/import/kayako/user/password.rb new file mode 100644 index 000000000..7cfc9a7a1 --- /dev/null +++ b/lib/sequencer/unit/import/kayako/user/password.rb @@ -0,0 +1,29 @@ +# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/ + +class Sequencer + class Unit + module Import + module Kayako + module User + class Password < Sequencer::Unit::Common::Provider::Named + + uses :initiator + + private + + def password + # set the used import key as the admin password + # since we have no other confidential value + # that is known to Zammad and the User + return Setting.get('import_kayako_endpoint_password') if initiator + + # otherwise set an empty password so the user + # has to re-set a new password for Zammad + '' + end + end + end + end + end + end +end diff --git a/lib/sequencer/unit/import/kayako/user/roles.rb b/lib/sequencer/unit/import/kayako/user/roles.rb new file mode 100644 index 000000000..86f41aaf1 --- /dev/null +++ b/lib/sequencer/unit/import/kayako/user/roles.rb @@ -0,0 +1,71 @@ +# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/ + +class Sequencer + class Unit + module Import + module Kayako + module User + class Roles < Sequencer::Unit::Common::Provider::Named + uses :resource, :initiator + + private + + def roles + return admin if initiator + + map_roles + end + + def map_roles + return send(kayako_role) if kayako_role && respond_to?(kayako_role, true) + + logger.debug "Unknown mapping for role '#{resource['role']['type']}' (method: #{kayako_role})" + + customer + end + + def kayako_role + @kayako_role ||= resource['role']&.fetch('type')&.downcase + end + + def customer + [role_customer] + end + + def collaborators + agent + end + + def agent + [role_agent] + end + + def owner + admin + end + + def admin + [role_admin, role_agent] + end + + def role_admin + @role_admin ||= lookup('Admin') + end + + def role_agent + @role_agent ||= lookup('Agent') + end + + def role_customer + @role_customer ||= lookup('Customer') + end + + def lookup(role_name) + ::Role.lookup(name: role_name) + end + end + end + end + end + end +end diff --git a/lib/sequencer/unit/import/kayako/user_fields.rb b/lib/sequencer/unit/import/kayako/user_fields.rb new file mode 100644 index 000000000..be6e56f9c --- /dev/null +++ b/lib/sequencer/unit/import/kayako/user_fields.rb @@ -0,0 +1,12 @@ +# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/ + +class Sequencer + class Unit + module Import + module Kayako + class UserFields < Sequencer::Unit::Import::Kayako::SubSequence::Field + end + end + end + end +end diff --git a/lib/sequencer/unit/import/kayako/users.rb b/lib/sequencer/unit/import/kayako/users.rb new file mode 100644 index 000000000..9de90a1ae --- /dev/null +++ b/lib/sequencer/unit/import/kayako/users.rb @@ -0,0 +1,12 @@ +# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/ + +class Sequencer + class Unit + module Import + module Kayako + class Users < Sequencer::Unit::Import::Kayako::SubSequence::Object + end + end + end + end +end diff --git a/lib/sequencer/unit/kayako/connected.rb b/lib/sequencer/unit/kayako/connected.rb new file mode 100644 index 000000000..2f2db73dd --- /dev/null +++ b/lib/sequencer/unit/kayako/connected.rb @@ -0,0 +1,23 @@ +# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/ + +class Sequencer + class Unit + module Kayako + class Connected < Sequencer::Unit::Common::Provider::Named + extend ::Sequencer::Unit::Import::Kayako::Requester + + private + + def connected + response = self.class.perform_request( + api_path: 'me', + ) + response.is_a?(Net::HTTPOK) + rescue => e + logger.error e + nil + end + end + end + end +end diff --git a/spec/factories/object_manager_attribute.rb b/spec/factories/object_manager_attribute.rb index 02732b88e..6920bd886 100644 --- a/spec/factories/object_manager_attribute.rb +++ b/spec/factories/object_manager_attribute.rb @@ -55,6 +55,21 @@ FactoryBot.define do end end + factory :object_manager_attribute_textarea, parent: :object_manager_attribute do + data_type { 'textarea' } + data_option do + { + 'type' => 'textarea', + 'maxlength' => 255, + 'null' => true, + 'translate' => false, + 'default' => default || '', + 'options' => {}, + 'relation' => '', + } + end + end + factory :object_manager_attribute_integer, parent: :object_manager_attribute do data_type { 'integer' } data_option do diff --git a/spec/integration/kayako_spec.rb b/spec/integration/kayako_spec.rb new file mode 100644 index 000000000..2df17b03a --- /dev/null +++ b/spec/integration/kayako_spec.rb @@ -0,0 +1,71 @@ +# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/ + +require 'rails_helper' + +RSpec.describe 'Kayako import', type: :integration, use_vcr: true, db_strategy: :reset, required_envs: %w[IMPORT_KAYAKO_ENDPOINT IMPORT_KAYAKO_ENDPOINT_PASSWORD IMPORT_KAYAKO_ENDPOINT_USERNAME] do # rubocop:disable RSpec/DescribeClass + let(:job) { ImportJob.last } + + before do + Setting.set('import_kayako_endpoint', ENV['IMPORT_KAYAKO_ENDPOINT']) + Setting.set('import_kayako_endpoint_password', ENV['IMPORT_KAYAKO_ENDPOINT_PASSWORD']) + Setting.set('import_kayako_endpoint_username', ENV['IMPORT_KAYAKO_ENDPOINT_USERNAME']) + Setting.set('import_mode', true) + Setting.set('system_init_done', false) + + VCR.use_cassette 'kayako_import' do + ImportJob.create(name: 'Import::Kayako').start + end + end + + context 'when performing the full Kayako import' do + let(:job) { ImportJob.last } + let(:expected_stats) do + { + 'Groups' => { + 'skipped' => 0, + 'created' => 4, + 'updated' => 0, + 'unchanged' => 0, + 'failed' => 0, + 'deactivated' => 0, + 'sum' => 4, + 'total' => 4, + }, + 'Users' => { + 'skipped' => 0, + 'created' => 7, + 'updated' => 0, + 'unchanged' => 0, + 'failed' => 0, + 'deactivated' => 0, + 'sum' => 7, + 'total' => 7, + }, + 'Organizations' => { + 'skipped' => 0, + 'created' => 2, + 'updated' => 1, + 'unchanged' => 0, + 'failed' => 0, + 'deactivated' => 0, + 'sum' => 3, + 'total' => 3, + }, + 'Tickets' => { + 'skipped' => 0, + 'created' => 4, + 'updated' => 1, + 'unchanged' => 0, + 'failed' => 0, + 'deactivated' => 0, + 'sum' => 5, + 'total' => 5, + }, + } + end + + it 'imports the correct number of expected objects' do + expect(job.result).to eq expected_stats + end + end +end diff --git a/spec/lib/sequencer/sequence/import/kayako/case_field_spec.rb b/spec/lib/sequencer/sequence/import/kayako/case_field_spec.rb new file mode 100644 index 000000000..36ebfc8dd --- /dev/null +++ b/spec/lib/sequencer/sequence/import/kayako/case_field_spec.rb @@ -0,0 +1,54 @@ +# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/ + +require 'rails_helper' + +require 'lib/sequencer/sequence/import/kayako/examples/object_custom_fields_examples' + +RSpec.describe ::Sequencer::Sequence::Import::Kayako::CaseField, sequencer: :sequence do + + context 'when trying to import ticket fields from Kayako', db_strategy: :reset do + let(:imported_type_options) do + { + 'Question' => 'Question', + 'Task' => 'Task', + 'Problem' => 'Problem', + 'Incident' => 'Incident', + } + end + + include_examples 'Object custom fields', klass: Ticket + + context 'when importing system fields' do + let(:resource) do + { + 'id' => 80_000_387_409, + 'fielduuid' => 'cad5295c-495a-4605-8eda-861d4a19d6f2', + 'title' => 'Type', + 'type' => 'TYPE', + 'key' => 'type', + 'is_required_for_agents' => false, + 'is_required_on_resolution' => false, + 'is_visible_to_customers' => false, + 'is_customer_editable' => false, + 'is_required_for_customers' => false, + 'regular_expression' => nil, + 'sort_order' => 5, + 'is_enabled' => true, + 'is_system' => true, + 'options' => [], + 'created_at' => '2021-08-12T11:48:51+00:00', + 'updated_at' => '2021-08-12T11:48:51+00:00', + } + end + + it "activate the already existing ticket 'type' field" do + expect { process(process_payload) }.to change { ObjectManager::Attribute.get(object: 'Ticket', name: 'type').active }.from(false).to(true) + end + + it "import the fixed option list for the ticket 'type' field" do + process(process_payload) + expect(ObjectManager::Attribute.get(object: 'Ticket', name: 'type').data_option[:options]).to a_hash_including(imported_type_options) + end + end + end +end diff --git a/spec/lib/sequencer/sequence/import/kayako/case_spec.rb b/spec/lib/sequencer/sequence/import/kayako/case_spec.rb new file mode 100644 index 000000000..9a49b4f06 --- /dev/null +++ b/spec/lib/sequencer/sequence/import/kayako/case_spec.rb @@ -0,0 +1,292 @@ +# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/ + +require 'rails_helper' + +require 'lib/sequencer/sequence/import/kayako/examples/object_custom_field_values_examples' + +RSpec.describe ::Sequencer::Sequence::Import::Kayako::Case, sequencer: :sequence, db_strategy: :reset do + + context 'when importing cases from Kayako' do + + let(:group) { create :group } + let(:owner) { create :agent, group_ids: [group.id] } + let(:organization) { create :organization } + let(:customer) { create :customer, organization: organization } + + let(:resource) do + { + 'id' => 9999, + 'legacy_id' => nil, + 'subject' => 'Getting comfortable with Kayako: a sample conversation', + 'portal' => 'SETUP', + 'source_channel' => { + 'uuid' => 'e955e374-8324-4637-97a5-763cd4010997', + 'type' => 'MAIL', + 'character_limit' => nil, + 'resource_type' => 'channel' + }, + 'requester' => { + 'id' => 80_014_400_777, + 'organization' => { + 'id' => 80_014_400_111, + 'resource_type' => 'organization' + }, + 'resource_type' => 'user', + }, + 'creator' => { + 'id' => 80_014_400_777, + 'resource_type' => 'user', + }, + 'identity' => { + 'id' => 80_014_400_777, + 'resource_type' => 'identity_email' + }, + 'assigned_agent' => { + 'id' => 80_014_400_475, + 'resource_type' => 'user', + }, + 'assigned_team' => { + 'id' => 80_000_374_718, + 'resource_type' => 'team' + }, + 'status' => { + 'id' => 2, + 'label' => 'Open', + 'type' => 'OPEN', + 'sort_order' => 2, + 'is_sla_active' => true, + 'is_deleted' => false, + 'created_at' => '2021-08-12T11:48:51+00:00', + 'updated_at' => '2021-08-12T11:48:51+00:00', + 'resource_type' => 'case_status', + }, + 'priority' => { + 'id' => 1, + 'label' => 'Low', + 'level' => 1, + 'created_at' => '2021-08-12T11:48:51+00:00', + 'updated_at' => '2021-08-12T11:48:51+00:00', + 'resource_type' => 'case_priority', + }, + 'type' => { + 'id' => 1, + 'label' => 'Question', + 'type' => 'QUESTION', + 'created_at' => '2021-08-12T11:48:51+00:00', + 'updated_at' => '2021-08-12T11:48:51+00:00', + }, + 'last_updated_by' => { + 'id' => 80_000_374_718, + 'resource_type' => 'user', + }, + 'state' => 'ACTIVE', + 'tags' => [ + { + 'id' => 1, + 'name' => 'example', + 'resource_type' => 'tag' + }, + { + 'id' => 2, + 'name' => 'test', + 'resource_type' => 'tag' + } + ], + 'created_at' => '2018-08-18T12:00:00+00:00', + 'updated_at' => '2021-08-24T06:30:00+00:00', + 'resource_type' => 'case', + } + + end + + let(:id_map) do + { + 'Organization' => { + 80_014_400_111 => organization.id, + }, + 'User' => { + 80_014_400_475 => owner.id, + 80_014_400_777 => customer.id, + }, + 'Group' => { + 80_000_374_718 => group.id, + }, + } + end + let(:process_payload) do + { + import_job: build_stubbed(:import_job, name: 'Import::Kayako', payload: {}), + dry_run: false, + resource: resource, + field_map: {}, + id_map: id_map, + default_language: 'en-us', + } + end + + let(:posts_response_payload) do + { + 'data' => [ + { + 'id' => 99_999, + 'uuid' => '179a033a-7582-4def-ae57-b8f077eaee5b', + 'client_id' => '', + 'subject' => 'Getting comfortable with Kayako: a sample conversation', + 'contents' => 'Some text conent\n', + 'creator' => { + 'id' => 80_014_400_777, + 'resource_type' => 'user' + }, + 'identity' => { + 'id' => 80_014_400_777, + 'email' => customer.email, + 'resource_type' => 'identity_email', + }, + 'source_channel' => { + 'uuid' => 'e955e374-8324-4637-97a5-763cd4010997', + 'type' => 'MAIL', + 'character_limit' => nil, + 'account' => { + 'id' => 1, + 'resource_type' => 'mailbox' + }, + 'resource_type' => 'channel' + }, + 'attachments' => [], + 'original' => { + 'id' => 4, + 'uuid' => '179a033a-7582-4def-ae57-b8f077eaee5b', + 'subject' => 'Getting comfortable with Kayako: a sample conversation', + 'body_text' => 'Some text conent\n', + 'body_html' => '
Some text conent
', + 'recipients' => [], + 'fullname' => customer.fullname, + 'email' => customer.email, + 'creator' => { + 'id' => 80_014_400_777, + 'resource_type' => 'user' + }, + 'identity' => { + 'id' => 80_014_400_777, + 'email' => customer.email, + 'resource_type' => 'identity_email', + }, + 'mailbox' => { + 'id' => 1, + 'uuid' => 'e955e374-8324-4637-97a5-763cd4010997', + 'address' => 'info@zammad.org', + 'resource_type' => 'mailbox', + }, + 'attachments' => [], + 'download_all' => nil, + 'locale' => nil, + 'response_time' => 0, + 'created_at' => '2021-08-16T08:19:40+00:00', + 'updated_at' => '2021-08-16T08:19:40+00:00', + 'resource_type' => 'case_message', + }, + 'is_requester' => true, + 'created_at' => '2021-08-16T08:19:40+00:00', + 'updated_at' => '2021-08-16T08:30:11+00:00', + 'resource_type' => 'post', + } + ] + } + end + + let(:imported_ticket) do + { + title: 'Getting comfortable with Kayako: a sample conversation', + note: nil, + create_article_type_id: 1, + create_article_sender_id: 2, + article_count: 1, + state_id: 2, + group_id: group.id, + priority_id: 1, + owner_id: owner.id, + customer_id: customer.id, + organization_id: organization.id, + type: 'Question' + } + end + + before do + # Mock the posts get request (Import::Kayako::Case::Posts). + stub_request(:get, 'https://yours.kayako.com/api/v1/cases/9999/posts?include=mailbox,message_recipient,channel,attachment,case_message,note,chat_message,identity_email,identity_twitter,identity_facebook,facebook_message,facebook_post,facebook_post_comment,twitter_message,twitter_tweet&limit=100').to_return(status: 200, body: JSON.generate(posts_response_payload), headers: {}) + end + + it 'adds tickets' do + expect { process(process_payload) }.to change(Ticket, :count).by(1) + end + + it 'correct attributes for added ticket' do + process(process_payload) + expect(Ticket.last).to have_attributes(imported_ticket) + end + + it 'correct tags for added ticket' do + process(process_payload) + expect(Ticket.last.tag_list).to eq(%w[example test]) + end + + it 'adds article' do + expect { process(process_payload) }.to change(Ticket::Article, :count).by(1) + end + + it 'correct attributes for added article' do + process(process_payload) + expect(Ticket::Article.last).to have_attributes( + to: 'info@zammad.org', + body: "
Some text conent
\n
", + ) + end + + context 'when ticket is imported twice' do + before do + process(process_payload) + end + + it 'updates first article for already existing ticket' do + expect { process(process_payload) }.to change(Ticket::Article, :count).by(0) + end + end + + context 'when importing without a type' do + before do + resource['type'] = nil + imported_ticket[:type] = nil + end + + it 'correct attributes for added ticket' do + process(process_payload) + expect(Ticket.last).to have_attributes(imported_ticket) + end + end + + context "when status is 'PENDING'" do + before do + resource['status'] = { + 'id' => 3, + 'label' => 'Pending', + 'type' => 'PENDING', + 'sort_order' => 3, + 'is_sla_active' => false, + 'is_deleted' => false, + 'created_at' => '2021-08-12T11:48:51+00:00', + 'updated_at' => '2021-08-12T11:48:51+00:00', + } + imported_ticket[:state_id] = 3 + end + + it 'correct attributes for added ticket' do + process(process_payload) + expect(Ticket.last).to have_attributes(imported_ticket) + end + end + + context 'when importing custom fields' do + include_examples 'Object custom field values', object_name: 'Ticket', klass: Ticket + end + end +end diff --git a/spec/lib/sequencer/sequence/import/kayako/examples/object_custom_field_values_examples.rb b/spec/lib/sequencer/sequence/import/kayako/examples/object_custom_field_values_examples.rb new file mode 100644 index 000000000..bf7b1f83c --- /dev/null +++ b/spec/lib/sequencer/sequence/import/kayako/examples/object_custom_field_values_examples.rb @@ -0,0 +1,459 @@ +# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/ + +RSpec.shared_examples 'Object custom field values', db_strategy: :reset do |object_name:, klass:| + + let(:resource) do + super().merge( + 'custom_fields' => [ + { + 'field' => { + 'id' => 1, + 'fielduuid' => '82e5393b-e036-45d1-beb9-46f96ebd697a', + 'title' => 'Textfield', + 'type' => 'TEXT', + 'key' => 'custom_textfield', + 'is_visible_to_customers' => false, + 'is_customer_editable' => false, + 'is_required_for_customers' => false, + 'regular_expression' => nil, + 'sort_order' => 1, + 'is_enabled' => true, + 'options' => [], + 'created_at' => '2021-08-16T19:34:35+00:00', + 'updated_at' => '2021-08-16T19:34:35+00:00', + }, + 'value' => 'Testing', + }, + { + 'field' => { + 'id' => 2, + 'fielduuid' => 'ff7093f3-ad44-4519-80b0-f9b1a9988ac0', + 'title' => 'Singleselection', + 'type' => 'SELECT', + 'key' => 'custom_singleselection', + 'is_visible_to_customers' => false, + 'is_customer_editable' => false, + 'is_required_for_customers' => false, + 'regular_expression' => nil, + 'sort_order' => 2, + 'is_enabled' => true, + 'options' => [ + { + 'id' => 1, + 'fielduuid' => 'ff7093f3-ad44-4519-80b0-f9b1a9988ac0', + 'values' => [ + { + 'id' => 26, + 'locale' => 'en-us', + 'translation' => 'one', + 'created_at' => '2021-08-16T19:35:02+00:00', + 'updated_at' => '2021-08-16T19:35:02+00:00', + } + ], + 'sort_order' => 0, + 'created_at' => '2021-08-16T19:35:02+00:00', + 'updated_at' => '2021-08-16T19:35:02+00:00', + }, + { + 'id' => 2, + 'fielduuid' => 'ff7093f3-ad44-4519-80b0-f9b1a9988ac0', + 'values' => [ + { + 'id' => 27, + 'locale' => 'en-us', + 'translation' => 'two', + 'created_at' => '2021-08-16T19:35:02+00:00', + 'updated_at' => '2021-08-16T19:35:02+00:00', + } + ], + 'sort_order' => 0, + 'created_at' => '2021-08-16T19:35:02+00:00', + 'updated_at' => '2021-08-16T19:35:02+00:00', + }, + { + 'id' => 3, + 'fielduuid' => 'ff7093f3-ad44-4519-80b0-f9b1a9988ac0', + 'values' => [ + { + 'id' => 25, + 'locale' => 'en-us', + 'translation' => 'three', + 'created_at' => '2021-08-16T19:35:01+00:00', + 'updated_at' => '2021-08-16T19:35:01+00:00', + } + ], + 'sort_order' => 0, + 'created_at' => '2021-08-16T19:35:01+00:00', + 'updated_at' => '2021-08-16T19:35:01+00:00', + }, + ], + 'created_at' => '2021-08-16T19:35:01+00:00', + 'updated_at' => '2021-08-17T14:32:50+00:00', + }, + 'value' => '2', + }, + { + 'field' => { + 'id' => 4, + 'fielduuid' => '9586e37c-b561-4119-8673-726787ceb79d', + 'title' => 'Checkbox', + 'type' => 'CHECKBOX', + 'key' => 'custom_checkbox', + 'is_visible_to_customers' => false, + 'is_customer_editable' => false, + 'is_required_for_customers' => false, + 'regular_expression' => nil, + 'sort_order' => 4, + 'is_enabled' => true, + 'created_at' => '2021-08-16T19:35:32+00:00', + 'updated_at' => '2021-08-16T20:00:47+00:00', + }, + 'value' => '5,6', + }, + { + 'field' => { + 'id' => 5, + 'fielduuid' => '317664dc-66d6-4d60-9814-64905a7e2fb8', + 'title' => 'Available?', + 'type' => 'YESNO', + 'key' => 'custom_boolean', + 'is_visible_to_customers' => false, + 'is_customer_editable' => false, + 'is_required_for_customers' => false, + 'regular_expression' => nil, + 'sort_order' => 5, + 'is_enabled' => true, + 'options' => [], + 'created_at' => '2021-08-16T19:35:43+00:00', + 'updated_at' => '2021-08-16T19:35:43+00:00', + }, + 'value' => 'yes', + }, + { + 'field' => { + 'id' => 6, + 'fielduuid' => 'b8d5fd67-b446-44a4-9559-f9f4b85c025a', + 'title' => 'Regex', + 'type' => 'REGEX', + 'key' => 'custom_text_regex', + 'is_visible_to_customers' => false, + 'is_customer_editable' => false, + 'is_required_for_customers' => false, + 'regular_expression' => '\\d\\d\\d', + 'sort_order' => 6, + 'is_enabled' => true, + 'options' => [], + 'created_at' => '2021-08-16T19:58:57+00:00', + 'updated_at' => '2021-08-16T19:58:57+00:00', + }, + 'value' => '999', + }, + { + 'field' => { + 'id' => 7, + 'fielduuid' => 'c06852f7-0c82-45af-9ce0-f5ac6e19db93', + 'title' => 'Textarea', + 'type' => 'TEXTAREA', + 'key' => 'custom_textarea', + 'is_visible_to_customers' => false, + 'is_customer_editable' => false, + 'is_required_for_customers' => false, + 'regular_expression' => nil, + 'sort_order' => 7, + 'is_enabled' => true, + 'options' => [], + 'created_at' => '2021-08-16T19:59:07+00:00', + 'updated_at' => '2021-08-16T19:59:07+00:00', + }, + 'value' => 'Example textarea content.\nA new line.', + }, + { + 'field' => { + 'id' => 8, + 'fielduuid' => 'e5346df5-55ec-4e15-aceb-3360c457aaca', + 'title' => 'Radio', + 'type' => 'RADIO', + 'key' => 'custom_radio', + 'is_visible_to_customers' => false, + 'is_customer_editable' => false, + 'is_required_for_customers' => false, + 'regular_expression' => nil, + 'sort_order' => 8, + 'is_enabled' => true, + 'options' => [ + { + 'id' => 7, + 'fielduuid' => 'e5346df5-55ec-4e15-aceb-3360c457aaca', + 'values' => [ + { + 'id' => 43, + 'locale' => 'en-us', + 'translation' => 'first', + 'created_at' => '2021-08-16T19:59:33+00:00', + 'updated_at' => '2021-08-16T19:59:33+00:00', + } + ], + 'sort_order' => 0, + 'created_at' => '2021-08-16T19:59:33+00:00', + 'updated_at' => '2021-08-16T19:59:33+00:00', + }, + { + 'id' => 8, + 'fielduuid' => 'e5346df5-55ec-4e15-aceb-3360c457aaca', + 'values' => [ + { + 'id' => 44, + 'locale' => 'en-us', + 'translation' => 'second', + 'created_at' => '2021-08-16T19:59:33+00:00', + 'updated_at' => '2021-08-16T19:59:33+00:00', + } + ], + 'sort_order' => 0, + 'created_at' => '2021-08-16T19:59:33+00:00', + 'updated_at' => '2021-08-16T19:59:33+00:00', + }, + { + 'id' => 9, + 'fielduuid' => 'e5346df5-55ec-4e15-aceb-3360c457aaca', + 'values' => [ + { + 'id' => 45, + 'locale' => 'en-us', + 'translation' => 'third', + 'created_at' => '2021-08-16T19:59:33+00:00', + 'updated_at' => '2021-08-16T19:59:33+00:00', + } + ], + 'sort_order' => 0, + 'created_at' => '2021-08-16T19:59:33+00:00', + 'updated_at' => '2021-08-16T19:59:33+00:00', + } + ], + 'created_at' => '2021-08-16T19:59:33+00:00', + 'updated_at' => '2021-08-17T14:45:10+00:00', + }, + 'value' => '9', + }, + { + 'field' => { + 'id' => 9, + 'fielduuid' => '13a19707-29f0-4e97-8077-44be958c052c', + 'title' => 'Tree Select', + 'type' => 'CASCADINGSELECT', + 'key' => 'custom_tree_select', + 'is_visible_to_customers' => false, + 'is_customer_editable' => false, + 'is_required_for_customers' => false, + 'regular_expression' => nil, + 'sort_order' => 9, + 'is_enabled' => true, + 'options' => [ + { + 'id' => 10, + 'fielduuid' => '13a19707-29f0-4e97-8077-44be958c052c', + 'values' => [ + { + 'id' => 48, + 'locale' => 'en-us', + 'translation' => 'First-Level 1', + 'created_at' => '2021-08-16T19:59:52+00:00', + 'updated_at' => '2021-08-16T19:59:52+00:00', + } + ], + 'sort_order' => 1, + 'created_at' => '2021-08-16T19:59:52+00:00', + 'updated_at' => '2021-08-16T20:02:03+00:00', + }, + { + 'id' => 11, + 'fielduuid' => '13a19707-29f0-4e97-8077-44be958c052c', + 'values' => [ + { + 'id' => 49, + 'locale' => 'en-us', + 'translation' => 'First-Level 2\\Second-Level 1', + 'created_at' => '2021-08-16T19:59:52+00:00', + 'updated_at' => '2021-08-16T20:05:31+00:00', + } + ], + 'sort_order' => 2, + 'created_at' => '2021-08-16T19:59:52+00:00', + 'updated_at' => '2021-08-16T20:02:03+00:00', + }, + { + 'id' => 22, + 'fielduuid' => '13a19707-29f0-4e97-8077-44be958c052c', + 'values' => [ + { + 'id' => 427, + 'locale' => 'en-us', + 'translation' => 'First-Level 2\\Second-Level 2', + 'created_at' => '2021-08-18T09:41:09+00:00', + 'updated_at' => '2021-08-18T13:10:05+00:00', + } + ], + 'sort_order' => 3, + 'created_at' => '2021-08-18T09:41:09+00:00', + 'updated_at' => '2021-08-18T09:41:54+00:00', + }, + { + 'id' => 12, + 'fielduuid' => '13a19707-29f0-4e97-8077-44be958c052c', + 'values' => [ + { + 'id' => 50, + 'locale' => 'en-us', + 'translation' => 'First-Level 3', + 'created_at' => '2021-08-16T19:59:52+00:00', + 'updated_at' => '2021-08-16T19:59:52+00:00', + } + ], + 'sort_order' => 5, + 'created_at' => '2021-08-16T19:59:52+00:00', + 'updated_at' => '2021-08-18T09:41:54+00:00', + }, + ], + 'created_at' => '2021-08-16T19:59:52+00:00', + 'updated_at' => '2021-08-18T13:10:05+00:00', + }, + 'value' => '22', + }, + { + 'field' => { + 'id' => 10, + 'fielduuid' => '0c4f20ce-5db4-4e78-83d7-9fb9c7ac62b7', + 'title' => 'Decimal', + 'type' => 'DECIMAL', + 'key' => 'custom_text_decimal', + 'is_visible_to_customers' => false, + 'is_customer_editable' => false, + 'is_required_for_customers' => false, + 'regular_expression' => nil, + 'sort_order' => 10, + 'is_enabled' => true, + 'options' => [], + 'created_at' => '2021-08-16T20:01:01+00:00', + 'updated_at' => '2021-08-16T20:01:01+00:00', + }, + 'value' => '3.5', + }, + { + 'field' => { + 'id' => 11, + 'fielduuid' => '1a2aa5f9-8128-43be-abe9-8128fcc41005', + 'title' => 'Numeric', + 'type' => 'NUMERIC', + 'key' => 'custom_integer', + 'is_visible_to_customers' => false, + 'is_customer_editable' => false, + 'is_required_for_customers' => false, + 'regular_expression' => nil, + 'sort_order' => 11, + 'is_enabled' => true, + 'options' => [], + 'created_at' => '2021-08-16T20:01:07+00:00', + 'updated_at' => '2021-08-16T20:01:07+00:00', + }, + 'value' => '3', + }, + { + 'field' => { + 'id' => 12, + 'fielduuid' => '63b3eff6-9405-4857-aa2b-4e1e4639e283', + 'title' => 'Attachment', + 'type' => 'FILE', + 'key' => 'attachment', + 'is_visible_to_customers' => true, + 'is_customer_editable' => true, + 'is_required_for_customers' => true, + 'descriptions' => [], + 'regular_expression' => nil, + 'sort_order' => 12, + 'is_enabled' => true, + 'options' => [], + 'created_at' => '2021-08-16T20:59:03+00:00', + 'updated_at' => '2021-08-16T20:59:03+00:00', + }, + 'value' => '', + }, + { + 'field' => { + 'id' => 13, + 'fielduuid' => 'bc9d1be5-9a7b-4581-90be-59e75a4e660d', + 'title' => 'Founding Date', + 'type' => 'DATE', + 'key' => 'custom_date', + 'is_visible_to_customers' => false, + 'is_customer_editable' => false, + 'is_required_for_customers' => false, + 'regular_expression' => nil, + 'sort_order' => 13, + 'is_enabled' => true, + 'options' => [], + 'created_at' => '2021-08-17T20:33:18+00:00', + 'updated_at' => '2021-08-17T20:33:18+00:00', + }, + 'value' => '2021-08-13T00:00:00+00:00', + } + ], + ) + end + + let(:field_map) do + { + object_name => { + 'custom_textfield' => 'custom_textfield', + 'custom_singleselection' => 'custom_singleselection', + 'custom_boolean' => 'custom_boolean', + 'custom_radio' => 'custom_radio', + 'custom_text_regex' => 'custom_text_regex', + 'custom_tree_select' => 'custom_tree_select', + 'custom_textarea' => 'custom_textarea', + 'custom_text_decimal' => 'custom_text_decimal', + 'custom_integer' => 'custom_integer', + 'custom_date' => 'custom_date' + } + } + end + + let(:process_payload) do + super().merge( + field_map: field_map + ) + end + + let(:imported_resource_fields) do + { + custom_textfield: 'Testing', + custom_singleselection: 'two', + custom_boolean: true, + custom_radio: 'third', + custom_text_regex: '999', + custom_textarea: 'Example textarea content.\nA new line.', + custom_tree_select: 'First-Level 2::Second-Level 2', + custom_text_decimal: '3.5', + custom_integer: 3, + custom_date: Date.new(2021, 8, 13) + } + end + + before do + create :object_manager_attribute_text, object_name: object_name, name: 'custom_textfield' + create :object_manager_attribute_select, object_name: object_name, name: 'custom_singleselection' + create :object_manager_attribute_boolean, object_name: object_name, name: 'custom_boolean' + create :object_manager_attribute_select, object_name: object_name, name: 'custom_radio' + create :object_manager_attribute_text, object_name: object_name, name: 'custom_text_regex' + create :object_manager_attribute_textarea, object_name: object_name, name: 'custom_textarea' + create :object_manager_attribute_tree_select, object_name: object_name, name: 'custom_tree_select' + create :object_manager_attribute_text, object_name: object_name, name: 'custom_text_decimal' + create :object_manager_attribute_integer, object_name: object_name, name: 'custom_integer' + create :object_manager_attribute_date, object_name: object_name, name: 'custom_date' + ObjectManager::Attribute.migration_execute + end + + it 'adds correct custom field data' do + process(process_payload) + expect(klass.last).to have_attributes(imported_resource_fields) + end +end diff --git a/spec/lib/sequencer/sequence/import/kayako/examples/object_custom_fields_examples.rb b/spec/lib/sequencer/sequence/import/kayako/examples/object_custom_fields_examples.rb new file mode 100644 index 000000000..4246e51db --- /dev/null +++ b/spec/lib/sequencer/sequence/import/kayako/examples/object_custom_fields_examples.rb @@ -0,0 +1,235 @@ +# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/ + +RSpec.shared_examples 'Object custom fields' do |klass:| + let(:process_payload) do + { + import_job: build_stubbed(:import_job, name: 'Import::Kayako', payload: {}), + dry_run: false, + resource: resource, + field_map: {}, + id_map: {}, + default_language: 'en-us', + } + end + + shared_examples 'import valid custom field' do |field_name| + it 'add custom field' do + expect { process(process_payload) }.to change(klass, :column_names).by([field_name]) + end + end + + shared_examples 'import skipped custom field' do + it 'ignore custom field' do + expect { process(process_payload) }.not_to change(klass, :column_names) + end + end + + context "when custom field type is 'TEXT'" do + let(:resource) do + { + 'id' => 80_000_387_409, + 'fielduuid' => '82e5393b-e036-45d1-beb9-46f96ebd697a', + 'title' => 'Textfield', + 'type' => 'TEXT', + 'key' => 'custom_textfield', + 'is_visible_to_customers' => false, + 'required_for_agents' => true, + 'is_customer_editable' => false, + 'is_required_for_customers' => false, + 'regular_expression' => nil, + 'sort_order' => 1, + 'is_enabled' => true, + 'options' => [], + 'created_at' => '2021-08-16T19:34:35+00:00', + 'updated_at' => '2021-08-16T19:34:35+00:00', + } + end + + include_examples 'import valid custom field', 'custom_textfield' + end + + context 'when custom field should be skipped' do + let(:resource) do + { + 'id' => 80_000_387_409, + 'fielduuid' => '82e5393b-e036-45d1-beb9-46f96ebd697a', + 'title' => 'Name', + 'type' => 'TEXT', + 'key' => 'name', + 'is_visible_to_customers' => false, + 'required_for_agents' => true, + 'is_customer_editable' => false, + 'is_required_for_customers' => false, + 'regular_expression' => nil, + 'sort_order' => 1, + 'is_enabled' => true, + 'is_system' => true, + 'options' => [], + 'created_at' => '2021-08-16T19:34:35+00:00', + 'updated_at' => '2021-08-16T19:34:35+00:00', + } + end + + include_examples 'import skipped custom field' + end + + context "when custom field type is 'SELECT'" do + let(:resource) do + { + 'id' => 80_000_387_409, + 'fielduuid' => 'ff7093f3-ad44-4519-80b0-f9b1a9988ac0', + 'title' => 'Singleselection', + 'type' => 'SELECT', + 'key' => 'custom_singleselection', + 'is_visible_to_customers' => false, + 'is_customer_editable' => false, + 'is_required_for_customers' => false, + 'regular_expression' => nil, + 'sort_order' => 2, + 'is_enabled' => true, + 'options' => [ + { + 'id' => 1, + 'fielduuid' => 'ff7093f3-ad44-4519-80b0-f9b1a9988ac0', + 'values' => [ + { + 'id' => 26, + 'locale' => 'en-us', + 'translation' => 'one', + 'created_at' => '2021-08-16T19:35:02+00:00', + 'updated_at' => '2021-08-16T19:35:02+00:00', + } + ], + 'sort_order' => 0, + 'created_at' => '2021-08-16T19:35:02+00:00', + 'updated_at' => '2021-08-16T19:35:02+00:00', + }, + { + 'id' => 2, + 'fielduuid' => 'ff7093f3-ad44-4519-80b0-f9b1a9988ac0', + 'values' => [ + { + 'id' => 27, + 'locale' => 'en-us', + 'translation' => 'two', + 'created_at' => '2021-08-16T19:35:02+00:00', + 'updated_at' => '2021-08-16T19:35:02+00:00', + } + ], + 'sort_order' => 0, + 'created_at' => '2021-08-16T19:35:02+00:00', + 'updated_at' => '2021-08-16T19:35:02+00:00', + }, + { + 'id' => 3, + 'fielduuid' => 'ff7093f3-ad44-4519-80b0-f9b1a9988ac0', + 'values' => [ + { + 'id' => 25, + 'locale' => 'en-us', + 'translation' => 'three', + 'created_at' => '2021-08-16T19:35:01+00:00', + 'updated_at' => '2021-08-16T19:35:01+00:00', + } + ], + 'sort_order' => 0, + 'created_at' => '2021-08-16T19:35:01+00:00', + 'updated_at' => '2021-08-16T19:35:01+00:00', + }, + ], + 'created_at' => '2021-08-16T19:35:01+00:00', + 'updated_at' => '2021-08-17T14:32:50+00:00', + } + end + + include_examples 'import valid custom field', 'custom_singleselection' + end + + context "when custom field type is 'CASCADINGSELECT'" do + let(:resource) do + { + 'id' => 80_000_387_409, + 'fielduuid' => '13a19707-29f0-4e97-8077-44be958c052c', + 'title' => 'Tree Select', + 'type' => 'CASCADINGSELECT', + 'key' => 'custom_tree_select', + 'is_visible_to_customers' => false, + 'is_customer_editable' => false, + 'is_required_for_customers' => false, + 'regular_expression' => nil, + 'sort_order' => 9, + 'is_enabled' => true, + 'options' => [ + { + 'id' => 10, + 'fielduuid' => '13a19707-29f0-4e97-8077-44be958c052c', + 'values' => [ + { + 'id' => 48, + 'locale' => 'en-us', + 'translation' => 'First-Level 1', + 'created_at' => '2021-08-16T19:59:52+00:00', + 'updated_at' => '2021-08-16T19:59:52+00:00', + } + ], + 'sort_order' => 1, + 'created_at' => '2021-08-16T19:59:52+00:00', + 'updated_at' => '2021-08-16T20:02:03+00:00', + }, + { + 'id' => 11, + 'fielduuid' => '13a19707-29f0-4e97-8077-44be958c052c', + 'values' => [ + { + 'id' => 49, + 'locale' => 'en-us', + 'translation' => 'First-Level 2\\Second-Level 1', + 'created_at' => '2021-08-16T19:59:52+00:00', + 'updated_at' => '2021-08-16T20:05:31+00:00', + } + ], + 'sort_order' => 2, + 'created_at' => '2021-08-16T19:59:52+00:00', + 'updated_at' => '2021-08-16T20:02:03+00:00', + }, + { + 'id' => 22, + 'fielduuid' => '13a19707-29f0-4e97-8077-44be958c052c', + 'values' => [ + { + 'id' => 427, + 'locale' => 'en-us', + 'translation' => 'First-Level 2\\Second-Level 2', + 'created_at' => '2021-08-18T09:41:09+00:00', + 'updated_at' => '2021-08-18T13:10:05+00:00', + } + ], + 'sort_order' => 3, + 'created_at' => '2021-08-18T09:41:09+00:00', + 'updated_at' => '2021-08-18T09:41:54+00:00', + }, + { + 'id' => 12, + 'fielduuid' => '13a19707-29f0-4e97-8077-44be958c052c', + 'values' => [ + { + 'id' => 50, + 'locale' => 'en-us', + 'translation' => 'First-Level 3', + 'created_at' => '2021-08-16T19:59:52+00:00', + 'updated_at' => '2021-08-16T19:59:52+00:00', + } + ], + 'sort_order' => 5, + 'created_at' => '2021-08-16T19:59:52+00:00', + 'updated_at' => '2021-08-18T09:41:54+00:00', + }, + ], + 'created_at' => '2021-08-16T19:59:52+00:00', + 'updated_at' => '2021-08-18T13:10:05+00:00', + } + end + + include_examples 'import valid custom field', 'custom_tree_select' + end +end diff --git a/spec/lib/sequencer/sequence/import/kayako/generic_object_spec.rb b/spec/lib/sequencer/sequence/import/kayako/generic_object_spec.rb new file mode 100644 index 000000000..f9329294b --- /dev/null +++ b/spec/lib/sequencer/sequence/import/kayako/generic_object_spec.rb @@ -0,0 +1,72 @@ +# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/ + +require 'rails_helper' + +RSpec.describe ::Sequencer::Sequence::Import::Kayako::GenericObject, sequencer: :sequence, db_strategy: :reset do + context 'when importing group list with generic object' do + let(:resources_payloud) do + { + 'data' => [ + { + 'id' => 80_000_374_715, + 'legacy_id' => nil, + 'title' => 'Support', + 'businesshour' => { + 'id' => 1, + 'resource_type' => 'business_hour' + }, + 'member_count' => 0, + 'created_at' => '2021-08-16T13:42:26+00:00', + 'updated_at' => '2021-08-16T13:42:26+00:00', + 'resource_type' => 'team', + }, + { + 'id' => 80_000_374_716, + 'legacy_id' => nil, + 'title' => 'Sales', + 'businesshour' => { + 'id' => 1, + 'resource_type' => 'business_hour' + }, + 'member_count' => 0, + 'created_at' => '2021-08-16T13:42:26+00:00', + 'updated_at' => '2021-08-16T13:42:26+00:00', + 'resource_type' => 'team', + } + ] + } + end + + let(:process_payload) do + { + import_job: build_stubbed(:import_job, name: 'Import::Kayako', payload: {}), + dry_run: false, + object: 'Team', + request_params: {}, + field_map: {}, + id_map: {}, + default_language: 'en-us' + } + end + + before do + # Mock the groups get request + stub_request(:get, 'https://yours.kayako.com/api/v1/teams?limit=100').to_return(status: 200, body: JSON.generate(resources_payloud), headers: {}) + end + + it 'add groups' do + expect { process(process_payload) }.to change(Group, :count).by(2) + end + + context 'when list request fails' do + before do + allow(Sequencer::Unit::Import::Kayako::Request).to receive(:handle_error).with(any_args).and_return(true) + stub_request(:get, 'https://yours.kayako.com/api/v1/teams?limit=100').to_return(status: 400, headers: {}) + end + + it 'check that a failing response do not raise a hard error' do + expect { process(process_payload) }.to change(Group, :count).by(0) + end + end + end +end diff --git a/spec/lib/sequencer/sequence/import/kayako/organization_field_spec.rb b/spec/lib/sequencer/sequence/import/kayako/organization_field_spec.rb new file mode 100644 index 000000000..ce9f654d5 --- /dev/null +++ b/spec/lib/sequencer/sequence/import/kayako/organization_field_spec.rb @@ -0,0 +1,12 @@ +# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/ + +require 'rails_helper' + +require 'lib/sequencer/sequence/import/kayako/examples/object_custom_fields_examples' + +RSpec.describe ::Sequencer::Sequence::Import::Kayako::OrganizationField, sequencer: :sequence do + + context 'when trying to import ticket fields from Kayako', db_strategy: :reset do + include_examples 'Object custom fields', klass: Organization + end +end diff --git a/spec/lib/sequencer/sequence/import/kayako/organization_spec.rb b/spec/lib/sequencer/sequence/import/kayako/organization_spec.rb new file mode 100644 index 000000000..960c5385c --- /dev/null +++ b/spec/lib/sequencer/sequence/import/kayako/organization_spec.rb @@ -0,0 +1,87 @@ +# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/ + +require 'rails_helper' + +require 'lib/sequencer/sequence/import/kayako/examples/object_custom_field_values_examples' + +RSpec.describe ::Sequencer::Sequence::Import::Kayako::Organization, sequencer: :sequence, db_strategy: :reset do + + context 'when importing organizations from Kayako' do + + let(:resource) do + { + 'id' => 80_000_602_705, + 'name' => 'Test Foundation', + 'legacy_id' => nil, + 'is_shared' => false, + 'domains' => [ + { + 'id' => 3, + 'domain' => 'test-foundation.com', + 'is_primary' => true, + 'is_validated' => false, + 'created_at' => '2021-08-16T09:01:14+00:00', + 'updated_at' => '2021-08-16T09:01:14+00:00', + 'resource_type' => 'identity_domain', + } + ], + 'is_validated' => nil, + 'phone' => [], + 'addresses' => [], + 'websites' => [], + 'pinned_notes_count' => 0, + 'created_at' => '2021-08-16T09:01:14+00:00', + 'updated_at' => '2021-08-18T20:37:52+00:00', + 'resource_type' => 'organization', + } + end + + let(:process_payload) do + { + import_job: build_stubbed(:import_job, name: 'Import::Kayako', payload: {}), + dry_run: false, + resource: resource, + field_map: {}, + id_map: {}, + default_language: 'en-us', + } + end + + let(:imported_organization) do + { + name: 'Test Foundation', + domain: 'test-foundation.com', + domain_assignment: true, + } + end + + it 'increased organization count' do + expect { process(process_payload) }.to change(Organization, :count).by(1) + end + + it 'adds correct organization data' do + process(process_payload) + expect(Organization.last).to have_attributes(imported_organization) + end + + context 'when importing custom fields' do + include_examples 'Object custom field values', object_name: 'Organization', klass: Organization + end + + context 'when resource has no domains' do + let(:resource) do + super().merge('domains' => []) + end + + before do + imported_organization[:domain] = nil + imported_organization[:domain_assignment] = false + end + + it 'adds organizations' do + process(process_payload) + expect(Organization.last).to have_attributes(imported_organization) + end + end + end +end diff --git a/spec/lib/sequencer/sequence/import/kayako/post_spec.rb b/spec/lib/sequencer/sequence/import/kayako/post_spec.rb new file mode 100644 index 000000000..2e6a72732 --- /dev/null +++ b/spec/lib/sequencer/sequence/import/kayako/post_spec.rb @@ -0,0 +1,170 @@ +# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/ + +require 'rails_helper' + +RSpec.describe ::Sequencer::Sequence::Import::Kayako::Post, sequencer: :sequence do + + context 'when importing posts from Kayako' do + + let(:user) { create :user } + let(:customer) { create :customer } + let(:ticket) { create :ticket } + + let(:resource) do + { + 'id' => 99_999, + 'uuid' => '179a033a-7582-4def-ae57-b8f077eaee5b', + 'client_id' => '', + 'subject' => 'Getting comfortable with Kayako: a sample conversation', + 'contents' => "[img src=\"https://yours.kayako.com/media/url/UB6tba5kStQ7pL1i247kJ2blopDsywfn\" class=\"fr-fic fr-dii\" style=\"width: 127px; height: 96.3263px;\" width=\"127\" height=\"96.3263\"]\n\nA Test with a inline image.\n", + 'creator' => { + 'id' => 80_014_400_777, + 'resource_type' => 'user' + }, + 'identity' => { + 'id' => 80_014_400_777, + 'email' => customer.email, + 'resource_type' => 'identity_email', + }, + 'source_channel' => { + 'uuid' => 'e955e374-8324-4637-97a5-763cd4010997', + 'type' => 'MAIL', + 'character_limit' => nil, + 'account' => { + 'id' => 1, + 'resource_type' => 'mailbox' + }, + 'resource_type' => 'channel' + }, + 'attachments' => [ + { + 'id' => 1, + 'name' => 'example.log', + 'size' => 1909, + 'width' => 0, + 'height' => 0, + 'type' => 'text/plain', + 'content_id' => nil, + 'alt' => nil, + 'url' => 'https://yours.kayako.com/api/v1/cases/9999/notes/99999/attachments/2/url', + 'url_download' => 'https://yours.kayako.com/api/v1/cases/9999/notes/99999/attachments/2/download', + 'thumbnails' => [], + 'created_at' => '2021-08-16T08:43:46+00:00', + 'resource_type' => 'attachment', + } + ], + 'original' => { + 'id' => 4, + 'uuid' => '179a033a-7582-4def-ae57-b8f077eaee5b', + 'subject' => 'Getting comfortable with Kayako: a sample conversation', + 'body_text' => "[img src=\"https://yours.kayako.com/media/url/UB6tba5kStQ7pL1i247kJ2blopDsywfn\" class=\"fr-fic fr-dii\" style=\"width: 127px; height: 96.3263px;\" width=\"127\" height=\"96.3263\"]\n\nA Test with a inline image.\n", + 'body_html' => '

A Test with a inline image.
', + 'recipients' => [], + 'fullname' => customer.fullname, + 'email' => customer.email, + 'creator' => { + 'id' => 80_014_400_777, + 'resource_type' => 'user' + }, + 'identity' => { + 'id' => 80_014_400_777, + 'email' => customer.email, + 'resource_type' => 'identity_email', + }, + 'mailbox' => { + 'id' => 1, + 'uuid' => 'e955e374-8324-4637-97a5-763cd4010997', + 'address' => 'info@zammad.org', + 'resource_type' => 'mailbox', + }, + 'attachments' => [], + 'download_all' => nil, + 'locale' => nil, + 'response_time' => 0, + 'created_at' => '2021-08-16T08:19:40+00:00', + 'updated_at' => '2021-08-16T08:19:40+00:00', + 'resource_type' => 'case_message', + }, + 'is_requester' => true, + 'created_at' => '2021-08-16T08:19:40+00:00', + 'updated_at' => '2021-08-16T08:30:11+00:00', + 'resource_type' => 'post', + } + end + let(:used_urls) do + [ + 'https://yours.kayako.com/media/url/UB6tba5kStQ7pL1i247kJ2blopDsywfn', + 'https://yours.kayako.com/api/v1/cases/9999/notes/99999/attachments/2/download' + ] + end + + let(:id_map) do + { + 'Ticket' => { + 1001 => ticket.id, + }, + 'User' => { + 80_014_400_745 => user.id, + 80_014_400_777 => customer.id, + } + } + end + let(:process_payload) do + { + import_job: build_stubbed(:import_job, name: 'Import::Kayako', payload: {}), + dry_run: false, + resource: resource, + field_map: {}, + id_map: id_map, + instance: ticket, + default_language: 'en-us', + } + end + + let(:imported_ticket_article_attachment) do + { + filename: 'example.log', + size: '3', + preferences: { + 'Content-Type': 'text/plain' + } + } + end + + before do + # Mock the attachment and inline image download requests. + used_urls.each do |used_url| + stub_request(:get, used_url).to_return(status: 200, body: '123', headers: {}) + end + end + + it 'adds article with inline image' do + expect { process(process_payload) }.to change(Ticket::Article, :count).by(1) + end + + it 'correct attributes for added article' do + process(process_payload) + expect(Ticket::Article.last).to have_attributes( + to: 'info@zammad.org', + body: "\n\n

A Test with a inline image.
\n\n", + ) + end + + it 'updates already existing article' do + expect do + process(process_payload) + process(process_payload) + end.to change(Ticket::Article, :count).by(1) + end + + it 'adds correct number of attachments' do + process(process_payload) + expect(Ticket::Article.last.attachments.size).to eq 1 + end + + it 'adds attachment content' do + process(process_payload) + expect(Ticket::Article.last.attachments.last).to have_attributes(imported_ticket_article_attachment) + end + end +end diff --git a/spec/lib/sequencer/sequence/import/kayako/team_spec.rb b/spec/lib/sequencer/sequence/import/kayako/team_spec.rb new file mode 100644 index 000000000..359d36290 --- /dev/null +++ b/spec/lib/sequencer/sequence/import/kayako/team_spec.rb @@ -0,0 +1,47 @@ +# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/ + +require 'rails_helper' + +RSpec.describe ::Sequencer::Sequence::Import::Kayako::Team, sequencer: :sequence do + + context 'when importing teams from Kayako' do + + let(:resource) do + { + 'id' => 80_000_374_715, + 'legacy_id' => nil, + 'title' => 'Support', + 'businesshour' => { + 'id' => 1, + 'resource_type' => 'business_hour' + }, + 'member_count' => 0, + 'created_at' => '2021-08-16T13:42:26+00:00', + 'updated_at' => '2021-08-16T13:42:26+00:00', + 'resource_type' => 'team', + } + end + + let(:process_payload) do + { + import_job: build_stubbed(:import_job, name: 'Import::Kayako', payload: {}), + dry_run: false, + resource: resource, + field_map: {}, + id_map: {}, + } + end + + it 'adds groups' do + expect { process(process_payload) }.to change(Group, :count).by(1) + end + + it 'check added group data' do + process(process_payload) + expect(Group.last).to have_attributes( + name: 'Support', + active: true, + ) + end + end +end diff --git a/spec/lib/sequencer/sequence/import/kayako/time_entry_spec.rb b/spec/lib/sequencer/sequence/import/kayako/time_entry_spec.rb new file mode 100644 index 000000000..b1a3a0dd0 --- /dev/null +++ b/spec/lib/sequencer/sequence/import/kayako/time_entry_spec.rb @@ -0,0 +1,84 @@ +# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/ + +require 'rails_helper' + +RSpec.describe ::Sequencer::Sequence::Import::Kayako::TimeEntry, sequencer: :sequence do + + context 'when importing time_entry from Kayako' do + + let(:resource) do + { + 'id' => 51, + 'time_tracking_log_id' => 51, + 'case' => { + 'id' => 1001, + 'resource_type' => 'case' + }, + 'agent' => { + 'id' => 80_014_400_475, + 'resource_type' => 'user' + }, + 'log_type' => 'WORKED', + 'time_spent' => 3600, + 'creator' => { + 'id' => 80_014_400_475, + 'resource_type' => 'user' + }, + 'created_at' => '2021-08-27T20:38:30+00:00', + 'updated_at' => '2021-08-27T20:38:30+00:00', + 'resource_type' => 'timetracking_log', + } + end + + let(:ticket) { create :ticket } + let(:id_map) do + { + 'Ticket' => { + 1001 => ticket.id, + }, + 'User' => { + 80_014_400_475 => 1, + } + } + end + let(:process_payload) do + { + import_job: build_stubbed(:import_job, name: 'Import::Kayako', payload: {}), + dry_run: false, + resource: resource, + field_map: {}, + id_map: id_map, + default_language: 'en-us' + } + end + + let(:imported_time_entry) do + { + ticket_id: ticket.id, + created_by_id: 1, + time_unit: 60, + } + end + + it 'adds time entry' do + expect { process(process_payload) }.to change(Ticket::TimeAccounting, :count).by(1) + end + + it 'correct attributes for added time entry' do + process(process_payload) + expect(Ticket::TimeAccounting.last).to have_attributes(imported_time_entry) + end + + context 'when time entry should be skipped' do + let(:resource) do + super().merge( + 'log_type' => 'VIEWED' + ) + end + + it 'skip time entry' do + expect { process(process_payload) }.to change(Ticket::TimeAccounting, :count).by(0) + end + end + end +end diff --git a/spec/lib/sequencer/sequence/import/kayako/user_field_spec.rb b/spec/lib/sequencer/sequence/import/kayako/user_field_spec.rb new file mode 100644 index 000000000..6a178393c --- /dev/null +++ b/spec/lib/sequencer/sequence/import/kayako/user_field_spec.rb @@ -0,0 +1,12 @@ +# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/ + +require 'rails_helper' + +require 'lib/sequencer/sequence/import/kayako/examples/object_custom_fields_examples' + +RSpec.describe ::Sequencer::Sequence::Import::Kayako::UserField, sequencer: :sequence do + + context 'when trying to import ticket fields from Kayako', db_strategy: :reset do + include_examples 'Object custom fields', klass: User + end +end diff --git a/spec/lib/sequencer/sequence/import/kayako/user_spec.rb b/spec/lib/sequencer/sequence/import/kayako/user_spec.rb new file mode 100644 index 000000000..d9448057e --- /dev/null +++ b/spec/lib/sequencer/sequence/import/kayako/user_spec.rb @@ -0,0 +1,150 @@ +# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/ + +require 'rails_helper' + +require 'lib/sequencer/sequence/import/kayako/examples/object_custom_field_values_examples' + +RSpec.describe ::Sequencer::Sequence::Import::Kayako::User, sequencer: :sequence, db_strategy: :reset do + context 'when importing users from Kayako' do + let(:groups) do + create_list(:group, 2) + end + + let(:organization) { create(:organization) } + + let(:resource) do + { + 'id' => 80_000_602_705, + 'uuid' => 'd4c85a6c-465f-5577-8240-276c0c7fe546', + 'full_name' => 'John Doe', + 'is_enabled' => true, + 'role' => { + 'id' => 2, + 'title' => 'Agent', + 'type' => 'AGENT', + 'is_system' => true, + 'agent_case_access' => 'ALL', + 'created_at' => '2021-08-12T11:48:45+00:00', + 'updated_at' => '2021-08-12T11:48:45+00:00', + 'resource_type' => 'role', + }, + 'agent_case_access' => 'INHERIT-FROM-ROLE', + 'organization' => { + 'id' => 1001, + 'resource_type' => 'user' + }, + 'teams' => [ + { + 'id' => 1001, + 'resource_type' => 'team', + }, + { + 'id' => 1002, + 'resource_type' => 'team', + } + ], + 'emails' => [ + { + 'id' => 8, + 'email' => 'kayako@example.com', + 'is_primary' => true, + 'is_validated' => false, + 'is_notification_enabled' => false, + 'created_at' => '2021-08-19T08:24:50+00:00', + 'updated_at' => '2021-08-19T08:24:50+00:00', + 'resource_type' => 'identity_email', + }, + ], + 'phones' => [ + { + 'id' => 2, + 'number' => '+49123456789', + 'is_primary' => true, + 'is_validated' => false, + 'created_at' => '2021-08-19T10:16:26+00:00', + 'updated_at' => '2021-08-19T10:16:33+00:00', + 'resource_type' => 'identity_phone', + } + ], + 'twitter' => [], + 'facebook' => [], + 'time_zone' => nil, + 'time_zone_offset' => nil, + 'last_seen_user_agent' => nil, + 'last_seen_ip' => nil, + 'last_seen_at' => nil, + 'last_active_at' => '2021-08-19T13:16:23+00:00', + 'avatar_updated_at' => nil, + 'last_logged_in_at' => '2021-08-19T13:16:23+00:00', + 'last_activity_at' => nil, + 'created_at' => '2021-08-16T09:01:14+00:00', + 'updated_at' => '2021-08-18T20:37:52+00:00', + 'resource_type' => 'user', + } + end + + let(:id_map) do + { + 'Group' => { + 1001 => groups[0].id, + 1002 => groups[1].id, + }, + 'Organization' => { + 1001 => organization.id, + }, + } + end + + let(:process_payload) do + { + import_job: build_stubbed(:import_job, name: 'Import::Kayako', payload: {}), + dry_run: false, + resource: resource, + field_map: {}, + id_map: id_map, + default_language: 'en-us', + } + end + + let(:imported_user) do + { + firstname: 'John', + lastname: 'Doe', + login: 'kayako@example.com', + email: 'kayako@example.com', + phone: '+49123456789', + active: true, + last_login: DateTime.parse('2021-08-19T13:16:23+00:00'), + } + end + + it 'increased user count' do + expect { process(process_payload) }.to change(User, :count).by(1) + end + + it 'adds correct user data' do + process(process_payload) + expect(User.last).to have_attributes(imported_user) + end + + it 'sets user roles correctly for initiator user' do + Setting.set('import_kayako_endpoint_username', 'kayako@example.com') + process(process_payload) + expect(User.last.roles.sort.map(&:name)).to eq %w[Admin Agent] + end + + it 'sets user roles correctly for non-admin user' do + process(process_payload) + expect(User.last.roles.sort.map(&:name)).to eq ['Agent'] + end + + it 'sets user groups correctly' do + process(process_payload) + expect(User.last.groups_access('full').sort).to eq groups + end + + context 'when importing custom fields' do + include_examples 'Object custom field values', object_name: 'User', klass: User + end + end +end diff --git a/spec/lib/sequencer/unit/kayako/connected_spec.rb b/spec/lib/sequencer/unit/kayako/connected_spec.rb new file mode 100644 index 000000000..798c03de6 --- /dev/null +++ b/spec/lib/sequencer/unit/kayako/connected_spec.rb @@ -0,0 +1,31 @@ +# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/ + +require 'rails_helper' + +RSpec.describe Sequencer::Unit::Kayako::Connected, sequencer: :unit do + + context 'when checking the connection to Kayako' do + + let(:params) do + { + dry_run: false, + import_job: instance_double(ImportJob), + field_map: {}, + id_map: {}, + } + end + + let(:response_ok) { Net::HTTPOK.new(1.0, '200', 'OK') } + let(:response_unauthorized) { Net::HTTPUnauthorized.new(1.0, '401', 'Unauthorized') } + + it 'check for correct connection' do + allow(described_class).to receive(:perform_request).with(any_args).and_return(response_ok) + expect(process(params)).to eq({ connected: true }) + end + + it 'check for unauthorized connection' do + allow(described_class).to receive(:perform_request).with(any_args).and_return(response_unauthorized) + expect(process(params)).to eq({ connected: false }) + end + end +end diff --git a/spec/requests/import_kayako_spec.rb b/spec/requests/import_kayako_spec.rb new file mode 100644 index 000000000..7c0ef2217 --- /dev/null +++ b/spec/requests/import_kayako_spec.rb @@ -0,0 +1,22 @@ +# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/ + +require 'rails_helper' + +RSpec.describe 'ImportKayako', type: :request, set_up: false, authenticated_as: false, required_envs: %w[IMPORT_KAYAKO_ENDPOINT_SUBDOMAIN] do + let(:action) { nil } + let(:endpoint) { "/api/v1/import/kayako/#{action}" } + + describe 'POST /api/v1/import/kayako/url_check', :use_vcr do + let(:action) { 'url_check' } + + it 'check invalid subdomain' do + post endpoint, params: { url: 'https://reallybadexample.kayako.com' }, as: :json + expect(json_response['result']).to eq('invalid') + end + + it 'check valid subdomain' do + post endpoint, params: { url: "https://#{ENV['IMPORT_KAYAKO_ENDPOINT_SUBDOMAIN']}.kayako.com" }, as: :json + expect(json_response['result']).to eq('ok') + end + end +end diff --git a/spec/support/vcr_mask_kayako_endpoint_auth.rb b/spec/support/vcr_mask_kayako_endpoint_auth.rb new file mode 100644 index 000000000..4204c201f --- /dev/null +++ b/spec/support/vcr_mask_kayako_endpoint_auth.rb @@ -0,0 +1,11 @@ +# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/ + +VCR.configure do |c| + # The API key is used only inside the base64 encoded Basic Auth string, so mask that as well. + c.filter_sensitive_data('') { Base64.encode64("#{ENV['IMPORT_KAYAKO_ENDPOINT_USERNAME']}:#{ENV['IMPORT_KAYAKO_ENDPOINT_PASSWORD']}").lines(chomp: true).join } + + # The hostname of the Kayako endpoint URL used as well + if ENV['IMPORT_KAYAKO_ENDPOINT'].present? + c.filter_sensitive_data('') { URI.parse(ENV['IMPORT_KAYAKO_ENDPOINT']).hostname } + end +end diff --git a/spec/system/import/kayako_spec.rb b/spec/system/import/kayako_spec.rb new file mode 100644 index 000000000..6432f0d56 --- /dev/null +++ b/spec/system/import/kayako_spec.rb @@ -0,0 +1,124 @@ +# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/ + +require 'rails_helper' + +RSpec.describe 'Import Kayako', type: :system, set_up: false, authenticated_as: false, required_envs: %w[IMPORT_KAYAKO_ENDPOINT_SUBDOMAIN IMPORT_KAYAKO_ENDPOINT_PASSWORD IMPORT_KAYAKO_ENDPOINT_USERNAME] do + describe 'fields validation', :use_vcr do + before do + visit '#import' + find('.js-kayako').click + end + + let(:subdomain_field) { find('#kayako-subdomain') } + let(:email_field) { find('#kayako-email') } + let(:password_field) { find('#kayako-password') } + + it 'invalid hostname' do + subdomain_field.fill_in with: 'reallybadexample' + + expect(page).to have_css('.kayako-subdomain-error', text: 'Hostname not found!') + end + + it 'valid hostname' do + subdomain_field.fill_in with: 'reallybadexample' + + # wait for error to appear to validate it's hidden successfully + find('.kayako-subdomain-error', text: 'Hostname not found!') + + subdomain_field.fill_in with: ENV['IMPORT_KAYAKO_ENDPOINT_SUBDOMAIN'] + + expect(page).to have_no_css('.kayako-subdomain-error', text: 'Hostname not found!') + end + + it 'invalid credentials' do + subdomain_field.fill_in with: ENV['IMPORT_KAYAKO_ENDPOINT_SUBDOMAIN'] + find('.js-kayako-credentials').click + email_field.fill_in with: ENV['IMPORT_KAYAKO_ENDPOINT_USERNAME'] + password_field.fill_in with: '1nv4l1dT0K3N' + + expect(page).to have_css('.kayako-password-error', text: 'Invalid credentials!') + end + + it 'valid credentials' do + subdomain_field.fill_in with: ENV['IMPORT_KAYAKO_ENDPOINT_SUBDOMAIN'] + find('.js-kayako-credentials').click + email_field.fill_in with: ENV['IMPORT_KAYAKO_ENDPOINT_USERNAME'] + password_field.fill_in with: '1nv4l1dT0K3N' + + # wait for error to appear to validate it's hidden successfully + expect(page).to have_css('.kayako-password-error', text: 'Invalid credentials!') + + password_field.fill_in with: ENV['IMPORT_KAYAKO_ENDPOINT_PASSWORD'] + + expect(page).to have_no_css('.kayako-password-error', text: 'Invalid credentials!') + end + + it 'shows start button' do + subdomain_field.fill_in with: ENV['IMPORT_KAYAKO_ENDPOINT_SUBDOMAIN'] + find('.js-kayako-credentials').click + email_field.fill_in with: ENV['IMPORT_KAYAKO_ENDPOINT_USERNAME'] + password_field.fill_in with: ENV['IMPORT_KAYAKO_ENDPOINT_PASSWORD'] + + expect(page).to have_css('.js-migration-start') + end + end + + describe 'import progress', :use_vcr do + let(:subdomain_field) { find('#kayako-subdomain') } + let(:email_field) { find('#kayako-email') } + let(:password_field) { find('#kayako-password') } + let(:job) { ImportJob.find_by(name: 'Import::Kayako') } + + before do + VCR.use_cassette 'system/import/kayako/import_progress_setup' do + visit '#import' + find('.js-kayako').click + + subdomain_field.fill_in with: ENV['IMPORT_KAYAKO_ENDPOINT_SUBDOMAIN'] + find('.js-kayako-credentials').click + email_field.fill_in with: ENV['IMPORT_KAYAKO_ENDPOINT_USERNAME'] + password_field.fill_in with: ENV['IMPORT_KAYAKO_ENDPOINT_PASSWORD'] + + find('.js-migration-start').click + + await_empty_ajax_queue + end + end + + it 'shows groups progress' do + job.update! result: { Groups: { sum: 3, total: 4 } } + + expect(page).to have_css('.js-groups .js-done', text: '3') + .and(have_css('.js-groups .js-total', text: '4')) + end + + it 'shows users progress' do + job.update! result: { Users: { sum: 5, total: 7 } } + + expect(page).to have_css('.js-users .js-done', text: '5') + .and(have_css('.js-users .js-total', text: '7')) + end + + it 'shows organizations progress' do + job.update! result: { Organizations: { sum: 3, total: 3 } } + + expect(page).to have_css('.js-organizations .js-done', text: '3') + .and(have_css('.js-organizations .js-total', text: '3')) + end + + it 'shows tickets progress' do + job.update! result: { Tickets: { sum: 3, total: 5 } } + + expect(page).to have_css('.js-tickets .js-done', text: '3') + .and(have_css('.js-tickets .js-total', text: '5')) + end + + it 'shows login after import is finished' do + job.update! finished_at: Time.zone.now + + Rake::Task['zammad:setup:auto_wizard'].execute + + expect(page).to have_text(Setting.get('fqdn')) + end + end +end diff --git a/test/data/vcr_cassettes/kayako_import.yml b/test/data/vcr_cassettes/kayako_import.yml new file mode 100644 index 000000000..7eb9cca2d --- /dev/null +++ b/test/data/vcr_cassettes/kayako_import.yml @@ -0,0 +1,3549 @@ +--- +http_interactions: +- request: + method: get + uri: https:///api/v1/settings + body: + encoding: US-ASCII + string: '' + headers: + Content-Type: + - application/json + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + User-Agent: + - Ruby + Host: + - "" + Authorization: + - Basic + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx + Date: + - Fri, 01 Oct 2021 15:58:52 GMT + Content-Type: + - application/json + Transfer-Encoding: + - chunked + Connection: + - keep-alive + X-Csrf-Token: + - XRdK9nTGdqGWokkQ2T1Uf0yQcjNhri2PnfVi5rslxRr1jfO343dhE0wLvCowDq9X7VVzrpVpp5wU0IK7w0y56nziDIZYYINAvg4k + Cache-Control: + - private, max-age=0, must-revalidate + Expires: + - '0' + X-Api-Version: + - '1' + Date-Iso: + - '2021-10-01T15:58:52+00:00' + Access-Control-Expose-Headers: + - Date-ISO + X-Xss-Protection: + - 1; mode=block + X-Content-Type-Options: + - nosniff + Strict-Transport-Security: + - max-age=31536000; includeSubDomains preload + body: + encoding: ASCII-8BIT + string: |- + { + "status": 200, + "data": [ + { + "id": 71, + "category": "social", + "name": "account_connected", + "is_protected": false, + "value": "0", + "resource_type": "setting" + }, + { + "id": 64, + "category": "email", + "name": "account_setup", + "is_protected": false, + "value": "0", + "resource_type": "setting" + }, + { + "id": 14, + "category": "user", + "name": "agent_added", + "is_protected": false, + "value": "0", + "resource_type": "setting" + }, + { + "id": 18, + "category": "security", + "name": "agent.authentication_type", + "is_protected": false, + "value": "internal", + "resource_type": "setting" + }, + { + "id": 32, + "category": "security", + "name": "agent.google.authentication.domain", + "is_protected": false, + "value": "", + "resource_type": "setting" + }, + { + "id": 33, + "category": "security", + "name": "agent.ip_restriction", + "is_protected": false, + "value": "", + "resource_type": "setting" + }, + { + "id": 21, + "category": "security", + "name": "agent.login_attempt_limit", + "is_protected": false, + "value": "10", + "resource_type": "setting" + }, + { + "id": 27, + "category": "security", + "name": "agent.password.expires_in", + "is_protected": false, + "value": "0", + "resource_type": "setting" + }, + { + "id": 26, + "category": "security", + "name": "agent.password.max_consecutive", + "is_protected": false, + "value": "0", + "resource_type": "setting" + }, + { + "id": 22, + "category": "security", + "name": "agent.password.min_characters", + "is_protected": false, + "value": "8", + "resource_type": "setting" + }, + { + "id": 23, + "category": "security", + "name": "agent.password.min_numbers", + "is_protected": false, + "value": "1", + "resource_type": "setting" + }, + { + "id": 24, + "category": "security", + "name": "agent.password.min_symbols", + "is_protected": false, + "value": "1", + "resource_type": "setting" + }, + { + "id": 25, + "category": "security", + "name": "agent.password.require_mixed_case", + "is_protected": false, + "value": "1", + "resource_type": "setting" + }, + { + "id": 20, + "category": "security", + "name": "agent.session_expiry", + "is_protected": false, + "value": "16", + "resource_type": "setting" + }, + { + "id": 19, + "category": "security", + "name": "agent.social_authentication.google", + "is_protected": false, + "value": "0", + "resource_type": "setting" + }, + { + "id": 28, + "category": "security", + "name": "agent.sso.jwt.login_url", + "is_protected": false, + "value": "", + "resource_type": "setting" + }, + { + "id": 29, + "category": "security", + "name": "agent.sso.jwt.logout_url", + "is_protected": false, + "value": "", + "resource_type": "setting" + }, + { + "id": 31, + "category": "security", + "name": "agent.sso.jwt.service_name", + "is_protected": false, + "value": "Agent SSO Service", + "resource_type": "setting" + }, + { + "id": 30, + "category": "security", + "name": "agent.sso.jwt.shared_secret", + "is_protected": false, + "value": "", + "resource_type": "setting" + }, + { + "id": 65, + "category": "users", + "name": "allow_requests_from_unregistered", + "is_protected": false, + "value": "1", + "resource_type": "setting" + }, + { + "id": 82, + "category": "security", + "name": "allow_unsafe_html_in_articles", + "is_protected": false, + "value": "0", + "resource_type": "setting" + }, + { + "id": 63, + "category": "email", + "name": "custom_dkim", + "is_protected": false, + "value": "0", + "resource_type": "setting" + }, + { + "id": 34, + "category": "security", + "name": "customer.authentication_type", + "is_protected": false, + "value": "internal", + "resource_type": "setting" + }, + { + "id": 39, + "category": "security", + "name": "customer.login_attempt_limit", + "is_protected": false, + "value": "10", + "resource_type": "setting" + }, + { + "id": 45, + "category": "security", + "name": "customer.password.expires_in", + "is_protected": false, + "value": "0", + "resource_type": "setting" + }, + { + "id": 44, + "category": "security", + "name": "customer.password.max_consecutive", + "is_protected": false, + "value": "0", + "resource_type": "setting" + }, + { + "id": 40, + "category": "security", + "name": "customer.password.min_characters", + "is_protected": false, + "value": "8", + "resource_type": "setting" + }, + { + "id": 41, + "category": "security", + "name": "customer.password.min_numbers", + "is_protected": false, + "value": "1", + "resource_type": "setting" + }, + { + "id": 42, + "category": "security", + "name": "customer.password.min_symbols", + "is_protected": false, + "value": "0", + "resource_type": "setting" + }, + { + "id": 43, + "category": "security", + "name": "customer.password.require_mixed_case", + "is_protected": false, + "value": "0", + "resource_type": "setting" + }, + { + "id": 38, + "category": "security", + "name": "customer.session_expiry", + "is_protected": false, + "value": "72", + "resource_type": "setting" + }, + { + "id": 36, + "category": "security", + "name": "customer.social_authentication.facebook", + "is_protected": false, + "value": "1", + "resource_type": "setting" + }, + { + "id": 37, + "category": "security", + "name": "customer.social_authentication.google", + "is_protected": false, + "value": "1", + "resource_type": "setting" + }, + { + "id": 35, + "category": "security", + "name": "customer.social_authentication.twitter", + "is_protected": false, + "value": "1", + "resource_type": "setting" + }, + { + "id": 46, + "category": "security", + "name": "customer.sso.jwt.login_url", + "is_protected": false, + "value": "", + "resource_type": "setting" + }, + { + "id": 47, + "category": "security", + "name": "customer.sso.jwt.logout_url", + "is_protected": false, + "value": "", + "resource_type": "setting" + }, + { + "id": 49, + "category": "security", + "name": "customer.sso.jwt.service_name", + "is_protected": false, + "value": "Customer SSO Service", + "resource_type": "setting" + }, + { + "id": 48, + "category": "security", + "name": "customer.sso.jwt.shared_secret", + "is_protected": false, + "value": "", + "resource_type": "setting" + }, + { + "id": 4, + "category": "account", + "name": "default_language", + "is_protected": false, + "value": "en-us", + "resource_type": "setting" + }, + { + "id": 68, + "category": "users", + "name": "email_blacklist", + "is_protected": false, + "value": "", + "resource_type": "setting" + }, + { + "id": 61, + "category": "email", + "name": "email_inbound_html", + "is_protected": false, + "value": "0", + "resource_type": "setting" + }, + { + "id": 67, + "category": "users", + "name": "email_whitelist", + "is_protected": false, + "value": "", + "resource_type": "setting" + }, + { + "id": 15, + "category": "user", + "name": "experience_kayako_completed", + "is_protected": false, + "value": "0", + "resource_type": "setting" + }, + { + "id": 16, + "category": "user", + "name": "learn_kayako_completed", + "is_protected": false, + "value": "0", + "resource_type": "setting" + }, + { + "id": 62, + "category": "email", + "name": "personalize_replies", + "is_protected": false, + "value": "1", + "resource_type": "setting" + }, + { + "id": 56, + "category": "cases", + "name": "reopen_conversation_on_bounce", + "is_protected": false, + "value": "1", + "resource_type": "setting" + }, + { + "id": 66, + "category": "users", + "name": "require_captcha", + "is_protected": false, + "value": "1", + "resource_type": "setting" + }, + { + "id": 75, + "category": "messenger", + "name": "setup", + "is_protected": false, + "value": "0", + "resource_type": "setting" + }, + { + "id": 60, + "category": "email", + "name": "spam_score", + "is_protected": false, + "value": "5", + "resource_type": "setting" + }, + { + "id": 17, + "category": "user", + "name": "team_added", + "is_protected": false, + "value": "0", + "resource_type": "setting" + }, + { + "id": 74, + "category": "chat", + "name": "teams", + "is_protected": false, + "value": "", + "resource_type": "setting" + }, + { + "id": 6, + "category": "account", + "name": "time_format", + "is_protected": false, + "value": "24hour", + "resource_type": "setting" + }, + { + "id": 55, + "category": "cases", + "name": "timetracking", + "is_protected": false, + "value": "1", + "resource_type": "setting" + }, + { + "id": 5, + "category": "account", + "name": "timezone", + "is_protected": false, + "value": "UTC", + "resource_type": "setting" + }, + { + "id": 52, + "category": "security", + "name": "token.android", + "is_protected": true, + "value": "", + "resource_type": "setting" + }, + { + "id": 51, + "category": "security", + "name": "token.ios", + "is_protected": true, + "value": "", + "resource_type": "setting" + }, + { + "id": 50, + "category": "security", + "name": "token.web", + "is_protected": true, + "value": "", + "resource_type": "setting" + }, + { + "id": 59, + "category": "email", + "name": "wildcard_email", + "is_protected": false, + "value": "1", + "resource_type": "setting" + } + ], + "resource": "setting", + "total_count": 58, + "session_id": "TayW6Qnt0Loid4b9a618960d7e46555d8d95657ab22808718f64lWdx9dau5cFE99JtQiSLIv2Y5Asz" + } + recorded_at: Fri, 01 Oct 2021 15:58:52 GMT +- request: + method: get + uri: https:///api/v1/teams?limit=100 + body: + encoding: US-ASCII + string: '' + headers: + Content-Type: + - application/json + X-Session-Id: + - TayW6Qnt0Loid4b9a618960d7e46555d8d95657ab22808718f64lWdx9dau5cFE99JtQiSLIv2Y5Asz + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + User-Agent: + - Ruby + Host: + - "" + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx + Date: + - Fri, 01 Oct 2021 15:58:53 GMT + Content-Type: + - application/json + Transfer-Encoding: + - chunked + Connection: + - keep-alive + Cache-Control: + - private, max-age=0, must-revalidate + Expires: + - '0' + X-Api-Version: + - '1' + Date-Iso: + - '2021-10-01T15:58:53+00:00' + Access-Control-Expose-Headers: + - Date-ISO + X-Xss-Protection: + - 1; mode=block + X-Content-Type-Options: + - nosniff + Strict-Transport-Security: + - max-age=31536000; includeSubDomains preload + body: + encoding: ASCII-8BIT + string: |- + { + "status": 200, + "data": [ + { + "id": 1, + "legacy_id": null, + "title": "General", + "businesshour": { + "id": 1, + "resource_type": "business_hour" + }, + "member_count": 2, + "created_at": "2021-08-24T18:24:11+00:00", + "updated_at": "2021-08-24T18:24:11+00:00", + "resource_type": "team", + "resource_url": "https:///api/v1/teams/1" + }, + { + "id": 2, + "legacy_id": null, + "title": "Support", + "businesshour": { + "id": 1, + "resource_type": "business_hour" + }, + "member_count": 1, + "created_at": "2021-08-27T11:27:14+00:00", + "updated_at": "2021-08-27T11:27:14+00:00", + "resource_type": "team", + "resource_url": "https:///api/v1/teams/2" + }, + { + "id": 3, + "legacy_id": null, + "title": "Sales", + "businesshour": { + "id": 1, + "resource_type": "business_hour" + }, + "member_count": 0, + "created_at": "2021-08-27T11:27:24+00:00", + "updated_at": "2021-08-27T11:27:24+00:00", + "resource_type": "team", + "resource_url": "https:///api/v1/teams/3" + }, + { + "id": 4, + "legacy_id": null, + "title": "Marketing", + "businesshour": { + "id": 1, + "resource_type": "business_hour" + }, + "member_count": 0, + "created_at": "2021-08-27T11:27:43+00:00", + "updated_at": "2021-08-27T11:27:44+00:00", + "resource_type": "team", + "resource_url": "https:///api/v1/teams/4" + } + ], + "resource": "team", + "offset": 0, + "limit": 100, + "total_count": 4 + } + recorded_at: Fri, 01 Oct 2021 15:58:53 GMT +- request: + method: get + uri: https:///api/v1/organizations/fields?include=field_option,locale_field&limit=100 + body: + encoding: US-ASCII + string: '' + headers: + Content-Type: + - application/json + X-Session-Id: + - TayW6Qnt0Loid4b9a618960d7e46555d8d95657ab22808718f64lWdx9dau5cFE99JtQiSLIv2Y5Asz + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + User-Agent: + - Ruby + Host: + - "" + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx + Date: + - Fri, 01 Oct 2021 15:58:53 GMT + Content-Type: + - application/json + Content-Length: + - '97' + Connection: + - keep-alive + Etag: + - d41d8cd98f00b204e9800998ecf8427e + Cache-Control: + - private, max-age=0, must-revalidate + Expires: + - '0' + X-Api-Version: + - '1' + Date-Iso: + - '2021-10-01T15:58:53+00:00' + Access-Control-Expose-Headers: + - Date-ISO + X-Xss-Protection: + - 1; mode=block + X-Content-Type-Options: + - nosniff + Strict-Transport-Security: + - max-age=31536000; includeSubDomains preload + body: + encoding: UTF-8 + string: |- + { + "status": 200, + "data": [], + "resource": "organization_field", + "total_count": 0 + } + recorded_at: Fri, 01 Oct 2021 15:58:53 GMT +- request: + method: get + uri: https:///api/v1/organizations?include=organization_field,field_option,locale_field,identity_domain&limit=100 + body: + encoding: US-ASCII + string: '' + headers: + Content-Type: + - application/json + X-Session-Id: + - TayW6Qnt0Loid4b9a618960d7e46555d8d95657ab22808718f64lWdx9dau5cFE99JtQiSLIv2Y5Asz + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + User-Agent: + - Ruby + Host: + - "" + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx + Date: + - Fri, 01 Oct 2021 15:58:54 GMT + Content-Type: + - application/json + Transfer-Encoding: + - chunked + Connection: + - keep-alive + Cache-Control: + - private, max-age=0, must-revalidate + Expires: + - '0' + X-Api-Version: + - '1' + Date-Iso: + - '2021-10-01T15:58:54+00:00' + Access-Control-Expose-Headers: + - Date-ISO + X-Xss-Protection: + - 1; mode=block + X-Content-Type-Options: + - nosniff + Strict-Transport-Security: + - max-age=31536000; includeSubDomains preload + body: + encoding: ASCII-8BIT + string: |- + { + "status": 200, + "data": [ + { + "id": 3, + "name": "Zammad Foundation", + "legacy_id": null, + "is_shared": false, + "domains": [ + { + "id": 3, + "domain": "zammad.org", + "is_primary": true, + "is_validated": false, + "created_at": "2021-08-27T10:33:16+00:00", + "updated_at": "2021-08-27T10:33:16+00:00", + "resource_type": "identity_domain", + "resource_url": "https:///api/v1/identities/domains/3" + } + ], + "is_validated": null, + "phone": [], + "addresses": [], + "websites": [], + "pinned_notes_count": 0, + "custom_fields": [], + "created_at": "2021-08-27T10:33:09+00:00", + "updated_at": "2021-08-27T10:33:16+00:00", + "resource_type": "organization", + "resource_url": "https:///api/v1/organizations/3" + }, + { + "id": 2, + "name": "Brewfictus", + "legacy_id": null, + "is_shared": false, + "domains": [ + { + "id": 2, + "domain": "brewfictus.com", + "is_primary": true, + "is_validated": false, + "created_at": "2021-08-24T18:24:12+00:00", + "updated_at": "2021-08-24T18:24:12+00:00", + "resource_type": "identity_domain", + "resource_url": "https:///api/v1/identities/domains/2" + } + ], + "is_validated": null, + "phone": [], + "addresses": [], + "websites": [], + "pinned_notes_count": 0, + "custom_fields": [], + "created_at": "2021-08-24T18:24:12+00:00", + "updated_at": "2021-08-24T18:24:12+00:00", + "resource_type": "organization", + "resource_url": "https:///api/v1/organizations/2" + }, + { + "id": 1, + "name": "Kayako", + "legacy_id": null, + "is_shared": false, + "domains": [ + { + "id": 1, + "domain": "kayako.com", + "is_primary": true, + "is_validated": false, + "created_at": "2021-08-24T18:24:11+00:00", + "updated_at": "2021-08-24T18:24:11+00:00", + "resource_type": "identity_domain", + "resource_url": "https:///api/v1/identities/domains/1" + } + ], + "is_validated": null, + "phone": [], + "addresses": [], + "websites": [], + "pinned_notes_count": 0, + "custom_fields": [], + "created_at": "2021-08-24T18:24:11+00:00", + "updated_at": "2021-08-24T18:24:11+00:00", + "resource_type": "organization", + "resource_url": "https:///api/v1/organizations/1" + } + ], + "resource": "organization", + "offset": 0, + "limit": 100, + "total_count": 3 + } + recorded_at: Fri, 01 Oct 2021 15:58:54 GMT +- request: + method: get + uri: https:///api/v1/users/fields?include=field_option,locale_field&limit=100 + body: + encoding: US-ASCII + string: '' + headers: + Content-Type: + - application/json + X-Session-Id: + - TayW6Qnt0Loid4b9a618960d7e46555d8d95657ab22808718f64lWdx9dau5cFE99JtQiSLIv2Y5Asz + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + User-Agent: + - Ruby + Host: + - "" + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx + Date: + - Fri, 01 Oct 2021 15:58:55 GMT + Content-Type: + - application/json + Content-Length: + - '89' + Connection: + - keep-alive + Etag: + - d41d8cd98f00b204e9800998ecf8427e + Cache-Control: + - private, max-age=0, must-revalidate + Expires: + - '0' + X-Api-Version: + - '1' + Date-Iso: + - '2021-10-01T15:58:55+00:00' + Access-Control-Expose-Headers: + - Date-ISO + X-Xss-Protection: + - 1; mode=block + X-Content-Type-Options: + - nosniff + Strict-Transport-Security: + - max-age=31536000; includeSubDomains preload + body: + encoding: UTF-8 + string: |- + { + "status": 200, + "data": [], + "resource": "user_field", + "total_count": 0 + } + recorded_at: Fri, 01 Oct 2021 15:58:55 GMT +- request: + method: get + uri: https:///api/v1/users?include=user_field,field_option,locale_field,identity_email,identify_phone,identity_twitter,identity_facebook,role&limit=100 + body: + encoding: US-ASCII + string: '' + headers: + Content-Type: + - application/json + X-Session-Id: + - TayW6Qnt0Loid4b9a618960d7e46555d8d95657ab22808718f64lWdx9dau5cFE99JtQiSLIv2Y5Asz + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + User-Agent: + - Ruby + Host: + - "" + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx + Date: + - Fri, 01 Oct 2021 15:58:55 GMT + Content-Type: + - application/json + Transfer-Encoding: + - chunked + Connection: + - keep-alive + Cache-Control: + - private, max-age=0, must-revalidate + Expires: + - '0' + X-Api-Version: + - '1' + Date-Iso: + - '2021-10-01T15:58:55+00:00' + Access-Control-Expose-Headers: + - Date-ISO + X-Xss-Protection: + - 1; mode=block + X-Content-Type-Options: + - nosniff + Strict-Transport-Security: + - max-age=31536000; includeSubDomains preload + body: + encoding: ASCII-8BIT + string: |- + { + "status": 200, + "data": [ + { + "id": 7, + "uuid": "0c546446-d095-54c5-ae57-5f6f838d3c43", + "full_name": "Dominik Klein", + "legacy_id": null, + "designation": null, + "is_enabled": true, + "is_mfa_enabled": false, + "role": { + "id": 4, + "title": "Customer", + "type": "CUSTOMER", + "is_system": true, + "agent_case_access": null, + "created_at": "2021-08-24T18:24:11+00:00", + "updated_at": "2021-08-24T18:24:11+00:00", + "resource_type": "role", + "resource_url": "https:///api/v1/roles/4" + }, + "avatar": "https:///avatar/get/0c546446-d095-54c5-ae57-5f6f838d3c43?1633096989", + "agent_case_access": null, + "organization_case_access": "REQUESTED", + "organization": null, + "teams": [], + "emails": [ + { + "id": 7, + "email": "dominik.klein.morsbach@gmail.com", + "is_primary": true, + "is_validated": false, + "is_notification_enabled": false, + "created_at": "2021-08-27T10:49:56+00:00", + "updated_at": "2021-08-27T10:49:56+00:00", + "resource_type": "identity_email", + "resource_url": "https:///api/v1/identities/emails/7" + } + ], + "phones": [], + "twitter": [], + "facebook": [], + "external_identifiers": [], + "custom_fields": [], + "pinned_notes_count": 0, + "locale": { + "id": 3, + "resource_type": "locale" + }, + "time_zone": "Europe/Paris", + "time_zone_offset": 7200, + "greeting": null, + "signature": null, + "status_message": null, + "last_seen_user_agent": null, + "last_seen_ip": null, + "last_seen_at": "2021-08-27T10:49:56+00:00", + "last_active_at": "2021-10-01T14:03:09+00:00", + "realtime_channel": "presence-442543cd422877504001eb0550f189ad362d6475fa6d95fd0f2d8ee0ff770f65@v1_users_7", + "presence_channel": "user_presence-442543cd422877504001eb0550f189ad362d6475fa6d95fd0f2d8ee0ff770f65@f806879cb5bb012167bf61d705bfe94adf2e791b", + "password_updated_at": "2021-08-27T10:49:56+00:00", + "avatar_updated_at": null, + "last_logged_in_at": null, + "last_activity_at": null, + "created_at": "2021-08-27T10:49:56+00:00", + "updated_at": "2021-10-01T14:03:09+00:00", + "resource_type": "user", + "resource_url": "https:///api/v1/users/7" + }, + { + "id": 6, + "uuid": "f27a9e93-9756-5535-948f-654b73af873c", + "full_name": "Customer", + "legacy_id": null, + "designation": null, + "is_enabled": false, + "is_mfa_enabled": false, + "role": { + "id": 4, + "title": "Customer", + "type": "CUSTOMER", + "is_system": true, + "agent_case_access": null, + "created_at": "2021-08-24T18:24:11+00:00", + "updated_at": "2021-08-24T18:24:11+00:00", + "resource_type": "role", + "resource_url": "https:///api/v1/roles/4" + }, + "avatar": "https:///avatar/get/f27a9e93-9756-5535-948f-654b73af873c?1630061084", + "agent_case_access": null, + "organization_case_access": "REQUESTED", + "organization": { + "id": 3, + "resource_type": "organization" + }, + "teams": [], + "emails": [ + { + "id": 6, + "email": "customer@zammad.org", + "is_primary": true, + "is_validated": false, + "is_notification_enabled": false, + "created_at": "2021-08-27T10:44:36+00:00", + "updated_at": "2021-08-27T10:44:36+00:00", + "resource_type": "identity_email", + "resource_url": "https:///api/v1/identities/emails/6" + } + ], + "phones": [], + "twitter": [], + "facebook": [], + "external_identifiers": [], + "custom_fields": [], + "pinned_notes_count": 0, + "locale": { + "id": 3, + "resource_type": "locale" + }, + "time_zone": null, + "time_zone_offset": null, + "greeting": null, + "signature": null, + "status_message": null, + "last_seen_user_agent": null, + "last_seen_ip": null, + "last_seen_at": null, + "last_active_at": "2021-08-27T10:44:36+00:00", + "realtime_channel": "presence-442543cd422877504001eb0550f189ad362d6475fa6d95fd0f2d8ee0ff770f65@v1_users_6", + "presence_channel": "user_presence-442543cd422877504001eb0550f189ad362d6475fa6d95fd0f2d8ee0ff770f65@f9bd1ca07611d6dae6f265a93ee99062744e52cf", + "password_updated_at": "2021-08-27T10:44:36+00:00", + "avatar_updated_at": null, + "last_logged_in_at": null, + "last_activity_at": null, + "created_at": "2021-08-27T10:44:36+00:00", + "updated_at": "2021-08-27T10:44:44+00:00", + "resource_type": "user", + "resource_url": "https:///api/v1/users/6" + }, + { + "id": 5, + "uuid": "05c4cfa9-a17f-558e-a8bb-8288a0858d4c", + "full_name": "Simon Diaz", + "legacy_id": null, + "designation": null, + "is_enabled": false, + "is_mfa_enabled": false, + "role": { + "id": 4, + "title": "Customer", + "type": "CUSTOMER", + "is_system": true, + "agent_case_access": null, + "created_at": "2021-08-24T18:24:11+00:00", + "updated_at": "2021-08-24T18:24:11+00:00", + "resource_type": "role", + "resource_url": "https:///api/v1/roles/4" + }, + "avatar": "https:///avatar/get/05c4cfa9-a17f-558e-a8bb-8288a0858d4c?1633095179", + "agent_case_access": null, + "organization_case_access": "REQUESTED", + "organization": { + "id": 1, + "resource_type": "organization" + }, + "teams": [], + "emails": [ + { + "id": 5, + "email": "simon@brewfictus.com", + "is_primary": true, + "is_validated": false, + "is_notification_enabled": false, + "created_at": "2021-08-24T18:24:12+00:00", + "updated_at": "2021-08-24T18:24:12+00:00", + "resource_type": "identity_email", + "resource_url": "https:///api/v1/identities/emails/5" + } + ], + "phones": [], + "twitter": [], + "facebook": [], + "external_identifiers": [], + "custom_fields": [], + "pinned_notes_count": 0, + "locale": { + "id": 3, + "resource_type": "locale" + }, + "time_zone": "UTC", + "time_zone_offset": 0, + "greeting": null, + "signature": "", + "status_message": null, + "last_seen_user_agent": null, + "last_seen_ip": null, + "last_seen_at": null, + "last_active_at": "2021-10-01T13:32:59+00:00", + "realtime_channel": "presence-442543cd422877504001eb0550f189ad362d6475fa6d95fd0f2d8ee0ff770f65@v1_users_5", + "presence_channel": "user_presence-442543cd422877504001eb0550f189ad362d6475fa6d95fd0f2d8ee0ff770f65@d5b4e65fcec6a8c20de613e3644e7532bb82e8ff", + "password_updated_at": "2021-08-24T18:24:12+00:00", + "avatar_updated_at": "2021-08-24T18:24:12+00:00", + "last_logged_in_at": null, + "last_activity_at": null, + "created_at": "2021-08-24T18:24:12+00:00", + "updated_at": "2021-10-01T13:32:59+00:00", + "resource_type": "user", + "resource_url": "https:///api/v1/users/5" + }, + { + "id": 4, + "uuid": "38dcb0ec-6b1a-5526-84fc-2eac97e0108e", + "full_name": "Tobias Schroeter", + "legacy_id": null, + "designation": null, + "is_enabled": true, + "is_mfa_enabled": false, + "role": { + "id": 4, + "title": "Customer", + "type": "CUSTOMER", + "is_system": true, + "agent_case_access": null, + "created_at": "2021-08-24T18:24:11+00:00", + "updated_at": "2021-08-24T18:24:11+00:00", + "resource_type": "role", + "resource_url": "https:///api/v1/roles/4" + }, + "avatar": "https:///avatar/get/38dcb0ec-6b1a-5526-84fc-2eac97e0108e?1633083506", + "agent_case_access": null, + "organization_case_access": "REQUESTED", + "organization": { + "id": 1, + "resource_type": "organization" + }, + "teams": [], + "emails": [ + { + "id": 4, + "email": "tobias@brewfictus.com", + "is_primary": true, + "is_validated": false, + "is_notification_enabled": false, + "created_at": "2021-08-24T18:24:12+00:00", + "updated_at": "2021-08-24T18:24:12+00:00", + "resource_type": "identity_email", + "resource_url": "https:///api/v1/identities/emails/4" + } + ], + "phones": [], + "twitter": [ + { + "id": 2, + "twitter_id": "738160281235292160", + "full_name": "Tobias", + "screen_name": "TobyBrewfictus", + "follower_count": 0, + "description": null, + "url": null, + "location": null, + "profile_image_url": null, + "locale": null, + "is_verified": false, + "is_primary": false, + "is_validated": false, + "created_at": "2021-08-24T18:24:35+00:00", + "updated_at": "2021-08-24T18:24:35+00:00", + "resource_type": "identity_twitter", + "resource_url": "https:///api/v1/identities/twitter/2" + } + ], + "facebook": [], + "external_identifiers": [], + "custom_fields": [], + "pinned_notes_count": 0, + "locale": { + "id": 3, + "resource_type": "locale" + }, + "time_zone": "UTC", + "time_zone_offset": 0, + "greeting": null, + "signature": "", + "status_message": null, + "last_seen_user_agent": null, + "last_seen_ip": null, + "last_seen_at": null, + "last_active_at": "2021-10-01T10:18:26+00:00", + "realtime_channel": "presence-442543cd422877504001eb0550f189ad362d6475fa6d95fd0f2d8ee0ff770f65@v1_users_4", + "presence_channel": "user_presence-442543cd422877504001eb0550f189ad362d6475fa6d95fd0f2d8ee0ff770f65@ccf0bc16a353495989e7760977f43fae0ecfa29c", + "password_updated_at": "2021-08-24T18:24:12+00:00", + "avatar_updated_at": "2021-08-24T18:24:12+00:00", + "last_logged_in_at": null, + "last_activity_at": null, + "created_at": "2021-08-24T18:24:12+00:00", + "updated_at": "2021-10-01T10:18:26+00:00", + "resource_type": "user", + "resource_url": "https:///api/v1/users/4" + }, + { + "id": 3, + "uuid": "81d8a32c-de07-5ed6-b92f-ef42650299a2", + "full_name": "Taylor West", + "legacy_id": null, + "designation": null, + "is_enabled": true, + "is_mfa_enabled": false, + "role": { + "id": 4, + "title": "Customer", + "type": "CUSTOMER", + "is_system": true, + "agent_case_access": null, + "created_at": "2021-08-24T18:24:11+00:00", + "updated_at": "2021-08-24T18:24:11+00:00", + "resource_type": "role", + "resource_url": "https:///api/v1/roles/4" + }, + "avatar": "https:///avatar/get/81d8a32c-de07-5ed6-b92f-ef42650299a2?1630066733", + "agent_case_access": null, + "organization_case_access": "REQUESTED", + "organization": { + "id": 1, + "resource_type": "organization" + }, + "teams": [], + "emails": [ + { + "id": 3, + "email": "rainbowcitycafe@gmail.com", + "is_primary": true, + "is_validated": false, + "is_notification_enabled": false, + "created_at": "2021-08-24T18:24:12+00:00", + "updated_at": "2021-08-24T18:24:12+00:00", + "resource_type": "identity_email", + "resource_url": "https:///api/v1/identities/emails/3" + } + ], + "phones": [], + "twitter": [ + { + "id": 1, + "twitter_id": "85425062392723712", + "full_name": "Taylor West", + "screen_name": "TaylorWestRnbw", + "follower_count": 0, + "description": null, + "url": null, + "location": null, + "profile_image_url": null, + "locale": null, + "is_verified": false, + "is_primary": false, + "is_validated": false, + "created_at": "2021-08-24T18:24:34+00:00", + "updated_at": "2021-08-24T18:24:34+00:00", + "resource_type": "identity_twitter", + "resource_url": "https:///api/v1/identities/twitter/1" + } + ], + "facebook": [], + "external_identifiers": [], + "custom_fields": [], + "pinned_notes_count": 0, + "locale": { + "id": 3, + "resource_type": "locale" + }, + "time_zone": "UTC", + "time_zone_offset": 0, + "greeting": null, + "signature": null, + "status_message": null, + "last_seen_user_agent": null, + "last_seen_ip": null, + "last_seen_at": "2021-08-27T12:18:53+00:00", + "last_active_at": "2021-08-27T12:18:53+00:00", + "realtime_channel": "presence-442543cd422877504001eb0550f189ad362d6475fa6d95fd0f2d8ee0ff770f65@v1_users_3", + "presence_channel": "user_presence-442543cd422877504001eb0550f189ad362d6475fa6d95fd0f2d8ee0ff770f65@dd132dd919d8d003c2bcd2e006a9133a8669d204", + "password_updated_at": "2021-08-24T18:24:11+00:00", + "avatar_updated_at": "2021-08-24T18:24:12+00:00", + "last_logged_in_at": null, + "last_activity_at": null, + "created_at": "2021-08-24T18:24:11+00:00", + "updated_at": "2021-08-27T12:18:53+00:00", + "resource_type": "user", + "resource_url": "https:///api/v1/users/3" + }, + { + "id": 2, + "uuid": "575e6dc8-5406-5d65-b012-11e152c69758", + "full_name": "Kelly O'Brien", + "legacy_id": null, + "designation": null, + "is_enabled": true, + "is_mfa_enabled": false, + "role": { + "id": 3, + "title": "Collaborator", + "type": "COLLABORATOR", + "is_system": true, + "agent_case_access": "ALL", + "created_at": "2021-08-24T18:24:11+00:00", + "updated_at": "2021-08-24T18:24:11+00:00", + "resource_type": "role", + "resource_url": "https:///api/v1/roles/3" + }, + "avatar": "https:///avatar/get/575e6dc8-5406-5d65-b012-11e152c69758?1630061019", + "agent_case_access": "ALL", + "organization_case_access": null, + "organization": { + "id": 1, + "resource_type": "organization" + }, + "teams": [ + { + "id": 1, + "resource_type": "team" + } + ], + "emails": [ + { + "id": 2, + "email": "kelly@kayako.com", + "is_primary": true, + "is_validated": false, + "is_notification_enabled": false, + "created_at": "2021-08-24T18:24:11+00:00", + "updated_at": "2021-08-24T18:24:11+00:00", + "resource_type": "identity_email", + "resource_url": "https:///api/v1/identities/emails/2" + } + ], + "phones": [], + "twitter": [], + "facebook": [], + "external_identifiers": [], + "custom_fields": [], + "pinned_notes_count": 0, + "locale": { + "id": 3, + "resource_type": "locale" + }, + "time_zone": "UTC", + "time_zone_offset": 0, + "greeting": null, + "signature": null, + "status_message": null, + "last_seen_user_agent": null, + "last_seen_ip": null, + "last_seen_at": null, + "last_active_at": "2021-08-27T10:43:39+00:00", + "realtime_channel": "presence-442543cd422877504001eb0550f189ad362d6475fa6d95fd0f2d8ee0ff770f65@v1_users_2", + "presence_channel": "user_presence-442543cd422877504001eb0550f189ad362d6475fa6d95fd0f2d8ee0ff770f65@5714d8e200a4f6460dab8a3ce070827c67597874", + "password_updated_at": "2021-08-24T18:24:11+00:00", + "avatar_updated_at": "2021-08-24T18:24:11+00:00", + "last_logged_in_at": null, + "last_activity_at": null, + "created_at": "2021-08-24T18:24:11+00:00", + "updated_at": "2021-08-27T10:43:39+00:00", + "resource_type": "user", + "resource_url": "https:///api/v1/users/2" + }, + { + "id": 1, + "uuid": "a8dfe5fd-b08d-5d07-ad8b-74b113f5d726", + "full_name": "Thorsten Eckel", + "legacy_id": null, + "designation": null, + "is_enabled": true, + "is_mfa_enabled": false, + "role": { + "id": 5, + "title": "Owner", + "type": "OWNER", + "is_system": true, + "agent_case_access": "ALL", + "created_at": "2021-08-24T18:24:11+00:00", + "updated_at": "2021-08-24T18:24:11+00:00", + "resource_type": "role", + "resource_url": "https:///api/v1/roles/5" + }, + "avatar": "https:///avatar/get/a8dfe5fd-b08d-5d07-ad8b-74b113f5d726?1633103802", + "agent_case_access": "ALL", + "organization_case_access": null, + "organization": { + "id": 3, + "resource_type": "organization" + }, + "teams": [ + { + "id": 1, + "resource_type": "team" + }, + { + "id": 2, + "resource_type": "team" + } + ], + "emails": [ + { + "id": 1, + "email": "", + "is_primary": true, + "is_validated": true, + "is_notification_enabled": false, + "created_at": "2021-08-24T18:24:11+00:00", + "updated_at": "2021-08-27T06:57:08+00:00", + "resource_type": "identity_email", + "resource_url": "https:///api/v1/identities/emails/1" + } + ], + "phones": [], + "twitter": [], + "facebook": [], + "external_identifiers": [], + "custom_fields": [], + "pinned_notes_count": 0, + "locale": { + "id": 3, + "resource_type": "locale" + }, + "time_zone": "UTC", + "time_zone_offset": 0, + "greeting": null, + "signature": null, + "status_message": null, + "last_seen_user_agent": "Ruby", + "last_seen_ip": "5.231.138.208", + "last_seen_at": "2021-10-01T15:56:42+00:00", + "last_active_at": "2021-10-01T15:56:42+00:00", + "realtime_channel": "presence-442543cd422877504001eb0550f189ad362d6475fa6d95fd0f2d8ee0ff770f65@v1_users_1", + "presence_channel": "user_presence-442543cd422877504001eb0550f189ad362d6475fa6d95fd0f2d8ee0ff770f65@cf0274b394db3af555dbc136fc70aab6e45bee42", + "password_updated_at": "2021-08-27T07:18:23+00:00", + "avatar_updated_at": null, + "last_logged_in_at": "2021-10-01T15:58:52+00:00", + "last_activity_at": "2021-10-01T15:58:52+00:00", + "created_at": "2021-08-24T18:24:11+00:00", + "updated_at": "2021-10-01T15:56:42+00:00", + "resource_type": "user", + "resource_url": "https:///api/v1/users/1" + } + ], + "resource": "user", + "offset": 0, + "limit": 100, + "total_count": 7 + } + recorded_at: Fri, 01 Oct 2021 15:58:55 GMT +- request: + method: get + uri: https:///api/v1/cases/fields?include=field_option,locale_field&limit=100 + body: + encoding: US-ASCII + string: '' + headers: + Content-Type: + - application/json + X-Session-Id: + - TayW6Qnt0Loid4b9a618960d7e46555d8d95657ab22808718f64lWdx9dau5cFE99JtQiSLIv2Y5Asz + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + User-Agent: + - Ruby + Host: + - "" + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx + Date: + - Fri, 01 Oct 2021 15:58:56 GMT + Content-Type: + - application/json + Transfer-Encoding: + - chunked + Connection: + - keep-alive + Cache-Control: + - private, max-age=0, must-revalidate + Expires: + - '0' + X-Api-Version: + - '1' + Date-Iso: + - '2021-10-01T15:58:56+00:00' + Access-Control-Expose-Headers: + - Date-ISO + X-Xss-Protection: + - 1; mode=block + X-Content-Type-Options: + - nosniff + Strict-Transport-Security: + - max-age=31536000; includeSubDomains preload + body: + encoding: ASCII-8BIT + string: |- + { + "status": 200, + "data": [ + { + "id": 1, + "fielduuid": "beaf2079-5a79-446c-a487-61dfee353f1c", + "title": "Subject", + "type": "SUBJECT", + "key": "subject", + "is_required_for_agents": true, + "is_required_on_resolution": true, + "is_visible_to_customers": true, + "customer_titles": [ + { + "id": 1, + "locale": "en-us", + "translation": "Subject", + "created_at": "2021-08-24T18:24:16+00:00", + "updated_at": "2021-08-24T18:24:16+00:00", + "resource_type": "locale_field", + "resource_url": "https:///api/v1/locale/fields/1" + } + ], + "is_customer_editable": true, + "is_required_for_customers": true, + "descriptions": [ + { + "id": 2, + "locale": "en-us", + "translation": null, + "created_at": "2021-08-24T18:24:16+00:00", + "updated_at": "2021-08-24T18:24:16+00:00", + "resource_type": "locale_field", + "resource_url": "https:///api/v1/locale/fields/2" + } + ], + "regular_expression": null, + "sort_order": 1, + "is_enabled": true, + "is_system": true, + "options": [], + "created_at": "2021-08-24T18:24:16+00:00", + "updated_at": "2021-08-24T18:24:16+00:00", + "resource_type": "case_field", + "resource_url": "https:///api/v1/cases/fields/1" + }, + { + "id": 2, + "fielduuid": "e167724d-13d4-4cc7-9a99-c69078a491eb", + "title": "Message", + "type": "MESSAGE", + "key": "message", + "is_required_for_agents": false, + "is_required_on_resolution": true, + "is_visible_to_customers": true, + "customer_titles": [ + { + "id": 3, + "locale": "en-us", + "translation": "Message", + "created_at": "2021-08-24T18:24:16+00:00", + "updated_at": "2021-08-24T18:24:16+00:00", + "resource_type": "locale_field", + "resource_url": "https:///api/v1/locale/fields/3" + } + ], + "is_customer_editable": true, + "is_required_for_customers": true, + "descriptions": [ + { + "id": 4, + "locale": "en-us", + "translation": null, + "created_at": "2021-08-24T18:24:16+00:00", + "updated_at": "2021-08-24T18:24:16+00:00", + "resource_type": "locale_field", + "resource_url": "https:///api/v1/locale/fields/4" + } + ], + "regular_expression": null, + "sort_order": 2, + "is_enabled": true, + "is_system": true, + "options": [], + "created_at": "2021-08-24T18:24:16+00:00", + "updated_at": "2021-08-24T18:24:16+00:00", + "resource_type": "case_field", + "resource_url": "https:///api/v1/cases/fields/2" + }, + { + "id": 3, + "fielduuid": "ddd30482-7cef-46c6-86f1-2fa57052c80b", + "title": "Priority", + "type": "PRIORITY", + "key": "priority", + "is_required_for_agents": false, + "is_required_on_resolution": false, + "is_visible_to_customers": true, + "customer_titles": [ + { + "id": 5, + "locale": "en-us", + "translation": "Priority", + "created_at": "2021-08-24T18:24:16+00:00", + "updated_at": "2021-08-24T18:24:16+00:00", + "resource_type": "locale_field", + "resource_url": "https:///api/v1/locale/fields/5" + } + ], + "is_customer_editable": true, + "is_required_for_customers": false, + "descriptions": [ + { + "id": 6, + "locale": "en-us", + "translation": null, + "created_at": "2021-08-24T18:24:16+00:00", + "updated_at": "2021-08-24T18:24:16+00:00", + "resource_type": "locale_field", + "resource_url": "https:///api/v1/locale/fields/6" + } + ], + "regular_expression": null, + "sort_order": 3, + "is_enabled": true, + "is_system": true, + "options": [], + "created_at": "2021-08-24T18:24:16+00:00", + "updated_at": "2021-08-24T18:24:16+00:00", + "resource_type": "case_field", + "resource_url": "https:///api/v1/cases/fields/3" + }, + { + "id": 4, + "fielduuid": "f5b106f2-7d88-49cc-9cf8-c0bdd797b76f", + "title": "Status", + "type": "STATUS", + "key": "status", + "is_required_for_agents": false, + "is_required_on_resolution": true, + "is_visible_to_customers": false, + "customer_titles": [ + { + "id": 7, + "locale": "en-us", + "translation": "Status", + "created_at": "2021-08-24T18:24:16+00:00", + "updated_at": "2021-08-24T18:24:16+00:00", + "resource_type": "locale_field", + "resource_url": "https:///api/v1/locale/fields/7" + } + ], + "is_customer_editable": false, + "is_required_for_customers": false, + "descriptions": [ + { + "id": 8, + "locale": "en-us", + "translation": null, + "created_at": "2021-08-24T18:24:16+00:00", + "updated_at": "2021-08-24T18:24:16+00:00", + "resource_type": "locale_field", + "resource_url": "https:///api/v1/locale/fields/8" + } + ], + "regular_expression": null, + "sort_order": 4, + "is_enabled": true, + "is_system": true, + "options": [], + "created_at": "2021-08-24T18:24:16+00:00", + "updated_at": "2021-08-24T18:24:16+00:00", + "resource_type": "case_field", + "resource_url": "https:///api/v1/cases/fields/4" + }, + { + "id": 5, + "fielduuid": "4be5a2aa-307e-4032-8e44-d4ecdf5ecda1", + "title": "Type", + "type": "TYPE", + "key": "type", + "is_required_for_agents": false, + "is_required_on_resolution": false, + "is_visible_to_customers": false, + "customer_titles": [ + { + "id": 9, + "locale": "en-us", + "translation": "Type", + "created_at": "2021-08-24T18:24:16+00:00", + "updated_at": "2021-08-24T18:24:16+00:00", + "resource_type": "locale_field", + "resource_url": "https:///api/v1/locale/fields/9" + } + ], + "is_customer_editable": false, + "is_required_for_customers": false, + "descriptions": [ + { + "id": 10, + "locale": "en-us", + "translation": null, + "created_at": "2021-08-24T18:24:16+00:00", + "updated_at": "2021-08-24T18:24:16+00:00", + "resource_type": "locale_field", + "resource_url": "https:///api/v1/locale/fields/10" + } + ], + "regular_expression": null, + "sort_order": 5, + "is_enabled": true, + "is_system": true, + "options": [], + "created_at": "2021-08-24T18:24:16+00:00", + "updated_at": "2021-08-24T18:24:16+00:00", + "resource_type": "case_field", + "resource_url": "https:///api/v1/cases/fields/5" + }, + { + "id": 6, + "fielduuid": "3ae3f47a-f677-4203-acee-b47cc136e0e9", + "title": "Team", + "type": "TEAM", + "key": "team", + "is_required_for_agents": false, + "is_required_on_resolution": false, + "is_visible_to_customers": false, + "customer_titles": [ + { + "id": 11, + "locale": "en-us", + "translation": "Team", + "created_at": "2021-08-24T18:24:16+00:00", + "updated_at": "2021-08-24T18:24:16+00:00", + "resource_type": "locale_field", + "resource_url": "https:///api/v1/locale/fields/11" + } + ], + "is_customer_editable": false, + "is_required_for_customers": false, + "descriptions": [ + { + "id": 12, + "locale": "en-us", + "translation": null, + "created_at": "2021-08-24T18:24:16+00:00", + "updated_at": "2021-08-24T18:24:16+00:00", + "resource_type": "locale_field", + "resource_url": "https:///api/v1/locale/fields/12" + } + ], + "regular_expression": null, + "sort_order": 6, + "is_enabled": true, + "is_system": true, + "options": [], + "created_at": "2021-08-24T18:24:16+00:00", + "updated_at": "2021-08-24T18:24:16+00:00", + "resource_type": "case_field", + "resource_url": "https:///api/v1/cases/fields/6" + }, + { + "id": 7, + "fielduuid": "ee4d91ac-8e37-44b0-b23e-908f2fb9738a", + "title": "Assignee", + "type": "ASSIGNEE", + "key": "assignee", + "is_required_for_agents": false, + "is_required_on_resolution": false, + "is_visible_to_customers": true, + "customer_titles": [ + { + "id": 13, + "locale": "en-us", + "translation": "Assignee", + "created_at": "2021-08-24T18:24:16+00:00", + "updated_at": "2021-08-24T18:24:16+00:00", + "resource_type": "locale_field", + "resource_url": "https:///api/v1/locale/fields/13" + } + ], + "is_customer_editable": false, + "is_required_for_customers": false, + "descriptions": [ + { + "id": 14, + "locale": "en-us", + "translation": null, + "created_at": "2021-08-24T18:24:16+00:00", + "updated_at": "2021-08-24T18:24:16+00:00", + "resource_type": "locale_field", + "resource_url": "https:///api/v1/locale/fields/14" + } + ], + "regular_expression": null, + "sort_order": 7, + "is_enabled": true, + "is_system": true, + "options": [], + "created_at": "2021-08-24T18:24:16+00:00", + "updated_at": "2021-08-24T18:24:16+00:00", + "resource_type": "case_field", + "resource_url": "https:///api/v1/cases/fields/7" + }, + { + "id": 8, + "fielduuid": "a9bb7938-c0d0-4ff7-988e-c0d61a106941", + "title": "CustomText", + "type": "TEXT", + "key": "customtext", + "is_required_for_agents": false, + "is_required_on_resolution": false, + "is_visible_to_customers": false, + "customer_titles": [ + { + "id": 19, + "locale": "en-us", + "translation": null, + "created_at": "2021-10-01T13:51:53+00:00", + "updated_at": "2021-10-01T13:51:53+00:00", + "resource_type": "locale_field", + "resource_url": "https:///api/v1/locale/fields/19" + } + ], + "is_customer_editable": false, + "is_required_for_customers": false, + "descriptions": [ + { + "id": 20, + "locale": "en-us", + "translation": null, + "created_at": "2021-10-01T13:51:53+00:00", + "updated_at": "2021-10-01T13:51:53+00:00", + "resource_type": "locale_field", + "resource_url": "https:///api/v1/locale/fields/20" + } + ], + "regular_expression": null, + "sort_order": 8, + "is_enabled": true, + "is_system": false, + "options": [], + "created_at": "2021-10-01T13:51:53+00:00", + "updated_at": "2021-10-01T13:51:53+00:00", + "resource_type": "case_field", + "resource_url": "https:///api/v1/cases/fields/8" + }, + { + "id": 9, + "fielduuid": "6d004c13-ca6c-47cf-92f9-4629dfe1401d", + "title": "CustomTextarea", + "type": "TEXTAREA", + "key": "customtextarea", + "is_required_for_agents": false, + "is_required_on_resolution": false, + "is_visible_to_customers": false, + "customer_titles": [ + { + "id": 21, + "locale": "en-us", + "translation": null, + "created_at": "2021-10-01T13:52:08+00:00", + "updated_at": "2021-10-01T13:52:08+00:00", + "resource_type": "locale_field", + "resource_url": "https:///api/v1/locale/fields/21" + } + ], + "is_customer_editable": false, + "is_required_for_customers": false, + "descriptions": [ + { + "id": 22, + "locale": "en-us", + "translation": null, + "created_at": "2021-10-01T13:52:08+00:00", + "updated_at": "2021-10-01T13:52:08+00:00", + "resource_type": "locale_field", + "resource_url": "https:///api/v1/locale/fields/22" + } + ], + "regular_expression": null, + "sort_order": 9, + "is_enabled": true, + "is_system": false, + "options": [], + "created_at": "2021-10-01T13:52:08+00:00", + "updated_at": "2021-10-01T13:52:08+00:00", + "resource_type": "case_field", + "resource_url": "https:///api/v1/cases/fields/9" + }, + { + "id": 10, + "fielduuid": "fcef9f73-e25b-4744-93f6-0166eca5423c", + "title": "CustomRadio", + "type": "RADIO", + "key": "customradio", + "is_required_for_agents": false, + "is_required_on_resolution": false, + "is_visible_to_customers": false, + "customer_titles": [ + { + "id": 23, + "locale": "en-us", + "translation": null, + "created_at": "2021-10-01T13:54:46+00:00", + "updated_at": "2021-10-01T13:54:46+00:00", + "resource_type": "locale_field", + "resource_url": "https:///api/v1/locale/fields/23" + } + ], + "is_customer_editable": false, + "is_required_for_customers": false, + "descriptions": [ + { + "id": 24, + "locale": "en-us", + "translation": null, + "created_at": "2021-10-01T13:54:46+00:00", + "updated_at": "2021-10-01T13:54:46+00:00", + "resource_type": "locale_field", + "resource_url": "https:///api/v1/locale/fields/24" + } + ], + "regular_expression": null, + "sort_order": 10, + "is_enabled": true, + "is_system": false, + "options": [ + { + "id": 1, + "fielduuid": "fcef9f73-e25b-4744-93f6-0166eca5423c", + "values": [ + { + "id": 25, + "locale": "en-us", + "translation": "Test 1", + "created_at": "2021-10-01T13:54:46+00:00", + "updated_at": "2021-10-01T13:54:46+00:00", + "resource_type": "locale_field", + "resource_url": "https:///api/v1/locale/fields/25" + } + ], + "sort_order": 0, + "created_at": "2021-10-01T13:54:46+00:00", + "updated_at": "2021-10-01T13:54:46+00:00", + "resource_type": "field_option", + "resource_url": "https:///api/v1/base/field/option/1" + }, + { + "id": 2, + "fielduuid": "fcef9f73-e25b-4744-93f6-0166eca5423c", + "values": [ + { + "id": 26, + "locale": "en-us", + "translation": "Test 2", + "created_at": "2021-10-01T13:54:46+00:00", + "updated_at": "2021-10-01T13:54:46+00:00", + "resource_type": "locale_field", + "resource_url": "https:///api/v1/locale/fields/26" + } + ], + "sort_order": 0, + "created_at": "2021-10-01T13:54:46+00:00", + "updated_at": "2021-10-01T13:54:46+00:00", + "resource_type": "field_option", + "resource_url": "https:///api/v1/base/field/option/2" + } + ], + "created_at": "2021-10-01T13:54:46+00:00", + "updated_at": "2021-10-01T13:54:46+00:00", + "resource_type": "case_field", + "resource_url": "https:///api/v1/cases/fields/10" + }, + { + "id": 11, + "fielduuid": "60c67010-54e3-442c-9c90-7fba5388ad18", + "title": "CustomSingleSelect", + "type": "SELECT", + "key": "customsingleselect", + "is_required_for_agents": false, + "is_required_on_resolution": false, + "is_visible_to_customers": false, + "customer_titles": [ + { + "id": 27, + "locale": "en-us", + "translation": null, + "created_at": "2021-10-01T13:55:01+00:00", + "updated_at": "2021-10-01T13:55:01+00:00", + "resource_type": "locale_field", + "resource_url": "https:///api/v1/locale/fields/27" + } + ], + "is_customer_editable": false, + "is_required_for_customers": false, + "descriptions": [ + { + "id": 28, + "locale": "en-us", + "translation": null, + "created_at": "2021-10-01T13:55:01+00:00", + "updated_at": "2021-10-01T13:55:01+00:00", + "resource_type": "locale_field", + "resource_url": "https:///api/v1/locale/fields/28" + } + ], + "regular_expression": null, + "sort_order": 11, + "is_enabled": true, + "is_system": false, + "options": [ + { + "id": 3, + "fielduuid": "60c67010-54e3-442c-9c90-7fba5388ad18", + "values": [ + { + "id": 29, + "locale": "en-us", + "translation": "a", + "created_at": "2021-10-01T13:55:01+00:00", + "updated_at": "2021-10-01T13:55:01+00:00", + "resource_type": "locale_field", + "resource_url": "https:///api/v1/locale/fields/29" + } + ], + "sort_order": 0, + "created_at": "2021-10-01T13:55:01+00:00", + "updated_at": "2021-10-01T13:55:01+00:00", + "resource_type": "field_option", + "resource_url": "https:///api/v1/base/field/option/3" + }, + { + "id": 4, + "fielduuid": "60c67010-54e3-442c-9c90-7fba5388ad18", + "values": [ + { + "id": 30, + "locale": "en-us", + "translation": "b", + "created_at": "2021-10-01T13:55:01+00:00", + "updated_at": "2021-10-01T13:55:01+00:00", + "resource_type": "locale_field", + "resource_url": "https:///api/v1/locale/fields/30" + } + ], + "sort_order": 0, + "created_at": "2021-10-01T13:55:01+00:00", + "updated_at": "2021-10-01T13:55:01+00:00", + "resource_type": "field_option", + "resource_url": "https:///api/v1/base/field/option/4" + }, + { + "id": 5, + "fielduuid": "60c67010-54e3-442c-9c90-7fba5388ad18", + "values": [ + { + "id": 31, + "locale": "en-us", + "translation": "c", + "created_at": "2021-10-01T13:55:01+00:00", + "updated_at": "2021-10-01T13:55:01+00:00", + "resource_type": "locale_field", + "resource_url": "https:///api/v1/locale/fields/31" + } + ], + "sort_order": 0, + "created_at": "2021-10-01T13:55:01+00:00", + "updated_at": "2021-10-01T13:55:01+00:00", + "resource_type": "field_option", + "resource_url": "https:///api/v1/base/field/option/5" + } + ], + "created_at": "2021-10-01T13:55:01+00:00", + "updated_at": "2021-10-01T13:55:01+00:00", + "resource_type": "case_field", + "resource_url": "https:///api/v1/cases/fields/11" + }, + { + "id": 12, + "fielduuid": "17fb2d4e-bcfb-4353-8870-e317c14df74e", + "title": "CustomMultiChoice", + "type": "CHECKBOX", + "key": "custommultichoice", + "is_required_for_agents": false, + "is_required_on_resolution": false, + "is_visible_to_customers": false, + "customer_titles": [ + { + "id": 32, + "locale": "en-us", + "translation": null, + "created_at": "2021-10-01T13:55:52+00:00", + "updated_at": "2021-10-01T13:55:52+00:00", + "resource_type": "locale_field", + "resource_url": "https:///api/v1/locale/fields/32" + } + ], + "is_customer_editable": false, + "is_required_for_customers": false, + "descriptions": [ + { + "id": 33, + "locale": "en-us", + "translation": null, + "created_at": "2021-10-01T13:55:52+00:00", + "updated_at": "2021-10-01T13:55:52+00:00", + "resource_type": "locale_field", + "resource_url": "https:///api/v1/locale/fields/33" + } + ], + "regular_expression": null, + "sort_order": 12, + "is_enabled": true, + "is_system": false, + "options": [ + { + "id": 6, + "fielduuid": "17fb2d4e-bcfb-4353-8870-e317c14df74e", + "values": [ + { + "id": 34, + "locale": "en-us", + "translation": "1", + "created_at": "2021-10-01T13:55:52+00:00", + "updated_at": "2021-10-01T13:55:52+00:00", + "resource_type": "locale_field", + "resource_url": "https:///api/v1/locale/fields/34" + } + ], + "sort_order": 0, + "created_at": "2021-10-01T13:55:52+00:00", + "updated_at": "2021-10-01T13:55:52+00:00", + "resource_type": "field_option", + "resource_url": "https:///api/v1/base/field/option/6" + }, + { + "id": 7, + "fielduuid": "17fb2d4e-bcfb-4353-8870-e317c14df74e", + "values": [ + { + "id": 35, + "locale": "en-us", + "translation": "2", + "created_at": "2021-10-01T13:55:52+00:00", + "updated_at": "2021-10-01T13:55:52+00:00", + "resource_type": "locale_field", + "resource_url": "https:///api/v1/locale/fields/35" + } + ], + "sort_order": 0, + "created_at": "2021-10-01T13:55:52+00:00", + "updated_at": "2021-10-01T13:55:52+00:00", + "resource_type": "field_option", + "resource_url": "https:///api/v1/base/field/option/7" + }, + { + "id": 8, + "fielduuid": "17fb2d4e-bcfb-4353-8870-e317c14df74e", + "values": [ + { + "id": 36, + "locale": "en-us", + "translation": "3", + "created_at": "2021-10-01T13:55:52+00:00", + "updated_at": "2021-10-01T13:55:52+00:00", + "resource_type": "locale_field", + "resource_url": "https:///api/v1/locale/fields/36" + } + ], + "sort_order": 0, + "created_at": "2021-10-01T13:55:52+00:00", + "updated_at": "2021-10-01T13:55:52+00:00", + "resource_type": "field_option", + "resource_url": "https:///api/v1/base/field/option/8" + } + ], + "created_at": "2021-10-01T13:55:52+00:00", + "updated_at": "2021-10-01T13:55:52+00:00", + "resource_type": "case_field", + "resource_url": "https:///api/v1/cases/fields/12" + }, + { + "id": 13, + "fielduuid": "2adc53a8-0e91-4f1b-b071-fa02f1d05cc0", + "title": "CustomNumeric", + "type": "NUMERIC", + "key": "customnumeric", + "is_required_for_agents": false, + "is_required_on_resolution": false, + "is_visible_to_customers": false, + "customer_titles": [ + { + "id": 37, + "locale": "en-us", + "translation": null, + "created_at": "2021-10-01T13:56:26+00:00", + "updated_at": "2021-10-01T13:56:26+00:00", + "resource_type": "locale_field", + "resource_url": "https:///api/v1/locale/fields/37" + } + ], + "is_customer_editable": false, + "is_required_for_customers": false, + "descriptions": [ + { + "id": 38, + "locale": "en-us", + "translation": null, + "created_at": "2021-10-01T13:56:26+00:00", + "updated_at": "2021-10-01T13:56:26+00:00", + "resource_type": "locale_field", + "resource_url": "https:///api/v1/locale/fields/38" + } + ], + "regular_expression": null, + "sort_order": 13, + "is_enabled": true, + "is_system": false, + "options": [], + "created_at": "2021-10-01T13:56:26+00:00", + "updated_at": "2021-10-01T13:56:26+00:00", + "resource_type": "case_field", + "resource_url": "https:///api/v1/cases/fields/13" + }, + { + "id": 14, + "fielduuid": "c583698a-e986-4b1c-9001-f8355e2ca951", + "title": "CustomDecimal", + "type": "DECIMAL", + "key": "customdecimal", + "is_required_for_agents": false, + "is_required_on_resolution": false, + "is_visible_to_customers": false, + "customer_titles": [ + { + "id": 39, + "locale": "en-us", + "translation": null, + "created_at": "2021-10-01T13:56:41+00:00", + "updated_at": "2021-10-01T13:56:41+00:00", + "resource_type": "locale_field", + "resource_url": "https:///api/v1/locale/fields/39" + } + ], + "is_customer_editable": false, + "is_required_for_customers": false, + "descriptions": [ + { + "id": 40, + "locale": "en-us", + "translation": null, + "created_at": "2021-10-01T13:56:41+00:00", + "updated_at": "2021-10-01T13:56:41+00:00", + "resource_type": "locale_field", + "resource_url": "https:///api/v1/locale/fields/40" + } + ], + "regular_expression": null, + "sort_order": 14, + "is_enabled": true, + "is_system": false, + "options": [], + "created_at": "2021-10-01T13:56:41+00:00", + "updated_at": "2021-10-01T13:56:41+00:00", + "resource_type": "case_field", + "resource_url": "https:///api/v1/cases/fields/14" + }, + { + "id": 15, + "fielduuid": "ce5e552f-9680-4624-a864-5e01649fcebc", + "title": "CustomYesNo", + "type": "YESNO", + "key": "customyesno", + "is_required_for_agents": false, + "is_required_on_resolution": false, + "is_visible_to_customers": false, + "customer_titles": [ + { + "id": 41, + "locale": "en-us", + "translation": null, + "created_at": "2021-10-01T14:00:31+00:00", + "updated_at": "2021-10-01T14:00:31+00:00", + "resource_type": "locale_field", + "resource_url": "https:///api/v1/locale/fields/41" + } + ], + "is_customer_editable": false, + "is_required_for_customers": false, + "descriptions": [ + { + "id": 42, + "locale": "en-us", + "translation": null, + "created_at": "2021-10-01T14:00:31+00:00", + "updated_at": "2021-10-01T14:00:31+00:00", + "resource_type": "locale_field", + "resource_url": "https:///api/v1/locale/fields/42" + } + ], + "regular_expression": null, + "sort_order": 15, + "is_enabled": true, + "is_system": false, + "options": [], + "created_at": "2021-10-01T14:00:31+00:00", + "updated_at": "2021-10-01T14:00:31+00:00", + "resource_type": "case_field", + "resource_url": "https:///api/v1/cases/fields/15" + }, + { + "id": 16, + "fielduuid": "31a1628f-8041-4313-8fce-705f0209647a", + "title": "CustomTreeSelect", + "type": "CASCADINGSELECT", + "key": "customtreeselect", + "is_required_for_agents": false, + "is_required_on_resolution": false, + "is_visible_to_customers": false, + "customer_titles": [ + { + "id": 43, + "locale": "en-us", + "translation": null, + "created_at": "2021-10-01T14:01:05+00:00", + "updated_at": "2021-10-01T14:01:05+00:00", + "resource_type": "locale_field", + "resource_url": "https:///api/v1/locale/fields/43" + } + ], + "is_customer_editable": false, + "is_required_for_customers": false, + "descriptions": [ + { + "id": 44, + "locale": "en-us", + "translation": null, + "created_at": "2021-10-01T14:01:05+00:00", + "updated_at": "2021-10-01T14:01:05+00:00", + "resource_type": "locale_field", + "resource_url": "https:///api/v1/locale/fields/44" + } + ], + "regular_expression": null, + "sort_order": 16, + "is_enabled": true, + "is_system": false, + "options": [ + { + "id": 9, + "fielduuid": "31a1628f-8041-4313-8fce-705f0209647a", + "values": [ + { + "id": 45, + "locale": "en-us", + "translation": "Level1", + "created_at": "2021-10-01T14:01:05+00:00", + "updated_at": "2021-10-01T14:01:05+00:00", + "resource_type": "locale_field", + "resource_url": "https:///api/v1/locale/fields/45" + } + ], + "sort_order": 0, + "created_at": "2021-10-01T14:01:05+00:00", + "updated_at": "2021-10-01T14:01:05+00:00", + "resource_type": "field_option", + "resource_url": "https:///api/v1/base/field/option/9" + }, + { + "id": 10, + "fielduuid": "31a1628f-8041-4313-8fce-705f0209647a", + "values": [ + { + "id": 46, + "locale": "en-us", + "translation": "Level1::Sub1", + "created_at": "2021-10-01T14:01:05+00:00", + "updated_at": "2021-10-01T14:01:05+00:00", + "resource_type": "locale_field", + "resource_url": "https:///api/v1/locale/fields/46" + } + ], + "sort_order": 0, + "created_at": "2021-10-01T14:01:05+00:00", + "updated_at": "2021-10-01T14:01:05+00:00", + "resource_type": "field_option", + "resource_url": "https:///api/v1/base/field/option/10" + }, + { + "id": 11, + "fielduuid": "31a1628f-8041-4313-8fce-705f0209647a", + "values": [ + { + "id": 47, + "locale": "en-us", + "translation": "Level2", + "created_at": "2021-10-01T14:01:05+00:00", + "updated_at": "2021-10-01T14:01:05+00:00", + "resource_type": "locale_field", + "resource_url": "https:///api/v1/locale/fields/47" + } + ], + "sort_order": 0, + "created_at": "2021-10-01T14:01:05+00:00", + "updated_at": "2021-10-01T14:01:05+00:00", + "resource_type": "field_option", + "resource_url": "https:///api/v1/base/field/option/11" + } + ], + "created_at": "2021-10-01T14:01:05+00:00", + "updated_at": "2021-10-01T14:01:05+00:00", + "resource_type": "case_field", + "resource_url": "https:///api/v1/cases/fields/16" + }, + { + "id": 17, + "fielduuid": "43d80332-100d-40a6-adc2-c4917c9a50e4", + "title": "CustomDate", + "type": "DATE", + "key": "customdate", + "is_required_for_agents": false, + "is_required_on_resolution": false, + "is_visible_to_customers": false, + "customer_titles": [ + { + "id": 48, + "locale": "en-us", + "translation": null, + "created_at": "2021-10-01T14:01:27+00:00", + "updated_at": "2021-10-01T14:01:27+00:00", + "resource_type": "locale_field", + "resource_url": "https:///api/v1/locale/fields/48" + } + ], + "is_customer_editable": false, + "is_required_for_customers": false, + "descriptions": [ + { + "id": 49, + "locale": "en-us", + "translation": null, + "created_at": "2021-10-01T14:01:27+00:00", + "updated_at": "2021-10-01T14:01:27+00:00", + "resource_type": "locale_field", + "resource_url": "https:///api/v1/locale/fields/49" + } + ], + "regular_expression": null, + "sort_order": 17, + "is_enabled": true, + "is_system": false, + "options": [], + "created_at": "2021-10-01T14:01:27+00:00", + "updated_at": "2021-10-01T14:01:27+00:00", + "resource_type": "case_field", + "resource_url": "https:///api/v1/cases/fields/17" + }, + { + "id": 18, + "fielduuid": "21071813-aa21-490c-9c38-b00d6ebc5c73", + "title": "CustomRegexp", + "type": "REGEX", + "key": "customregexp", + "is_required_for_agents": false, + "is_required_on_resolution": false, + "is_visible_to_customers": false, + "customer_titles": [ + { + "id": 50, + "locale": "en-us", + "translation": null, + "created_at": "2021-10-01T14:01:51+00:00", + "updated_at": "2021-10-01T14:01:51+00:00", + "resource_type": "locale_field", + "resource_url": "https:///api/v1/locale/fields/50" + } + ], + "is_customer_editable": false, + "is_required_for_customers": false, + "descriptions": [ + { + "id": 51, + "locale": "en-us", + "translation": null, + "created_at": "2021-10-01T14:01:51+00:00", + "updated_at": "2021-10-01T14:01:51+00:00", + "resource_type": "locale_field", + "resource_url": "https:///api/v1/locale/fields/51" + } + ], + "regular_expression": "\\d\\d\\d", + "sort_order": 18, + "is_enabled": true, + "is_system": false, + "options": [], + "created_at": "2021-10-01T14:01:51+00:00", + "updated_at": "2021-10-01T14:01:51+00:00", + "resource_type": "case_field", + "resource_url": "https:///api/v1/cases/fields/18" + } + ], + "resource": "case_field", + "total_count": 18 + } + recorded_at: Fri, 01 Oct 2021 15:58:56 GMT +- request: + method: get + uri: https:///api/v1/cases?fields=%2Btags&include=user,case_priority,case_status,channel,tag,case_type&limit=100 + body: + encoding: US-ASCII + string: '' + headers: + Content-Type: + - application/json + X-Session-Id: + - TayW6Qnt0Loid4b9a618960d7e46555d8d95657ab22808718f64lWdx9dau5cFE99JtQiSLIv2Y5Asz + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + User-Agent: + - Ruby + Host: + - "" + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx + Date: + - Fri, 01 Oct 2021 15:58:57 GMT + Content-Type: + - application/json + Transfer-Encoding: + - chunked + Connection: + - keep-alive + Cache-Control: + - private, max-age=0, must-revalidate + Expires: + - '0' + X-Api-Version: + - '1' + Date-Iso: + - '2021-10-01T15:58:57+00:00' + Access-Control-Expose-Headers: + - Date-ISO + X-Xss-Protection: + - 1; mode=block + X-Content-Type-Options: + - nosniff + Strict-Transport-Security: + - max-age=31536000; includeSubDomains preload + body: + encoding: ASCII-8BIT + string: !binary |- + ewogICAgInN0YXR1cyI6IDIwMCwKICAgICJkYXRhIjogWwogICAgICAgIHsKICAgICAgICAgICAgImlkIjogMywKICAgICAgICAgICAgImxlZ2FjeV9pZCI6IG51bGwsCiAgICAgICAgICAgICJzdWJqZWN0IjogIkEgdGVzdCBxdWVzdGlvbiIsCiAgICAgICAgICAgICJwb3J0YWwiOiAiU0VSVklDRSIsCiAgICAgICAgICAgICJzb3VyY2VfY2hhbm5lbCI6IHsKICAgICAgICAgICAgICAgICJ1dWlkIjogImZkM2E4MTE2LTk1YzItNDkyZS05YWYzLWIzYWI1N2RjOWYxYSIsCiAgICAgICAgICAgICAgICAidHlwZSI6ICJNQUlMIiwKICAgICAgICAgICAgICAgICJjaGFyYWN0ZXJfbGltaXQiOiBudWxsLAogICAgICAgICAgICAgICAgImFjY291bnQiOiB7CiAgICAgICAgICAgICAgICAgICAgImlkIjogMSwKICAgICAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJtYWlsYm94IgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJyZXNvdXJjZV90eXBlIjogImNoYW5uZWwiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJsYXN0X3B1YmxpY19jaGFubmVsIjogewogICAgICAgICAgICAgICAgInV1aWQiOiAiZmQzYTgxMTYtOTVjMi00OTJlLTlhZjMtYjNhYjU3ZGM5ZjFhIiwKICAgICAgICAgICAgICAgICJ0eXBlIjogIk1BSUwiLAogICAgICAgICAgICAgICAgImNoYXJhY3Rlcl9saW1pdCI6IG51bGwsCiAgICAgICAgICAgICAgICAiYWNjb3VudCI6IHsKICAgICAgICAgICAgICAgICAgICAiaWQiOiAxLAogICAgICAgICAgICAgICAgICAgICJyZXNvdXJjZV90eXBlIjogIm1haWxib3giCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAiY2hhbm5lbCIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgInJlcXVlc3RlciI6IHsKICAgICAgICAgICAgICAgICJpZCI6IDcsCiAgICAgICAgICAgICAgICAidXVpZCI6ICIwYzU0NjQ0Ni1kMDk1LTU0YzUtYWU1Ny01ZjZmODM4ZDNjNDMiLAogICAgICAgICAgICAgICAgImZ1bGxfbmFtZSI6ICJEb21pbmlrIEtsZWluIiwKICAgICAgICAgICAgICAgICJsZWdhY3lfaWQiOiBudWxsLAogICAgICAgICAgICAgICAgImRlc2lnbmF0aW9uIjogbnVsbCwKICAgICAgICAgICAgICAgICJpc19lbmFibGVkIjogdHJ1ZSwKICAgICAgICAgICAgICAgICJpc19tZmFfZW5hYmxlZCI6IGZhbHNlLAogICAgICAgICAgICAgICAgInJvbGUiOiB7CiAgICAgICAgICAgICAgICAgICAgImlkIjogNCwKICAgICAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJyb2xlIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJhdmF0YXIiOiAiaHR0cHM6Ly88SU1QT1JUX0tBWUFLT19FTkRQT0lOVF9IT1NUTkFNRT4vYXZhdGFyL2dldC8wYzU0NjQ0Ni1kMDk1LTU0YzUtYWU1Ny01ZjZmODM4ZDNjNDM/MTYzMzA5Njk4OSIsCiAgICAgICAgICAgICAgICAiYWdlbnRfY2FzZV9hY2Nlc3MiOiBudWxsLAogICAgICAgICAgICAgICAgIm9yZ2FuaXphdGlvbl9jYXNlX2FjY2VzcyI6ICJSRVFVRVNURUQiLAogICAgICAgICAgICAgICAgIm9yZ2FuaXphdGlvbiI6IG51bGwsCiAgICAgICAgICAgICAgICAidGVhbXMiOiBbXSwKICAgICAgICAgICAgICAgICJlbWFpbHMiOiBbCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAiaWQiOiA3LAogICAgICAgICAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJpZGVudGl0eV9lbWFpbCIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgInBob25lcyI6IFtdLAogICAgICAgICAgICAgICAgInR3aXR0ZXIiOiBbXSwKICAgICAgICAgICAgICAgICJmYWNlYm9vayI6IFtdLAogICAgICAgICAgICAgICAgImV4dGVybmFsX2lkZW50aWZpZXJzIjogW10sCiAgICAgICAgICAgICAgICAiY3VzdG9tX2ZpZWxkcyI6IFtdLAogICAgICAgICAgICAgICAgInBpbm5lZF9ub3Rlc19jb3VudCI6IDAsCiAgICAgICAgICAgICAgICAibG9jYWxlIjogewogICAgICAgICAgICAgICAgICAgICJpZCI6IDMsCiAgICAgICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAibG9jYWxlIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJ0aW1lX3pvbmUiOiAiRXVyb3BlL1BhcmlzIiwKICAgICAgICAgICAgICAgICJ0aW1lX3pvbmVfb2Zmc2V0IjogNzIwMCwKICAgICAgICAgICAgICAgICJncmVldGluZyI6IG51bGwsCiAgICAgICAgICAgICAgICAic2lnbmF0dXJlIjogbnVsbCwKICAgICAgICAgICAgICAgICJzdGF0dXNfbWVzc2FnZSI6IG51bGwsCiAgICAgICAgICAgICAgICAibGFzdF9zZWVuX3VzZXJfYWdlbnQiOiBudWxsLAogICAgICAgICAgICAgICAgImxhc3Rfc2Vlbl9pcCI6IG51bGwsCiAgICAgICAgICAgICAgICAibGFzdF9zZWVuX2F0IjogIjIwMjEtMDgtMjdUMTA6NDk6NTYrMDA6MDAiLAogICAgICAgICAgICAgICAgImxhc3RfYWN0aXZlX2F0IjogIjIwMjEtMTAtMDFUMTQ6MDM6MDkrMDA6MDAiLAogICAgICAgICAgICAgICAgInJlYWx0aW1lX2NoYW5uZWwiOiAicHJlc2VuY2UtNDQyNTQzY2Q0MjI4Nzc1MDQwMDFlYjA1NTBmMTg5YWQzNjJkNjQ3NWZhNmQ5NWZkMGYyZDhlZTBmZjc3MGY2NUB2MV91c2Vyc183IiwKICAgICAgICAgICAgICAgICJwcmVzZW5jZV9jaGFubmVsIjogInVzZXJfcHJlc2VuY2UtNDQyNTQzY2Q0MjI4Nzc1MDQwMDFlYjA1NTBmMTg5YWQzNjJkNjQ3NWZhNmQ5NWZkMGYyZDhlZTBmZjc3MGY2NUBmODA2ODc5Y2I1YmIwMTIxNjdiZjYxZDcwNWJmZTk0YWRmMmU3OTFiIiwKICAgICAgICAgICAgICAgICJwYXNzd29yZF91cGRhdGVkX2F0IjogIjIwMjEtMDgtMjdUMTA6NDk6NTYrMDA6MDAiLAogICAgICAgICAgICAgICAgImF2YXRhcl91cGRhdGVkX2F0IjogbnVsbCwKICAgICAgICAgICAgICAgICJsYXN0X2xvZ2dlZF9pbl9hdCI6IG51bGwsCiAgICAgICAgICAgICAgICAibGFzdF9hY3Rpdml0eV9hdCI6IG51bGwsCiAgICAgICAgICAgICAgICAiY3JlYXRlZF9hdCI6ICIyMDIxLTA4LTI3VDEwOjQ5OjU2KzAwOjAwIiwKICAgICAgICAgICAgICAgICJ1cGRhdGVkX2F0IjogIjIwMjEtMTAtMDFUMTQ6MDM6MDkrMDA6MDAiLAogICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAidXNlciIsCiAgICAgICAgICAgICAgICAicmVzb3VyY2VfdXJsIjogImh0dHBzOi8vPElNUE9SVF9LQVlBS09fRU5EUE9JTlRfSE9TVE5BTUU+L2FwaS92MS91c2Vycy83IgogICAgICAgICAgICB9LAogICAgICAgICAgICAiY3JlYXRvciI6IHsKICAgICAgICAgICAgICAgICJpZCI6IDcsCiAgICAgICAgICAgICAgICAidXVpZCI6ICIwYzU0NjQ0Ni1kMDk1LTU0YzUtYWU1Ny01ZjZmODM4ZDNjNDMiLAogICAgICAgICAgICAgICAgImZ1bGxfbmFtZSI6ICJEb21pbmlrIEtsZWluIiwKICAgICAgICAgICAgICAgICJsZWdhY3lfaWQiOiBudWxsLAogICAgICAgICAgICAgICAgImRlc2lnbmF0aW9uIjogbnVsbCwKICAgICAgICAgICAgICAgICJpc19lbmFibGVkIjogdHJ1ZSwKICAgICAgICAgICAgICAgICJpc19tZmFfZW5hYmxlZCI6IGZhbHNlLAogICAgICAgICAgICAgICAgInJvbGUiOiB7CiAgICAgICAgICAgICAgICAgICAgImlkIjogNCwKICAgICAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJyb2xlIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJhdmF0YXIiOiAiaHR0cHM6Ly88SU1QT1JUX0tBWUFLT19FTkRQT0lOVF9IT1NUTkFNRT4vYXZhdGFyL2dldC8wYzU0NjQ0Ni1kMDk1LTU0YzUtYWU1Ny01ZjZmODM4ZDNjNDM/MTYzMzA5Njk4OSIsCiAgICAgICAgICAgICAgICAiYWdlbnRfY2FzZV9hY2Nlc3MiOiBudWxsLAogICAgICAgICAgICAgICAgIm9yZ2FuaXphdGlvbl9jYXNlX2FjY2VzcyI6ICJSRVFVRVNURUQiLAogICAgICAgICAgICAgICAgIm9yZ2FuaXphdGlvbiI6IG51bGwsCiAgICAgICAgICAgICAgICAidGVhbXMiOiBbXSwKICAgICAgICAgICAgICAgICJlbWFpbHMiOiBbCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAiaWQiOiA3LAogICAgICAgICAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJpZGVudGl0eV9lbWFpbCIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgInBob25lcyI6IFtdLAogICAgICAgICAgICAgICAgInR3aXR0ZXIiOiBbXSwKICAgICAgICAgICAgICAgICJmYWNlYm9vayI6IFtdLAogICAgICAgICAgICAgICAgImV4dGVybmFsX2lkZW50aWZpZXJzIjogW10sCiAgICAgICAgICAgICAgICAiY3VzdG9tX2ZpZWxkcyI6IFtdLAogICAgICAgICAgICAgICAgInBpbm5lZF9ub3Rlc19jb3VudCI6IDAsCiAgICAgICAgICAgICAgICAibG9jYWxlIjogewogICAgICAgICAgICAgICAgICAgICJpZCI6IDMsCiAgICAgICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAibG9jYWxlIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJ0aW1lX3pvbmUiOiAiRXVyb3BlL1BhcmlzIiwKICAgICAgICAgICAgICAgICJ0aW1lX3pvbmVfb2Zmc2V0IjogNzIwMCwKICAgICAgICAgICAgICAgICJncmVldGluZyI6IG51bGwsCiAgICAgICAgICAgICAgICAic2lnbmF0dXJlIjogbnVsbCwKICAgICAgICAgICAgICAgICJzdGF0dXNfbWVzc2FnZSI6IG51bGwsCiAgICAgICAgICAgICAgICAibGFzdF9zZWVuX3VzZXJfYWdlbnQiOiBudWxsLAogICAgICAgICAgICAgICAgImxhc3Rfc2Vlbl9pcCI6IG51bGwsCiAgICAgICAgICAgICAgICAibGFzdF9zZWVuX2F0IjogIjIwMjEtMDgtMjdUMTA6NDk6NTYrMDA6MDAiLAogICAgICAgICAgICAgICAgImxhc3RfYWN0aXZlX2F0IjogIjIwMjEtMTAtMDFUMTQ6MDM6MDkrMDA6MDAiLAogICAgICAgICAgICAgICAgInJlYWx0aW1lX2NoYW5uZWwiOiAicHJlc2VuY2UtNDQyNTQzY2Q0MjI4Nzc1MDQwMDFlYjA1NTBmMTg5YWQzNjJkNjQ3NWZhNmQ5NWZkMGYyZDhlZTBmZjc3MGY2NUB2MV91c2Vyc183IiwKICAgICAgICAgICAgICAgICJwcmVzZW5jZV9jaGFubmVsIjogInVzZXJfcHJlc2VuY2UtNDQyNTQzY2Q0MjI4Nzc1MDQwMDFlYjA1NTBmMTg5YWQzNjJkNjQ3NWZhNmQ5NWZkMGYyZDhlZTBmZjc3MGY2NUBmODA2ODc5Y2I1YmIwMTIxNjdiZjYxZDcwNWJmZTk0YWRmMmU3OTFiIiwKICAgICAgICAgICAgICAgICJwYXNzd29yZF91cGRhdGVkX2F0IjogIjIwMjEtMDgtMjdUMTA6NDk6NTYrMDA6MDAiLAogICAgICAgICAgICAgICAgImF2YXRhcl91cGRhdGVkX2F0IjogbnVsbCwKICAgICAgICAgICAgICAgICJsYXN0X2xvZ2dlZF9pbl9hdCI6IG51bGwsCiAgICAgICAgICAgICAgICAibGFzdF9hY3Rpdml0eV9hdCI6IG51bGwsCiAgICAgICAgICAgICAgICAiY3JlYXRlZF9hdCI6ICIyMDIxLTA4LTI3VDEwOjQ5OjU2KzAwOjAwIiwKICAgICAgICAgICAgICAgICJ1cGRhdGVkX2F0IjogIjIwMjEtMTAtMDFUMTQ6MDM6MDkrMDA6MDAiLAogICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAidXNlciIsCiAgICAgICAgICAgICAgICAicmVzb3VyY2VfdXJsIjogImh0dHBzOi8vPElNUE9SVF9LQVlBS09fRU5EUE9JTlRfSE9TVE5BTUU+L2FwaS92MS91c2Vycy83IgogICAgICAgICAgICB9LAogICAgICAgICAgICAiaWRlbnRpdHkiOiB7CiAgICAgICAgICAgICAgICAiaWQiOiA3LAogICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAiaWRlbnRpdHlfZW1haWwiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJhc3NpZ25lZF9hZ2VudCI6IHsKICAgICAgICAgICAgICAgICJpZCI6IDEsCiAgICAgICAgICAgICAgICAidXVpZCI6ICJhOGRmZTVmZC1iMDhkLTVkMDctYWQ4Yi03NGIxMTNmNWQ3MjYiLAogICAgICAgICAgICAgICAgImZ1bGxfbmFtZSI6ICJUaG9yc3RlbiBFY2tlbCIsCiAgICAgICAgICAgICAgICAibGVnYWN5X2lkIjogbnVsbCwKICAgICAgICAgICAgICAgICJkZXNpZ25hdGlvbiI6IG51bGwsCiAgICAgICAgICAgICAgICAiaXNfZW5hYmxlZCI6IHRydWUsCiAgICAgICAgICAgICAgICAiaXNfbWZhX2VuYWJsZWQiOiBmYWxzZSwKICAgICAgICAgICAgICAgICJyb2xlIjogewogICAgICAgICAgICAgICAgICAgICJpZCI6IDUsCiAgICAgICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAicm9sZSIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAiYXZhdGFyIjogImh0dHBzOi8vPElNUE9SVF9LQVlBS09fRU5EUE9JTlRfSE9TVE5BTUU+L2F2YXRhci9nZXQvYThkZmU1ZmQtYjA4ZC01ZDA3LWFkOGItNzRiMTEzZjVkNzI2PzE2MzMxMDM4MDIiLAogICAgICAgICAgICAgICAgImFnZW50X2Nhc2VfYWNjZXNzIjogIkFMTCIsCiAgICAgICAgICAgICAgICAib3JnYW5pemF0aW9uX2Nhc2VfYWNjZXNzIjogbnVsbCwKICAgICAgICAgICAgICAgICJvcmdhbml6YXRpb24iOiB7CiAgICAgICAgICAgICAgICAgICAgImlkIjogMywKICAgICAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJvcmdhbml6YXRpb24iCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgInRlYW1zIjogWwogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgImlkIjogMSwKICAgICAgICAgICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAidGVhbSIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgImlkIjogMiwKICAgICAgICAgICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAidGVhbSIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgImVtYWlscyI6IFsKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICJpZCI6IDEsCiAgICAgICAgICAgICAgICAgICAgICAgICJyZXNvdXJjZV90eXBlIjogImlkZW50aXR5X2VtYWlsIgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAicGhvbmVzIjogW10sCiAgICAgICAgICAgICAgICAidHdpdHRlciI6IFtdLAogICAgICAgICAgICAgICAgImZhY2Vib29rIjogW10sCiAgICAgICAgICAgICAgICAiZXh0ZXJuYWxfaWRlbnRpZmllcnMiOiBbXSwKICAgICAgICAgICAgICAgICJjdXN0b21fZmllbGRzIjogW10sCiAgICAgICAgICAgICAgICAicGlubmVkX25vdGVzX2NvdW50IjogMCwKICAgICAgICAgICAgICAgICJsb2NhbGUiOiB7CiAgICAgICAgICAgICAgICAgICAgImlkIjogMywKICAgICAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJsb2NhbGUiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgInRpbWVfem9uZSI6ICJVVEMiLAogICAgICAgICAgICAgICAgInRpbWVfem9uZV9vZmZzZXQiOiAwLAogICAgICAgICAgICAgICAgImdyZWV0aW5nIjogbnVsbCwKICAgICAgICAgICAgICAgICJzaWduYXR1cmUiOiBudWxsLAogICAgICAgICAgICAgICAgInN0YXR1c19tZXNzYWdlIjogbnVsbCwKICAgICAgICAgICAgICAgICJsYXN0X3NlZW5fdXNlcl9hZ2VudCI6ICJSdWJ5IiwKICAgICAgICAgICAgICAgICJsYXN0X3NlZW5faXAiOiAiNS4yMzEuMTM4LjIwOCIsCiAgICAgICAgICAgICAgICAibGFzdF9zZWVuX2F0IjogIjIwMjEtMTAtMDFUMTU6NTY6NDIrMDA6MDAiLAogICAgICAgICAgICAgICAgImxhc3RfYWN0aXZlX2F0IjogIjIwMjEtMTAtMDFUMTU6NTY6NDIrMDA6MDAiLAogICAgICAgICAgICAgICAgInJlYWx0aW1lX2NoYW5uZWwiOiAicHJlc2VuY2UtNDQyNTQzY2Q0MjI4Nzc1MDQwMDFlYjA1NTBmMTg5YWQzNjJkNjQ3NWZhNmQ5NWZkMGYyZDhlZTBmZjc3MGY2NUB2MV91c2Vyc18xIiwKICAgICAgICAgICAgICAgICJwcmVzZW5jZV9jaGFubmVsIjogInVzZXJfcHJlc2VuY2UtNDQyNTQzY2Q0MjI4Nzc1MDQwMDFlYjA1NTBmMTg5YWQzNjJkNjQ3NWZhNmQ5NWZkMGYyZDhlZTBmZjc3MGY2NUBjZjAyNzRiMzk0ZGIzYWY1NTVkYmMxMzZmYzcwYWFiNmU0NWJlZTQyIiwKICAgICAgICAgICAgICAgICJwYXNzd29yZF91cGRhdGVkX2F0IjogIjIwMjEtMDgtMjdUMDc6MTg6MjMrMDA6MDAiLAogICAgICAgICAgICAgICAgImF2YXRhcl91cGRhdGVkX2F0IjogbnVsbCwKICAgICAgICAgICAgICAgICJsYXN0X2xvZ2dlZF9pbl9hdCI6ICIyMDIxLTEwLTAxVDE1OjU4OjUyKzAwOjAwIiwKICAgICAgICAgICAgICAgICJsYXN0X2FjdGl2aXR5X2F0IjogIjIwMjEtMTAtMDFUMTU6NTg6NTIrMDA6MDAiLAogICAgICAgICAgICAgICAgImNyZWF0ZWRfYXQiOiAiMjAyMS0wOC0yNFQxODoyNDoxMSswMDowMCIsCiAgICAgICAgICAgICAgICAidXBkYXRlZF9hdCI6ICIyMDIxLTEwLTAxVDE1OjU2OjQyKzAwOjAwIiwKICAgICAgICAgICAgICAgICJyZXNvdXJjZV90eXBlIjogInVzZXIiLAogICAgICAgICAgICAgICAgInJlc291cmNlX3VybCI6ICJodHRwczovLzxJTVBPUlRfS0FZQUtPX0VORFBPSU5UX0hPU1ROQU1FPi9hcGkvdjEvdXNlcnMvMSIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgImFzc2lnbmVkX3RlYW0iOiB7CiAgICAgICAgICAgICAgICAiaWQiOiAxLAogICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAidGVhbSIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgImxhc3RfYXNzaWduZWRfYnkiOiB7CiAgICAgICAgICAgICAgICAiaWQiOiAxLAogICAgICAgICAgICAgICAgInV1aWQiOiAiYThkZmU1ZmQtYjA4ZC01ZDA3LWFkOGItNzRiMTEzZjVkNzI2IiwKICAgICAgICAgICAgICAgICJmdWxsX25hbWUiOiAiVGhvcnN0ZW4gRWNrZWwiLAogICAgICAgICAgICAgICAgImxlZ2FjeV9pZCI6IG51bGwsCiAgICAgICAgICAgICAgICAiZGVzaWduYXRpb24iOiBudWxsLAogICAgICAgICAgICAgICAgImlzX2VuYWJsZWQiOiB0cnVlLAogICAgICAgICAgICAgICAgImlzX21mYV9lbmFibGVkIjogZmFsc2UsCiAgICAgICAgICAgICAgICAicm9sZSI6IHsKICAgICAgICAgICAgICAgICAgICAiaWQiOiA1LAogICAgICAgICAgICAgICAgICAgICJyZXNvdXJjZV90eXBlIjogInJvbGUiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgImF2YXRhciI6ICJodHRwczovLzxJTVBPUlRfS0FZQUtPX0VORFBPSU5UX0hPU1ROQU1FPi9hdmF0YXIvZ2V0L2E4ZGZlNWZkLWIwOGQtNWQwNy1hZDhiLTc0YjExM2Y1ZDcyNj8xNjMzMTAzODAyIiwKICAgICAgICAgICAgICAgICJhZ2VudF9jYXNlX2FjY2VzcyI6ICJBTEwiLAogICAgICAgICAgICAgICAgIm9yZ2FuaXphdGlvbl9jYXNlX2FjY2VzcyI6IG51bGwsCiAgICAgICAgICAgICAgICAib3JnYW5pemF0aW9uIjogewogICAgICAgICAgICAgICAgICAgICJpZCI6IDMsCiAgICAgICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAib3JnYW5pemF0aW9uIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJ0ZWFtcyI6IFsKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICJpZCI6IDEsCiAgICAgICAgICAgICAgICAgICAgICAgICJyZXNvdXJjZV90eXBlIjogInRlYW0iCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICJpZCI6IDIsCiAgICAgICAgICAgICAgICAgICAgICAgICJyZXNvdXJjZV90eXBlIjogInRlYW0iCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICJlbWFpbHMiOiBbCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAiaWQiOiAxLAogICAgICAgICAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJpZGVudGl0eV9lbWFpbCIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgInBob25lcyI6IFtdLAogICAgICAgICAgICAgICAgInR3aXR0ZXIiOiBbXSwKICAgICAgICAgICAgICAgICJmYWNlYm9vayI6IFtdLAogICAgICAgICAgICAgICAgImV4dGVybmFsX2lkZW50aWZpZXJzIjogW10sCiAgICAgICAgICAgICAgICAiY3VzdG9tX2ZpZWxkcyI6IFtdLAogICAgICAgICAgICAgICAgInBpbm5lZF9ub3Rlc19jb3VudCI6IDAsCiAgICAgICAgICAgICAgICAibG9jYWxlIjogewogICAgICAgICAgICAgICAgICAgICJpZCI6IDMsCiAgICAgICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAibG9jYWxlIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJ0aW1lX3pvbmUiOiAiVVRDIiwKICAgICAgICAgICAgICAgICJ0aW1lX3pvbmVfb2Zmc2V0IjogMCwKICAgICAgICAgICAgICAgICJncmVldGluZyI6IG51bGwsCiAgICAgICAgICAgICAgICAic2lnbmF0dXJlIjogbnVsbCwKICAgICAgICAgICAgICAgICJzdGF0dXNfbWVzc2FnZSI6IG51bGwsCiAgICAgICAgICAgICAgICAibGFzdF9zZWVuX3VzZXJfYWdlbnQiOiAiUnVieSIsCiAgICAgICAgICAgICAgICAibGFzdF9zZWVuX2lwIjogIjUuMjMxLjEzOC4yMDgiLAogICAgICAgICAgICAgICAgImxhc3Rfc2Vlbl9hdCI6ICIyMDIxLTEwLTAxVDE1OjU2OjQyKzAwOjAwIiwKICAgICAgICAgICAgICAgICJsYXN0X2FjdGl2ZV9hdCI6ICIyMDIxLTEwLTAxVDE1OjU2OjQyKzAwOjAwIiwKICAgICAgICAgICAgICAgICJyZWFsdGltZV9jaGFubmVsIjogInByZXNlbmNlLTQ0MjU0M2NkNDIyODc3NTA0MDAxZWIwNTUwZjE4OWFkMzYyZDY0NzVmYTZkOTVmZDBmMmQ4ZWUwZmY3NzBmNjVAdjFfdXNlcnNfMSIsCiAgICAgICAgICAgICAgICAicHJlc2VuY2VfY2hhbm5lbCI6ICJ1c2VyX3ByZXNlbmNlLTQ0MjU0M2NkNDIyODc3NTA0MDAxZWIwNTUwZjE4OWFkMzYyZDY0NzVmYTZkOTVmZDBmMmQ4ZWUwZmY3NzBmNjVAY2YwMjc0YjM5NGRiM2FmNTU1ZGJjMTM2ZmM3MGFhYjZlNDViZWU0MiIsCiAgICAgICAgICAgICAgICAicGFzc3dvcmRfdXBkYXRlZF9hdCI6ICIyMDIxLTA4LTI3VDA3OjE4OjIzKzAwOjAwIiwKICAgICAgICAgICAgICAgICJhdmF0YXJfdXBkYXRlZF9hdCI6IG51bGwsCiAgICAgICAgICAgICAgICAibGFzdF9sb2dnZWRfaW5fYXQiOiAiMjAyMS0xMC0wMVQxNTo1ODo1MiswMDowMCIsCiAgICAgICAgICAgICAgICAibGFzdF9hY3Rpdml0eV9hdCI6ICIyMDIxLTEwLTAxVDE1OjU4OjUyKzAwOjAwIiwKICAgICAgICAgICAgICAgICJjcmVhdGVkX2F0IjogIjIwMjEtMDgtMjRUMTg6MjQ6MTErMDA6MDAiLAogICAgICAgICAgICAgICAgInVwZGF0ZWRfYXQiOiAiMjAyMS0xMC0wMVQxNTo1Njo0MiswMDowMCIsCiAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJ1c2VyIiwKICAgICAgICAgICAgICAgICJyZXNvdXJjZV91cmwiOiAiaHR0cHM6Ly88SU1QT1JUX0tBWUFLT19FTkRQT0lOVF9IT1NUTkFNRT4vYXBpL3YxL3VzZXJzLzEiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJicmFuZCI6IHsKICAgICAgICAgICAgICAgICJpZCI6IDEsCiAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJicmFuZCIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgInN0YXR1cyI6IHsKICAgICAgICAgICAgICAgICJpZCI6IDEsCiAgICAgICAgICAgICAgICAibGFiZWwiOiAiTmV3IiwKICAgICAgICAgICAgICAgICJ0eXBlIjogIk5FVyIsCiAgICAgICAgICAgICAgICAic29ydF9vcmRlciI6IDEsCiAgICAgICAgICAgICAgICAiaXNfc2xhX2FjdGl2ZSI6IHRydWUsCiAgICAgICAgICAgICAgICAiaXNfZGVsZXRlZCI6IGZhbHNlLAogICAgICAgICAgICAgICAgImNyZWF0ZWRfYXQiOiAiMjAyMS0wOC0yNFQxODoyNDoxNiswMDowMCIsCiAgICAgICAgICAgICAgICAidXBkYXRlZF9hdCI6ICIyMDIxLTA4LTI0VDE4OjI0OjE2KzAwOjAwIiwKICAgICAgICAgICAgICAgICJyZXNvdXJjZV90eXBlIjogImNhc2Vfc3RhdHVzIiwKICAgICAgICAgICAgICAgICJyZXNvdXJjZV91cmwiOiAiaHR0cHM6Ly88SU1QT1JUX0tBWUFLT19FTkRQT0lOVF9IT1NUTkFNRT4vYXBpL3YxL2Nhc2VzL3N0YXR1c2VzLzEiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJwcmlvcml0eSI6IHsKICAgICAgICAgICAgICAgICJpZCI6IDEsCiAgICAgICAgICAgICAgICAibGFiZWwiOiAiTG93IiwKICAgICAgICAgICAgICAgICJsZXZlbCI6IDEsCiAgICAgICAgICAgICAgICAiY3JlYXRlZF9hdCI6ICIyMDIxLTA4LTI0VDE4OjI0OjE2KzAwOjAwIiwKICAgICAgICAgICAgICAgICJ1cGRhdGVkX2F0IjogIjIwMjEtMDgtMjRUMTg6MjQ6MTYrMDA6MDAiLAogICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAiY2FzZV9wcmlvcml0eSIsCiAgICAgICAgICAgICAgICAicmVzb3VyY2VfdXJsIjogImh0dHBzOi8vPElNUE9SVF9LQVlBS09fRU5EUE9JTlRfSE9TVE5BTUU+L2FwaS92MS9jYXNlcy9wcmlvcml0aWVzLzEiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJ0eXBlIjogewogICAgICAgICAgICAgICAgImlkIjogNCwKICAgICAgICAgICAgICAgICJsYWJlbCI6ICJJbmNpZGVudCIsCiAgICAgICAgICAgICAgICAidHlwZSI6ICJJTkNJREVOVCIsCiAgICAgICAgICAgICAgICAiY3JlYXRlZF9hdCI6ICIyMDIxLTA4LTI0VDE4OjI0OjE2KzAwOjAwIiwKICAgICAgICAgICAgICAgICJ1cGRhdGVkX2F0IjogIjIwMjEtMDgtMjRUMTg6MjQ6MTYrMDA6MDAiLAogICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAiY2FzZV90eXBlIiwKICAgICAgICAgICAgICAgICJyZXNvdXJjZV91cmwiOiAiaHR0cHM6Ly88SU1QT1JUX0tBWUFLT19FTkRQT0lOVF9IT1NUTkFNRT4vYXBpL3YxL2Nhc2VzL3R5cGVzLzQiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJyZWFkX21hcmtlciI6IHsKICAgICAgICAgICAgICAgICJpZCI6IDIsCiAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJyZWFkX21hcmtlciIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgInNsYV92ZXJzaW9uIjogbnVsbCwKICAgICAgICAgICAgInNsYV9tZXRyaWNzIjogW10sCiAgICAgICAgICAgICJmb3JtIjogbnVsbCwKICAgICAgICAgICAgImN1c3RvbV9maWVsZHMiOiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgImZpZWxkIjogewogICAgICAgICAgICAgICAgICAgICAgICAiaWQiOiA4LAogICAgICAgICAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJjYXNlX2ZpZWxkIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInZhbHVlIjogIkV4YW1wbGUiLAogICAgICAgICAgICAgICAgICAgICJyZXNvdXJjZV90eXBlIjogImNhc2VfZmllbGRfdmFsdWUiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICJmaWVsZCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgImlkIjogOSwKICAgICAgICAgICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAiY2FzZV9maWVsZCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJ2YWx1ZSI6ICJFeGFtcGxlXG5cblRlc3QiLAogICAgICAgICAgICAgICAgICAgICJyZXNvdXJjZV90eXBlIjogImNhc2VfZmllbGRfdmFsdWUiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICJmaWVsZCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgImlkIjogMTAsCiAgICAgICAgICAgICAgICAgICAgICAgICJyZXNvdXJjZV90eXBlIjogImNhc2VfZmllbGQiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAidmFsdWUiOiAiMSIsCiAgICAgICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAiY2FzZV9maWVsZF92YWx1ZSIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgImZpZWxkIjogewogICAgICAgICAgICAgICAgICAgICAgICAiaWQiOiAxMSwKICAgICAgICAgICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAiY2FzZV9maWVsZCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJ2YWx1ZSI6ICI0IiwKICAgICAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJjYXNlX2ZpZWxkX3ZhbHVlIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAiZmllbGQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJpZCI6IDEyLAogICAgICAgICAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJjYXNlX2ZpZWxkIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInZhbHVlIjogIjciLAogICAgICAgICAgICAgICAgICAgICJyZXNvdXJjZV90eXBlIjogImNhc2VfZmllbGRfdmFsdWUiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICJmaWVsZCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgImlkIjogMTMsCiAgICAgICAgICAgICAgICAgICAgICAgICJyZXNvdXJjZV90eXBlIjogImNhc2VfZmllbGQiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAidmFsdWUiOiAiMiIsCiAgICAgICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAiY2FzZV9maWVsZF92YWx1ZSIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgImZpZWxkIjogewogICAgICAgICAgICAgICAgICAgICAgICAiaWQiOiAxNCwKICAgICAgICAgICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAiY2FzZV9maWVsZCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJ2YWx1ZSI6ICIzIiwKICAgICAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJjYXNlX2ZpZWxkX3ZhbHVlIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAiZmllbGQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJpZCI6IDE1LAogICAgICAgICAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJjYXNlX2ZpZWxkIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInZhbHVlIjogInllcyIsCiAgICAgICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAiY2FzZV9maWVsZF92YWx1ZSIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgImZpZWxkIjogewogICAgICAgICAgICAgICAgICAgICAgICAiaWQiOiAxNiwKICAgICAgICAgICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAiY2FzZV9maWVsZCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJ2YWx1ZSI6ICIxMCIsCiAgICAgICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAiY2FzZV9maWVsZF92YWx1ZSIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgImZpZWxkIjogewogICAgICAgICAgICAgICAgICAgICAgICAiaWQiOiAxNywKICAgICAgICAgICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAiY2FzZV9maWVsZCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJ2YWx1ZSI6ICIyMDIxLTEwLTEyVDAwOjAwOjAwKzAwOjAwIiwKICAgICAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJjYXNlX2ZpZWxkX3ZhbHVlIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAiZmllbGQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJpZCI6IDE4LAogICAgICAgICAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJjYXNlX2ZpZWxkIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInZhbHVlIjogIjEyMyIsCiAgICAgICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAiY2FzZV9maWVsZF92YWx1ZSIKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgXSwKICAgICAgICAgICAgImxhc3RfcmVwbGllciI6IHsKICAgICAgICAgICAgICAgICJpZCI6IDEsCiAgICAgICAgICAgICAgICAidXVpZCI6ICJhOGRmZTVmZC1iMDhkLTVkMDctYWQ4Yi03NGIxMTNmNWQ3MjYiLAogICAgICAgICAgICAgICAgImZ1bGxfbmFtZSI6ICJUaG9yc3RlbiBFY2tlbCIsCiAgICAgICAgICAgICAgICAibGVnYWN5X2lkIjogbnVsbCwKICAgICAgICAgICAgICAgICJkZXNpZ25hdGlvbiI6IG51bGwsCiAgICAgICAgICAgICAgICAiaXNfZW5hYmxlZCI6IHRydWUsCiAgICAgICAgICAgICAgICAiaXNfbWZhX2VuYWJsZWQiOiBmYWxzZSwKICAgICAgICAgICAgICAgICJyb2xlIjogewogICAgICAgICAgICAgICAgICAgICJpZCI6IDUsCiAgICAgICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAicm9sZSIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAiYXZhdGFyIjogImh0dHBzOi8vPElNUE9SVF9LQVlBS09fRU5EUE9JTlRfSE9TVE5BTUU+L2F2YXRhci9nZXQvYThkZmU1ZmQtYjA4ZC01ZDA3LWFkOGItNzRiMTEzZjVkNzI2PzE2MzMxMDM4MDIiLAogICAgICAgICAgICAgICAgImFnZW50X2Nhc2VfYWNjZXNzIjogIkFMTCIsCiAgICAgICAgICAgICAgICAib3JnYW5pemF0aW9uX2Nhc2VfYWNjZXNzIjogbnVsbCwKICAgICAgICAgICAgICAgICJvcmdhbml6YXRpb24iOiB7CiAgICAgICAgICAgICAgICAgICAgImlkIjogMywKICAgICAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJvcmdhbml6YXRpb24iCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgInRlYW1zIjogWwogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgImlkIjogMSwKICAgICAgICAgICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAidGVhbSIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgImlkIjogMiwKICAgICAgICAgICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAidGVhbSIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgImVtYWlscyI6IFsKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICJpZCI6IDEsCiAgICAgICAgICAgICAgICAgICAgICAgICJyZXNvdXJjZV90eXBlIjogImlkZW50aXR5X2VtYWlsIgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAicGhvbmVzIjogW10sCiAgICAgICAgICAgICAgICAidHdpdHRlciI6IFtdLAogICAgICAgICAgICAgICAgImZhY2Vib29rIjogW10sCiAgICAgICAgICAgICAgICAiZXh0ZXJuYWxfaWRlbnRpZmllcnMiOiBbXSwKICAgICAgICAgICAgICAgICJjdXN0b21fZmllbGRzIjogW10sCiAgICAgICAgICAgICAgICAicGlubmVkX25vdGVzX2NvdW50IjogMCwKICAgICAgICAgICAgICAgICJsb2NhbGUiOiB7CiAgICAgICAgICAgICAgICAgICAgImlkIjogMywKICAgICAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJsb2NhbGUiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgInRpbWVfem9uZSI6ICJVVEMiLAogICAgICAgICAgICAgICAgInRpbWVfem9uZV9vZmZzZXQiOiAwLAogICAgICAgICAgICAgICAgImdyZWV0aW5nIjogbnVsbCwKICAgICAgICAgICAgICAgICJzaWduYXR1cmUiOiBudWxsLAogICAgICAgICAgICAgICAgInN0YXR1c19tZXNzYWdlIjogbnVsbCwKICAgICAgICAgICAgICAgICJsYXN0X3NlZW5fdXNlcl9hZ2VudCI6ICJSdWJ5IiwKICAgICAgICAgICAgICAgICJsYXN0X3NlZW5faXAiOiAiNS4yMzEuMTM4LjIwOCIsCiAgICAgICAgICAgICAgICAibGFzdF9zZWVuX2F0IjogIjIwMjEtMTAtMDFUMTU6NTY6NDIrMDA6MDAiLAogICAgICAgICAgICAgICAgImxhc3RfYWN0aXZlX2F0IjogIjIwMjEtMTAtMDFUMTU6NTY6NDIrMDA6MDAiLAogICAgICAgICAgICAgICAgInJlYWx0aW1lX2NoYW5uZWwiOiAicHJlc2VuY2UtNDQyNTQzY2Q0MjI4Nzc1MDQwMDFlYjA1NTBmMTg5YWQzNjJkNjQ3NWZhNmQ5NWZkMGYyZDhlZTBmZjc3MGY2NUB2MV91c2Vyc18xIiwKICAgICAgICAgICAgICAgICJwcmVzZW5jZV9jaGFubmVsIjogInVzZXJfcHJlc2VuY2UtNDQyNTQzY2Q0MjI4Nzc1MDQwMDFlYjA1NTBmMTg5YWQzNjJkNjQ3NWZhNmQ5NWZkMGYyZDhlZTBmZjc3MGY2NUBjZjAyNzRiMzk0ZGIzYWY1NTVkYmMxMzZmYzcwYWFiNmU0NWJlZTQyIiwKICAgICAgICAgICAgICAgICJwYXNzd29yZF91cGRhdGVkX2F0IjogIjIwMjEtMDgtMjdUMDc6MTg6MjMrMDA6MDAiLAogICAgICAgICAgICAgICAgImF2YXRhcl91cGRhdGVkX2F0IjogbnVsbCwKICAgICAgICAgICAgICAgICJsYXN0X2xvZ2dlZF9pbl9hdCI6ICIyMDIxLTEwLTAxVDE1OjU4OjUyKzAwOjAwIiwKICAgICAgICAgICAgICAgICJsYXN0X2FjdGl2aXR5X2F0IjogIjIwMjEtMTAtMDFUMTU6NTg6NTIrMDA6MDAiLAogICAgICAgICAgICAgICAgImNyZWF0ZWRfYXQiOiAiMjAyMS0wOC0yNFQxODoyNDoxMSswMDowMCIsCiAgICAgICAgICAgICAgICAidXBkYXRlZF9hdCI6ICIyMDIxLTEwLTAxVDE1OjU2OjQyKzAwOjAwIiwKICAgICAgICAgICAgICAgICJyZXNvdXJjZV90eXBlIjogInVzZXIiLAogICAgICAgICAgICAgICAgInJlc291cmNlX3VybCI6ICJodHRwczovLzxJTVBPUlRfS0FZQUtPX0VORFBPSU5UX0hPU1ROQU1FPi9hcGkvdjEvdXNlcnMvMSIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgImxhc3RfcmVwbGllcl9pZGVudGl0eSI6IHsKICAgICAgICAgICAgICAgICJpZCI6IDEsCiAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJpZGVudGl0eV9lbWFpbCIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgImxhc3RfdXBkYXRlZF9ieSI6IHsKICAgICAgICAgICAgICAgICJpZCI6IDEsCiAgICAgICAgICAgICAgICAidXVpZCI6ICJhOGRmZTVmZC1iMDhkLTVkMDctYWQ4Yi03NGIxMTNmNWQ3MjYiLAogICAgICAgICAgICAgICAgImZ1bGxfbmFtZSI6ICJUaG9yc3RlbiBFY2tlbCIsCiAgICAgICAgICAgICAgICAibGVnYWN5X2lkIjogbnVsbCwKICAgICAgICAgICAgICAgICJkZXNpZ25hdGlvbiI6IG51bGwsCiAgICAgICAgICAgICAgICAiaXNfZW5hYmxlZCI6IHRydWUsCiAgICAgICAgICAgICAgICAiaXNfbWZhX2VuYWJsZWQiOiBmYWxzZSwKICAgICAgICAgICAgICAgICJyb2xlIjogewogICAgICAgICAgICAgICAgICAgICJpZCI6IDUsCiAgICAgICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAicm9sZSIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAiYXZhdGFyIjogImh0dHBzOi8vPElNUE9SVF9LQVlBS09fRU5EUE9JTlRfSE9TVE5BTUU+L2F2YXRhci9nZXQvYThkZmU1ZmQtYjA4ZC01ZDA3LWFkOGItNzRiMTEzZjVkNzI2PzE2MzMxMDM4MDIiLAogICAgICAgICAgICAgICAgImFnZW50X2Nhc2VfYWNjZXNzIjogIkFMTCIsCiAgICAgICAgICAgICAgICAib3JnYW5pemF0aW9uX2Nhc2VfYWNjZXNzIjogbnVsbCwKICAgICAgICAgICAgICAgICJvcmdhbml6YXRpb24iOiB7CiAgICAgICAgICAgICAgICAgICAgImlkIjogMywKICAgICAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJvcmdhbml6YXRpb24iCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgInRlYW1zIjogWwogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgImlkIjogMSwKICAgICAgICAgICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAidGVhbSIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgImlkIjogMiwKICAgICAgICAgICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAidGVhbSIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgImVtYWlscyI6IFsKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICJpZCI6IDEsCiAgICAgICAgICAgICAgICAgICAgICAgICJyZXNvdXJjZV90eXBlIjogImlkZW50aXR5X2VtYWlsIgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAicGhvbmVzIjogW10sCiAgICAgICAgICAgICAgICAidHdpdHRlciI6IFtdLAogICAgICAgICAgICAgICAgImZhY2Vib29rIjogW10sCiAgICAgICAgICAgICAgICAiZXh0ZXJuYWxfaWRlbnRpZmllcnMiOiBbXSwKICAgICAgICAgICAgICAgICJjdXN0b21fZmllbGRzIjogW10sCiAgICAgICAgICAgICAgICAicGlubmVkX25vdGVzX2NvdW50IjogMCwKICAgICAgICAgICAgICAgICJsb2NhbGUiOiB7CiAgICAgICAgICAgICAgICAgICAgImlkIjogMywKICAgICAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJsb2NhbGUiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgInRpbWVfem9uZSI6ICJVVEMiLAogICAgICAgICAgICAgICAgInRpbWVfem9uZV9vZmZzZXQiOiAwLAogICAgICAgICAgICAgICAgImdyZWV0aW5nIjogbnVsbCwKICAgICAgICAgICAgICAgICJzaWduYXR1cmUiOiBudWxsLAogICAgICAgICAgICAgICAgInN0YXR1c19tZXNzYWdlIjogbnVsbCwKICAgICAgICAgICAgICAgICJsYXN0X3NlZW5fdXNlcl9hZ2VudCI6ICJSdWJ5IiwKICAgICAgICAgICAgICAgICJsYXN0X3NlZW5faXAiOiAiNS4yMzEuMTM4LjIwOCIsCiAgICAgICAgICAgICAgICAibGFzdF9zZWVuX2F0IjogIjIwMjEtMTAtMDFUMTU6NTY6NDIrMDA6MDAiLAogICAgICAgICAgICAgICAgImxhc3RfYWN0aXZlX2F0IjogIjIwMjEtMTAtMDFUMTU6NTY6NDIrMDA6MDAiLAogICAgICAgICAgICAgICAgInJlYWx0aW1lX2NoYW5uZWwiOiAicHJlc2VuY2UtNDQyNTQzY2Q0MjI4Nzc1MDQwMDFlYjA1NTBmMTg5YWQzNjJkNjQ3NWZhNmQ5NWZkMGYyZDhlZTBmZjc3MGY2NUB2MV91c2Vyc18xIiwKICAgICAgICAgICAgICAgICJwcmVzZW5jZV9jaGFubmVsIjogInVzZXJfcHJlc2VuY2UtNDQyNTQzY2Q0MjI4Nzc1MDQwMDFlYjA1NTBmMTg5YWQzNjJkNjQ3NWZhNmQ5NWZkMGYyZDhlZTBmZjc3MGY2NUBjZjAyNzRiMzk0ZGIzYWY1NTVkYmMxMzZmYzcwYWFiNmU0NWJlZTQyIiwKICAgICAgICAgICAgICAgICJwYXNzd29yZF91cGRhdGVkX2F0IjogIjIwMjEtMDgtMjdUMDc6MTg6MjMrMDA6MDAiLAogICAgICAgICAgICAgICAgImF2YXRhcl91cGRhdGVkX2F0IjogbnVsbCwKICAgICAgICAgICAgICAgICJsYXN0X2xvZ2dlZF9pbl9hdCI6ICIyMDIxLTEwLTAxVDE1OjU4OjUyKzAwOjAwIiwKICAgICAgICAgICAgICAgICJsYXN0X2FjdGl2aXR5X2F0IjogIjIwMjEtMTAtMDFUMTU6NTg6NTIrMDA6MDAiLAogICAgICAgICAgICAgICAgImNyZWF0ZWRfYXQiOiAiMjAyMS0wOC0yNFQxODoyNDoxMSswMDowMCIsCiAgICAgICAgICAgICAgICAidXBkYXRlZF9hdCI6ICIyMDIxLTEwLTAxVDE1OjU2OjQyKzAwOjAwIiwKICAgICAgICAgICAgICAgICJyZXNvdXJjZV90eXBlIjogInVzZXIiLAogICAgICAgICAgICAgICAgInJlc291cmNlX3VybCI6ICJodHRwczovLzxJTVBPUlRfS0FZQUtPX0VORFBPSU5UX0hPU1ROQU1FPi9hcGkvdjEvdXNlcnMvMSIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgImxhc3RfY29tcGxldGVkX2J5IjogbnVsbCwKICAgICAgICAgICAgImxhc3RfY2xvc2VkX2J5IjogbnVsbCwKICAgICAgICAgICAgInN0YXRlIjogIkFDVElWRSIsCiAgICAgICAgICAgICJwb3N0X2NvdW50IjogMiwKICAgICAgICAgICAgImhhc19ub3RlcyI6IHRydWUsCiAgICAgICAgICAgICJwaW5uZWRfbm90ZXNfY291bnQiOiAwLAogICAgICAgICAgICAiaGFzX2F0dGFjaG1lbnRzIjogdHJ1ZSwKICAgICAgICAgICAgImlzX21lcmdlZCI6IGZhbHNlLAogICAgICAgICAgICAicmF0aW5nIjogbnVsbCwKICAgICAgICAgICAgInJhdGluZ19zdGF0dXMiOiAiVU5PRkZFUkVEIiwKICAgICAgICAgICAgInRhZ3MiOiBbXSwKICAgICAgICAgICAgImxhc3RfcG9zdF9zdGF0dXMiOiAiIiwKICAgICAgICAgICAgImxhc3RfcG9zdF9wcmV2aWV3IjogIldlIHdpbGwgaGVscCB0aGUgZ3V5LiIsCiAgICAgICAgICAgICJsYXN0X3Bvc3RfdHlwZSI6ICJOT1RFIiwKICAgICAgICAgICAgImxhc3RfbWVzc2FnZV9wcmV2aWV3IjogIldlIHdpbGwgaGVscCB0aGUgZ3V5LiIsCiAgICAgICAgICAgICJyZWFsdGltZV9jaGFubmVsIjogInByZXNlbmNlLTQ0MjU0M2NkNDIyODc3NTA0MDAxZWIwNTUwZjE4OWFkMzYyZDY0NzVmYTZkOTVmZDBmMmQ4ZWUwZmY3NzBmNjVAdjFfY2FzZXNfMyIsCiAgICAgICAgICAgICJsYXN0X2Fzc2lnbmVkX2F0IjogIjIwMjEtMDgtMjdUMTE6Mjc6MDArMDA6MDAiLAogICAgICAgICAgICAibGFzdF9yZXBsaWVkX2F0IjogIjIwMjEtMDgtMjdUMTE6MjY6MjYrMDA6MDAiLAogICAgICAgICAgICAibGFzdF9vcGVuZWRfYXQiOiBudWxsLAogICAgICAgICAgICAibGFzdF9wZW5kaW5nX2F0IjogbnVsbCwKICAgICAgICAgICAgImxhc3RfY2xvc2VkX2F0IjogbnVsbCwKICAgICAgICAgICAgImxhc3RfY29tcGxldGVkX2F0IjogbnVsbCwKICAgICAgICAgICAgImxhc3RfYWdlbnRfYWN0aXZpdHlfYXQiOiAiMjAyMS0xMC0wMVQxNDowMzowOSswMDowMCIsCiAgICAgICAgICAgICJsYXN0X2N1c3RvbWVyX2FjdGl2aXR5X2F0IjogIjIwMjEtMDgtMjdUMTA6NDk6NTYrMDA6MDAiLAogICAgICAgICAgICAibGFzdF9yZXBseV9ieV9hZ2VudF9hdCI6ICIyMDIxLTA4LTI3VDExOjI2OjI2KzAwOjAwIiwKICAgICAgICAgICAgImxhc3RfcmVwbHlfYnlfcmVxdWVzdGVyX2F0IjogIjIwMjEtMDgtMjdUMTA6NDk6NTYrMDA6MDAiLAogICAgICAgICAgICAiYWdlbnRfdXBkYXRlZF9hdCI6ICIyMDIxLTEwLTAxVDE0OjAzOjA5KzAwOjAwIiwKICAgICAgICAgICAgImxhdGVzdF9hc3NpZ25lZV91cGRhdGUiOiAiMjAyMS0xMC0wMVQxNDowMzowOSswMDowMCIsCiAgICAgICAgICAgICJjcmVhdGVkX2F0IjogIjIwMjEtMDgtMjdUMTA6NDk6NTYrMDA6MDAiLAogICAgICAgICAgICAidXBkYXRlZF9hdCI6ICIyMDIxLTEwLTAxVDE0OjAzOjA5KzAwOjAwIiwKICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAiY2FzZSIsCiAgICAgICAgICAgICJyZXNvdXJjZV91cmwiOiAiaHR0cHM6Ly88SU1QT1JUX0tBWUFLT19FTkRQT0lOVF9IT1NUTkFNRT4vYXBpL3YxL2Nhc2VzLzMiCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgICJpZCI6IDUsCiAgICAgICAgICAgICJsZWdhY3lfaWQiOiBudWxsLAogICAgICAgICAgICAic3ViamVjdCI6ICJBIGV4YW1wbGUiLAogICAgICAgICAgICAicG9ydGFsIjogIkFQSSIsCiAgICAgICAgICAgICJzb3VyY2VfY2hhbm5lbCI6IHsKICAgICAgICAgICAgICAgICJ1dWlkIjogImNmM2NkMzlhLTU0YmYtNWU1ZS05MTJiLTg4MzkxOWYzYWIxZSIsCiAgICAgICAgICAgICAgICAidHlwZSI6ICJOT1RFIiwKICAgICAgICAgICAgICAgICJjaGFyYWN0ZXJfbGltaXQiOiBudWxsLAogICAgICAgICAgICAgICAgImFjY291bnQiOiBudWxsLAogICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAiY2hhbm5lbCIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgImxhc3RfcHVibGljX2NoYW5uZWwiOiBudWxsLAogICAgICAgICAgICAicmVxdWVzdGVyIjogewogICAgICAgICAgICAgICAgImlkIjogNywKICAgICAgICAgICAgICAgICJ1dWlkIjogIjBjNTQ2NDQ2LWQwOTUtNTRjNS1hZTU3LTVmNmY4MzhkM2M0MyIsCiAgICAgICAgICAgICAgICAiZnVsbF9uYW1lIjogIkRvbWluaWsgS2xlaW4iLAogICAgICAgICAgICAgICAgImxlZ2FjeV9pZCI6IG51bGwsCiAgICAgICAgICAgICAgICAiZGVzaWduYXRpb24iOiBudWxsLAogICAgICAgICAgICAgICAgImlzX2VuYWJsZWQiOiB0cnVlLAogICAgICAgICAgICAgICAgImlzX21mYV9lbmFibGVkIjogZmFsc2UsCiAgICAgICAgICAgICAgICAicm9sZSI6IHsKICAgICAgICAgICAgICAgICAgICAiaWQiOiA0LAogICAgICAgICAgICAgICAgICAgICJyZXNvdXJjZV90eXBlIjogInJvbGUiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgImF2YXRhciI6ICJodHRwczovLzxJTVBPUlRfS0FZQUtPX0VORFBPSU5UX0hPU1ROQU1FPi9hdmF0YXIvZ2V0LzBjNTQ2NDQ2LWQwOTUtNTRjNS1hZTU3LTVmNmY4MzhkM2M0Mz8xNjMzMDk2OTg5IiwKICAgICAgICAgICAgICAgICJhZ2VudF9jYXNlX2FjY2VzcyI6IG51bGwsCiAgICAgICAgICAgICAgICAib3JnYW5pemF0aW9uX2Nhc2VfYWNjZXNzIjogIlJFUVVFU1RFRCIsCiAgICAgICAgICAgICAgICAib3JnYW5pemF0aW9uIjogbnVsbCwKICAgICAgICAgICAgICAgICJ0ZWFtcyI6IFtdLAogICAgICAgICAgICAgICAgImVtYWlscyI6IFsKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICJpZCI6IDcsCiAgICAgICAgICAgICAgICAgICAgICAgICJyZXNvdXJjZV90eXBlIjogImlkZW50aXR5X2VtYWlsIgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAicGhvbmVzIjogW10sCiAgICAgICAgICAgICAgICAidHdpdHRlciI6IFtdLAogICAgICAgICAgICAgICAgImZhY2Vib29rIjogW10sCiAgICAgICAgICAgICAgICAiZXh0ZXJuYWxfaWRlbnRpZmllcnMiOiBbXSwKICAgICAgICAgICAgICAgICJjdXN0b21fZmllbGRzIjogW10sCiAgICAgICAgICAgICAgICAicGlubmVkX25vdGVzX2NvdW50IjogMCwKICAgICAgICAgICAgICAgICJsb2NhbGUiOiB7CiAgICAgICAgICAgICAgICAgICAgImlkIjogMywKICAgICAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJsb2NhbGUiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgInRpbWVfem9uZSI6ICJFdXJvcGUvUGFyaXMiLAogICAgICAgICAgICAgICAgInRpbWVfem9uZV9vZmZzZXQiOiA3MjAwLAogICAgICAgICAgICAgICAgImdyZWV0aW5nIjogbnVsbCwKICAgICAgICAgICAgICAgICJzaWduYXR1cmUiOiBudWxsLAogICAgICAgICAgICAgICAgInN0YXR1c19tZXNzYWdlIjogbnVsbCwKICAgICAgICAgICAgICAgICJsYXN0X3NlZW5fdXNlcl9hZ2VudCI6IG51bGwsCiAgICAgICAgICAgICAgICAibGFzdF9zZWVuX2lwIjogbnVsbCwKICAgICAgICAgICAgICAgICJsYXN0X3NlZW5fYXQiOiAiMjAyMS0wOC0yN1QxMDo0OTo1NiswMDowMCIsCiAgICAgICAgICAgICAgICAibGFzdF9hY3RpdmVfYXQiOiAiMjAyMS0xMC0wMVQxNDowMzowOSswMDowMCIsCiAgICAgICAgICAgICAgICAicmVhbHRpbWVfY2hhbm5lbCI6ICJwcmVzZW5jZS00NDI1NDNjZDQyMjg3NzUwNDAwMWViMDU1MGYxODlhZDM2MmQ2NDc1ZmE2ZDk1ZmQwZjJkOGVlMGZmNzcwZjY1QHYxX3VzZXJzXzciLAogICAgICAgICAgICAgICAgInByZXNlbmNlX2NoYW5uZWwiOiAidXNlcl9wcmVzZW5jZS00NDI1NDNjZDQyMjg3NzUwNDAwMWViMDU1MGYxODlhZDM2MmQ2NDc1ZmE2ZDk1ZmQwZjJkOGVlMGZmNzcwZjY1QGY4MDY4NzljYjViYjAxMjE2N2JmNjFkNzA1YmZlOTRhZGYyZTc5MWIiLAogICAgICAgICAgICAgICAgInBhc3N3b3JkX3VwZGF0ZWRfYXQiOiAiMjAyMS0wOC0yN1QxMDo0OTo1NiswMDowMCIsCiAgICAgICAgICAgICAgICAiYXZhdGFyX3VwZGF0ZWRfYXQiOiBudWxsLAogICAgICAgICAgICAgICAgImxhc3RfbG9nZ2VkX2luX2F0IjogbnVsbCwKICAgICAgICAgICAgICAgICJsYXN0X2FjdGl2aXR5X2F0IjogbnVsbCwKICAgICAgICAgICAgICAgICJjcmVhdGVkX2F0IjogIjIwMjEtMDgtMjdUMTA6NDk6NTYrMDA6MDAiLAogICAgICAgICAgICAgICAgInVwZGF0ZWRfYXQiOiAiMjAyMS0xMC0wMVQxNDowMzowOSswMDowMCIsCiAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJ1c2VyIiwKICAgICAgICAgICAgICAgICJyZXNvdXJjZV91cmwiOiAiaHR0cHM6Ly88SU1QT1JUX0tBWUFLT19FTkRQT0lOVF9IT1NUTkFNRT4vYXBpL3YxL3VzZXJzLzciCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJjcmVhdG9yIjogewogICAgICAgICAgICAgICAgImlkIjogMSwKICAgICAgICAgICAgICAgICJ1dWlkIjogImE4ZGZlNWZkLWIwOGQtNWQwNy1hZDhiLTc0YjExM2Y1ZDcyNiIsCiAgICAgICAgICAgICAgICAiZnVsbF9uYW1lIjogIlRob3JzdGVuIEVja2VsIiwKICAgICAgICAgICAgICAgICJsZWdhY3lfaWQiOiBudWxsLAogICAgICAgICAgICAgICAgImRlc2lnbmF0aW9uIjogbnVsbCwKICAgICAgICAgICAgICAgICJpc19lbmFibGVkIjogdHJ1ZSwKICAgICAgICAgICAgICAgICJpc19tZmFfZW5hYmxlZCI6IGZhbHNlLAogICAgICAgICAgICAgICAgInJvbGUiOiB7CiAgICAgICAgICAgICAgICAgICAgImlkIjogNSwKICAgICAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJyb2xlIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJhdmF0YXIiOiAiaHR0cHM6Ly88SU1QT1JUX0tBWUFLT19FTkRQT0lOVF9IT1NUTkFNRT4vYXZhdGFyL2dldC9hOGRmZTVmZC1iMDhkLTVkMDctYWQ4Yi03NGIxMTNmNWQ3MjY/MTYzMzEwMzgwMiIsCiAgICAgICAgICAgICAgICAiYWdlbnRfY2FzZV9hY2Nlc3MiOiAiQUxMIiwKICAgICAgICAgICAgICAgICJvcmdhbml6YXRpb25fY2FzZV9hY2Nlc3MiOiBudWxsLAogICAgICAgICAgICAgICAgIm9yZ2FuaXphdGlvbiI6IHsKICAgICAgICAgICAgICAgICAgICAiaWQiOiAzLAogICAgICAgICAgICAgICAgICAgICJyZXNvdXJjZV90eXBlIjogIm9yZ2FuaXphdGlvbiIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAidGVhbXMiOiBbCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAiaWQiOiAxLAogICAgICAgICAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJ0ZWFtIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAiaWQiOiAyLAogICAgICAgICAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJ0ZWFtIgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAiZW1haWxzIjogWwogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgImlkIjogMSwKICAgICAgICAgICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAiaWRlbnRpdHlfZW1haWwiCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICJwaG9uZXMiOiBbXSwKICAgICAgICAgICAgICAgICJ0d2l0dGVyIjogW10sCiAgICAgICAgICAgICAgICAiZmFjZWJvb2siOiBbXSwKICAgICAgICAgICAgICAgICJleHRlcm5hbF9pZGVudGlmaWVycyI6IFtdLAogICAgICAgICAgICAgICAgImN1c3RvbV9maWVsZHMiOiBbXSwKICAgICAgICAgICAgICAgICJwaW5uZWRfbm90ZXNfY291bnQiOiAwLAogICAgICAgICAgICAgICAgImxvY2FsZSI6IHsKICAgICAgICAgICAgICAgICAgICAiaWQiOiAzLAogICAgICAgICAgICAgICAgICAgICJyZXNvdXJjZV90eXBlIjogImxvY2FsZSIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAidGltZV96b25lIjogIlVUQyIsCiAgICAgICAgICAgICAgICAidGltZV96b25lX29mZnNldCI6IDAsCiAgICAgICAgICAgICAgICAiZ3JlZXRpbmciOiBudWxsLAogICAgICAgICAgICAgICAgInNpZ25hdHVyZSI6IG51bGwsCiAgICAgICAgICAgICAgICAic3RhdHVzX21lc3NhZ2UiOiBudWxsLAogICAgICAgICAgICAgICAgImxhc3Rfc2Vlbl91c2VyX2FnZW50IjogIlJ1YnkiLAogICAgICAgICAgICAgICAgImxhc3Rfc2Vlbl9pcCI6ICI1LjIzMS4xMzguMjA4IiwKICAgICAgICAgICAgICAgICJsYXN0X3NlZW5fYXQiOiAiMjAyMS0xMC0wMVQxNTo1Njo0MiswMDowMCIsCiAgICAgICAgICAgICAgICAibGFzdF9hY3RpdmVfYXQiOiAiMjAyMS0xMC0wMVQxNTo1Njo0MiswMDowMCIsCiAgICAgICAgICAgICAgICAicmVhbHRpbWVfY2hhbm5lbCI6ICJwcmVzZW5jZS00NDI1NDNjZDQyMjg3NzUwNDAwMWViMDU1MGYxODlhZDM2MmQ2NDc1ZmE2ZDk1ZmQwZjJkOGVlMGZmNzcwZjY1QHYxX3VzZXJzXzEiLAogICAgICAgICAgICAgICAgInByZXNlbmNlX2NoYW5uZWwiOiAidXNlcl9wcmVzZW5jZS00NDI1NDNjZDQyMjg3NzUwNDAwMWViMDU1MGYxODlhZDM2MmQ2NDc1ZmE2ZDk1ZmQwZjJkOGVlMGZmNzcwZjY1QGNmMDI3NGIzOTRkYjNhZjU1NWRiYzEzNmZjNzBhYWI2ZTQ1YmVlNDIiLAogICAgICAgICAgICAgICAgInBhc3N3b3JkX3VwZGF0ZWRfYXQiOiAiMjAyMS0wOC0yN1QwNzoxODoyMyswMDowMCIsCiAgICAgICAgICAgICAgICAiYXZhdGFyX3VwZGF0ZWRfYXQiOiBudWxsLAogICAgICAgICAgICAgICAgImxhc3RfbG9nZ2VkX2luX2F0IjogIjIwMjEtMTAtMDFUMTU6NTg6NTIrMDA6MDAiLAogICAgICAgICAgICAgICAgImxhc3RfYWN0aXZpdHlfYXQiOiAiMjAyMS0xMC0wMVQxNTo1ODo1MiswMDowMCIsCiAgICAgICAgICAgICAgICAiY3JlYXRlZF9hdCI6ICIyMDIxLTA4LTI0VDE4OjI0OjExKzAwOjAwIiwKICAgICAgICAgICAgICAgICJ1cGRhdGVkX2F0IjogIjIwMjEtMTAtMDFUMTU6NTY6NDIrMDA6MDAiLAogICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAidXNlciIsCiAgICAgICAgICAgICAgICAicmVzb3VyY2VfdXJsIjogImh0dHBzOi8vPElNUE9SVF9LQVlBS09fRU5EUE9JTlRfSE9TVE5BTUU+L2FwaS92MS91c2Vycy8xIgogICAgICAgICAgICB9LAogICAgICAgICAgICAiaWRlbnRpdHkiOiB7CiAgICAgICAgICAgICAgICAiaWQiOiA3LAogICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAiaWRlbnRpdHlfZW1haWwiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJhc3NpZ25lZF9hZ2VudCI6IG51bGwsCiAgICAgICAgICAgICJhc3NpZ25lZF90ZWFtIjogbnVsbCwKICAgICAgICAgICAgImxhc3RfYXNzaWduZWRfYnkiOiBudWxsLAogICAgICAgICAgICAiYnJhbmQiOiB7CiAgICAgICAgICAgICAgICAiaWQiOiAxLAogICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAiYnJhbmQiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJzdGF0dXMiOiB7CiAgICAgICAgICAgICAgICAiaWQiOiA1LAogICAgICAgICAgICAgICAgImxhYmVsIjogIkNsb3NlZCIsCiAgICAgICAgICAgICAgICAidHlwZSI6ICJDTE9TRUQiLAogICAgICAgICAgICAgICAgInNvcnRfb3JkZXIiOiA1LAogICAgICAgICAgICAgICAgImlzX3NsYV9hY3RpdmUiOiB0cnVlLAogICAgICAgICAgICAgICAgImlzX2RlbGV0ZWQiOiBmYWxzZSwKICAgICAgICAgICAgICAgICJjcmVhdGVkX2F0IjogIjIwMjEtMDgtMjRUMTg6MjQ6MTYrMDA6MDAiLAogICAgICAgICAgICAgICAgInVwZGF0ZWRfYXQiOiAiMjAyMS0wOC0yNFQxODoyNDoxNiswMDowMCIsCiAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJjYXNlX3N0YXR1cyIsCiAgICAgICAgICAgICAgICAicmVzb3VyY2VfdXJsIjogImh0dHBzOi8vPElNUE9SVF9LQVlBS09fRU5EUE9JTlRfSE9TVE5BTUU+L2FwaS92MS9jYXNlcy9zdGF0dXNlcy81IgogICAgICAgICAgICB9LAogICAgICAgICAgICAicHJpb3JpdHkiOiBudWxsLAogICAgICAgICAgICAidHlwZSI6IG51bGwsCiAgICAgICAgICAgICJyZWFkX21hcmtlciI6IG51bGwsCiAgICAgICAgICAgICJzbGFfdmVyc2lvbiI6IG51bGwsCiAgICAgICAgICAgICJzbGFfbWV0cmljcyI6IFtdLAogICAgICAgICAgICAiZm9ybSI6IHsKICAgICAgICAgICAgICAgICJpZCI6IDEsCiAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJjYXNlX2Zvcm0iCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJjdXN0b21fZmllbGRzIjogWwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICJmaWVsZCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgImlkIjogOCwKICAgICAgICAgICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAiY2FzZV9maWVsZCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJ2YWx1ZSI6ICIiLAogICAgICAgICAgICAgICAgICAgICJyZXNvdXJjZV90eXBlIjogImNhc2VfZmllbGRfdmFsdWUiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICJmaWVsZCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgImlkIjogOSwKICAgICAgICAgICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAiY2FzZV9maWVsZCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJ2YWx1ZSI6ICIiLAogICAgICAgICAgICAgICAgICAgICJyZXNvdXJjZV90eXBlIjogImNhc2VfZmllbGRfdmFsdWUiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICJmaWVsZCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgImlkIjogMTAsCiAgICAgICAgICAgICAgICAgICAgICAgICJyZXNvdXJjZV90eXBlIjogImNhc2VfZmllbGQiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAidmFsdWUiOiAiIiwKICAgICAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJjYXNlX2ZpZWxkX3ZhbHVlIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAiZmllbGQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJpZCI6IDExLAogICAgICAgICAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJjYXNlX2ZpZWxkIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInZhbHVlIjogIiIsCiAgICAgICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAiY2FzZV9maWVsZF92YWx1ZSIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgImZpZWxkIjogewogICAgICAgICAgICAgICAgICAgICAgICAiaWQiOiAxMiwKICAgICAgICAgICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAiY2FzZV9maWVsZCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJ2YWx1ZSI6ICIiLAogICAgICAgICAgICAgICAgICAgICJyZXNvdXJjZV90eXBlIjogImNhc2VfZmllbGRfdmFsdWUiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICJmaWVsZCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgImlkIjogMTMsCiAgICAgICAgICAgICAgICAgICAgICAgICJyZXNvdXJjZV90eXBlIjogImNhc2VfZmllbGQiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAidmFsdWUiOiAiIiwKICAgICAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJjYXNlX2ZpZWxkX3ZhbHVlIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAiZmllbGQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJpZCI6IDE0LAogICAgICAgICAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJjYXNlX2ZpZWxkIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInZhbHVlIjogIiIsCiAgICAgICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAiY2FzZV9maWVsZF92YWx1ZSIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgImZpZWxkIjogewogICAgICAgICAgICAgICAgICAgICAgICAiaWQiOiAxNSwKICAgICAgICAgICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAiY2FzZV9maWVsZCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJ2YWx1ZSI6ICIiLAogICAgICAgICAgICAgICAgICAgICJyZXNvdXJjZV90eXBlIjogImNhc2VfZmllbGRfdmFsdWUiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICJmaWVsZCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgImlkIjogMTYsCiAgICAgICAgICAgICAgICAgICAgICAgICJyZXNvdXJjZV90eXBlIjogImNhc2VfZmllbGQiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAidmFsdWUiOiAiIiwKICAgICAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJjYXNlX2ZpZWxkX3ZhbHVlIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAiZmllbGQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJpZCI6IDE3LAogICAgICAgICAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJjYXNlX2ZpZWxkIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInZhbHVlIjogIiIsCiAgICAgICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAiY2FzZV9maWVsZF92YWx1ZSIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgImZpZWxkIjogewogICAgICAgICAgICAgICAgICAgICAgICAiaWQiOiAxOCwKICAgICAgICAgICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAiY2FzZV9maWVsZCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJ2YWx1ZSI6ICIiLAogICAgICAgICAgICAgICAgICAgICJyZXNvdXJjZV90eXBlIjogImNhc2VfZmllbGRfdmFsdWUiCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJsYXN0X3JlcGxpZXIiOiB7CiAgICAgICAgICAgICAgICAiaWQiOiA3LAogICAgICAgICAgICAgICAgInV1aWQiOiAiMGM1NDY0NDYtZDA5NS01NGM1LWFlNTctNWY2ZjgzOGQzYzQzIiwKICAgICAgICAgICAgICAgICJmdWxsX25hbWUiOiAiRG9taW5payBLbGVpbiIsCiAgICAgICAgICAgICAgICAibGVnYWN5X2lkIjogbnVsbCwKICAgICAgICAgICAgICAgICJkZXNpZ25hdGlvbiI6IG51bGwsCiAgICAgICAgICAgICAgICAiaXNfZW5hYmxlZCI6IHRydWUsCiAgICAgICAgICAgICAgICAiaXNfbWZhX2VuYWJsZWQiOiBmYWxzZSwKICAgICAgICAgICAgICAgICJyb2xlIjogewogICAgICAgICAgICAgICAgICAgICJpZCI6IDQsCiAgICAgICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAicm9sZSIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAiYXZhdGFyIjogImh0dHBzOi8vPElNUE9SVF9LQVlBS09fRU5EUE9JTlRfSE9TVE5BTUU+L2F2YXRhci9nZXQvMGM1NDY0NDYtZDA5NS01NGM1LWFlNTctNWY2ZjgzOGQzYzQzPzE2MzMwOTY5ODkiLAogICAgICAgICAgICAgICAgImFnZW50X2Nhc2VfYWNjZXNzIjogbnVsbCwKICAgICAgICAgICAgICAgICJvcmdhbml6YXRpb25fY2FzZV9hY2Nlc3MiOiAiUkVRVUVTVEVEIiwKICAgICAgICAgICAgICAgICJvcmdhbml6YXRpb24iOiBudWxsLAogICAgICAgICAgICAgICAgInRlYW1zIjogW10sCiAgICAgICAgICAgICAgICAiZW1haWxzIjogWwogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgImlkIjogNywKICAgICAgICAgICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAiaWRlbnRpdHlfZW1haWwiCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICJwaG9uZXMiOiBbXSwKICAgICAgICAgICAgICAgICJ0d2l0dGVyIjogW10sCiAgICAgICAgICAgICAgICAiZmFjZWJvb2siOiBbXSwKICAgICAgICAgICAgICAgICJleHRlcm5hbF9pZGVudGlmaWVycyI6IFtdLAogICAgICAgICAgICAgICAgImN1c3RvbV9maWVsZHMiOiBbXSwKICAgICAgICAgICAgICAgICJwaW5uZWRfbm90ZXNfY291bnQiOiAwLAogICAgICAgICAgICAgICAgImxvY2FsZSI6IHsKICAgICAgICAgICAgICAgICAgICAiaWQiOiAzLAogICAgICAgICAgICAgICAgICAgICJyZXNvdXJjZV90eXBlIjogImxvY2FsZSIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAidGltZV96b25lIjogIkV1cm9wZS9QYXJpcyIsCiAgICAgICAgICAgICAgICAidGltZV96b25lX29mZnNldCI6IDcyMDAsCiAgICAgICAgICAgICAgICAiZ3JlZXRpbmciOiBudWxsLAogICAgICAgICAgICAgICAgInNpZ25hdHVyZSI6IG51bGwsCiAgICAgICAgICAgICAgICAic3RhdHVzX21lc3NhZ2UiOiBudWxsLAogICAgICAgICAgICAgICAgImxhc3Rfc2Vlbl91c2VyX2FnZW50IjogbnVsbCwKICAgICAgICAgICAgICAgICJsYXN0X3NlZW5faXAiOiBudWxsLAogICAgICAgICAgICAgICAgImxhc3Rfc2Vlbl9hdCI6ICIyMDIxLTA4LTI3VDEwOjQ5OjU2KzAwOjAwIiwKICAgICAgICAgICAgICAgICJsYXN0X2FjdGl2ZV9hdCI6ICIyMDIxLTEwLTAxVDE0OjAzOjA5KzAwOjAwIiwKICAgICAgICAgICAgICAgICJyZWFsdGltZV9jaGFubmVsIjogInByZXNlbmNlLTQ0MjU0M2NkNDIyODc3NTA0MDAxZWIwNTUwZjE4OWFkMzYyZDY0NzVmYTZkOTVmZDBmMmQ4ZWUwZmY3NzBmNjVAdjFfdXNlcnNfNyIsCiAgICAgICAgICAgICAgICAicHJlc2VuY2VfY2hhbm5lbCI6ICJ1c2VyX3ByZXNlbmNlLTQ0MjU0M2NkNDIyODc3NTA0MDAxZWIwNTUwZjE4OWFkMzYyZDY0NzVmYTZkOTVmZDBmMmQ4ZWUwZmY3NzBmNjVAZjgwNjg3OWNiNWJiMDEyMTY3YmY2MWQ3MDViZmU5NGFkZjJlNzkxYiIsCiAgICAgICAgICAgICAgICAicGFzc3dvcmRfdXBkYXRlZF9hdCI6ICIyMDIxLTA4LTI3VDEwOjQ5OjU2KzAwOjAwIiwKICAgICAgICAgICAgICAgICJhdmF0YXJfdXBkYXRlZF9hdCI6IG51bGwsCiAgICAgICAgICAgICAgICAibGFzdF9sb2dnZWRfaW5fYXQiOiBudWxsLAogICAgICAgICAgICAgICAgImxhc3RfYWN0aXZpdHlfYXQiOiBudWxsLAogICAgICAgICAgICAgICAgImNyZWF0ZWRfYXQiOiAiMjAyMS0wOC0yN1QxMDo0OTo1NiswMDowMCIsCiAgICAgICAgICAgICAgICAidXBkYXRlZF9hdCI6ICIyMDIxLTEwLTAxVDE0OjAzOjA5KzAwOjAwIiwKICAgICAgICAgICAgICAgICJyZXNvdXJjZV90eXBlIjogInVzZXIiLAogICAgICAgICAgICAgICAgInJlc291cmNlX3VybCI6ICJodHRwczovLzxJTVBPUlRfS0FZQUtPX0VORFBPSU5UX0hPU1ROQU1FPi9hcGkvdjEvdXNlcnMvNyIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgImxhc3RfcmVwbGllcl9pZGVudGl0eSI6IHsKICAgICAgICAgICAgICAgICJpZCI6IDcsCiAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJpZGVudGl0eV9lbWFpbCIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgImxhc3RfdXBkYXRlZF9ieSI6IHsKICAgICAgICAgICAgICAgICJpZCI6IDEsCiAgICAgICAgICAgICAgICAidXVpZCI6ICJhOGRmZTVmZC1iMDhkLTVkMDctYWQ4Yi03NGIxMTNmNWQ3MjYiLAogICAgICAgICAgICAgICAgImZ1bGxfbmFtZSI6ICJUaG9yc3RlbiBFY2tlbCIsCiAgICAgICAgICAgICAgICAibGVnYWN5X2lkIjogbnVsbCwKICAgICAgICAgICAgICAgICJkZXNpZ25hdGlvbiI6IG51bGwsCiAgICAgICAgICAgICAgICAiaXNfZW5hYmxlZCI6IHRydWUsCiAgICAgICAgICAgICAgICAiaXNfbWZhX2VuYWJsZWQiOiBmYWxzZSwKICAgICAgICAgICAgICAgICJyb2xlIjogewogICAgICAgICAgICAgICAgICAgICJpZCI6IDUsCiAgICAgICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAicm9sZSIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAiYXZhdGFyIjogImh0dHBzOi8vPElNUE9SVF9LQVlBS09fRU5EUE9JTlRfSE9TVE5BTUU+L2F2YXRhci9nZXQvYThkZmU1ZmQtYjA4ZC01ZDA3LWFkOGItNzRiMTEzZjVkNzI2PzE2MzMxMDM4MDIiLAogICAgICAgICAgICAgICAgImFnZW50X2Nhc2VfYWNjZXNzIjogIkFMTCIsCiAgICAgICAgICAgICAgICAib3JnYW5pemF0aW9uX2Nhc2VfYWNjZXNzIjogbnVsbCwKICAgICAgICAgICAgICAgICJvcmdhbml6YXRpb24iOiB7CiAgICAgICAgICAgICAgICAgICAgImlkIjogMywKICAgICAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJvcmdhbml6YXRpb24iCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgInRlYW1zIjogWwogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgImlkIjogMSwKICAgICAgICAgICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAidGVhbSIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgImlkIjogMiwKICAgICAgICAgICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAidGVhbSIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgImVtYWlscyI6IFsKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICJpZCI6IDEsCiAgICAgICAgICAgICAgICAgICAgICAgICJyZXNvdXJjZV90eXBlIjogImlkZW50aXR5X2VtYWlsIgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAicGhvbmVzIjogW10sCiAgICAgICAgICAgICAgICAidHdpdHRlciI6IFtdLAogICAgICAgICAgICAgICAgImZhY2Vib29rIjogW10sCiAgICAgICAgICAgICAgICAiZXh0ZXJuYWxfaWRlbnRpZmllcnMiOiBbXSwKICAgICAgICAgICAgICAgICJjdXN0b21fZmllbGRzIjogW10sCiAgICAgICAgICAgICAgICAicGlubmVkX25vdGVzX2NvdW50IjogMCwKICAgICAgICAgICAgICAgICJsb2NhbGUiOiB7CiAgICAgICAgICAgICAgICAgICAgImlkIjogMywKICAgICAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJsb2NhbGUiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgInRpbWVfem9uZSI6ICJVVEMiLAogICAgICAgICAgICAgICAgInRpbWVfem9uZV9vZmZzZXQiOiAwLAogICAgICAgICAgICAgICAgImdyZWV0aW5nIjogbnVsbCwKICAgICAgICAgICAgICAgICJzaWduYXR1cmUiOiBudWxsLAogICAgICAgICAgICAgICAgInN0YXR1c19tZXNzYWdlIjogbnVsbCwKICAgICAgICAgICAgICAgICJsYXN0X3NlZW5fdXNlcl9hZ2VudCI6ICJSdWJ5IiwKICAgICAgICAgICAgICAgICJsYXN0X3NlZW5faXAiOiAiNS4yMzEuMTM4LjIwOCIsCiAgICAgICAgICAgICAgICAibGFzdF9zZWVuX2F0IjogIjIwMjEtMTAtMDFUMTU6NTY6NDIrMDA6MDAiLAogICAgICAgICAgICAgICAgImxhc3RfYWN0aXZlX2F0IjogIjIwMjEtMTAtMDFUMTU6NTY6NDIrMDA6MDAiLAogICAgICAgICAgICAgICAgInJlYWx0aW1lX2NoYW5uZWwiOiAicHJlc2VuY2UtNDQyNTQzY2Q0MjI4Nzc1MDQwMDFlYjA1NTBmMTg5YWQzNjJkNjQ3NWZhNmQ5NWZkMGYyZDhlZTBmZjc3MGY2NUB2MV91c2Vyc18xIiwKICAgICAgICAgICAgICAgICJwcmVzZW5jZV9jaGFubmVsIjogInVzZXJfcHJlc2VuY2UtNDQyNTQzY2Q0MjI4Nzc1MDQwMDFlYjA1NTBmMTg5YWQzNjJkNjQ3NWZhNmQ5NWZkMGYyZDhlZTBmZjc3MGY2NUBjZjAyNzRiMzk0ZGIzYWY1NTVkYmMxMzZmYzcwYWFiNmU0NWJlZTQyIiwKICAgICAgICAgICAgICAgICJwYXNzd29yZF91cGRhdGVkX2F0IjogIjIwMjEtMDgtMjdUMDc6MTg6MjMrMDA6MDAiLAogICAgICAgICAgICAgICAgImF2YXRhcl91cGRhdGVkX2F0IjogbnVsbCwKICAgICAgICAgICAgICAgICJsYXN0X2xvZ2dlZF9pbl9hdCI6ICIyMDIxLTEwLTAxVDE1OjU4OjUyKzAwOjAwIiwKICAgICAgICAgICAgICAgICJsYXN0X2FjdGl2aXR5X2F0IjogIjIwMjEtMTAtMDFUMTU6NTg6NTIrMDA6MDAiLAogICAgICAgICAgICAgICAgImNyZWF0ZWRfYXQiOiAiMjAyMS0wOC0yNFQxODoyNDoxMSswMDowMCIsCiAgICAgICAgICAgICAgICAidXBkYXRlZF9hdCI6ICIyMDIxLTEwLTAxVDE1OjU2OjQyKzAwOjAwIiwKICAgICAgICAgICAgICAgICJyZXNvdXJjZV90eXBlIjogInVzZXIiLAogICAgICAgICAgICAgICAgInJlc291cmNlX3VybCI6ICJodHRwczovLzxJTVBPUlRfS0FZQUtPX0VORFBPSU5UX0hPU1ROQU1FPi9hcGkvdjEvdXNlcnMvMSIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgImxhc3RfY29tcGxldGVkX2J5IjogewogICAgICAgICAgICAgICAgImlkIjogMSwKICAgICAgICAgICAgICAgICJ1dWlkIjogImE4ZGZlNWZkLWIwOGQtNWQwNy1hZDhiLTc0YjExM2Y1ZDcyNiIsCiAgICAgICAgICAgICAgICAiZnVsbF9uYW1lIjogIlRob3JzdGVuIEVja2VsIiwKICAgICAgICAgICAgICAgICJsZWdhY3lfaWQiOiBudWxsLAogICAgICAgICAgICAgICAgImRlc2lnbmF0aW9uIjogbnVsbCwKICAgICAgICAgICAgICAgICJpc19lbmFibGVkIjogdHJ1ZSwKICAgICAgICAgICAgICAgICJpc19tZmFfZW5hYmxlZCI6IGZhbHNlLAogICAgICAgICAgICAgICAgInJvbGUiOiB7CiAgICAgICAgICAgICAgICAgICAgImlkIjogNSwKICAgICAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJyb2xlIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJhdmF0YXIiOiAiaHR0cHM6Ly88SU1QT1JUX0tBWUFLT19FTkRQT0lOVF9IT1NUTkFNRT4vYXZhdGFyL2dldC9hOGRmZTVmZC1iMDhkLTVkMDctYWQ4Yi03NGIxMTNmNWQ3MjY/MTYzMzEwMzgwMiIsCiAgICAgICAgICAgICAgICAiYWdlbnRfY2FzZV9hY2Nlc3MiOiAiQUxMIiwKICAgICAgICAgICAgICAgICJvcmdhbml6YXRpb25fY2FzZV9hY2Nlc3MiOiBudWxsLAogICAgICAgICAgICAgICAgIm9yZ2FuaXphdGlvbiI6IHsKICAgICAgICAgICAgICAgICAgICAiaWQiOiAzLAogICAgICAgICAgICAgICAgICAgICJyZXNvdXJjZV90eXBlIjogIm9yZ2FuaXphdGlvbiIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAidGVhbXMiOiBbCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAiaWQiOiAxLAogICAgICAgICAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJ0ZWFtIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAiaWQiOiAyLAogICAgICAgICAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJ0ZWFtIgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAiZW1haWxzIjogWwogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgImlkIjogMSwKICAgICAgICAgICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAiaWRlbnRpdHlfZW1haWwiCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICJwaG9uZXMiOiBbXSwKICAgICAgICAgICAgICAgICJ0d2l0dGVyIjogW10sCiAgICAgICAgICAgICAgICAiZmFjZWJvb2siOiBbXSwKICAgICAgICAgICAgICAgICJleHRlcm5hbF9pZGVudGlmaWVycyI6IFtdLAogICAgICAgICAgICAgICAgImN1c3RvbV9maWVsZHMiOiBbXSwKICAgICAgICAgICAgICAgICJwaW5uZWRfbm90ZXNfY291bnQiOiAwLAogICAgICAgICAgICAgICAgImxvY2FsZSI6IHsKICAgICAgICAgICAgICAgICAgICAiaWQiOiAzLAogICAgICAgICAgICAgICAgICAgICJyZXNvdXJjZV90eXBlIjogImxvY2FsZSIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAidGltZV96b25lIjogIlVUQyIsCiAgICAgICAgICAgICAgICAidGltZV96b25lX29mZnNldCI6IDAsCiAgICAgICAgICAgICAgICAiZ3JlZXRpbmciOiBudWxsLAogICAgICAgICAgICAgICAgInNpZ25hdHVyZSI6IG51bGwsCiAgICAgICAgICAgICAgICAic3RhdHVzX21lc3NhZ2UiOiBudWxsLAogICAgICAgICAgICAgICAgImxhc3Rfc2Vlbl91c2VyX2FnZW50IjogIlJ1YnkiLAogICAgICAgICAgICAgICAgImxhc3Rfc2Vlbl9pcCI6ICI1LjIzMS4xMzguMjA4IiwKICAgICAgICAgICAgICAgICJsYXN0X3NlZW5fYXQiOiAiMjAyMS0xMC0wMVQxNTo1Njo0MiswMDowMCIsCiAgICAgICAgICAgICAgICAibGFzdF9hY3RpdmVfYXQiOiAiMjAyMS0xMC0wMVQxNTo1Njo0MiswMDowMCIsCiAgICAgICAgICAgICAgICAicmVhbHRpbWVfY2hhbm5lbCI6ICJwcmVzZW5jZS00NDI1NDNjZDQyMjg3NzUwNDAwMWViMDU1MGYxODlhZDM2MmQ2NDc1ZmE2ZDk1ZmQwZjJkOGVlMGZmNzcwZjY1QHYxX3VzZXJzXzEiLAogICAgICAgICAgICAgICAgInByZXNlbmNlX2NoYW5uZWwiOiAidXNlcl9wcmVzZW5jZS00NDI1NDNjZDQyMjg3NzUwNDAwMWViMDU1MGYxODlhZDM2MmQ2NDc1ZmE2ZDk1ZmQwZjJkOGVlMGZmNzcwZjY1QGNmMDI3NGIzOTRkYjNhZjU1NWRiYzEzNmZjNzBhYWI2ZTQ1YmVlNDIiLAogICAgICAgICAgICAgICAgInBhc3N3b3JkX3VwZGF0ZWRfYXQiOiAiMjAyMS0wOC0yN1QwNzoxODoyMyswMDowMCIsCiAgICAgICAgICAgICAgICAiYXZhdGFyX3VwZGF0ZWRfYXQiOiBudWxsLAogICAgICAgICAgICAgICAgImxhc3RfbG9nZ2VkX2luX2F0IjogIjIwMjEtMTAtMDFUMTU6NTg6NTIrMDA6MDAiLAogICAgICAgICAgICAgICAgImxhc3RfYWN0aXZpdHlfYXQiOiAiMjAyMS0xMC0wMVQxNTo1ODo1MiswMDowMCIsCiAgICAgICAgICAgICAgICAiY3JlYXRlZF9hdCI6ICIyMDIxLTA4LTI0VDE4OjI0OjExKzAwOjAwIiwKICAgICAgICAgICAgICAgICJ1cGRhdGVkX2F0IjogIjIwMjEtMTAtMDFUMTU6NTY6NDIrMDA6MDAiLAogICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAidXNlciIsCiAgICAgICAgICAgICAgICAicmVzb3VyY2VfdXJsIjogImh0dHBzOi8vPElNUE9SVF9LQVlBS09fRU5EUE9JTlRfSE9TVE5BTUU+L2FwaS92MS91c2Vycy8xIgogICAgICAgICAgICB9LAogICAgICAgICAgICAibGFzdF9jbG9zZWRfYnkiOiBudWxsLAogICAgICAgICAgICAic3RhdGUiOiAiQUNUSVZFIiwKICAgICAgICAgICAgInBvc3RfY291bnQiOiAxLAogICAgICAgICAgICAiaGFzX25vdGVzIjogdHJ1ZSwKICAgICAgICAgICAgInBpbm5lZF9ub3Rlc19jb3VudCI6IDAsCiAgICAgICAgICAgICJoYXNfYXR0YWNobWVudHMiOiBmYWxzZSwKICAgICAgICAgICAgImlzX21lcmdlZCI6IGZhbHNlLAogICAgICAgICAgICAicmF0aW5nIjogbnVsbCwKICAgICAgICAgICAgInJhdGluZ19zdGF0dXMiOiAiT0ZGRVJFRCIsCiAgICAgICAgICAgICJ0YWdzIjogW10sCiAgICAgICAgICAgICJsYXN0X3Bvc3Rfc3RhdHVzIjogIiIsCiAgICAgICAgICAgICJsYXN0X3Bvc3RfcHJldmlldyI6ICJBIGV4YW1wbGUgZm9yIGEgY2xvc2VkIHRpY2tldC4iLAogICAgICAgICAgICAibGFzdF9wb3N0X3R5cGUiOiAiTk9URSIsCiAgICAgICAgICAgICJsYXN0X21lc3NhZ2VfcHJldmlldyI6ICJBIGV4YW1wbGUgZm9yIGEgY2xvc2VkIHRpY2tldC4iLAogICAgICAgICAgICAicmVhbHRpbWVfY2hhbm5lbCI6ICJwcmVzZW5jZS00NDI1NDNjZDQyMjg3NzUwNDAwMWViMDU1MGYxODlhZDM2MmQ2NDc1ZmE2ZDk1ZmQwZjJkOGVlMGZmNzcwZjY1QHYxX2Nhc2VzXzUiLAogICAgICAgICAgICAibGFzdF9hc3NpZ25lZF9hdCI6IG51bGwsCiAgICAgICAgICAgICJsYXN0X3JlcGxpZWRfYXQiOiAiMjAyMS0wOC0yN1QxMjoyMDozMyswMDowMCIsCiAgICAgICAgICAgICJsYXN0X29wZW5lZF9hdCI6IG51bGwsCiAgICAgICAgICAgICJsYXN0X3BlbmRpbmdfYXQiOiBudWxsLAogICAgICAgICAgICAibGFzdF9jbG9zZWRfYXQiOiAiMjAyMS0wOS0wMVQxMjoyNDozOSswMDowMCIsCiAgICAgICAgICAgICJsYXN0X2NvbXBsZXRlZF9hdCI6ICIyMDIxLTA4LTI3VDEyOjIwOjQxKzAwOjAwIiwKICAgICAgICAgICAgImxhc3RfYWdlbnRfYWN0aXZpdHlfYXQiOiAiMjAyMS0wOC0yN1QxMjoyMDo0MSswMDowMCIsCiAgICAgICAgICAgICJsYXN0X2N1c3RvbWVyX2FjdGl2aXR5X2F0IjogbnVsbCwKICAgICAgICAgICAgImxhc3RfcmVwbHlfYnlfYWdlbnRfYXQiOiBudWxsLAogICAgICAgICAgICAibGFzdF9yZXBseV9ieV9yZXF1ZXN0ZXJfYXQiOiBudWxsLAogICAgICAgICAgICAiYWdlbnRfdXBkYXRlZF9hdCI6ICIyMDIxLTA4LTI3VDEyOjIwOjQxKzAwOjAwIiwKICAgICAgICAgICAgImxhdGVzdF9hc3NpZ25lZV91cGRhdGUiOiBudWxsLAogICAgICAgICAgICAiY3JlYXRlZF9hdCI6ICIyMDIxLTA4LTI3VDEyOjIwOjMzKzAwOjAwIiwKICAgICAgICAgICAgInVwZGF0ZWRfYXQiOiAiMjAyMS0wOS0wMVQxMjoyNDozOSswMDowMCIsCiAgICAgICAgICAgICJyZXNvdXJjZV90eXBlIjogImNhc2UiLAogICAgICAgICAgICAicmVzb3VyY2VfdXJsIjogImh0dHBzOi8vPElNUE9SVF9LQVlBS09fRU5EUE9JTlRfSE9TVE5BTUU+L2FwaS92MS9jYXNlcy81IgogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICAiaWQiOiA0LAogICAgICAgICAgICAibGVnYWN5X2lkIjogbnVsbCwKICAgICAgICAgICAgInN1YmplY3QiOiAiSSBoYXZlIGEgcHJvYmxlbSB3aXRoIG15IG1hYyIsCiAgICAgICAgICAgICJwb3J0YWwiOiAiUFJJTUFSWSIsCiAgICAgICAgICAgICJzb3VyY2VfY2hhbm5lbCI6IHsKICAgICAgICAgICAgICAgICJ1dWlkIjogIjhjOWI1NmJkLTEwYmQtNWM5MS05M2RhLTE5MDQxOTNlYWQ0ZSIsCiAgICAgICAgICAgICAgICAidHlwZSI6ICJIRUxQQ0VOVEVSIiwKICAgICAgICAgICAgICAgICJjaGFyYWN0ZXJfbGltaXQiOiBudWxsLAogICAgICAgICAgICAgICAgImFjY291bnQiOiBudWxsLAogICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAiY2hhbm5lbCIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgImxhc3RfcHVibGljX2NoYW5uZWwiOiB7CiAgICAgICAgICAgICAgICAidXVpZCI6ICI4YzliNTZiZC0xMGJkLTVjOTEtOTNkYS0xOTA0MTkzZWFkNGUiLAogICAgICAgICAgICAgICAgInR5cGUiOiAiSEVMUENFTlRFUiIsCiAgICAgICAgICAgICAgICAiY2hhcmFjdGVyX2xpbWl0IjogbnVsbCwKICAgICAgICAgICAgICAgICJhY2NvdW50IjogbnVsbCwKICAgICAgICAgICAgICAgICJyZXNvdXJjZV90eXBlIjogImNoYW5uZWwiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJyZXF1ZXN0ZXIiOiB7CiAgICAgICAgICAgICAgICAiaWQiOiAzLAogICAgICAgICAgICAgICAgInV1aWQiOiAiODFkOGEzMmMtZGUwNy01ZWQ2LWI5MmYtZWY0MjY1MDI5OWEyIiwKICAgICAgICAgICAgICAgICJmdWxsX25hbWUiOiAiVGF5bG9yIFdlc3QiLAogICAgICAgICAgICAgICAgImxlZ2FjeV9pZCI6IG51bGwsCiAgICAgICAgICAgICAgICAiZGVzaWduYXRpb24iOiBudWxsLAogICAgICAgICAgICAgICAgImlzX2VuYWJsZWQiOiB0cnVlLAogICAgICAgICAgICAgICAgImlzX21mYV9lbmFibGVkIjogZmFsc2UsCiAgICAgICAgICAgICAgICAicm9sZSI6IHsKICAgICAgICAgICAgICAgICAgICAiaWQiOiA0LAogICAgICAgICAgICAgICAgICAgICJyZXNvdXJjZV90eXBlIjogInJvbGUiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgImF2YXRhciI6ICJodHRwczovLzxJTVBPUlRfS0FZQUtPX0VORFBPSU5UX0hPU1ROQU1FPi9hdmF0YXIvZ2V0LzgxZDhhMzJjLWRlMDctNWVkNi1iOTJmLWVmNDI2NTAyOTlhMj8xNjMwMDY2NzMzIiwKICAgICAgICAgICAgICAgICJhZ2VudF9jYXNlX2FjY2VzcyI6IG51bGwsCiAgICAgICAgICAgICAgICAib3JnYW5pemF0aW9uX2Nhc2VfYWNjZXNzIjogIlJFUVVFU1RFRCIsCiAgICAgICAgICAgICAgICAib3JnYW5pemF0aW9uIjogewogICAgICAgICAgICAgICAgICAgICJpZCI6IDEsCiAgICAgICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAib3JnYW5pemF0aW9uIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJ0ZWFtcyI6IFtdLAogICAgICAgICAgICAgICAgImVtYWlscyI6IFsKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICJpZCI6IDMsCiAgICAgICAgICAgICAgICAgICAgICAgICJyZXNvdXJjZV90eXBlIjogImlkZW50aXR5X2VtYWlsIgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAicGhvbmVzIjogW10sCiAgICAgICAgICAgICAgICAidHdpdHRlciI6IFsKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICJpZCI6IDEsCiAgICAgICAgICAgICAgICAgICAgICAgICJyZXNvdXJjZV90eXBlIjogImlkZW50aXR5X3R3aXR0ZXIiCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICJmYWNlYm9vayI6IFtdLAogICAgICAgICAgICAgICAgImV4dGVybmFsX2lkZW50aWZpZXJzIjogW10sCiAgICAgICAgICAgICAgICAiY3VzdG9tX2ZpZWxkcyI6IFtdLAogICAgICAgICAgICAgICAgInBpbm5lZF9ub3Rlc19jb3VudCI6IDAsCiAgICAgICAgICAgICAgICAibG9jYWxlIjogewogICAgICAgICAgICAgICAgICAgICJpZCI6IDMsCiAgICAgICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAibG9jYWxlIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJ0aW1lX3pvbmUiOiAiVVRDIiwKICAgICAgICAgICAgICAgICJ0aW1lX3pvbmVfb2Zmc2V0IjogMCwKICAgICAgICAgICAgICAgICJncmVldGluZyI6IG51bGwsCiAgICAgICAgICAgICAgICAic2lnbmF0dXJlIjogbnVsbCwKICAgICAgICAgICAgICAgICJzdGF0dXNfbWVzc2FnZSI6IG51bGwsCiAgICAgICAgICAgICAgICAibGFzdF9zZWVuX3VzZXJfYWdlbnQiOiBudWxsLAogICAgICAgICAgICAgICAgImxhc3Rfc2Vlbl9pcCI6IG51bGwsCiAgICAgICAgICAgICAgICAibGFzdF9zZWVuX2F0IjogIjIwMjEtMDgtMjdUMTI6MTg6NTMrMDA6MDAiLAogICAgICAgICAgICAgICAgImxhc3RfYWN0aXZlX2F0IjogIjIwMjEtMDgtMjdUMTI6MTg6NTMrMDA6MDAiLAogICAgICAgICAgICAgICAgInJlYWx0aW1lX2NoYW5uZWwiOiAicHJlc2VuY2UtNDQyNTQzY2Q0MjI4Nzc1MDQwMDFlYjA1NTBmMTg5YWQzNjJkNjQ3NWZhNmQ5NWZkMGYyZDhlZTBmZjc3MGY2NUB2MV91c2Vyc18zIiwKICAgICAgICAgICAgICAgICJwcmVzZW5jZV9jaGFubmVsIjogInVzZXJfcHJlc2VuY2UtNDQyNTQzY2Q0MjI4Nzc1MDQwMDFlYjA1NTBmMTg5YWQzNjJkNjQ3NWZhNmQ5NWZkMGYyZDhlZTBmZjc3MGY2NUBkZDEzMmRkOTE5ZDhkMDAzYzJiY2QyZTAwNmE5MTMzYTg2NjlkMjA0IiwKICAgICAgICAgICAgICAgICJwYXNzd29yZF91cGRhdGVkX2F0IjogIjIwMjEtMDgtMjRUMTg6MjQ6MTErMDA6MDAiLAogICAgICAgICAgICAgICAgImF2YXRhcl91cGRhdGVkX2F0IjogIjIwMjEtMDgtMjRUMTg6MjQ6MTIrMDA6MDAiLAogICAgICAgICAgICAgICAgImxhc3RfbG9nZ2VkX2luX2F0IjogbnVsbCwKICAgICAgICAgICAgICAgICJsYXN0X2FjdGl2aXR5X2F0IjogbnVsbCwKICAgICAgICAgICAgICAgICJjcmVhdGVkX2F0IjogIjIwMjEtMDgtMjRUMTg6MjQ6MTErMDA6MDAiLAogICAgICAgICAgICAgICAgInVwZGF0ZWRfYXQiOiAiMjAyMS0wOC0yN1QxMjoxODo1MyswMDowMCIsCiAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJ1c2VyIiwKICAgICAgICAgICAgICAgICJyZXNvdXJjZV91cmwiOiAiaHR0cHM6Ly88SU1QT1JUX0tBWUFLT19FTkRQT0lOVF9IT1NUTkFNRT4vYXBpL3YxL3VzZXJzLzMiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJjcmVhdG9yIjogewogICAgICAgICAgICAgICAgImlkIjogMywKICAgICAgICAgICAgICAgICJ1dWlkIjogIjgxZDhhMzJjLWRlMDctNWVkNi1iOTJmLWVmNDI2NTAyOTlhMiIsCiAgICAgICAgICAgICAgICAiZnVsbF9uYW1lIjogIlRheWxvciBXZXN0IiwKICAgICAgICAgICAgICAgICJsZWdhY3lfaWQiOiBudWxsLAogICAgICAgICAgICAgICAgImRlc2lnbmF0aW9uIjogbnVsbCwKICAgICAgICAgICAgICAgICJpc19lbmFibGVkIjogdHJ1ZSwKICAgICAgICAgICAgICAgICJpc19tZmFfZW5hYmxlZCI6IGZhbHNlLAogICAgICAgICAgICAgICAgInJvbGUiOiB7CiAgICAgICAgICAgICAgICAgICAgImlkIjogNCwKICAgICAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJyb2xlIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJhdmF0YXIiOiAiaHR0cHM6Ly88SU1QT1JUX0tBWUFLT19FTkRQT0lOVF9IT1NUTkFNRT4vYXZhdGFyL2dldC84MWQ4YTMyYy1kZTA3LTVlZDYtYjkyZi1lZjQyNjUwMjk5YTI/MTYzMDA2NjczMyIsCiAgICAgICAgICAgICAgICAiYWdlbnRfY2FzZV9hY2Nlc3MiOiBudWxsLAogICAgICAgICAgICAgICAgIm9yZ2FuaXphdGlvbl9jYXNlX2FjY2VzcyI6ICJSRVFVRVNURUQiLAogICAgICAgICAgICAgICAgIm9yZ2FuaXphdGlvbiI6IHsKICAgICAgICAgICAgICAgICAgICAiaWQiOiAxLAogICAgICAgICAgICAgICAgICAgICJyZXNvdXJjZV90eXBlIjogIm9yZ2FuaXphdGlvbiIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAidGVhbXMiOiBbXSwKICAgICAgICAgICAgICAgICJlbWFpbHMiOiBbCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAiaWQiOiAzLAogICAgICAgICAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJpZGVudGl0eV9lbWFpbCIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgInBob25lcyI6IFtdLAogICAgICAgICAgICAgICAgInR3aXR0ZXIiOiBbCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAiaWQiOiAxLAogICAgICAgICAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJpZGVudGl0eV90d2l0dGVyIgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAiZmFjZWJvb2siOiBbXSwKICAgICAgICAgICAgICAgICJleHRlcm5hbF9pZGVudGlmaWVycyI6IFtdLAogICAgICAgICAgICAgICAgImN1c3RvbV9maWVsZHMiOiBbXSwKICAgICAgICAgICAgICAgICJwaW5uZWRfbm90ZXNfY291bnQiOiAwLAogICAgICAgICAgICAgICAgImxvY2FsZSI6IHsKICAgICAgICAgICAgICAgICAgICAiaWQiOiAzLAogICAgICAgICAgICAgICAgICAgICJyZXNvdXJjZV90eXBlIjogImxvY2FsZSIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAidGltZV96b25lIjogIlVUQyIsCiAgICAgICAgICAgICAgICAidGltZV96b25lX29mZnNldCI6IDAsCiAgICAgICAgICAgICAgICAiZ3JlZXRpbmciOiBudWxsLAogICAgICAgICAgICAgICAgInNpZ25hdHVyZSI6IG51bGwsCiAgICAgICAgICAgICAgICAic3RhdHVzX21lc3NhZ2UiOiBudWxsLAogICAgICAgICAgICAgICAgImxhc3Rfc2Vlbl91c2VyX2FnZW50IjogbnVsbCwKICAgICAgICAgICAgICAgICJsYXN0X3NlZW5faXAiOiBudWxsLAogICAgICAgICAgICAgICAgImxhc3Rfc2Vlbl9hdCI6ICIyMDIxLTA4LTI3VDEyOjE4OjUzKzAwOjAwIiwKICAgICAgICAgICAgICAgICJsYXN0X2FjdGl2ZV9hdCI6ICIyMDIxLTA4LTI3VDEyOjE4OjUzKzAwOjAwIiwKICAgICAgICAgICAgICAgICJyZWFsdGltZV9jaGFubmVsIjogInByZXNlbmNlLTQ0MjU0M2NkNDIyODc3NTA0MDAxZWIwNTUwZjE4OWFkMzYyZDY0NzVmYTZkOTVmZDBmMmQ4ZWUwZmY3NzBmNjVAdjFfdXNlcnNfMyIsCiAgICAgICAgICAgICAgICAicHJlc2VuY2VfY2hhbm5lbCI6ICJ1c2VyX3ByZXNlbmNlLTQ0MjU0M2NkNDIyODc3NTA0MDAxZWIwNTUwZjE4OWFkMzYyZDY0NzVmYTZkOTVmZDBmMmQ4ZWUwZmY3NzBmNjVAZGQxMzJkZDkxOWQ4ZDAwM2MyYmNkMmUwMDZhOTEzM2E4NjY5ZDIwNCIsCiAgICAgICAgICAgICAgICAicGFzc3dvcmRfdXBkYXRlZF9hdCI6ICIyMDIxLTA4LTI0VDE4OjI0OjExKzAwOjAwIiwKICAgICAgICAgICAgICAgICJhdmF0YXJfdXBkYXRlZF9hdCI6ICIyMDIxLTA4LTI0VDE4OjI0OjEyKzAwOjAwIiwKICAgICAgICAgICAgICAgICJsYXN0X2xvZ2dlZF9pbl9hdCI6IG51bGwsCiAgICAgICAgICAgICAgICAibGFzdF9hY3Rpdml0eV9hdCI6IG51bGwsCiAgICAgICAgICAgICAgICAiY3JlYXRlZF9hdCI6ICIyMDIxLTA4LTI0VDE4OjI0OjExKzAwOjAwIiwKICAgICAgICAgICAgICAgICJ1cGRhdGVkX2F0IjogIjIwMjEtMDgtMjdUMTI6MTg6NTMrMDA6MDAiLAogICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAidXNlciIsCiAgICAgICAgICAgICAgICAicmVzb3VyY2VfdXJsIjogImh0dHBzOi8vPElNUE9SVF9LQVlBS09fRU5EUE9JTlRfSE9TVE5BTUU+L2FwaS92MS91c2Vycy8zIgogICAgICAgICAgICB9LAogICAgICAgICAgICAiaWRlbnRpdHkiOiB7CiAgICAgICAgICAgICAgICAiaWQiOiAzLAogICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAiaWRlbnRpdHlfZW1haWwiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJhc3NpZ25lZF9hZ2VudCI6IHsKICAgICAgICAgICAgICAgICJpZCI6IDEsCiAgICAgICAgICAgICAgICAidXVpZCI6ICJhOGRmZTVmZC1iMDhkLTVkMDctYWQ4Yi03NGIxMTNmNWQ3MjYiLAogICAgICAgICAgICAgICAgImZ1bGxfbmFtZSI6ICJUaG9yc3RlbiBFY2tlbCIsCiAgICAgICAgICAgICAgICAibGVnYWN5X2lkIjogbnVsbCwKICAgICAgICAgICAgICAgICJkZXNpZ25hdGlvbiI6IG51bGwsCiAgICAgICAgICAgICAgICAiaXNfZW5hYmxlZCI6IHRydWUsCiAgICAgICAgICAgICAgICAiaXNfbWZhX2VuYWJsZWQiOiBmYWxzZSwKICAgICAgICAgICAgICAgICJyb2xlIjogewogICAgICAgICAgICAgICAgICAgICJpZCI6IDUsCiAgICAgICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAicm9sZSIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAiYXZhdGFyIjogImh0dHBzOi8vPElNUE9SVF9LQVlBS09fRU5EUE9JTlRfSE9TVE5BTUU+L2F2YXRhci9nZXQvYThkZmU1ZmQtYjA4ZC01ZDA3LWFkOGItNzRiMTEzZjVkNzI2PzE2MzMxMDM4MDIiLAogICAgICAgICAgICAgICAgImFnZW50X2Nhc2VfYWNjZXNzIjogIkFMTCIsCiAgICAgICAgICAgICAgICAib3JnYW5pemF0aW9uX2Nhc2VfYWNjZXNzIjogbnVsbCwKICAgICAgICAgICAgICAgICJvcmdhbml6YXRpb24iOiB7CiAgICAgICAgICAgICAgICAgICAgImlkIjogMywKICAgICAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJvcmdhbml6YXRpb24iCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgInRlYW1zIjogWwogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgImlkIjogMSwKICAgICAgICAgICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAidGVhbSIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgImlkIjogMiwKICAgICAgICAgICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAidGVhbSIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgImVtYWlscyI6IFsKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICJpZCI6IDEsCiAgICAgICAgICAgICAgICAgICAgICAgICJyZXNvdXJjZV90eXBlIjogImlkZW50aXR5X2VtYWlsIgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAicGhvbmVzIjogW10sCiAgICAgICAgICAgICAgICAidHdpdHRlciI6IFtdLAogICAgICAgICAgICAgICAgImZhY2Vib29rIjogW10sCiAgICAgICAgICAgICAgICAiZXh0ZXJuYWxfaWRlbnRpZmllcnMiOiBbXSwKICAgICAgICAgICAgICAgICJjdXN0b21fZmllbGRzIjogW10sCiAgICAgICAgICAgICAgICAicGlubmVkX25vdGVzX2NvdW50IjogMCwKICAgICAgICAgICAgICAgICJsb2NhbGUiOiB7CiAgICAgICAgICAgICAgICAgICAgImlkIjogMywKICAgICAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJsb2NhbGUiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgInRpbWVfem9uZSI6ICJVVEMiLAogICAgICAgICAgICAgICAgInRpbWVfem9uZV9vZmZzZXQiOiAwLAogICAgICAgICAgICAgICAgImdyZWV0aW5nIjogbnVsbCwKICAgICAgICAgICAgICAgICJzaWduYXR1cmUiOiBudWxsLAogICAgICAgICAgICAgICAgInN0YXR1c19tZXNzYWdlIjogbnVsbCwKICAgICAgICAgICAgICAgICJsYXN0X3NlZW5fdXNlcl9hZ2VudCI6ICJSdWJ5IiwKICAgICAgICAgICAgICAgICJsYXN0X3NlZW5faXAiOiAiNS4yMzEuMTM4LjIwOCIsCiAgICAgICAgICAgICAgICAibGFzdF9zZWVuX2F0IjogIjIwMjEtMTAtMDFUMTU6NTY6NDIrMDA6MDAiLAogICAgICAgICAgICAgICAgImxhc3RfYWN0aXZlX2F0IjogIjIwMjEtMTAtMDFUMTU6NTY6NDIrMDA6MDAiLAogICAgICAgICAgICAgICAgInJlYWx0aW1lX2NoYW5uZWwiOiAicHJlc2VuY2UtNDQyNTQzY2Q0MjI4Nzc1MDQwMDFlYjA1NTBmMTg5YWQzNjJkNjQ3NWZhNmQ5NWZkMGYyZDhlZTBmZjc3MGY2NUB2MV91c2Vyc18xIiwKICAgICAgICAgICAgICAgICJwcmVzZW5jZV9jaGFubmVsIjogInVzZXJfcHJlc2VuY2UtNDQyNTQzY2Q0MjI4Nzc1MDQwMDFlYjA1NTBmMTg5YWQzNjJkNjQ3NWZhNmQ5NWZkMGYyZDhlZTBmZjc3MGY2NUBjZjAyNzRiMzk0ZGIzYWY1NTVkYmMxMzZmYzcwYWFiNmU0NWJlZTQyIiwKICAgICAgICAgICAgICAgICJwYXNzd29yZF91cGRhdGVkX2F0IjogIjIwMjEtMDgtMjdUMDc6MTg6MjMrMDA6MDAiLAogICAgICAgICAgICAgICAgImF2YXRhcl91cGRhdGVkX2F0IjogbnVsbCwKICAgICAgICAgICAgICAgICJsYXN0X2xvZ2dlZF9pbl9hdCI6ICIyMDIxLTEwLTAxVDE1OjU4OjUyKzAwOjAwIiwKICAgICAgICAgICAgICAgICJsYXN0X2FjdGl2aXR5X2F0IjogIjIwMjEtMTAtMDFUMTU6NTg6NTIrMDA6MDAiLAogICAgICAgICAgICAgICAgImNyZWF0ZWRfYXQiOiAiMjAyMS0wOC0yNFQxODoyNDoxMSswMDowMCIsCiAgICAgICAgICAgICAgICAidXBkYXRlZF9hdCI6ICIyMDIxLTEwLTAxVDE1OjU2OjQyKzAwOjAwIiwKICAgICAgICAgICAgICAgICJyZXNvdXJjZV90eXBlIjogInVzZXIiLAogICAgICAgICAgICAgICAgInJlc291cmNlX3VybCI6ICJodHRwczovLzxJTVBPUlRfS0FZQUtPX0VORFBPSU5UX0hPU1ROQU1FPi9hcGkvdjEvdXNlcnMvMSIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgImFzc2lnbmVkX3RlYW0iOiB7CiAgICAgICAgICAgICAgICAiaWQiOiAyLAogICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAidGVhbSIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgImxhc3RfYXNzaWduZWRfYnkiOiB7CiAgICAgICAgICAgICAgICAiaWQiOiAxLAogICAgICAgICAgICAgICAgInV1aWQiOiAiYThkZmU1ZmQtYjA4ZC01ZDA3LWFkOGItNzRiMTEzZjVkNzI2IiwKICAgICAgICAgICAgICAgICJmdWxsX25hbWUiOiAiVGhvcnN0ZW4gRWNrZWwiLAogICAgICAgICAgICAgICAgImxlZ2FjeV9pZCI6IG51bGwsCiAgICAgICAgICAgICAgICAiZGVzaWduYXRpb24iOiBudWxsLAogICAgICAgICAgICAgICAgImlzX2VuYWJsZWQiOiB0cnVlLAogICAgICAgICAgICAgICAgImlzX21mYV9lbmFibGVkIjogZmFsc2UsCiAgICAgICAgICAgICAgICAicm9sZSI6IHsKICAgICAgICAgICAgICAgICAgICAiaWQiOiA1LAogICAgICAgICAgICAgICAgICAgICJyZXNvdXJjZV90eXBlIjogInJvbGUiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgImF2YXRhciI6ICJodHRwczovLzxJTVBPUlRfS0FZQUtPX0VORFBPSU5UX0hPU1ROQU1FPi9hdmF0YXIvZ2V0L2E4ZGZlNWZkLWIwOGQtNWQwNy1hZDhiLTc0YjExM2Y1ZDcyNj8xNjMzMTAzODAyIiwKICAgICAgICAgICAgICAgICJhZ2VudF9jYXNlX2FjY2VzcyI6ICJBTEwiLAogICAgICAgICAgICAgICAgIm9yZ2FuaXphdGlvbl9jYXNlX2FjY2VzcyI6IG51bGwsCiAgICAgICAgICAgICAgICAib3JnYW5pemF0aW9uIjogewogICAgICAgICAgICAgICAgICAgICJpZCI6IDMsCiAgICAgICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAib3JnYW5pemF0aW9uIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJ0ZWFtcyI6IFsKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICJpZCI6IDEsCiAgICAgICAgICAgICAgICAgICAgICAgICJyZXNvdXJjZV90eXBlIjogInRlYW0iCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICJpZCI6IDIsCiAgICAgICAgICAgICAgICAgICAgICAgICJyZXNvdXJjZV90eXBlIjogInRlYW0iCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICJlbWFpbHMiOiBbCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAiaWQiOiAxLAogICAgICAgICAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJpZGVudGl0eV9lbWFpbCIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgInBob25lcyI6IFtdLAogICAgICAgICAgICAgICAgInR3aXR0ZXIiOiBbXSwKICAgICAgICAgICAgICAgICJmYWNlYm9vayI6IFtdLAogICAgICAgICAgICAgICAgImV4dGVybmFsX2lkZW50aWZpZXJzIjogW10sCiAgICAgICAgICAgICAgICAiY3VzdG9tX2ZpZWxkcyI6IFtdLAogICAgICAgICAgICAgICAgInBpbm5lZF9ub3Rlc19jb3VudCI6IDAsCiAgICAgICAgICAgICAgICAibG9jYWxlIjogewogICAgICAgICAgICAgICAgICAgICJpZCI6IDMsCiAgICAgICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAibG9jYWxlIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJ0aW1lX3pvbmUiOiAiVVRDIiwKICAgICAgICAgICAgICAgICJ0aW1lX3pvbmVfb2Zmc2V0IjogMCwKICAgICAgICAgICAgICAgICJncmVldGluZyI6IG51bGwsCiAgICAgICAgICAgICAgICAic2lnbmF0dXJlIjogbnVsbCwKICAgICAgICAgICAgICAgICJzdGF0dXNfbWVzc2FnZSI6IG51bGwsCiAgICAgICAgICAgICAgICAibGFzdF9zZWVuX3VzZXJfYWdlbnQiOiAiUnVieSIsCiAgICAgICAgICAgICAgICAibGFzdF9zZWVuX2lwIjogIjUuMjMxLjEzOC4yMDgiLAogICAgICAgICAgICAgICAgImxhc3Rfc2Vlbl9hdCI6ICIyMDIxLTEwLTAxVDE1OjU2OjQyKzAwOjAwIiwKICAgICAgICAgICAgICAgICJsYXN0X2FjdGl2ZV9hdCI6ICIyMDIxLTEwLTAxVDE1OjU2OjQyKzAwOjAwIiwKICAgICAgICAgICAgICAgICJyZWFsdGltZV9jaGFubmVsIjogInByZXNlbmNlLTQ0MjU0M2NkNDIyODc3NTA0MDAxZWIwNTUwZjE4OWFkMzYyZDY0NzVmYTZkOTVmZDBmMmQ4ZWUwZmY3NzBmNjVAdjFfdXNlcnNfMSIsCiAgICAgICAgICAgICAgICAicHJlc2VuY2VfY2hhbm5lbCI6ICJ1c2VyX3ByZXNlbmNlLTQ0MjU0M2NkNDIyODc3NTA0MDAxZWIwNTUwZjE4OWFkMzYyZDY0NzVmYTZkOTVmZDBmMmQ4ZWUwZmY3NzBmNjVAY2YwMjc0YjM5NGRiM2FmNTU1ZGJjMTM2ZmM3MGFhYjZlNDViZWU0MiIsCiAgICAgICAgICAgICAgICAicGFzc3dvcmRfdXBkYXRlZF9hdCI6ICIyMDIxLTA4LTI3VDA3OjE4OjIzKzAwOjAwIiwKICAgICAgICAgICAgICAgICJhdmF0YXJfdXBkYXRlZF9hdCI6IG51bGwsCiAgICAgICAgICAgICAgICAibGFzdF9sb2dnZWRfaW5fYXQiOiAiMjAyMS0xMC0wMVQxNTo1ODo1MiswMDowMCIsCiAgICAgICAgICAgICAgICAibGFzdF9hY3Rpdml0eV9hdCI6ICIyMDIxLTEwLTAxVDE1OjU4OjUyKzAwOjAwIiwKICAgICAgICAgICAgICAgICJjcmVhdGVkX2F0IjogIjIwMjEtMDgtMjRUMTg6MjQ6MTErMDA6MDAiLAogICAgICAgICAgICAgICAgInVwZGF0ZWRfYXQiOiAiMjAyMS0xMC0wMVQxNTo1Njo0MiswMDowMCIsCiAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJ1c2VyIiwKICAgICAgICAgICAgICAgICJyZXNvdXJjZV91cmwiOiAiaHR0cHM6Ly88SU1QT1JUX0tBWUFLT19FTkRQT0lOVF9IT1NUTkFNRT4vYXBpL3YxL3VzZXJzLzEiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJicmFuZCI6IHsKICAgICAgICAgICAgICAgICJpZCI6IDEsCiAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJicmFuZCIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgInN0YXR1cyI6IHsKICAgICAgICAgICAgICAgICJpZCI6IDMsCiAgICAgICAgICAgICAgICAibGFiZWwiOiAiUGVuZGluZyIsCiAgICAgICAgICAgICAgICAidHlwZSI6ICJQRU5ESU5HIiwKICAgICAgICAgICAgICAgICJzb3J0X29yZGVyIjogMywKICAgICAgICAgICAgICAgICJpc19zbGFfYWN0aXZlIjogZmFsc2UsCiAgICAgICAgICAgICAgICAiaXNfZGVsZXRlZCI6IGZhbHNlLAogICAgICAgICAgICAgICAgImNyZWF0ZWRfYXQiOiAiMjAyMS0wOC0yNFQxODoyNDoxNiswMDowMCIsCiAgICAgICAgICAgICAgICAidXBkYXRlZF9hdCI6ICIyMDIxLTA4LTI0VDE4OjI0OjE2KzAwOjAwIiwKICAgICAgICAgICAgICAgICJyZXNvdXJjZV90eXBlIjogImNhc2Vfc3RhdHVzIiwKICAgICAgICAgICAgICAgICJyZXNvdXJjZV91cmwiOiAiaHR0cHM6Ly88SU1QT1JUX0tBWUFLT19FTkRQT0lOVF9IT1NUTkFNRT4vYXBpL3YxL2Nhc2VzL3N0YXR1c2VzLzMiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJwcmlvcml0eSI6IHsKICAgICAgICAgICAgICAgICJpZCI6IDMsCiAgICAgICAgICAgICAgICAibGFiZWwiOiAiSGlnaCIsCiAgICAgICAgICAgICAgICAibGV2ZWwiOiAzLAogICAgICAgICAgICAgICAgImNyZWF0ZWRfYXQiOiAiMjAyMS0wOC0yNFQxODoyNDoxNiswMDowMCIsCiAgICAgICAgICAgICAgICAidXBkYXRlZF9hdCI6ICIyMDIxLTA4LTI0VDE4OjI0OjE2KzAwOjAwIiwKICAgICAgICAgICAgICAgICJyZXNvdXJjZV90eXBlIjogImNhc2VfcHJpb3JpdHkiLAogICAgICAgICAgICAgICAgInJlc291cmNlX3VybCI6ICJodHRwczovLzxJTVBPUlRfS0FZQUtPX0VORFBPSU5UX0hPU1ROQU1FPi9hcGkvdjEvY2FzZXMvcHJpb3JpdGllcy8zIgogICAgICAgICAgICB9LAogICAgICAgICAgICAidHlwZSI6IG51bGwsCiAgICAgICAgICAgICJyZWFkX21hcmtlciI6IHsKICAgICAgICAgICAgICAgICJpZCI6IDQsCiAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJyZWFkX21hcmtlciIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgInNsYV92ZXJzaW9uIjogbnVsbCwKICAgICAgICAgICAgInNsYV9tZXRyaWNzIjogW10sCiAgICAgICAgICAgICJmb3JtIjogbnVsbCwKICAgICAgICAgICAgImN1c3RvbV9maWVsZHMiOiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgImZpZWxkIjogewogICAgICAgICAgICAgICAgICAgICAgICAiaWQiOiA4LAogICAgICAgICAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJjYXNlX2ZpZWxkIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInZhbHVlIjogIiIsCiAgICAgICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAiY2FzZV9maWVsZF92YWx1ZSIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgImZpZWxkIjogewogICAgICAgICAgICAgICAgICAgICAgICAiaWQiOiA5LAogICAgICAgICAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJjYXNlX2ZpZWxkIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInZhbHVlIjogIiIsCiAgICAgICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAiY2FzZV9maWVsZF92YWx1ZSIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgImZpZWxkIjogewogICAgICAgICAgICAgICAgICAgICAgICAiaWQiOiAxMCwKICAgICAgICAgICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAiY2FzZV9maWVsZCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJ2YWx1ZSI6ICIiLAogICAgICAgICAgICAgICAgICAgICJyZXNvdXJjZV90eXBlIjogImNhc2VfZmllbGRfdmFsdWUiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICJmaWVsZCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgImlkIjogMTEsCiAgICAgICAgICAgICAgICAgICAgICAgICJyZXNvdXJjZV90eXBlIjogImNhc2VfZmllbGQiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAidmFsdWUiOiAiIiwKICAgICAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJjYXNlX2ZpZWxkX3ZhbHVlIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAiZmllbGQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJpZCI6IDEyLAogICAgICAgICAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJjYXNlX2ZpZWxkIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInZhbHVlIjogIiIsCiAgICAgICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAiY2FzZV9maWVsZF92YWx1ZSIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgImZpZWxkIjogewogICAgICAgICAgICAgICAgICAgICAgICAiaWQiOiAxMywKICAgICAgICAgICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAiY2FzZV9maWVsZCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJ2YWx1ZSI6ICIiLAogICAgICAgICAgICAgICAgICAgICJyZXNvdXJjZV90eXBlIjogImNhc2VfZmllbGRfdmFsdWUiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICJmaWVsZCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgImlkIjogMTQsCiAgICAgICAgICAgICAgICAgICAgICAgICJyZXNvdXJjZV90eXBlIjogImNhc2VfZmllbGQiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAidmFsdWUiOiAiIiwKICAgICAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJjYXNlX2ZpZWxkX3ZhbHVlIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAiZmllbGQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJpZCI6IDE1LAogICAgICAgICAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJjYXNlX2ZpZWxkIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInZhbHVlIjogIiIsCiAgICAgICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAiY2FzZV9maWVsZF92YWx1ZSIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgImZpZWxkIjogewogICAgICAgICAgICAgICAgICAgICAgICAiaWQiOiAxNiwKICAgICAgICAgICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAiY2FzZV9maWVsZCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJ2YWx1ZSI6ICIiLAogICAgICAgICAgICAgICAgICAgICJyZXNvdXJjZV90eXBlIjogImNhc2VfZmllbGRfdmFsdWUiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICJmaWVsZCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgImlkIjogMTcsCiAgICAgICAgICAgICAgICAgICAgICAgICJyZXNvdXJjZV90eXBlIjogImNhc2VfZmllbGQiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAidmFsdWUiOiAiIiwKICAgICAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJjYXNlX2ZpZWxkX3ZhbHVlIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAiZmllbGQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJpZCI6IDE4LAogICAgICAgICAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJjYXNlX2ZpZWxkIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInZhbHVlIjogIiIsCiAgICAgICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAiY2FzZV9maWVsZF92YWx1ZSIKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgXSwKICAgICAgICAgICAgImxhc3RfcmVwbGllciI6IHsKICAgICAgICAgICAgICAgICJpZCI6IDMsCiAgICAgICAgICAgICAgICAidXVpZCI6ICI4MWQ4YTMyYy1kZTA3LTVlZDYtYjkyZi1lZjQyNjUwMjk5YTIiLAogICAgICAgICAgICAgICAgImZ1bGxfbmFtZSI6ICJUYXlsb3IgV2VzdCIsCiAgICAgICAgICAgICAgICAibGVnYWN5X2lkIjogbnVsbCwKICAgICAgICAgICAgICAgICJkZXNpZ25hdGlvbiI6IG51bGwsCiAgICAgICAgICAgICAgICAiaXNfZW5hYmxlZCI6IHRydWUsCiAgICAgICAgICAgICAgICAiaXNfbWZhX2VuYWJsZWQiOiBmYWxzZSwKICAgICAgICAgICAgICAgICJyb2xlIjogewogICAgICAgICAgICAgICAgICAgICJpZCI6IDQsCiAgICAgICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAicm9sZSIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAiYXZhdGFyIjogImh0dHBzOi8vPElNUE9SVF9LQVlBS09fRU5EUE9JTlRfSE9TVE5BTUU+L2F2YXRhci9nZXQvODFkOGEzMmMtZGUwNy01ZWQ2LWI5MmYtZWY0MjY1MDI5OWEyPzE2MzAwNjY3MzMiLAogICAgICAgICAgICAgICAgImFnZW50X2Nhc2VfYWNjZXNzIjogbnVsbCwKICAgICAgICAgICAgICAgICJvcmdhbml6YXRpb25fY2FzZV9hY2Nlc3MiOiAiUkVRVUVTVEVEIiwKICAgICAgICAgICAgICAgICJvcmdhbml6YXRpb24iOiB7CiAgICAgICAgICAgICAgICAgICAgImlkIjogMSwKICAgICAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJvcmdhbml6YXRpb24iCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgInRlYW1zIjogW10sCiAgICAgICAgICAgICAgICAiZW1haWxzIjogWwogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgImlkIjogMywKICAgICAgICAgICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAiaWRlbnRpdHlfZW1haWwiCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICJwaG9uZXMiOiBbXSwKICAgICAgICAgICAgICAgICJ0d2l0dGVyIjogWwogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgImlkIjogMSwKICAgICAgICAgICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAiaWRlbnRpdHlfdHdpdHRlciIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgImZhY2Vib29rIjogW10sCiAgICAgICAgICAgICAgICAiZXh0ZXJuYWxfaWRlbnRpZmllcnMiOiBbXSwKICAgICAgICAgICAgICAgICJjdXN0b21fZmllbGRzIjogW10sCiAgICAgICAgICAgICAgICAicGlubmVkX25vdGVzX2NvdW50IjogMCwKICAgICAgICAgICAgICAgICJsb2NhbGUiOiB7CiAgICAgICAgICAgICAgICAgICAgImlkIjogMywKICAgICAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJsb2NhbGUiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgInRpbWVfem9uZSI6ICJVVEMiLAogICAgICAgICAgICAgICAgInRpbWVfem9uZV9vZmZzZXQiOiAwLAogICAgICAgICAgICAgICAgImdyZWV0aW5nIjogbnVsbCwKICAgICAgICAgICAgICAgICJzaWduYXR1cmUiOiBudWxsLAogICAgICAgICAgICAgICAgInN0YXR1c19tZXNzYWdlIjogbnVsbCwKICAgICAgICAgICAgICAgICJsYXN0X3NlZW5fdXNlcl9hZ2VudCI6IG51bGwsCiAgICAgICAgICAgICAgICAibGFzdF9zZWVuX2lwIjogbnVsbCwKICAgICAgICAgICAgICAgICJsYXN0X3NlZW5fYXQiOiAiMjAyMS0wOC0yN1QxMjoxODo1MyswMDowMCIsCiAgICAgICAgICAgICAgICAibGFzdF9hY3RpdmVfYXQiOiAiMjAyMS0wOC0yN1QxMjoxODo1MyswMDowMCIsCiAgICAgICAgICAgICAgICAicmVhbHRpbWVfY2hhbm5lbCI6ICJwcmVzZW5jZS00NDI1NDNjZDQyMjg3NzUwNDAwMWViMDU1MGYxODlhZDM2MmQ2NDc1ZmE2ZDk1ZmQwZjJkOGVlMGZmNzcwZjY1QHYxX3VzZXJzXzMiLAogICAgICAgICAgICAgICAgInByZXNlbmNlX2NoYW5uZWwiOiAidXNlcl9wcmVzZW5jZS00NDI1NDNjZDQyMjg3NzUwNDAwMWViMDU1MGYxODlhZDM2MmQ2NDc1ZmE2ZDk1ZmQwZjJkOGVlMGZmNzcwZjY1QGRkMTMyZGQ5MTlkOGQwMDNjMmJjZDJlMDA2YTkxMzNhODY2OWQyMDQiLAogICAgICAgICAgICAgICAgInBhc3N3b3JkX3VwZGF0ZWRfYXQiOiAiMjAyMS0wOC0yNFQxODoyNDoxMSswMDowMCIsCiAgICAgICAgICAgICAgICAiYXZhdGFyX3VwZGF0ZWRfYXQiOiAiMjAyMS0wOC0yNFQxODoyNDoxMiswMDowMCIsCiAgICAgICAgICAgICAgICAibGFzdF9sb2dnZWRfaW5fYXQiOiBudWxsLAogICAgICAgICAgICAgICAgImxhc3RfYWN0aXZpdHlfYXQiOiBudWxsLAogICAgICAgICAgICAgICAgImNyZWF0ZWRfYXQiOiAiMjAyMS0wOC0yNFQxODoyNDoxMSswMDowMCIsCiAgICAgICAgICAgICAgICAidXBkYXRlZF9hdCI6ICIyMDIxLTA4LTI3VDEyOjE4OjUzKzAwOjAwIiwKICAgICAgICAgICAgICAgICJyZXNvdXJjZV90eXBlIjogInVzZXIiLAogICAgICAgICAgICAgICAgInJlc291cmNlX3VybCI6ICJodHRwczovLzxJTVBPUlRfS0FZQUtPX0VORFBPSU5UX0hPU1ROQU1FPi9hcGkvdjEvdXNlcnMvMyIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgImxhc3RfcmVwbGllcl9pZGVudGl0eSI6IHsKICAgICAgICAgICAgICAgICJpZCI6IDMsCiAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJpZGVudGl0eV9lbWFpbCIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgImxhc3RfdXBkYXRlZF9ieSI6IHsKICAgICAgICAgICAgICAgICJpZCI6IDEsCiAgICAgICAgICAgICAgICAidXVpZCI6ICJhOGRmZTVmZC1iMDhkLTVkMDctYWQ4Yi03NGIxMTNmNWQ3MjYiLAogICAgICAgICAgICAgICAgImZ1bGxfbmFtZSI6ICJUaG9yc3RlbiBFY2tlbCIsCiAgICAgICAgICAgICAgICAibGVnYWN5X2lkIjogbnVsbCwKICAgICAgICAgICAgICAgICJkZXNpZ25hdGlvbiI6IG51bGwsCiAgICAgICAgICAgICAgICAiaXNfZW5hYmxlZCI6IHRydWUsCiAgICAgICAgICAgICAgICAiaXNfbWZhX2VuYWJsZWQiOiBmYWxzZSwKICAgICAgICAgICAgICAgICJyb2xlIjogewogICAgICAgICAgICAgICAgICAgICJpZCI6IDUsCiAgICAgICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAicm9sZSIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAiYXZhdGFyIjogImh0dHBzOi8vPElNUE9SVF9LQVlBS09fRU5EUE9JTlRfSE9TVE5BTUU+L2F2YXRhci9nZXQvYThkZmU1ZmQtYjA4ZC01ZDA3LWFkOGItNzRiMTEzZjVkNzI2PzE2MzMxMDM4MDIiLAogICAgICAgICAgICAgICAgImFnZW50X2Nhc2VfYWNjZXNzIjogIkFMTCIsCiAgICAgICAgICAgICAgICAib3JnYW5pemF0aW9uX2Nhc2VfYWNjZXNzIjogbnVsbCwKICAgICAgICAgICAgICAgICJvcmdhbml6YXRpb24iOiB7CiAgICAgICAgICAgICAgICAgICAgImlkIjogMywKICAgICAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJvcmdhbml6YXRpb24iCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgInRlYW1zIjogWwogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgImlkIjogMSwKICAgICAgICAgICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAidGVhbSIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgImlkIjogMiwKICAgICAgICAgICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAidGVhbSIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgImVtYWlscyI6IFsKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICJpZCI6IDEsCiAgICAgICAgICAgICAgICAgICAgICAgICJyZXNvdXJjZV90eXBlIjogImlkZW50aXR5X2VtYWlsIgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAicGhvbmVzIjogW10sCiAgICAgICAgICAgICAgICAidHdpdHRlciI6IFtdLAogICAgICAgICAgICAgICAgImZhY2Vib29rIjogW10sCiAgICAgICAgICAgICAgICAiZXh0ZXJuYWxfaWRlbnRpZmllcnMiOiBbXSwKICAgICAgICAgICAgICAgICJjdXN0b21fZmllbGRzIjogW10sCiAgICAgICAgICAgICAgICAicGlubmVkX25vdGVzX2NvdW50IjogMCwKICAgICAgICAgICAgICAgICJsb2NhbGUiOiB7CiAgICAgICAgICAgICAgICAgICAgImlkIjogMywKICAgICAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJsb2NhbGUiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgInRpbWVfem9uZSI6ICJVVEMiLAogICAgICAgICAgICAgICAgInRpbWVfem9uZV9vZmZzZXQiOiAwLAogICAgICAgICAgICAgICAgImdyZWV0aW5nIjogbnVsbCwKICAgICAgICAgICAgICAgICJzaWduYXR1cmUiOiBudWxsLAogICAgICAgICAgICAgICAgInN0YXR1c19tZXNzYWdlIjogbnVsbCwKICAgICAgICAgICAgICAgICJsYXN0X3NlZW5fdXNlcl9hZ2VudCI6ICJSdWJ5IiwKICAgICAgICAgICAgICAgICJsYXN0X3NlZW5faXAiOiAiNS4yMzEuMTM4LjIwOCIsCiAgICAgICAgICAgICAgICAibGFzdF9zZWVuX2F0IjogIjIwMjEtMTAtMDFUMTU6NTY6NDIrMDA6MDAiLAogICAgICAgICAgICAgICAgImxhc3RfYWN0aXZlX2F0IjogIjIwMjEtMTAtMDFUMTU6NTY6NDIrMDA6MDAiLAogICAgICAgICAgICAgICAgInJlYWx0aW1lX2NoYW5uZWwiOiAicHJlc2VuY2UtNDQyNTQzY2Q0MjI4Nzc1MDQwMDFlYjA1NTBmMTg5YWQzNjJkNjQ3NWZhNmQ5NWZkMGYyZDhlZTBmZjc3MGY2NUB2MV91c2Vyc18xIiwKICAgICAgICAgICAgICAgICJwcmVzZW5jZV9jaGFubmVsIjogInVzZXJfcHJlc2VuY2UtNDQyNTQzY2Q0MjI4Nzc1MDQwMDFlYjA1NTBmMTg5YWQzNjJkNjQ3NWZhNmQ5NWZkMGYyZDhlZTBmZjc3MGY2NUBjZjAyNzRiMzk0ZGIzYWY1NTVkYmMxMzZmYzcwYWFiNmU0NWJlZTQyIiwKICAgICAgICAgICAgICAgICJwYXNzd29yZF91cGRhdGVkX2F0IjogIjIwMjEtMDgtMjdUMDc6MTg6MjMrMDA6MDAiLAogICAgICAgICAgICAgICAgImF2YXRhcl91cGRhdGVkX2F0IjogbnVsbCwKICAgICAgICAgICAgICAgICJsYXN0X2xvZ2dlZF9pbl9hdCI6ICIyMDIxLTEwLTAxVDE1OjU4OjUyKzAwOjAwIiwKICAgICAgICAgICAgICAgICJsYXN0X2FjdGl2aXR5X2F0IjogIjIwMjEtMTAtMDFUMTU6NTg6NTIrMDA6MDAiLAogICAgICAgICAgICAgICAgImNyZWF0ZWRfYXQiOiAiMjAyMS0wOC0yNFQxODoyNDoxMSswMDowMCIsCiAgICAgICAgICAgICAgICAidXBkYXRlZF9hdCI6ICIyMDIxLTEwLTAxVDE1OjU2OjQyKzAwOjAwIiwKICAgICAgICAgICAgICAgICJyZXNvdXJjZV90eXBlIjogInVzZXIiLAogICAgICAgICAgICAgICAgInJlc291cmNlX3VybCI6ICJodHRwczovLzxJTVBPUlRfS0FZQUtPX0VORFBPSU5UX0hPU1ROQU1FPi9hcGkvdjEvdXNlcnMvMSIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgImxhc3RfY29tcGxldGVkX2J5IjogbnVsbCwKICAgICAgICAgICAgImxhc3RfY2xvc2VkX2J5IjogbnVsbCwKICAgICAgICAgICAgInN0YXRlIjogIkFDVElWRSIsCiAgICAgICAgICAgICJwb3N0X2NvdW50IjogMSwKICAgICAgICAgICAgImhhc19ub3RlcyI6IGZhbHNlLAogICAgICAgICAgICAicGlubmVkX25vdGVzX2NvdW50IjogMCwKICAgICAgICAgICAgImhhc19hdHRhY2htZW50cyI6IGZhbHNlLAogICAgICAgICAgICAiaXNfbWVyZ2VkIjogZmFsc2UsCiAgICAgICAgICAgICJyYXRpbmciOiBudWxsLAogICAgICAgICAgICAicmF0aW5nX3N0YXR1cyI6ICJVTk9GRkVSRUQiLAogICAgICAgICAgICAidGFncyI6IFsKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAiaWQiOiAxLAogICAgICAgICAgICAgICAgICAgICJuYW1lIjogIm1hYyIsCiAgICAgICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAidGFnIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAiaWQiOiAyLAogICAgICAgICAgICAgICAgICAgICJuYW1lIjogImFwcGxlIiwKICAgICAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJ0YWciCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJsYXN0X3Bvc3Rfc3RhdHVzIjogIlNFRU4iLAogICAgICAgICAgICAibGFzdF9wb3N0X3ByZXZpZXciOiAiQ2FuIHlvdSBoZWxwIG1lPyIsCiAgICAgICAgICAgICJsYXN0X3Bvc3RfdHlwZSI6ICJQVUJMSUMiLAogICAgICAgICAgICAibGFzdF9tZXNzYWdlX3ByZXZpZXciOiAiQ2FuIHlvdSBoZWxwIG1lPyIsCiAgICAgICAgICAgICJyZWFsdGltZV9jaGFubmVsIjogInByZXNlbmNlLTQ0MjU0M2NkNDIyODc3NTA0MDAxZWIwNTUwZjE4OWFkMzYyZDY0NzVmYTZkOTVmZDBmMmQ4ZWUwZmY3NzBmNjVAdjFfY2FzZXNfNCIsCiAgICAgICAgICAgICJsYXN0X2Fzc2lnbmVkX2F0IjogIjIwMjEtMDgtMjdUMTI6MTk6NTIrMDA6MDAiLAogICAgICAgICAgICAibGFzdF9yZXBsaWVkX2F0IjogIjIwMjEtMDgtMjdUMTI6MTg6NTMrMDA6MDAiLAogICAgICAgICAgICAibGFzdF9vcGVuZWRfYXQiOiBudWxsLAogICAgICAgICAgICAibGFzdF9wZW5kaW5nX2F0IjogIjIwMjEtMDgtMjdUMTI6MTk6NTIrMDA6MDAiLAogICAgICAgICAgICAibGFzdF9jbG9zZWRfYXQiOiBudWxsLAogICAgICAgICAgICAibGFzdF9jb21wbGV0ZWRfYXQiOiBudWxsLAogICAgICAgICAgICAibGFzdF9hZ2VudF9hY3Rpdml0eV9hdCI6ICIyMDIxLTA4LTI3VDEyOjE5OjUyKzAwOjAwIiwKICAgICAgICAgICAgImxhc3RfY3VzdG9tZXJfYWN0aXZpdHlfYXQiOiAiMjAyMS0wOC0yN1QxMjoxODo1MyswMDowMCIsCiAgICAgICAgICAgICJsYXN0X3JlcGx5X2J5X2FnZW50X2F0IjogbnVsbCwKICAgICAgICAgICAgImxhc3RfcmVwbHlfYnlfcmVxdWVzdGVyX2F0IjogIjIwMjEtMDgtMjdUMTI6MTg6NTMrMDA6MDAiLAogICAgICAgICAgICAiYWdlbnRfdXBkYXRlZF9hdCI6ICIyMDIxLTA4LTI3VDEyOjE5OjUyKzAwOjAwIiwKICAgICAgICAgICAgImxhdGVzdF9hc3NpZ25lZV91cGRhdGUiOiAiMjAyMS0wOC0yN1QxMjoxOTo1MiswMDowMCIsCiAgICAgICAgICAgICJjcmVhdGVkX2F0IjogIjIwMjEtMDgtMjdUMTI6MTg6NTMrMDA6MDAiLAogICAgICAgICAgICAidXBkYXRlZF9hdCI6ICIyMDIxLTA4LTI3VDEyOjE5OjUyKzAwOjAwIiwKICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAiY2FzZSIsCiAgICAgICAgICAgICJyZXNvdXJjZV91cmwiOiAiaHR0cHM6Ly88SU1QT1JUX0tBWUFLT19FTkRQT0lOVF9IT1NUTkFNRT4vYXBpL3YxL2Nhc2VzLzQiCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgICJpZCI6IDIsCiAgICAgICAgICAgICJsZWdhY3lfaWQiOiBudWxsLAogICAgICAgICAgICAic3ViamVjdCI6ICIgSG93IGRvIEkgcGxhY2UgYSBjdXN0b20gb3JkZXI/ICIsCiAgICAgICAgICAgICJwb3J0YWwiOiAiQVBJIiwKICAgICAgICAgICAgInNvdXJjZV9jaGFubmVsIjogewogICAgICAgICAgICAgICAgInV1aWQiOiAiY2YzY2QzOWEtNTRiZi01ZTVlLTkxMmItODgzOTE5ZjNhYjFlIiwKICAgICAgICAgICAgICAgICJ0eXBlIjogIk5PVEUiLAogICAgICAgICAgICAgICAgImNoYXJhY3Rlcl9saW1pdCI6IG51bGwsCiAgICAgICAgICAgICAgICAiYWNjb3VudCI6IG51bGwsCiAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJjaGFubmVsIgogICAgICAgICAgICB9LAogICAgICAgICAgICAibGFzdF9wdWJsaWNfY2hhbm5lbCI6IG51bGwsCiAgICAgICAgICAgICJyZXF1ZXN0ZXIiOiB7CiAgICAgICAgICAgICAgICAiaWQiOiAzLAogICAgICAgICAgICAgICAgInV1aWQiOiAiODFkOGEzMmMtZGUwNy01ZWQ2LWI5MmYtZWY0MjY1MDI5OWEyIiwKICAgICAgICAgICAgICAgICJmdWxsX25hbWUiOiAiVGF5bG9yIFdlc3QiLAogICAgICAgICAgICAgICAgImxlZ2FjeV9pZCI6IG51bGwsCiAgICAgICAgICAgICAgICAiZGVzaWduYXRpb24iOiBudWxsLAogICAgICAgICAgICAgICAgImlzX2VuYWJsZWQiOiB0cnVlLAogICAgICAgICAgICAgICAgImlzX21mYV9lbmFibGVkIjogZmFsc2UsCiAgICAgICAgICAgICAgICAicm9sZSI6IHsKICAgICAgICAgICAgICAgICAgICAiaWQiOiA0LAogICAgICAgICAgICAgICAgICAgICJyZXNvdXJjZV90eXBlIjogInJvbGUiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgImF2YXRhciI6ICJodHRwczovLzxJTVBPUlRfS0FZQUtPX0VORFBPSU5UX0hPU1ROQU1FPi9hdmF0YXIvZ2V0LzgxZDhhMzJjLWRlMDctNWVkNi1iOTJmLWVmNDI2NTAyOTlhMj8xNjMwMDY2NzMzIiwKICAgICAgICAgICAgICAgICJhZ2VudF9jYXNlX2FjY2VzcyI6IG51bGwsCiAgICAgICAgICAgICAgICAib3JnYW5pemF0aW9uX2Nhc2VfYWNjZXNzIjogIlJFUVVFU1RFRCIsCiAgICAgICAgICAgICAgICAib3JnYW5pemF0aW9uIjogewogICAgICAgICAgICAgICAgICAgICJpZCI6IDEsCiAgICAgICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAib3JnYW5pemF0aW9uIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJ0ZWFtcyI6IFtdLAogICAgICAgICAgICAgICAgImVtYWlscyI6IFsKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICJpZCI6IDMsCiAgICAgICAgICAgICAgICAgICAgICAgICJyZXNvdXJjZV90eXBlIjogImlkZW50aXR5X2VtYWlsIgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAicGhvbmVzIjogW10sCiAgICAgICAgICAgICAgICAidHdpdHRlciI6IFsKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICJpZCI6IDEsCiAgICAgICAgICAgICAgICAgICAgICAgICJyZXNvdXJjZV90eXBlIjogImlkZW50aXR5X3R3aXR0ZXIiCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICJmYWNlYm9vayI6IFtdLAogICAgICAgICAgICAgICAgImV4dGVybmFsX2lkZW50aWZpZXJzIjogW10sCiAgICAgICAgICAgICAgICAiY3VzdG9tX2ZpZWxkcyI6IFtdLAogICAgICAgICAgICAgICAgInBpbm5lZF9ub3Rlc19jb3VudCI6IDAsCiAgICAgICAgICAgICAgICAibG9jYWxlIjogewogICAgICAgICAgICAgICAgICAgICJpZCI6IDMsCiAgICAgICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAibG9jYWxlIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJ0aW1lX3pvbmUiOiAiVVRDIiwKICAgICAgICAgICAgICAgICJ0aW1lX3pvbmVfb2Zmc2V0IjogMCwKICAgICAgICAgICAgICAgICJncmVldGluZyI6IG51bGwsCiAgICAgICAgICAgICAgICAic2lnbmF0dXJlIjogbnVsbCwKICAgICAgICAgICAgICAgICJzdGF0dXNfbWVzc2FnZSI6IG51bGwsCiAgICAgICAgICAgICAgICAibGFzdF9zZWVuX3VzZXJfYWdlbnQiOiBudWxsLAogICAgICAgICAgICAgICAgImxhc3Rfc2Vlbl9pcCI6IG51bGwsCiAgICAgICAgICAgICAgICAibGFzdF9zZWVuX2F0IjogIjIwMjEtMDgtMjdUMTI6MTg6NTMrMDA6MDAiLAogICAgICAgICAgICAgICAgImxhc3RfYWN0aXZlX2F0IjogIjIwMjEtMDgtMjdUMTI6MTg6NTMrMDA6MDAiLAogICAgICAgICAgICAgICAgInJlYWx0aW1lX2NoYW5uZWwiOiAicHJlc2VuY2UtNDQyNTQzY2Q0MjI4Nzc1MDQwMDFlYjA1NTBmMTg5YWQzNjJkNjQ3NWZhNmQ5NWZkMGYyZDhlZTBmZjc3MGY2NUB2MV91c2Vyc18zIiwKICAgICAgICAgICAgICAgICJwcmVzZW5jZV9jaGFubmVsIjogInVzZXJfcHJlc2VuY2UtNDQyNTQzY2Q0MjI4Nzc1MDQwMDFlYjA1NTBmMTg5YWQzNjJkNjQ3NWZhNmQ5NWZkMGYyZDhlZTBmZjc3MGY2NUBkZDEzMmRkOTE5ZDhkMDAzYzJiY2QyZTAwNmE5MTMzYTg2NjlkMjA0IiwKICAgICAgICAgICAgICAgICJwYXNzd29yZF91cGRhdGVkX2F0IjogIjIwMjEtMDgtMjRUMTg6MjQ6MTErMDA6MDAiLAogICAgICAgICAgICAgICAgImF2YXRhcl91cGRhdGVkX2F0IjogIjIwMjEtMDgtMjRUMTg6MjQ6MTIrMDA6MDAiLAogICAgICAgICAgICAgICAgImxhc3RfbG9nZ2VkX2luX2F0IjogbnVsbCwKICAgICAgICAgICAgICAgICJsYXN0X2FjdGl2aXR5X2F0IjogbnVsbCwKICAgICAgICAgICAgICAgICJjcmVhdGVkX2F0IjogIjIwMjEtMDgtMjRUMTg6MjQ6MTErMDA6MDAiLAogICAgICAgICAgICAgICAgInVwZGF0ZWRfYXQiOiAiMjAyMS0wOC0yN1QxMjoxODo1MyswMDowMCIsCiAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJ1c2VyIiwKICAgICAgICAgICAgICAgICJyZXNvdXJjZV91cmwiOiAiaHR0cHM6Ly88SU1QT1JUX0tBWUFLT19FTkRQT0lOVF9IT1NUTkFNRT4vYXBpL3YxL3VzZXJzLzMiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJjcmVhdG9yIjogewogICAgICAgICAgICAgICAgImlkIjogMSwKICAgICAgICAgICAgICAgICJ1dWlkIjogImE4ZGZlNWZkLWIwOGQtNWQwNy1hZDhiLTc0YjExM2Y1ZDcyNiIsCiAgICAgICAgICAgICAgICAiZnVsbF9uYW1lIjogIlRob3JzdGVuIEVja2VsIiwKICAgICAgICAgICAgICAgICJsZWdhY3lfaWQiOiBudWxsLAogICAgICAgICAgICAgICAgImRlc2lnbmF0aW9uIjogbnVsbCwKICAgICAgICAgICAgICAgICJpc19lbmFibGVkIjogdHJ1ZSwKICAgICAgICAgICAgICAgICJpc19tZmFfZW5hYmxlZCI6IGZhbHNlLAogICAgICAgICAgICAgICAgInJvbGUiOiB7CiAgICAgICAgICAgICAgICAgICAgImlkIjogNSwKICAgICAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJyb2xlIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJhdmF0YXIiOiAiaHR0cHM6Ly88SU1QT1JUX0tBWUFLT19FTkRQT0lOVF9IT1NUTkFNRT4vYXZhdGFyL2dldC9hOGRmZTVmZC1iMDhkLTVkMDctYWQ4Yi03NGIxMTNmNWQ3MjY/MTYzMzEwMzgwMiIsCiAgICAgICAgICAgICAgICAiYWdlbnRfY2FzZV9hY2Nlc3MiOiAiQUxMIiwKICAgICAgICAgICAgICAgICJvcmdhbml6YXRpb25fY2FzZV9hY2Nlc3MiOiBudWxsLAogICAgICAgICAgICAgICAgIm9yZ2FuaXphdGlvbiI6IHsKICAgICAgICAgICAgICAgICAgICAiaWQiOiAzLAogICAgICAgICAgICAgICAgICAgICJyZXNvdXJjZV90eXBlIjogIm9yZ2FuaXphdGlvbiIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAidGVhbXMiOiBbCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAiaWQiOiAxLAogICAgICAgICAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJ0ZWFtIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAiaWQiOiAyLAogICAgICAgICAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJ0ZWFtIgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAiZW1haWxzIjogWwogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgImlkIjogMSwKICAgICAgICAgICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAiaWRlbnRpdHlfZW1haWwiCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICJwaG9uZXMiOiBbXSwKICAgICAgICAgICAgICAgICJ0d2l0dGVyIjogW10sCiAgICAgICAgICAgICAgICAiZmFjZWJvb2siOiBbXSwKICAgICAgICAgICAgICAgICJleHRlcm5hbF9pZGVudGlmaWVycyI6IFtdLAogICAgICAgICAgICAgICAgImN1c3RvbV9maWVsZHMiOiBbXSwKICAgICAgICAgICAgICAgICJwaW5uZWRfbm90ZXNfY291bnQiOiAwLAogICAgICAgICAgICAgICAgImxvY2FsZSI6IHsKICAgICAgICAgICAgICAgICAgICAiaWQiOiAzLAogICAgICAgICAgICAgICAgICAgICJyZXNvdXJjZV90eXBlIjogImxvY2FsZSIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAidGltZV96b25lIjogIlVUQyIsCiAgICAgICAgICAgICAgICAidGltZV96b25lX29mZnNldCI6IDAsCiAgICAgICAgICAgICAgICAiZ3JlZXRpbmciOiBudWxsLAogICAgICAgICAgICAgICAgInNpZ25hdHVyZSI6IG51bGwsCiAgICAgICAgICAgICAgICAic3RhdHVzX21lc3NhZ2UiOiBudWxsLAogICAgICAgICAgICAgICAgImxhc3Rfc2Vlbl91c2VyX2FnZW50IjogIlJ1YnkiLAogICAgICAgICAgICAgICAgImxhc3Rfc2Vlbl9pcCI6ICI1LjIzMS4xMzguMjA4IiwKICAgICAgICAgICAgICAgICJsYXN0X3NlZW5fYXQiOiAiMjAyMS0xMC0wMVQxNTo1Njo0MiswMDowMCIsCiAgICAgICAgICAgICAgICAibGFzdF9hY3RpdmVfYXQiOiAiMjAyMS0xMC0wMVQxNTo1Njo0MiswMDowMCIsCiAgICAgICAgICAgICAgICAicmVhbHRpbWVfY2hhbm5lbCI6ICJwcmVzZW5jZS00NDI1NDNjZDQyMjg3NzUwNDAwMWViMDU1MGYxODlhZDM2MmQ2NDc1ZmE2ZDk1ZmQwZjJkOGVlMGZmNzcwZjY1QHYxX3VzZXJzXzEiLAogICAgICAgICAgICAgICAgInByZXNlbmNlX2NoYW5uZWwiOiAidXNlcl9wcmVzZW5jZS00NDI1NDNjZDQyMjg3NzUwNDAwMWViMDU1MGYxODlhZDM2MmQ2NDc1ZmE2ZDk1ZmQwZjJkOGVlMGZmNzcwZjY1QGNmMDI3NGIzOTRkYjNhZjU1NWRiYzEzNmZjNzBhYWI2ZTQ1YmVlNDIiLAogICAgICAgICAgICAgICAgInBhc3N3b3JkX3VwZGF0ZWRfYXQiOiAiMjAyMS0wOC0yN1QwNzoxODoyMyswMDowMCIsCiAgICAgICAgICAgICAgICAiYXZhdGFyX3VwZGF0ZWRfYXQiOiBudWxsLAogICAgICAgICAgICAgICAgImxhc3RfbG9nZ2VkX2luX2F0IjogIjIwMjEtMTAtMDFUMTU6NTg6NTIrMDA6MDAiLAogICAgICAgICAgICAgICAgImxhc3RfYWN0aXZpdHlfYXQiOiAiMjAyMS0xMC0wMVQxNTo1ODo1MiswMDowMCIsCiAgICAgICAgICAgICAgICAiY3JlYXRlZF9hdCI6ICIyMDIxLTA4LTI0VDE4OjI0OjExKzAwOjAwIiwKICAgICAgICAgICAgICAgICJ1cGRhdGVkX2F0IjogIjIwMjEtMTAtMDFUMTU6NTY6NDIrMDA6MDAiLAogICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAidXNlciIsCiAgICAgICAgICAgICAgICAicmVzb3VyY2VfdXJsIjogImh0dHBzOi8vPElNUE9SVF9LQVlBS09fRU5EUE9JTlRfSE9TVE5BTUU+L2FwaS92MS91c2Vycy8xIgogICAgICAgICAgICB9LAogICAgICAgICAgICAiaWRlbnRpdHkiOiB7CiAgICAgICAgICAgICAgICAiaWQiOiAzLAogICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAiaWRlbnRpdHlfZW1haWwiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJhc3NpZ25lZF9hZ2VudCI6IG51bGwsCiAgICAgICAgICAgICJhc3NpZ25lZF90ZWFtIjogbnVsbCwKICAgICAgICAgICAgImxhc3RfYXNzaWduZWRfYnkiOiBudWxsLAogICAgICAgICAgICAiYnJhbmQiOiB7CiAgICAgICAgICAgICAgICAiaWQiOiAxLAogICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAiYnJhbmQiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJzdGF0dXMiOiB7CiAgICAgICAgICAgICAgICAiaWQiOiAxLAogICAgICAgICAgICAgICAgImxhYmVsIjogIk5ldyIsCiAgICAgICAgICAgICAgICAidHlwZSI6ICJORVciLAogICAgICAgICAgICAgICAgInNvcnRfb3JkZXIiOiAxLAogICAgICAgICAgICAgICAgImlzX3NsYV9hY3RpdmUiOiB0cnVlLAogICAgICAgICAgICAgICAgImlzX2RlbGV0ZWQiOiBmYWxzZSwKICAgICAgICAgICAgICAgICJjcmVhdGVkX2F0IjogIjIwMjEtMDgtMjRUMTg6MjQ6MTYrMDA6MDAiLAogICAgICAgICAgICAgICAgInVwZGF0ZWRfYXQiOiAiMjAyMS0wOC0yNFQxODoyNDoxNiswMDowMCIsCiAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJjYXNlX3N0YXR1cyIsCiAgICAgICAgICAgICAgICAicmVzb3VyY2VfdXJsIjogImh0dHBzOi8vPElNUE9SVF9LQVlBS09fRU5EUE9JTlRfSE9TVE5BTUU+L2FwaS92MS9jYXNlcy9zdGF0dXNlcy8xIgogICAgICAgICAgICB9LAogICAgICAgICAgICAicHJpb3JpdHkiOiBudWxsLAogICAgICAgICAgICAidHlwZSI6IG51bGwsCiAgICAgICAgICAgICJyZWFkX21hcmtlciI6IG51bGwsCiAgICAgICAgICAgICJzbGFfdmVyc2lvbiI6IG51bGwsCiAgICAgICAgICAgICJzbGFfbWV0cmljcyI6IFtdLAogICAgICAgICAgICAiZm9ybSI6IHsKICAgICAgICAgICAgICAgICJpZCI6IDEsCiAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJjYXNlX2Zvcm0iCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJjdXN0b21fZmllbGRzIjogWwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICJmaWVsZCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgImlkIjogOCwKICAgICAgICAgICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAiY2FzZV9maWVsZCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJ2YWx1ZSI6ICIiLAogICAgICAgICAgICAgICAgICAgICJyZXNvdXJjZV90eXBlIjogImNhc2VfZmllbGRfdmFsdWUiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICJmaWVsZCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgImlkIjogOSwKICAgICAgICAgICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAiY2FzZV9maWVsZCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJ2YWx1ZSI6ICIiLAogICAgICAgICAgICAgICAgICAgICJyZXNvdXJjZV90eXBlIjogImNhc2VfZmllbGRfdmFsdWUiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICJmaWVsZCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgImlkIjogMTAsCiAgICAgICAgICAgICAgICAgICAgICAgICJyZXNvdXJjZV90eXBlIjogImNhc2VfZmllbGQiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAidmFsdWUiOiAiIiwKICAgICAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJjYXNlX2ZpZWxkX3ZhbHVlIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAiZmllbGQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJpZCI6IDExLAogICAgICAgICAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJjYXNlX2ZpZWxkIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInZhbHVlIjogIiIsCiAgICAgICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAiY2FzZV9maWVsZF92YWx1ZSIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgImZpZWxkIjogewogICAgICAgICAgICAgICAgICAgICAgICAiaWQiOiAxMiwKICAgICAgICAgICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAiY2FzZV9maWVsZCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJ2YWx1ZSI6ICIiLAogICAgICAgICAgICAgICAgICAgICJyZXNvdXJjZV90eXBlIjogImNhc2VfZmllbGRfdmFsdWUiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICJmaWVsZCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgImlkIjogMTMsCiAgICAgICAgICAgICAgICAgICAgICAgICJyZXNvdXJjZV90eXBlIjogImNhc2VfZmllbGQiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAidmFsdWUiOiAiIiwKICAgICAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJjYXNlX2ZpZWxkX3ZhbHVlIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAiZmllbGQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJpZCI6IDE0LAogICAgICAgICAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJjYXNlX2ZpZWxkIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInZhbHVlIjogIiIsCiAgICAgICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAiY2FzZV9maWVsZF92YWx1ZSIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgImZpZWxkIjogewogICAgICAgICAgICAgICAgICAgICAgICAiaWQiOiAxNSwKICAgICAgICAgICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAiY2FzZV9maWVsZCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJ2YWx1ZSI6ICIiLAogICAgICAgICAgICAgICAgICAgICJyZXNvdXJjZV90eXBlIjogImNhc2VfZmllbGRfdmFsdWUiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICJmaWVsZCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgImlkIjogMTYsCiAgICAgICAgICAgICAgICAgICAgICAgICJyZXNvdXJjZV90eXBlIjogImNhc2VfZmllbGQiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAidmFsdWUiOiAiIiwKICAgICAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJjYXNlX2ZpZWxkX3ZhbHVlIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAiZmllbGQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJpZCI6IDE3LAogICAgICAgICAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJjYXNlX2ZpZWxkIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInZhbHVlIjogIiIsCiAgICAgICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAiY2FzZV9maWVsZF92YWx1ZSIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgImZpZWxkIjogewogICAgICAgICAgICAgICAgICAgICAgICAiaWQiOiAxOCwKICAgICAgICAgICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAiY2FzZV9maWVsZCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJ2YWx1ZSI6ICIiLAogICAgICAgICAgICAgICAgICAgICJyZXNvdXJjZV90eXBlIjogImNhc2VfZmllbGRfdmFsdWUiCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJsYXN0X3JlcGxpZXIiOiB7CiAgICAgICAgICAgICAgICAiaWQiOiAzLAogICAgICAgICAgICAgICAgInV1aWQiOiAiODFkOGEzMmMtZGUwNy01ZWQ2LWI5MmYtZWY0MjY1MDI5OWEyIiwKICAgICAgICAgICAgICAgICJmdWxsX25hbWUiOiAiVGF5bG9yIFdlc3QiLAogICAgICAgICAgICAgICAgImxlZ2FjeV9pZCI6IG51bGwsCiAgICAgICAgICAgICAgICAiZGVzaWduYXRpb24iOiBudWxsLAogICAgICAgICAgICAgICAgImlzX2VuYWJsZWQiOiB0cnVlLAogICAgICAgICAgICAgICAgImlzX21mYV9lbmFibGVkIjogZmFsc2UsCiAgICAgICAgICAgICAgICAicm9sZSI6IHsKICAgICAgICAgICAgICAgICAgICAiaWQiOiA0LAogICAgICAgICAgICAgICAgICAgICJyZXNvdXJjZV90eXBlIjogInJvbGUiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgImF2YXRhciI6ICJodHRwczovLzxJTVBPUlRfS0FZQUtPX0VORFBPSU5UX0hPU1ROQU1FPi9hdmF0YXIvZ2V0LzgxZDhhMzJjLWRlMDctNWVkNi1iOTJmLWVmNDI2NTAyOTlhMj8xNjMwMDY2NzMzIiwKICAgICAgICAgICAgICAgICJhZ2VudF9jYXNlX2FjY2VzcyI6IG51bGwsCiAgICAgICAgICAgICAgICAib3JnYW5pemF0aW9uX2Nhc2VfYWNjZXNzIjogIlJFUVVFU1RFRCIsCiAgICAgICAgICAgICAgICAib3JnYW5pemF0aW9uIjogewogICAgICAgICAgICAgICAgICAgICJpZCI6IDEsCiAgICAgICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAib3JnYW5pemF0aW9uIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJ0ZWFtcyI6IFtdLAogICAgICAgICAgICAgICAgImVtYWlscyI6IFsKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICJpZCI6IDMsCiAgICAgICAgICAgICAgICAgICAgICAgICJyZXNvdXJjZV90eXBlIjogImlkZW50aXR5X2VtYWlsIgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAicGhvbmVzIjogW10sCiAgICAgICAgICAgICAgICAidHdpdHRlciI6IFsKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICJpZCI6IDEsCiAgICAgICAgICAgICAgICAgICAgICAgICJyZXNvdXJjZV90eXBlIjogImlkZW50aXR5X3R3aXR0ZXIiCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICJmYWNlYm9vayI6IFtdLAogICAgICAgICAgICAgICAgImV4dGVybmFsX2lkZW50aWZpZXJzIjogW10sCiAgICAgICAgICAgICAgICAiY3VzdG9tX2ZpZWxkcyI6IFtdLAogICAgICAgICAgICAgICAgInBpbm5lZF9ub3Rlc19jb3VudCI6IDAsCiAgICAgICAgICAgICAgICAibG9jYWxlIjogewogICAgICAgICAgICAgICAgICAgICJpZCI6IDMsCiAgICAgICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAibG9jYWxlIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJ0aW1lX3pvbmUiOiAiVVRDIiwKICAgICAgICAgICAgICAgICJ0aW1lX3pvbmVfb2Zmc2V0IjogMCwKICAgICAgICAgICAgICAgICJncmVldGluZyI6IG51bGwsCiAgICAgICAgICAgICAgICAic2lnbmF0dXJlIjogbnVsbCwKICAgICAgICAgICAgICAgICJzdGF0dXNfbWVzc2FnZSI6IG51bGwsCiAgICAgICAgICAgICAgICAibGFzdF9zZWVuX3VzZXJfYWdlbnQiOiBudWxsLAogICAgICAgICAgICAgICAgImxhc3Rfc2Vlbl9pcCI6IG51bGwsCiAgICAgICAgICAgICAgICAibGFzdF9zZWVuX2F0IjogIjIwMjEtMDgtMjdUMTI6MTg6NTMrMDA6MDAiLAogICAgICAgICAgICAgICAgImxhc3RfYWN0aXZlX2F0IjogIjIwMjEtMDgtMjdUMTI6MTg6NTMrMDA6MDAiLAogICAgICAgICAgICAgICAgInJlYWx0aW1lX2NoYW5uZWwiOiAicHJlc2VuY2UtNDQyNTQzY2Q0MjI4Nzc1MDQwMDFlYjA1NTBmMTg5YWQzNjJkNjQ3NWZhNmQ5NWZkMGYyZDhlZTBmZjc3MGY2NUB2MV91c2Vyc18zIiwKICAgICAgICAgICAgICAgICJwcmVzZW5jZV9jaGFubmVsIjogInVzZXJfcHJlc2VuY2UtNDQyNTQzY2Q0MjI4Nzc1MDQwMDFlYjA1NTBmMTg5YWQzNjJkNjQ3NWZhNmQ5NWZkMGYyZDhlZTBmZjc3MGY2NUBkZDEzMmRkOTE5ZDhkMDAzYzJiY2QyZTAwNmE5MTMzYTg2NjlkMjA0IiwKICAgICAgICAgICAgICAgICJwYXNzd29yZF91cGRhdGVkX2F0IjogIjIwMjEtMDgtMjRUMTg6MjQ6MTErMDA6MDAiLAogICAgICAgICAgICAgICAgImF2YXRhcl91cGRhdGVkX2F0IjogIjIwMjEtMDgtMjRUMTg6MjQ6MTIrMDA6MDAiLAogICAgICAgICAgICAgICAgImxhc3RfbG9nZ2VkX2luX2F0IjogbnVsbCwKICAgICAgICAgICAgICAgICJsYXN0X2FjdGl2aXR5X2F0IjogbnVsbCwKICAgICAgICAgICAgICAgICJjcmVhdGVkX2F0IjogIjIwMjEtMDgtMjRUMTg6MjQ6MTErMDA6MDAiLAogICAgICAgICAgICAgICAgInVwZGF0ZWRfYXQiOiAiMjAyMS0wOC0yN1QxMjoxODo1MyswMDowMCIsCiAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJ1c2VyIiwKICAgICAgICAgICAgICAgICJyZXNvdXJjZV91cmwiOiAiaHR0cHM6Ly88SU1QT1JUX0tBWUFLT19FTkRQT0lOVF9IT1NUTkFNRT4vYXBpL3YxL3VzZXJzLzMiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJsYXN0X3JlcGxpZXJfaWRlbnRpdHkiOiB7CiAgICAgICAgICAgICAgICAiaWQiOiAzLAogICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAiaWRlbnRpdHlfZW1haWwiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJsYXN0X3VwZGF0ZWRfYnkiOiB7CiAgICAgICAgICAgICAgICAiaWQiOiAxLAogICAgICAgICAgICAgICAgInV1aWQiOiAiYThkZmU1ZmQtYjA4ZC01ZDA3LWFkOGItNzRiMTEzZjVkNzI2IiwKICAgICAgICAgICAgICAgICJmdWxsX25hbWUiOiAiVGhvcnN0ZW4gRWNrZWwiLAogICAgICAgICAgICAgICAgImxlZ2FjeV9pZCI6IG51bGwsCiAgICAgICAgICAgICAgICAiZGVzaWduYXRpb24iOiBudWxsLAogICAgICAgICAgICAgICAgImlzX2VuYWJsZWQiOiB0cnVlLAogICAgICAgICAgICAgICAgImlzX21mYV9lbmFibGVkIjogZmFsc2UsCiAgICAgICAgICAgICAgICAicm9sZSI6IHsKICAgICAgICAgICAgICAgICAgICAiaWQiOiA1LAogICAgICAgICAgICAgICAgICAgICJyZXNvdXJjZV90eXBlIjogInJvbGUiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgImF2YXRhciI6ICJodHRwczovLzxJTVBPUlRfS0FZQUtPX0VORFBPSU5UX0hPU1ROQU1FPi9hdmF0YXIvZ2V0L2E4ZGZlNWZkLWIwOGQtNWQwNy1hZDhiLTc0YjExM2Y1ZDcyNj8xNjMzMTAzODAyIiwKICAgICAgICAgICAgICAgICJhZ2VudF9jYXNlX2FjY2VzcyI6ICJBTEwiLAogICAgICAgICAgICAgICAgIm9yZ2FuaXphdGlvbl9jYXNlX2FjY2VzcyI6IG51bGwsCiAgICAgICAgICAgICAgICAib3JnYW5pemF0aW9uIjogewogICAgICAgICAgICAgICAgICAgICJpZCI6IDMsCiAgICAgICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAib3JnYW5pemF0aW9uIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJ0ZWFtcyI6IFsKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICJpZCI6IDEsCiAgICAgICAgICAgICAgICAgICAgICAgICJyZXNvdXJjZV90eXBlIjogInRlYW0iCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICJpZCI6IDIsCiAgICAgICAgICAgICAgICAgICAgICAgICJyZXNvdXJjZV90eXBlIjogInRlYW0iCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICJlbWFpbHMiOiBbCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAiaWQiOiAxLAogICAgICAgICAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJpZGVudGl0eV9lbWFpbCIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgInBob25lcyI6IFtdLAogICAgICAgICAgICAgICAgInR3aXR0ZXIiOiBbXSwKICAgICAgICAgICAgICAgICJmYWNlYm9vayI6IFtdLAogICAgICAgICAgICAgICAgImV4dGVybmFsX2lkZW50aWZpZXJzIjogW10sCiAgICAgICAgICAgICAgICAiY3VzdG9tX2ZpZWxkcyI6IFtdLAogICAgICAgICAgICAgICAgInBpbm5lZF9ub3Rlc19jb3VudCI6IDAsCiAgICAgICAgICAgICAgICAibG9jYWxlIjogewogICAgICAgICAgICAgICAgICAgICJpZCI6IDMsCiAgICAgICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAibG9jYWxlIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJ0aW1lX3pvbmUiOiAiVVRDIiwKICAgICAgICAgICAgICAgICJ0aW1lX3pvbmVfb2Zmc2V0IjogMCwKICAgICAgICAgICAgICAgICJncmVldGluZyI6IG51bGwsCiAgICAgICAgICAgICAgICAic2lnbmF0dXJlIjogbnVsbCwKICAgICAgICAgICAgICAgICJzdGF0dXNfbWVzc2FnZSI6IG51bGwsCiAgICAgICAgICAgICAgICAibGFzdF9zZWVuX3VzZXJfYWdlbnQiOiAiUnVieSIsCiAgICAgICAgICAgICAgICAibGFzdF9zZWVuX2lwIjogIjUuMjMxLjEzOC4yMDgiLAogICAgICAgICAgICAgICAgImxhc3Rfc2Vlbl9hdCI6ICIyMDIxLTEwLTAxVDE1OjU2OjQyKzAwOjAwIiwKICAgICAgICAgICAgICAgICJsYXN0X2FjdGl2ZV9hdCI6ICIyMDIxLTEwLTAxVDE1OjU2OjQyKzAwOjAwIiwKICAgICAgICAgICAgICAgICJyZWFsdGltZV9jaGFubmVsIjogInByZXNlbmNlLTQ0MjU0M2NkNDIyODc3NTA0MDAxZWIwNTUwZjE4OWFkMzYyZDY0NzVmYTZkOTVmZDBmMmQ4ZWUwZmY3NzBmNjVAdjFfdXNlcnNfMSIsCiAgICAgICAgICAgICAgICAicHJlc2VuY2VfY2hhbm5lbCI6ICJ1c2VyX3ByZXNlbmNlLTQ0MjU0M2NkNDIyODc3NTA0MDAxZWIwNTUwZjE4OWFkMzYyZDY0NzVmYTZkOTVmZDBmMmQ4ZWUwZmY3NzBmNjVAY2YwMjc0YjM5NGRiM2FmNTU1ZGJjMTM2ZmM3MGFhYjZlNDViZWU0MiIsCiAgICAgICAgICAgICAgICAicGFzc3dvcmRfdXBkYXRlZF9hdCI6ICIyMDIxLTA4LTI3VDA3OjE4OjIzKzAwOjAwIiwKICAgICAgICAgICAgICAgICJhdmF0YXJfdXBkYXRlZF9hdCI6IG51bGwsCiAgICAgICAgICAgICAgICAibGFzdF9sb2dnZWRfaW5fYXQiOiAiMjAyMS0xMC0wMVQxNTo1ODo1MiswMDowMCIsCiAgICAgICAgICAgICAgICAibGFzdF9hY3Rpdml0eV9hdCI6ICIyMDIxLTEwLTAxVDE1OjU4OjUyKzAwOjAwIiwKICAgICAgICAgICAgICAgICJjcmVhdGVkX2F0IjogIjIwMjEtMDgtMjRUMTg6MjQ6MTErMDA6MDAiLAogICAgICAgICAgICAgICAgInVwZGF0ZWRfYXQiOiAiMjAyMS0xMC0wMVQxNTo1Njo0MiswMDowMCIsCiAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJ1c2VyIiwKICAgICAgICAgICAgICAgICJyZXNvdXJjZV91cmwiOiAiaHR0cHM6Ly88SU1QT1JUX0tBWUFLT19FTkRQT0lOVF9IT1NUTkFNRT4vYXBpL3YxL3VzZXJzLzEiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJsYXN0X2NvbXBsZXRlZF9ieSI6IG51bGwsCiAgICAgICAgICAgICJsYXN0X2Nsb3NlZF9ieSI6IG51bGwsCiAgICAgICAgICAgICJzdGF0ZSI6ICJBQ1RJVkUiLAogICAgICAgICAgICAicG9zdF9jb3VudCI6IDEsCiAgICAgICAgICAgICJoYXNfbm90ZXMiOiB0cnVlLAogICAgICAgICAgICAicGlubmVkX25vdGVzX2NvdW50IjogMCwKICAgICAgICAgICAgImhhc19hdHRhY2htZW50cyI6IGZhbHNlLAogICAgICAgICAgICAiaXNfbWVyZ2VkIjogZmFsc2UsCiAgICAgICAgICAgICJyYXRpbmciOiBudWxsLAogICAgICAgICAgICAicmF0aW5nX3N0YXR1cyI6ICJVTk9GRkVSRUQiLAogICAgICAgICAgICAidGFncyI6IFtdLAogICAgICAgICAgICAibGFzdF9wb3N0X3N0YXR1cyI6ICIiLAogICAgICAgICAgICAibGFzdF9wb3N0X3ByZXZpZXciOiAiSSB3YW50IHRvIHB1cmNoYXNlIGFuIGFzc29ydGVkIHNldCBvZiByZXRhaWwgZXF1aXBtZW50LiBJ4oCZbSBub3QgYWJsZSB0byBidWlsZCBteSBidW5kbGUuIENhbiB5b3UgaGVscCBtZSB3aXRoIHRoaXMgcHVyY2hhc2U/IExvb2tpbmcgZm9yd2FyZCB0byBtb3JlIGluZm9ybWF0aW9uISIsCiAgICAgICAgICAgICJsYXN0X3Bvc3RfdHlwZSI6ICJOT1RFIiwKICAgICAgICAgICAgImxhc3RfbWVzc2FnZV9wcmV2aWV3IjogIkkgd2FudCB0byBwdXJjaGFzZSBhbiBhc3NvcnRlZCBzZXQgb2YgcmV0YWlsIGVxdWlwbWVudC4gSeKAmW0gbm90IGFibGUgdG8gYnVpbGQgbXkgYnVuZGxlLiBDYW4geW91IGhlbHAgbWUgd2l0aCB0aGlzIHB1cmNoYXNlPyBMb29raW5nIGZvcndhcmQgdG8gbW9yZSBpbmZvcm1hdGlvbiEiLAogICAgICAgICAgICAicmVhbHRpbWVfY2hhbm5lbCI6ICJwcmVzZW5jZS00NDI1NDNjZDQyMjg3NzUwNDAwMWViMDU1MGYxODlhZDM2MmQ2NDc1ZmE2ZDk1ZmQwZjJkOGVlMGZmNzcwZjY1QHYxX2Nhc2VzXzIiLAogICAgICAgICAgICAibGFzdF9hc3NpZ25lZF9hdCI6IG51bGwsCiAgICAgICAgICAgICJsYXN0X3JlcGxpZWRfYXQiOiAiMjAyMS0wOC0yN1QxMDo0NTo1MSswMDowMCIsCiAgICAgICAgICAgICJsYXN0X29wZW5lZF9hdCI6IG51bGwsCiAgICAgICAgICAgICJsYXN0X3BlbmRpbmdfYXQiOiBudWxsLAogICAgICAgICAgICAibGFzdF9jbG9zZWRfYXQiOiBudWxsLAogICAgICAgICAgICAibGFzdF9jb21wbGV0ZWRfYXQiOiBudWxsLAogICAgICAgICAgICAibGFzdF9hZ2VudF9hY3Rpdml0eV9hdCI6ICIyMDIxLTA4LTI3VDEwOjQ1OjUxKzAwOjAwIiwKICAgICAgICAgICAgImxhc3RfY3VzdG9tZXJfYWN0aXZpdHlfYXQiOiBudWxsLAogICAgICAgICAgICAibGFzdF9yZXBseV9ieV9hZ2VudF9hdCI6IG51bGwsCiAgICAgICAgICAgICJsYXN0X3JlcGx5X2J5X3JlcXVlc3Rlcl9hdCI6IG51bGwsCiAgICAgICAgICAgICJhZ2VudF91cGRhdGVkX2F0IjogbnVsbCwKICAgICAgICAgICAgImxhdGVzdF9hc3NpZ25lZV91cGRhdGUiOiBudWxsLAogICAgICAgICAgICAiY3JlYXRlZF9hdCI6ICIyMDIxLTA4LTI3VDEwOjQ1OjUxKzAwOjAwIiwKICAgICAgICAgICAgInVwZGF0ZWRfYXQiOiAiMjAyMS0wOC0yN1QxMDo0NTo1MSswMDowMCIsCiAgICAgICAgICAgICJyZXNvdXJjZV90eXBlIjogImNhc2UiLAogICAgICAgICAgICAicmVzb3VyY2VfdXJsIjogImh0dHBzOi8vPElNUE9SVF9LQVlBS09fRU5EUE9JTlRfSE9TVE5BTUU+L2FwaS92MS9jYXNlcy8yIgogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICAiaWQiOiAxLAogICAgICAgICAgICAibGVnYWN5X2lkIjogbnVsbCwKICAgICAgICAgICAgInN1YmplY3QiOiAiR2V0dGluZyBjb21mb3J0YWJsZSB3aXRoIEtheWFrbzogYSBzYW1wbGUgY29udmVyc2F0aW9uIiwKICAgICAgICAgICAgInBvcnRhbCI6ICJTRVRVUCIsCiAgICAgICAgICAgICJzb3VyY2VfY2hhbm5lbCI6IHsKICAgICAgICAgICAgICAgICJ1dWlkIjogImZkM2E4MTE2LTk1YzItNDkyZS05YWYzLWIzYWI1N2RjOWYxYSIsCiAgICAgICAgICAgICAgICAidHlwZSI6ICJNQUlMIiwKICAgICAgICAgICAgICAgICJjaGFyYWN0ZXJfbGltaXQiOiBudWxsLAogICAgICAgICAgICAgICAgImFjY291bnQiOiB7CiAgICAgICAgICAgICAgICAgICAgImlkIjogMSwKICAgICAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJtYWlsYm94IgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJyZXNvdXJjZV90eXBlIjogImNoYW5uZWwiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJsYXN0X3B1YmxpY19jaGFubmVsIjogewogICAgICAgICAgICAgICAgInV1aWQiOiAiZmQzYTgxMTYtOTVjMi00OTJlLTlhZjMtYjNhYjU3ZGM5ZjFhIiwKICAgICAgICAgICAgICAgICJ0eXBlIjogIk1BSUwiLAogICAgICAgICAgICAgICAgImNoYXJhY3Rlcl9saW1pdCI6IG51bGwsCiAgICAgICAgICAgICAgICAiYWNjb3VudCI6IHsKICAgICAgICAgICAgICAgICAgICAiaWQiOiAxLAogICAgICAgICAgICAgICAgICAgICJyZXNvdXJjZV90eXBlIjogIm1haWxib3giCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAiY2hhbm5lbCIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgInJlcXVlc3RlciI6IHsKICAgICAgICAgICAgICAgICJpZCI6IDMsCiAgICAgICAgICAgICAgICAidXVpZCI6ICI4MWQ4YTMyYy1kZTA3LTVlZDYtYjkyZi1lZjQyNjUwMjk5YTIiLAogICAgICAgICAgICAgICAgImZ1bGxfbmFtZSI6ICJUYXlsb3IgV2VzdCIsCiAgICAgICAgICAgICAgICAibGVnYWN5X2lkIjogbnVsbCwKICAgICAgICAgICAgICAgICJkZXNpZ25hdGlvbiI6IG51bGwsCiAgICAgICAgICAgICAgICAiaXNfZW5hYmxlZCI6IHRydWUsCiAgICAgICAgICAgICAgICAiaXNfbWZhX2VuYWJsZWQiOiBmYWxzZSwKICAgICAgICAgICAgICAgICJyb2xlIjogewogICAgICAgICAgICAgICAgICAgICJpZCI6IDQsCiAgICAgICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAicm9sZSIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAiYXZhdGFyIjogImh0dHBzOi8vPElNUE9SVF9LQVlBS09fRU5EUE9JTlRfSE9TVE5BTUU+L2F2YXRhci9nZXQvODFkOGEzMmMtZGUwNy01ZWQ2LWI5MmYtZWY0MjY1MDI5OWEyPzE2MzAwNjY3MzMiLAogICAgICAgICAgICAgICAgImFnZW50X2Nhc2VfYWNjZXNzIjogbnVsbCwKICAgICAgICAgICAgICAgICJvcmdhbml6YXRpb25fY2FzZV9hY2Nlc3MiOiAiUkVRVUVTVEVEIiwKICAgICAgICAgICAgICAgICJvcmdhbml6YXRpb24iOiB7CiAgICAgICAgICAgICAgICAgICAgImlkIjogMSwKICAgICAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJvcmdhbml6YXRpb24iCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgInRlYW1zIjogW10sCiAgICAgICAgICAgICAgICAiZW1haWxzIjogWwogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgImlkIjogMywKICAgICAgICAgICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAiaWRlbnRpdHlfZW1haWwiCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICJwaG9uZXMiOiBbXSwKICAgICAgICAgICAgICAgICJ0d2l0dGVyIjogWwogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgImlkIjogMSwKICAgICAgICAgICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAiaWRlbnRpdHlfdHdpdHRlciIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgImZhY2Vib29rIjogW10sCiAgICAgICAgICAgICAgICAiZXh0ZXJuYWxfaWRlbnRpZmllcnMiOiBbXSwKICAgICAgICAgICAgICAgICJjdXN0b21fZmllbGRzIjogW10sCiAgICAgICAgICAgICAgICAicGlubmVkX25vdGVzX2NvdW50IjogMCwKICAgICAgICAgICAgICAgICJsb2NhbGUiOiB7CiAgICAgICAgICAgICAgICAgICAgImlkIjogMywKICAgICAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJsb2NhbGUiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgInRpbWVfem9uZSI6ICJVVEMiLAogICAgICAgICAgICAgICAgInRpbWVfem9uZV9vZmZzZXQiOiAwLAogICAgICAgICAgICAgICAgImdyZWV0aW5nIjogbnVsbCwKICAgICAgICAgICAgICAgICJzaWduYXR1cmUiOiBudWxsLAogICAgICAgICAgICAgICAgInN0YXR1c19tZXNzYWdlIjogbnVsbCwKICAgICAgICAgICAgICAgICJsYXN0X3NlZW5fdXNlcl9hZ2VudCI6IG51bGwsCiAgICAgICAgICAgICAgICAibGFzdF9zZWVuX2lwIjogbnVsbCwKICAgICAgICAgICAgICAgICJsYXN0X3NlZW5fYXQiOiAiMjAyMS0wOC0yN1QxMjoxODo1MyswMDowMCIsCiAgICAgICAgICAgICAgICAibGFzdF9hY3RpdmVfYXQiOiAiMjAyMS0wOC0yN1QxMjoxODo1MyswMDowMCIsCiAgICAgICAgICAgICAgICAicmVhbHRpbWVfY2hhbm5lbCI6ICJwcmVzZW5jZS00NDI1NDNjZDQyMjg3NzUwNDAwMWViMDU1MGYxODlhZDM2MmQ2NDc1ZmE2ZDk1ZmQwZjJkOGVlMGZmNzcwZjY1QHYxX3VzZXJzXzMiLAogICAgICAgICAgICAgICAgInByZXNlbmNlX2NoYW5uZWwiOiAidXNlcl9wcmVzZW5jZS00NDI1NDNjZDQyMjg3NzUwNDAwMWViMDU1MGYxODlhZDM2MmQ2NDc1ZmE2ZDk1ZmQwZjJkOGVlMGZmNzcwZjY1QGRkMTMyZGQ5MTlkOGQwMDNjMmJjZDJlMDA2YTkxMzNhODY2OWQyMDQiLAogICAgICAgICAgICAgICAgInBhc3N3b3JkX3VwZGF0ZWRfYXQiOiAiMjAyMS0wOC0yNFQxODoyNDoxMSswMDowMCIsCiAgICAgICAgICAgICAgICAiYXZhdGFyX3VwZGF0ZWRfYXQiOiAiMjAyMS0wOC0yNFQxODoyNDoxMiswMDowMCIsCiAgICAgICAgICAgICAgICAibGFzdF9sb2dnZWRfaW5fYXQiOiBudWxsLAogICAgICAgICAgICAgICAgImxhc3RfYWN0aXZpdHlfYXQiOiBudWxsLAogICAgICAgICAgICAgICAgImNyZWF0ZWRfYXQiOiAiMjAyMS0wOC0yNFQxODoyNDoxMSswMDowMCIsCiAgICAgICAgICAgICAgICAidXBkYXRlZF9hdCI6ICIyMDIxLTA4LTI3VDEyOjE4OjUzKzAwOjAwIiwKICAgICAgICAgICAgICAgICJyZXNvdXJjZV90eXBlIjogInVzZXIiLAogICAgICAgICAgICAgICAgInJlc291cmNlX3VybCI6ICJodHRwczovLzxJTVBPUlRfS0FZQUtPX0VORFBPSU5UX0hPU1ROQU1FPi9hcGkvdjEvdXNlcnMvMyIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgImNyZWF0b3IiOiB7CiAgICAgICAgICAgICAgICAiaWQiOiAzLAogICAgICAgICAgICAgICAgInV1aWQiOiAiODFkOGEzMmMtZGUwNy01ZWQ2LWI5MmYtZWY0MjY1MDI5OWEyIiwKICAgICAgICAgICAgICAgICJmdWxsX25hbWUiOiAiVGF5bG9yIFdlc3QiLAogICAgICAgICAgICAgICAgImxlZ2FjeV9pZCI6IG51bGwsCiAgICAgICAgICAgICAgICAiZGVzaWduYXRpb24iOiBudWxsLAogICAgICAgICAgICAgICAgImlzX2VuYWJsZWQiOiB0cnVlLAogICAgICAgICAgICAgICAgImlzX21mYV9lbmFibGVkIjogZmFsc2UsCiAgICAgICAgICAgICAgICAicm9sZSI6IHsKICAgICAgICAgICAgICAgICAgICAiaWQiOiA0LAogICAgICAgICAgICAgICAgICAgICJyZXNvdXJjZV90eXBlIjogInJvbGUiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgImF2YXRhciI6ICJodHRwczovLzxJTVBPUlRfS0FZQUtPX0VORFBPSU5UX0hPU1ROQU1FPi9hdmF0YXIvZ2V0LzgxZDhhMzJjLWRlMDctNWVkNi1iOTJmLWVmNDI2NTAyOTlhMj8xNjMwMDY2NzMzIiwKICAgICAgICAgICAgICAgICJhZ2VudF9jYXNlX2FjY2VzcyI6IG51bGwsCiAgICAgICAgICAgICAgICAib3JnYW5pemF0aW9uX2Nhc2VfYWNjZXNzIjogIlJFUVVFU1RFRCIsCiAgICAgICAgICAgICAgICAib3JnYW5pemF0aW9uIjogewogICAgICAgICAgICAgICAgICAgICJpZCI6IDEsCiAgICAgICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAib3JnYW5pemF0aW9uIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJ0ZWFtcyI6IFtdLAogICAgICAgICAgICAgICAgImVtYWlscyI6IFsKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICJpZCI6IDMsCiAgICAgICAgICAgICAgICAgICAgICAgICJyZXNvdXJjZV90eXBlIjogImlkZW50aXR5X2VtYWlsIgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAicGhvbmVzIjogW10sCiAgICAgICAgICAgICAgICAidHdpdHRlciI6IFsKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICJpZCI6IDEsCiAgICAgICAgICAgICAgICAgICAgICAgICJyZXNvdXJjZV90eXBlIjogImlkZW50aXR5X3R3aXR0ZXIiCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICJmYWNlYm9vayI6IFtdLAogICAgICAgICAgICAgICAgImV4dGVybmFsX2lkZW50aWZpZXJzIjogW10sCiAgICAgICAgICAgICAgICAiY3VzdG9tX2ZpZWxkcyI6IFtdLAogICAgICAgICAgICAgICAgInBpbm5lZF9ub3Rlc19jb3VudCI6IDAsCiAgICAgICAgICAgICAgICAibG9jYWxlIjogewogICAgICAgICAgICAgICAgICAgICJpZCI6IDMsCiAgICAgICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAibG9jYWxlIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJ0aW1lX3pvbmUiOiAiVVRDIiwKICAgICAgICAgICAgICAgICJ0aW1lX3pvbmVfb2Zmc2V0IjogMCwKICAgICAgICAgICAgICAgICJncmVldGluZyI6IG51bGwsCiAgICAgICAgICAgICAgICAic2lnbmF0dXJlIjogbnVsbCwKICAgICAgICAgICAgICAgICJzdGF0dXNfbWVzc2FnZSI6IG51bGwsCiAgICAgICAgICAgICAgICAibGFzdF9zZWVuX3VzZXJfYWdlbnQiOiBudWxsLAogICAgICAgICAgICAgICAgImxhc3Rfc2Vlbl9pcCI6IG51bGwsCiAgICAgICAgICAgICAgICAibGFzdF9zZWVuX2F0IjogIjIwMjEtMDgtMjdUMTI6MTg6NTMrMDA6MDAiLAogICAgICAgICAgICAgICAgImxhc3RfYWN0aXZlX2F0IjogIjIwMjEtMDgtMjdUMTI6MTg6NTMrMDA6MDAiLAogICAgICAgICAgICAgICAgInJlYWx0aW1lX2NoYW5uZWwiOiAicHJlc2VuY2UtNDQyNTQzY2Q0MjI4Nzc1MDQwMDFlYjA1NTBmMTg5YWQzNjJkNjQ3NWZhNmQ5NWZkMGYyZDhlZTBmZjc3MGY2NUB2MV91c2Vyc18zIiwKICAgICAgICAgICAgICAgICJwcmVzZW5jZV9jaGFubmVsIjogInVzZXJfcHJlc2VuY2UtNDQyNTQzY2Q0MjI4Nzc1MDQwMDFlYjA1NTBmMTg5YWQzNjJkNjQ3NWZhNmQ5NWZkMGYyZDhlZTBmZjc3MGY2NUBkZDEzMmRkOTE5ZDhkMDAzYzJiY2QyZTAwNmE5MTMzYTg2NjlkMjA0IiwKICAgICAgICAgICAgICAgICJwYXNzd29yZF91cGRhdGVkX2F0IjogIjIwMjEtMDgtMjRUMTg6MjQ6MTErMDA6MDAiLAogICAgICAgICAgICAgICAgImF2YXRhcl91cGRhdGVkX2F0IjogIjIwMjEtMDgtMjRUMTg6MjQ6MTIrMDA6MDAiLAogICAgICAgICAgICAgICAgImxhc3RfbG9nZ2VkX2luX2F0IjogbnVsbCwKICAgICAgICAgICAgICAgICJsYXN0X2FjdGl2aXR5X2F0IjogbnVsbCwKICAgICAgICAgICAgICAgICJjcmVhdGVkX2F0IjogIjIwMjEtMDgtMjRUMTg6MjQ6MTErMDA6MDAiLAogICAgICAgICAgICAgICAgInVwZGF0ZWRfYXQiOiAiMjAyMS0wOC0yN1QxMjoxODo1MyswMDowMCIsCiAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJ1c2VyIiwKICAgICAgICAgICAgICAgICJyZXNvdXJjZV91cmwiOiAiaHR0cHM6Ly88SU1QT1JUX0tBWUFLT19FTkRQT0lOVF9IT1NUTkFNRT4vYXBpL3YxL3VzZXJzLzMiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJpZGVudGl0eSI6IHsKICAgICAgICAgICAgICAgICJpZCI6IDMsCiAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJpZGVudGl0eV9lbWFpbCIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgImFzc2lnbmVkX2FnZW50IjogbnVsbCwKICAgICAgICAgICAgImFzc2lnbmVkX3RlYW0iOiB7CiAgICAgICAgICAgICAgICAiaWQiOiAxLAogICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAidGVhbSIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgImxhc3RfYXNzaWduZWRfYnkiOiBudWxsLAogICAgICAgICAgICAiYnJhbmQiOiB7CiAgICAgICAgICAgICAgICAiaWQiOiAxLAogICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAiYnJhbmQiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJzdGF0dXMiOiB7CiAgICAgICAgICAgICAgICAiaWQiOiAyLAogICAgICAgICAgICAgICAgImxhYmVsIjogIk9wZW4iLAogICAgICAgICAgICAgICAgInR5cGUiOiAiT1BFTiIsCiAgICAgICAgICAgICAgICAic29ydF9vcmRlciI6IDIsCiAgICAgICAgICAgICAgICAiaXNfc2xhX2FjdGl2ZSI6IHRydWUsCiAgICAgICAgICAgICAgICAiaXNfZGVsZXRlZCI6IGZhbHNlLAogICAgICAgICAgICAgICAgImNyZWF0ZWRfYXQiOiAiMjAyMS0wOC0yNFQxODoyNDoxNiswMDowMCIsCiAgICAgICAgICAgICAgICAidXBkYXRlZF9hdCI6ICIyMDIxLTA4LTI0VDE4OjI0OjE2KzAwOjAwIiwKICAgICAgICAgICAgICAgICJyZXNvdXJjZV90eXBlIjogImNhc2Vfc3RhdHVzIiwKICAgICAgICAgICAgICAgICJyZXNvdXJjZV91cmwiOiAiaHR0cHM6Ly88SU1QT1JUX0tBWUFLT19FTkRQT0lOVF9IT1NUTkFNRT4vYXBpL3YxL2Nhc2VzL3N0YXR1c2VzLzIiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJwcmlvcml0eSI6IG51bGwsCiAgICAgICAgICAgICJ0eXBlIjogewogICAgICAgICAgICAgICAgImlkIjogMSwKICAgICAgICAgICAgICAgICJsYWJlbCI6ICJRdWVzdGlvbiIsCiAgICAgICAgICAgICAgICAidHlwZSI6ICJRVUVTVElPTiIsCiAgICAgICAgICAgICAgICAiY3JlYXRlZF9hdCI6ICIyMDIxLTA4LTI0VDE4OjI0OjE2KzAwOjAwIiwKICAgICAgICAgICAgICAgICJ1cGRhdGVkX2F0IjogIjIwMjEtMDgtMjRUMTg6MjQ6MTYrMDA6MDAiLAogICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAiY2FzZV90eXBlIiwKICAgICAgICAgICAgICAgICJyZXNvdXJjZV91cmwiOiAiaHR0cHM6Ly88SU1QT1JUX0tBWUFLT19FTkRQT0lOVF9IT1NUTkFNRT4vYXBpL3YxL2Nhc2VzL3R5cGVzLzEiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJyZWFkX21hcmtlciI6IHsKICAgICAgICAgICAgICAgICJpZCI6IDEsCiAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJyZWFkX21hcmtlciIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgInNsYV92ZXJzaW9uIjogbnVsbCwKICAgICAgICAgICAgInNsYV9tZXRyaWNzIjogW10sCiAgICAgICAgICAgICJmb3JtIjogbnVsbCwKICAgICAgICAgICAgImN1c3RvbV9maWVsZHMiOiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgImZpZWxkIjogewogICAgICAgICAgICAgICAgICAgICAgICAiaWQiOiA4LAogICAgICAgICAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJjYXNlX2ZpZWxkIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInZhbHVlIjogIiIsCiAgICAgICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAiY2FzZV9maWVsZF92YWx1ZSIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgImZpZWxkIjogewogICAgICAgICAgICAgICAgICAgICAgICAiaWQiOiA5LAogICAgICAgICAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJjYXNlX2ZpZWxkIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInZhbHVlIjogIiIsCiAgICAgICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAiY2FzZV9maWVsZF92YWx1ZSIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgImZpZWxkIjogewogICAgICAgICAgICAgICAgICAgICAgICAiaWQiOiAxMCwKICAgICAgICAgICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAiY2FzZV9maWVsZCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJ2YWx1ZSI6ICIiLAogICAgICAgICAgICAgICAgICAgICJyZXNvdXJjZV90eXBlIjogImNhc2VfZmllbGRfdmFsdWUiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICJmaWVsZCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgImlkIjogMTEsCiAgICAgICAgICAgICAgICAgICAgICAgICJyZXNvdXJjZV90eXBlIjogImNhc2VfZmllbGQiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAidmFsdWUiOiAiIiwKICAgICAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJjYXNlX2ZpZWxkX3ZhbHVlIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAiZmllbGQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJpZCI6IDEyLAogICAgICAgICAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJjYXNlX2ZpZWxkIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInZhbHVlIjogIiIsCiAgICAgICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAiY2FzZV9maWVsZF92YWx1ZSIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgImZpZWxkIjogewogICAgICAgICAgICAgICAgICAgICAgICAiaWQiOiAxMywKICAgICAgICAgICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAiY2FzZV9maWVsZCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJ2YWx1ZSI6ICIiLAogICAgICAgICAgICAgICAgICAgICJyZXNvdXJjZV90eXBlIjogImNhc2VfZmllbGRfdmFsdWUiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICJmaWVsZCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgImlkIjogMTQsCiAgICAgICAgICAgICAgICAgICAgICAgICJyZXNvdXJjZV90eXBlIjogImNhc2VfZmllbGQiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAidmFsdWUiOiAiIiwKICAgICAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJjYXNlX2ZpZWxkX3ZhbHVlIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAiZmllbGQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJpZCI6IDE1LAogICAgICAgICAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJjYXNlX2ZpZWxkIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInZhbHVlIjogIiIsCiAgICAgICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAiY2FzZV9maWVsZF92YWx1ZSIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgImZpZWxkIjogewogICAgICAgICAgICAgICAgICAgICAgICAiaWQiOiAxNiwKICAgICAgICAgICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAiY2FzZV9maWVsZCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJ2YWx1ZSI6ICIiLAogICAgICAgICAgICAgICAgICAgICJyZXNvdXJjZV90eXBlIjogImNhc2VfZmllbGRfdmFsdWUiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICJmaWVsZCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgImlkIjogMTcsCiAgICAgICAgICAgICAgICAgICAgICAgICJyZXNvdXJjZV90eXBlIjogImNhc2VfZmllbGQiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAidmFsdWUiOiAiIiwKICAgICAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJjYXNlX2ZpZWxkX3ZhbHVlIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAiZmllbGQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJpZCI6IDE4LAogICAgICAgICAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJjYXNlX2ZpZWxkIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInZhbHVlIjogIiIsCiAgICAgICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAiY2FzZV9maWVsZF92YWx1ZSIKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgXSwKICAgICAgICAgICAgImxhc3RfcmVwbGllciI6IHsKICAgICAgICAgICAgICAgICJpZCI6IDMsCiAgICAgICAgICAgICAgICAidXVpZCI6ICI4MWQ4YTMyYy1kZTA3LTVlZDYtYjkyZi1lZjQyNjUwMjk5YTIiLAogICAgICAgICAgICAgICAgImZ1bGxfbmFtZSI6ICJUYXlsb3IgV2VzdCIsCiAgICAgICAgICAgICAgICAibGVnYWN5X2lkIjogbnVsbCwKICAgICAgICAgICAgICAgICJkZXNpZ25hdGlvbiI6IG51bGwsCiAgICAgICAgICAgICAgICAiaXNfZW5hYmxlZCI6IHRydWUsCiAgICAgICAgICAgICAgICAiaXNfbWZhX2VuYWJsZWQiOiBmYWxzZSwKICAgICAgICAgICAgICAgICJyb2xlIjogewogICAgICAgICAgICAgICAgICAgICJpZCI6IDQsCiAgICAgICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAicm9sZSIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAiYXZhdGFyIjogImh0dHBzOi8vPElNUE9SVF9LQVlBS09fRU5EUE9JTlRfSE9TVE5BTUU+L2F2YXRhci9nZXQvODFkOGEzMmMtZGUwNy01ZWQ2LWI5MmYtZWY0MjY1MDI5OWEyPzE2MzAwNjY3MzMiLAogICAgICAgICAgICAgICAgImFnZW50X2Nhc2VfYWNjZXNzIjogbnVsbCwKICAgICAgICAgICAgICAgICJvcmdhbml6YXRpb25fY2FzZV9hY2Nlc3MiOiAiUkVRVUVTVEVEIiwKICAgICAgICAgICAgICAgICJvcmdhbml6YXRpb24iOiB7CiAgICAgICAgICAgICAgICAgICAgImlkIjogMSwKICAgICAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJvcmdhbml6YXRpb24iCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgInRlYW1zIjogW10sCiAgICAgICAgICAgICAgICAiZW1haWxzIjogWwogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgImlkIjogMywKICAgICAgICAgICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAiaWRlbnRpdHlfZW1haWwiCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICJwaG9uZXMiOiBbXSwKICAgICAgICAgICAgICAgICJ0d2l0dGVyIjogWwogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgImlkIjogMSwKICAgICAgICAgICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAiaWRlbnRpdHlfdHdpdHRlciIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgImZhY2Vib29rIjogW10sCiAgICAgICAgICAgICAgICAiZXh0ZXJuYWxfaWRlbnRpZmllcnMiOiBbXSwKICAgICAgICAgICAgICAgICJjdXN0b21fZmllbGRzIjogW10sCiAgICAgICAgICAgICAgICAicGlubmVkX25vdGVzX2NvdW50IjogMCwKICAgICAgICAgICAgICAgICJsb2NhbGUiOiB7CiAgICAgICAgICAgICAgICAgICAgImlkIjogMywKICAgICAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJsb2NhbGUiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgInRpbWVfem9uZSI6ICJVVEMiLAogICAgICAgICAgICAgICAgInRpbWVfem9uZV9vZmZzZXQiOiAwLAogICAgICAgICAgICAgICAgImdyZWV0aW5nIjogbnVsbCwKICAgICAgICAgICAgICAgICJzaWduYXR1cmUiOiBudWxsLAogICAgICAgICAgICAgICAgInN0YXR1c19tZXNzYWdlIjogbnVsbCwKICAgICAgICAgICAgICAgICJsYXN0X3NlZW5fdXNlcl9hZ2VudCI6IG51bGwsCiAgICAgICAgICAgICAgICAibGFzdF9zZWVuX2lwIjogbnVsbCwKICAgICAgICAgICAgICAgICJsYXN0X3NlZW5fYXQiOiAiMjAyMS0wOC0yN1QxMjoxODo1MyswMDowMCIsCiAgICAgICAgICAgICAgICAibGFzdF9hY3RpdmVfYXQiOiAiMjAyMS0wOC0yN1QxMjoxODo1MyswMDowMCIsCiAgICAgICAgICAgICAgICAicmVhbHRpbWVfY2hhbm5lbCI6ICJwcmVzZW5jZS00NDI1NDNjZDQyMjg3NzUwNDAwMWViMDU1MGYxODlhZDM2MmQ2NDc1ZmE2ZDk1ZmQwZjJkOGVlMGZmNzcwZjY1QHYxX3VzZXJzXzMiLAogICAgICAgICAgICAgICAgInByZXNlbmNlX2NoYW5uZWwiOiAidXNlcl9wcmVzZW5jZS00NDI1NDNjZDQyMjg3NzUwNDAwMWViMDU1MGYxODlhZDM2MmQ2NDc1ZmE2ZDk1ZmQwZjJkOGVlMGZmNzcwZjY1QGRkMTMyZGQ5MTlkOGQwMDNjMmJjZDJlMDA2YTkxMzNhODY2OWQyMDQiLAogICAgICAgICAgICAgICAgInBhc3N3b3JkX3VwZGF0ZWRfYXQiOiAiMjAyMS0wOC0yNFQxODoyNDoxMSswMDowMCIsCiAgICAgICAgICAgICAgICAiYXZhdGFyX3VwZGF0ZWRfYXQiOiAiMjAyMS0wOC0yNFQxODoyNDoxMiswMDowMCIsCiAgICAgICAgICAgICAgICAibGFzdF9sb2dnZWRfaW5fYXQiOiBudWxsLAogICAgICAgICAgICAgICAgImxhc3RfYWN0aXZpdHlfYXQiOiBudWxsLAogICAgICAgICAgICAgICAgImNyZWF0ZWRfYXQiOiAiMjAyMS0wOC0yNFQxODoyNDoxMSswMDowMCIsCiAgICAgICAgICAgICAgICAidXBkYXRlZF9hdCI6ICIyMDIxLTA4LTI3VDEyOjE4OjUzKzAwOjAwIiwKICAgICAgICAgICAgICAgICJyZXNvdXJjZV90eXBlIjogInVzZXIiLAogICAgICAgICAgICAgICAgInJlc291cmNlX3VybCI6ICJodHRwczovLzxJTVBPUlRfS0FZQUtPX0VORFBPSU5UX0hPU1ROQU1FPi9hcGkvdjEvdXNlcnMvMyIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgImxhc3RfcmVwbGllcl9pZGVudGl0eSI6IHsKICAgICAgICAgICAgICAgICJpZCI6IDMsCiAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJpZGVudGl0eV9lbWFpbCIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgImxhc3RfdXBkYXRlZF9ieSI6IHsKICAgICAgICAgICAgICAgICJpZCI6IDMsCiAgICAgICAgICAgICAgICAidXVpZCI6ICI4MWQ4YTMyYy1kZTA3LTVlZDYtYjkyZi1lZjQyNjUwMjk5YTIiLAogICAgICAgICAgICAgICAgImZ1bGxfbmFtZSI6ICJUYXlsb3IgV2VzdCIsCiAgICAgICAgICAgICAgICAibGVnYWN5X2lkIjogbnVsbCwKICAgICAgICAgICAgICAgICJkZXNpZ25hdGlvbiI6IG51bGwsCiAgICAgICAgICAgICAgICAiaXNfZW5hYmxlZCI6IHRydWUsCiAgICAgICAgICAgICAgICAiaXNfbWZhX2VuYWJsZWQiOiBmYWxzZSwKICAgICAgICAgICAgICAgICJyb2xlIjogewogICAgICAgICAgICAgICAgICAgICJpZCI6IDQsCiAgICAgICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAicm9sZSIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAiYXZhdGFyIjogImh0dHBzOi8vPElNUE9SVF9LQVlBS09fRU5EUE9JTlRfSE9TVE5BTUU+L2F2YXRhci9nZXQvODFkOGEzMmMtZGUwNy01ZWQ2LWI5MmYtZWY0MjY1MDI5OWEyPzE2MzAwNjY3MzMiLAogICAgICAgICAgICAgICAgImFnZW50X2Nhc2VfYWNjZXNzIjogbnVsbCwKICAgICAgICAgICAgICAgICJvcmdhbml6YXRpb25fY2FzZV9hY2Nlc3MiOiAiUkVRVUVTVEVEIiwKICAgICAgICAgICAgICAgICJvcmdhbml6YXRpb24iOiB7CiAgICAgICAgICAgICAgICAgICAgImlkIjogMSwKICAgICAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJvcmdhbml6YXRpb24iCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgInRlYW1zIjogW10sCiAgICAgICAgICAgICAgICAiZW1haWxzIjogWwogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgImlkIjogMywKICAgICAgICAgICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAiaWRlbnRpdHlfZW1haWwiCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICJwaG9uZXMiOiBbXSwKICAgICAgICAgICAgICAgICJ0d2l0dGVyIjogWwogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgImlkIjogMSwKICAgICAgICAgICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAiaWRlbnRpdHlfdHdpdHRlciIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgImZhY2Vib29rIjogW10sCiAgICAgICAgICAgICAgICAiZXh0ZXJuYWxfaWRlbnRpZmllcnMiOiBbXSwKICAgICAgICAgICAgICAgICJjdXN0b21fZmllbGRzIjogW10sCiAgICAgICAgICAgICAgICAicGlubmVkX25vdGVzX2NvdW50IjogMCwKICAgICAgICAgICAgICAgICJsb2NhbGUiOiB7CiAgICAgICAgICAgICAgICAgICAgImlkIjogMywKICAgICAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJsb2NhbGUiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgInRpbWVfem9uZSI6ICJVVEMiLAogICAgICAgICAgICAgICAgInRpbWVfem9uZV9vZmZzZXQiOiAwLAogICAgICAgICAgICAgICAgImdyZWV0aW5nIjogbnVsbCwKICAgICAgICAgICAgICAgICJzaWduYXR1cmUiOiBudWxsLAogICAgICAgICAgICAgICAgInN0YXR1c19tZXNzYWdlIjogbnVsbCwKICAgICAgICAgICAgICAgICJsYXN0X3NlZW5fdXNlcl9hZ2VudCI6IG51bGwsCiAgICAgICAgICAgICAgICAibGFzdF9zZWVuX2lwIjogbnVsbCwKICAgICAgICAgICAgICAgICJsYXN0X3NlZW5fYXQiOiAiMjAyMS0wOC0yN1QxMjoxODo1MyswMDowMCIsCiAgICAgICAgICAgICAgICAibGFzdF9hY3RpdmVfYXQiOiAiMjAyMS0wOC0yN1QxMjoxODo1MyswMDowMCIsCiAgICAgICAgICAgICAgICAicmVhbHRpbWVfY2hhbm5lbCI6ICJwcmVzZW5jZS00NDI1NDNjZDQyMjg3NzUwNDAwMWViMDU1MGYxODlhZDM2MmQ2NDc1ZmE2ZDk1ZmQwZjJkOGVlMGZmNzcwZjY1QHYxX3VzZXJzXzMiLAogICAgICAgICAgICAgICAgInByZXNlbmNlX2NoYW5uZWwiOiAidXNlcl9wcmVzZW5jZS00NDI1NDNjZDQyMjg3NzUwNDAwMWViMDU1MGYxODlhZDM2MmQ2NDc1ZmE2ZDk1ZmQwZjJkOGVlMGZmNzcwZjY1QGRkMTMyZGQ5MTlkOGQwMDNjMmJjZDJlMDA2YTkxMzNhODY2OWQyMDQiLAogICAgICAgICAgICAgICAgInBhc3N3b3JkX3VwZGF0ZWRfYXQiOiAiMjAyMS0wOC0yNFQxODoyNDoxMSswMDowMCIsCiAgICAgICAgICAgICAgICAiYXZhdGFyX3VwZGF0ZWRfYXQiOiAiMjAyMS0wOC0yNFQxODoyNDoxMiswMDowMCIsCiAgICAgICAgICAgICAgICAibGFzdF9sb2dnZWRfaW5fYXQiOiBudWxsLAogICAgICAgICAgICAgICAgImxhc3RfYWN0aXZpdHlfYXQiOiBudWxsLAogICAgICAgICAgICAgICAgImNyZWF0ZWRfYXQiOiAiMjAyMS0wOC0yNFQxODoyNDoxMSswMDowMCIsCiAgICAgICAgICAgICAgICAidXBkYXRlZF9hdCI6ICIyMDIxLTA4LTI3VDEyOjE4OjUzKzAwOjAwIiwKICAgICAgICAgICAgICAgICJyZXNvdXJjZV90eXBlIjogInVzZXIiLAogICAgICAgICAgICAgICAgInJlc291cmNlX3VybCI6ICJodHRwczovLzxJTVBPUlRfS0FZQUtPX0VORFBPSU5UX0hPU1ROQU1FPi9hcGkvdjEvdXNlcnMvMyIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgImxhc3RfY29tcGxldGVkX2J5IjogbnVsbCwKICAgICAgICAgICAgImxhc3RfY2xvc2VkX2J5IjogbnVsbCwKICAgICAgICAgICAgInN0YXRlIjogIkFDVElWRSIsCiAgICAgICAgICAgICJwb3N0X2NvdW50IjogOCwKICAgICAgICAgICAgImhhc19ub3RlcyI6IGZhbHNlLAogICAgICAgICAgICAicGlubmVkX25vdGVzX2NvdW50IjogMCwKICAgICAgICAgICAgImhhc19hdHRhY2htZW50cyI6IGZhbHNlLAogICAgICAgICAgICAiaXNfbWVyZ2VkIjogZmFsc2UsCiAgICAgICAgICAgICJyYXRpbmciOiBudWxsLAogICAgICAgICAgICAicmF0aW5nX3N0YXR1cyI6ICJVTk9GRkVSRUQiLAogICAgICAgICAgICAidGFncyI6IFtdLAogICAgICAgICAgICAibGFzdF9wb3N0X3N0YXR1cyI6ICJERUxJVkVSRUQiLAogICAgICAgICAgICAibGFzdF9wb3N0X3ByZXZpZXciOiAiV0hBVD8hIFRoYW5rIHlvdSB2ZXJ5IG11Y2ghIPCfmI0iLAogICAgICAgICAgICAibGFzdF9wb3N0X3R5cGUiOiAiUFVCTElDIiwKICAgICAgICAgICAgImxhc3RfbWVzc2FnZV9wcmV2aWV3IjogIldIQVQ/ISBUaGFuayB5b3UgdmVyeSBtdWNoISDwn5iNIiwKICAgICAgICAgICAgInJlYWx0aW1lX2NoYW5uZWwiOiAicHJlc2VuY2UtNDQyNTQzY2Q0MjI4Nzc1MDQwMDFlYjA1NTBmMTg5YWQzNjJkNjQ3NWZhNmQ5NWZkMGYyZDhlZTBmZjc3MGY2NUB2MV9jYXNlc18xIiwKICAgICAgICAgICAgImxhc3RfYXNzaWduZWRfYXQiOiAiMjAyMS0wOC0yNFQxODoyNDozOSswMDowMCIsCiAgICAgICAgICAgICJsYXN0X3JlcGxpZWRfYXQiOiAiMjAyMS0wOC0yNFQxODowOTo0NCswMDowMCIsCiAgICAgICAgICAgICJsYXN0X29wZW5lZF9hdCI6ICIyMDIxLTA4LTI0VDE4OjI0OjM5KzAwOjAwIiwKICAgICAgICAgICAgImxhc3RfcGVuZGluZ19hdCI6ICIyMDIxLTA4LTI0VDE4OjI0OjI4KzAwOjAwIiwKICAgICAgICAgICAgImxhc3RfY2xvc2VkX2F0IjogbnVsbCwKICAgICAgICAgICAgImxhc3RfY29tcGxldGVkX2F0IjogIjIwMjEtMDgtMjRUMTg6MjQ6MzgrMDA6MDAiLAogICAgICAgICAgICAibGFzdF9hZ2VudF9hY3Rpdml0eV9hdCI6IG51bGwsCiAgICAgICAgICAgICJsYXN0X2N1c3RvbWVyX2FjdGl2aXR5X2F0IjogIjIwMjEtMDgtMjRUMTg6MjQ6MjMrMDA6MDAiLAogICAgICAgICAgICAibGFzdF9yZXBseV9ieV9hZ2VudF9hdCI6IG51bGwsCiAgICAgICAgICAgICJsYXN0X3JlcGx5X2J5X3JlcXVlc3Rlcl9hdCI6IG51bGwsCiAgICAgICAgICAgICJhZ2VudF91cGRhdGVkX2F0IjogbnVsbCwKICAgICAgICAgICAgImxhdGVzdF9hc3NpZ25lZV91cGRhdGUiOiBudWxsLAogICAgICAgICAgICAiY3JlYXRlZF9hdCI6ICIyMDIxLTA4LTI0VDE4OjA5OjM2KzAwOjAwIiwKICAgICAgICAgICAgInVwZGF0ZWRfYXQiOiAiMjAyMS0wOC0yNFQxODoyNDozMSswMDowMCIsCiAgICAgICAgICAgICJyZXNvdXJjZV90eXBlIjogImNhc2UiLAogICAgICAgICAgICAicmVzb3VyY2VfdXJsIjogImh0dHBzOi8vPElNUE9SVF9LQVlBS09fRU5EUE9JTlRfSE9TVE5BTUU+L2FwaS92MS9jYXNlcy8xIgogICAgICAgIH0KICAgIF0sCiAgICAicmVzb3VyY2UiOiAiY2FzZSIsCiAgICAib2Zmc2V0IjogMCwKICAgICJsaW1pdCI6IDEwMCwKICAgICJ0b3RhbF9jb3VudCI6IDUKfQ== + recorded_at: Fri, 01 Oct 2021 15:58:57 GMT +- request: + method: get + uri: https:///api/v1/cases/3/posts?include=mailbox,message_recipient,channel,attachment,case_message,note,chat_message,identity_email,identity_twitter,identity_facebook,facebook_message,facebook_post,facebook_post_comment,twitter_message,twitter_tweet&limit=100 + body: + encoding: US-ASCII + string: '' + headers: + Content-Type: + - application/json + X-Session-Id: + - TayW6Qnt0Loid4b9a618960d7e46555d8d95657ab22808718f64lWdx9dau5cFE99JtQiSLIv2Y5Asz + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + User-Agent: + - Ruby + Host: + - "" + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx + Date: + - Fri, 01 Oct 2021 15:58:58 GMT + Content-Type: + - application/json + Transfer-Encoding: + - chunked + Connection: + - keep-alive + Cache-Control: + - private, max-age=0, must-revalidate + Expires: + - '0' + X-Api-Version: + - '1' + Date-Iso: + - '2021-10-01T15:58:58+00:00' + Access-Control-Expose-Headers: + - Date-ISO + X-Xss-Protection: + - 1; mode=block + X-Content-Type-Options: + - nosniff + Strict-Transport-Security: + - max-age=31536000; includeSubDomains preload + body: + encoding: ASCII-8BIT + string: |- + { + "status": 200, + "data": [ + { + "id": 36, + "uuid": "db6befb5-24a7-43ee-afc4-4b4deb94ea55", + "client_id": "232d1622-4667-431d-9a97-7cd028bbb419", + "subject": "We will help the guy.\n", + "contents": "We will help the guy.\n", + "creator": { + "id": 1, + "resource_type": "user" + }, + "identity": { + "id": 1, + "email": "", + "is_primary": true, + "is_validated": true, + "is_notification_enabled": false, + "created_at": "2021-08-24T18:24:11+00:00", + "updated_at": "2021-08-27T06:57:08+00:00", + "resource_type": "identity_email", + "resource_url": "https:///api/v1/identities/emails/1" + }, + "source_channel": { + "uuid": "cf3cd39a-54bf-5e5e-912b-883919f3ab1e", + "type": "NOTE", + "character_limit": null, + "account": null, + "resource_type": "channel" + }, + "attachments": [ + { + "id": 1, + "name": "favicon.ico", + "size": 32988, + "width": 0, + "height": 0, + "type": "image/x-icon", + "content_id": null, + "alt": null, + "url": "https:///api/v1/cases/3/notes/3/attachments/1/url", + "url_download": "https:///api/v1/cases/3/notes/3/attachments/1/download", + "thumbnails": [], + "created_at": "2021-08-27T11:26:26+00:00", + "resource_type": "attachment", + "resource_url": "https:///api/v1/cases/3/notes/3/attachments/1" + } + ], + "download_all": "https:///api/v1/cases/3/notes/3/attachments/download/all", + "destination_medium": null, + "source": null, + "metadata": { + "user_agent": "", + "page_url": "" + }, + "original": { + "id": 3, + "body_text": "We will help the guy.\n", + "body_html": "We will help the guy.
", + "is_pinned": false, + "pinned_by": null, + "user": { + "id": 1, + "resource_type": "user" + }, + "creator": { + "id": 1, + "resource_type": "user" + }, + "attachments": [ + { + "id": 1, + "name": "favicon.ico", + "size": 32988, + "width": 0, + "height": 0, + "type": "image/x-icon", + "content_id": null, + "alt": null, + "url": "https:///api/v1/cases/3/notes/3/attachments/1/url", + "url_download": "https:///api/v1/cases/3/notes/3/attachments/1/download", + "thumbnails": [], + "created_at": "2021-08-27T11:26:26+00:00", + "resource_type": "attachment", + "resource_url": "https:///api/v1/cases/3/notes/3/attachments/1" + } + ], + "download_all": "https:///api/v1/cases/3/notes/3/attachments/download/all", + "created_at": "2021-08-27T11:26:26+00:00", + "updated_at": "2021-08-27T11:26:26+00:00", + "resource_type": "note", + "resource_url": "https:///api/v1/cases/3/notes/3" + }, + "post_status": "DELIVERED", + "post_status_reject_type": null, + "post_status_reject_reason": null, + "post_status_updated_at": "2021-08-27T11:26:26+00:00", + "is_requester": false, + "created_at": "2021-08-27T11:26:26+00:00", + "updated_at": "2021-08-27T11:26:26+00:00", + "resource_type": "post", + "resource_url": "https:///api/v1/cases/posts/36" + }, + { + "id": 35, + "uuid": "318284f1-a910-416f-b51a-8de586a505a2", + "client_id": "", + "subject": "A test question", + "contents": "Hello together,\n\ncan you help me?\n\nBest regards,\nDominik", + "creator": { + "id": 7, + "resource_type": "user" + }, + "identity": { + "id": 7, + "email": "dominik.klein.morsbach@gmail.com", + "is_primary": true, + "is_validated": false, + "is_notification_enabled": false, + "created_at": "2021-08-27T10:49:56+00:00", + "updated_at": "2021-08-27T10:49:56+00:00", + "resource_type": "identity_email", + "resource_url": "https:///api/v1/identities/emails/7" + }, + "source_channel": { + "uuid": "fd3a8116-95c2-492e-9af3-b3ab57dc9f1a", + "type": "MAIL", + "character_limit": null, + "account": { + "id": 1, + "uuid": "fd3a8116-95c2-492e-9af3-b3ab57dc9f1a", + "address": "support@", + "brand": { + "id": 1, + "resource_type": "brand" + }, + "is_system": true, + "is_custom": false, + "is_verified": false, + "is_default": true, + "is_enabled": false, + "is_deleted": false, + "verified_at": null, + "created_at": "2021-08-24T18:24:18+00:00", + "updated_at": "2021-08-27T06:57:08+00:00", + "resource_type": "mailbox", + "resource_url": "https:///api/v1/mailboxes/1" + }, + "resource_type": "channel" + }, + "attachments": [], + "download_all": null, + "destination_medium": null, + "source": null, + "metadata": { + "user_agent": "", + "page_url": "" + }, + "original": { + "id": 4, + "uuid": "318284f1-a910-416f-b51a-8de586a505a2", + "subject": "A test question", + "body_text": "Hello together,\n\ncan you help me?\n\nBest regards,\nDominik", + "body_html": "
\n Hello together,\n
\n
\n
\n
\n can you help me?\n
\n
\n
\n
\n
\n Best regards,\n
\n
\n Dominik\n
\n
", + "recipients": [], + "fullname": "Dominik Klein", + "email": "dominik.klein.morsbach@gmail.com", + "creator": { + "id": 7, + "resource_type": "user" + }, + "identity": { + "id": 7, + "email": "dominik.klein.morsbach@gmail.com", + "is_primary": true, + "is_validated": false, + "is_notification_enabled": false, + "created_at": "2021-08-27T10:49:56+00:00", + "updated_at": "2021-08-27T10:49:56+00:00", + "resource_type": "identity_email", + "resource_url": "https:///api/v1/identities/emails/7" + }, + "mailbox": { + "id": 1, + "uuid": "fd3a8116-95c2-492e-9af3-b3ab57dc9f1a", + "address": "support@", + "brand": { + "id": 1, + "resource_type": "brand" + }, + "is_system": true, + "is_custom": false, + "is_verified": false, + "is_default": true, + "is_enabled": false, + "is_deleted": false, + "verified_at": null, + "created_at": "2021-08-24T18:24:18+00:00", + "updated_at": "2021-08-27T06:57:08+00:00", + "resource_type": "mailbox", + "resource_url": "https:///api/v1/mailboxes/1" + }, + "attachments": [], + "download_all": null, + "locale": null, + "response_time": 0, + "created_at": "2021-08-27T10:49:56+00:00", + "updated_at": "2021-08-27T10:49:56+00:00", + "resource_type": "case_message", + "resource_url": "https:///api/v1/cases/3/messages/4" + }, + "post_status": "SEEN", + "post_status_reject_type": null, + "post_status_reject_reason": null, + "post_status_updated_at": "2021-08-27T11:26:26+00:00", + "is_requester": true, + "created_at": "2021-08-27T10:49:56+00:00", + "updated_at": "2021-08-27T11:26:26+00:00", + "resource_type": "post", + "resource_url": "https:///api/v1/cases/posts/35" + } + ], + "resource": "post", + "limit": 100, + "total_count": 2 + } + recorded_at: Fri, 01 Oct 2021 15:58:58 GMT +- request: + method: get + uri: https:///api/v1/cases/3/notes/3/attachments/1/download + body: + encoding: US-ASCII + string: '' + headers: + Content-Type: + - application/json + X-Session-Id: + - TayW6Qnt0Loid4b9a618960d7e46555d8d95657ab22808718f64lWdx9dau5cFE99JtQiSLIv2Y5Asz + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + User-Agent: + - Ruby + Host: + - "" + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx + Date: + - Fri, 01 Oct 2021 15:58:58 GMT + Content-Type: + - image/x-icon + Transfer-Encoding: + - chunked + Connection: + - keep-alive + Content-Transfer-Encoding: + - binary + Content-Disposition: + - attachment; filename="favicon.ico" + Date-Iso: + - '2021-10-01T15:58:58+00:00' + Access-Control-Expose-Headers: + - Date-ISO + X-Xss-Protection: + - 1; mode=block + X-Content-Type-Options: + - nosniff + Strict-Transport-Security: + - max-age=31536000; includeSubDomains preload + body: + encoding: ASCII-8BIT + string: !binary |- + AAABAAQAQEAAAAEAIAAoQAAARgAAACAgAAABACAAKBAAAG5AAAAYGAAAAQAgACgJAACWUAAAEBAAAAEAIAAoBAAAvlkAACgAAABAAAAAgAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAu0f8WAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJM7/FS/Q/YIv0P9hGsz/CgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8BLtH/eSzQ/Osv0P2RK87/KgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAu0f89LND85DDR//8vzvzCLc//Wiuq/wYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACbM/xQv0P63MNH//zDR//8s0PzrLtH9iizM/yMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AS/Q/3gt0Pz7MNH//zDR//8vzvz+L9D+ui/Q/1IAv/8EAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL9D/PCzQ/OQw0f//MNH//zDR//8w0f//LdD85S/Q/YIsyv8dAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA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AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMihAGrJogD/yaIA/8miAP/IngDGyJ4AKgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMegAE7InwD8yaIA/8igAPPHoQBtgIAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMeeADfGoQD1yaIA/8miALfFnAAfAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMacACTJoQDqxp4A7MihAFwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL+ZABTIoADbyKEApsKeABUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMaOAAnGoQCryaAASwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHIoABGxJ0ADQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKAAAACAAAABAAAAAAQAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMz/BQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv0P8mLtH/dC/Q/ysAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAtw/8RL87+sjDP/MEv0P9XAMz/BQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8BL9D/dy3Q/PwvzvzoL9D9gyzK/x0AAAAAAAAAAAAAAAAAAAAAAAAAAAAA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AP/GogDs39+ACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgIAAAgAAAAAAAAAAAAAAAMihAIrJogD/xqEAq8WXABYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADHogBoyKAA6MigAFMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAx6EAScefAKDGnAASAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL+ZABTGogA/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAoAAAAGAAAADAAAAABACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA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AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + recorded_at: Fri, 01 Oct 2021 15:58:59 GMT +- request: + method: get + uri: https:///api/v1/cases/5/posts?include=mailbox,message_recipient,channel,attachment,case_message,note,chat_message,identity_email,identity_twitter,identity_facebook,facebook_message,facebook_post,facebook_post_comment,twitter_message,twitter_tweet&limit=100 + body: + encoding: US-ASCII + string: '' + headers: + Content-Type: + - application/json + X-Session-Id: + - TayW6Qnt0Loid4b9a618960d7e46555d8d95657ab22808718f64lWdx9dau5cFE99JtQiSLIv2Y5Asz + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + User-Agent: + - Ruby + Host: + - "" + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx + Date: + - Fri, 01 Oct 2021 15:58:59 GMT + Content-Type: + - application/json + Transfer-Encoding: + - chunked + Connection: + - keep-alive + Cache-Control: + - private, max-age=0, must-revalidate + Expires: + - '0' + X-Api-Version: + - '1' + Date-Iso: + - '2021-10-01T15:58:59+00:00' + Access-Control-Expose-Headers: + - Date-ISO + X-Xss-Protection: + - 1; mode=block + X-Content-Type-Options: + - nosniff + Strict-Transport-Security: + - max-age=31536000; includeSubDomains preload + body: + encoding: ASCII-8BIT + string: |- + { + "status": 200, + "data": [ + { + "id": 50, + "uuid": "4f92e9a2-9662-4fc2-b2e3-b23869f1191b", + "client_id": "", + "subject": "A example for a closed ticket.\n", + "contents": "A example for a closed ticket.\n", + "creator": { + "id": 1, + "resource_type": "user" + }, + "identity": { + "id": 1, + "email": "", + "is_primary": true, + "is_validated": true, + "is_notification_enabled": false, + "created_at": "2021-08-24T18:24:11+00:00", + "updated_at": "2021-08-27T06:57:08+00:00", + "resource_type": "identity_email", + "resource_url": "https:///api/v1/identities/emails/1" + }, + "source_channel": { + "uuid": "cf3cd39a-54bf-5e5e-912b-883919f3ab1e", + "type": "NOTE", + "character_limit": null, + "account": null, + "resource_type": "channel" + }, + "attachments": [], + "download_all": null, + "destination_medium": null, + "source": null, + "metadata": { + "user_agent": "", + "page_url": "" + }, + "original": { + "id": 4, + "body_text": "A example for a closed ticket.\n", + "body_html": "A example for a closed ticket.
", + "is_pinned": false, + "pinned_by": null, + "user": { + "id": 1, + "resource_type": "user" + }, + "creator": { + "id": 1, + "resource_type": "user" + }, + "attachments": [], + "download_all": null, + "created_at": "2021-08-27T12:20:33+00:00", + "updated_at": "2021-08-27T12:20:33+00:00", + "resource_type": "note", + "resource_url": "https:///api/v1/cases/5/notes/4" + }, + "post_status": "DELIVERED", + "post_status_reject_type": null, + "post_status_reject_reason": null, + "post_status_updated_at": "2021-08-27T12:20:33+00:00", + "is_requester": false, + "created_at": "2021-08-27T12:20:33+00:00", + "updated_at": "2021-08-27T12:20:33+00:00", + "resource_type": "post", + "resource_url": "https:///api/v1/cases/posts/50" + } + ], + "resource": "post", + "limit": 100, + "total_count": 1 + } + recorded_at: Fri, 01 Oct 2021 15:58:59 GMT +- request: + method: get + uri: https:///api/v1/cases/4/posts?include=mailbox,message_recipient,channel,attachment,case_message,note,chat_message,identity_email,identity_twitter,identity_facebook,facebook_message,facebook_post,facebook_post_comment,twitter_message,twitter_tweet&limit=100 + body: + encoding: US-ASCII + string: '' + headers: + Content-Type: + - application/json + X-Session-Id: + - TayW6Qnt0Loid4b9a618960d7e46555d8d95657ab22808718f64lWdx9dau5cFE99JtQiSLIv2Y5Asz + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + User-Agent: + - Ruby + Host: + - "" + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx + Date: + - Fri, 01 Oct 2021 15:59:00 GMT + Content-Type: + - application/json + Transfer-Encoding: + - chunked + Connection: + - keep-alive + Cache-Control: + - private, max-age=0, must-revalidate + Expires: + - '0' + X-Api-Version: + - '1' + Date-Iso: + - '2021-10-01T15:59:00+00:00' + Access-Control-Expose-Headers: + - Date-ISO + X-Xss-Protection: + - 1; mode=block + X-Content-Type-Options: + - nosniff + Strict-Transport-Security: + - max-age=31536000; includeSubDomains preload + body: + encoding: ASCII-8BIT + string: |- + { + "status": 200, + "data": [ + { + "id": 48, + "uuid": "e959e7e9-f1db-4e5e-b7b6-fd4ea224d87a", + "client_id": "", + "subject": "I have a problem with my mac", + "contents": "Can you help me?", + "creator": { + "id": 3, + "resource_type": "user" + }, + "identity": { + "id": 3, + "email": "rainbowcitycafe@gmail.com", + "is_primary": true, + "is_validated": false, + "is_notification_enabled": false, + "created_at": "2021-08-24T18:24:12+00:00", + "updated_at": "2021-08-24T18:24:12+00:00", + "resource_type": "identity_email", + "resource_url": "https:///api/v1/identities/emails/3" + }, + "source_channel": { + "uuid": "8c9b56bd-10bd-5c91-93da-1904193ead4e", + "type": "HELPCENTER", + "character_limit": null, + "account": null, + "resource_type": "channel" + }, + "attachments": [], + "download_all": null, + "destination_medium": null, + "source": "HELPCENTER", + "metadata": { + "user_agent": "", + "page_url": "" + }, + "original": { + "id": 5, + "uuid": "e959e7e9-f1db-4e5e-b7b6-fd4ea224d87a", + "subject": "I have a problem with my mac", + "body_text": "Can you help me?", + "body_html": "Can you help me?", + "recipients": [], + "fullname": "Taylor West", + "email": "rainbowcitycafe@gmail.com", + "creator": { + "id": 3, + "resource_type": "user" + }, + "identity": { + "id": 3, + "email": "rainbowcitycafe@gmail.com", + "is_primary": true, + "is_validated": false, + "is_notification_enabled": false, + "created_at": "2021-08-24T18:24:12+00:00", + "updated_at": "2021-08-24T18:24:12+00:00", + "resource_type": "identity_email", + "resource_url": "https:///api/v1/identities/emails/3" + }, + "mailbox": null, + "attachments": [], + "download_all": null, + "locale": null, + "response_time": 0, + "created_at": "2021-08-27T12:18:53+00:00", + "updated_at": "2021-08-27T12:18:53+00:00", + "resource_type": "case_message", + "resource_url": "https:///api/v1/cases/4/messages/5" + }, + "post_status": "SEEN", + "post_status_reject_type": null, + "post_status_reject_reason": null, + "post_status_updated_at": "2021-08-27T12:19:53+00:00", + "is_requester": true, + "created_at": "2021-08-27T12:18:53+00:00", + "updated_at": "2021-08-27T12:19:53+00:00", + "resource_type": "post", + "resource_url": "https:///api/v1/cases/posts/48" + } + ], + "resource": "post", + "limit": 100, + "total_count": 1 + } + recorded_at: Fri, 01 Oct 2021 15:59:00 GMT +- request: + method: get + uri: https:///api/v1/cases/2/posts?include=mailbox,message_recipient,channel,attachment,case_message,note,chat_message,identity_email,identity_twitter,identity_facebook,facebook_message,facebook_post,facebook_post_comment,twitter_message,twitter_tweet&limit=100 + body: + encoding: US-ASCII + string: '' + headers: + Content-Type: + - application/json + X-Session-Id: + - TayW6Qnt0Loid4b9a618960d7e46555d8d95657ab22808718f64lWdx9dau5cFE99JtQiSLIv2Y5Asz + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + User-Agent: + - Ruby + Host: + - "" + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx + Date: + - Fri, 01 Oct 2021 15:59:00 GMT + Content-Type: + - application/json + Transfer-Encoding: + - chunked + Connection: + - keep-alive + Cache-Control: + - private, max-age=0, must-revalidate + Expires: + - '0' + X-Api-Version: + - '1' + Date-Iso: + - '2021-10-01T15:59:00+00:00' + Access-Control-Expose-Headers: + - Date-ISO + X-Xss-Protection: + - 1; mode=block + X-Content-Type-Options: + - nosniff + Strict-Transport-Security: + - max-age=31536000; includeSubDomains preload + body: + encoding: ASCII-8BIT + string: !binary |- + ewogICAgInN0YXR1cyI6IDIwMCwKICAgICJkYXRhIjogWwogICAgICAgIHsKICAgICAgICAgICAgImlkIjogMzQsCiAgICAgICAgICAgICJ1dWlkIjogIjRhZWQxOWYxLTkyYTAtNGNkNC04YzhlLTE2NWViMWUwMWE2OCIsCiAgICAgICAgICAgICJjbGllbnRfaWQiOiAiIiwKICAgICAgICAgICAgInN1YmplY3QiOiAiSSB3YW50IHRvIHB1cmNoYXNlIGFuIGFzc29ydGVkIHNldCBvZiByZXRhaWwgZXF1aXBtZW50LiBJ4oCZbSBub3QgYWJsZSB0byBidWlsZCBteSBidW5kbGUuIENhbiB5b3UgaGVscCBtZSB3aXRoIHRoaXMgcHVyY2hhc2U/IExvb2tpbmcgZm9yd2FyZCB0byBtb3JlIGluZm9ybWF0aW9uISIsCiAgICAgICAgICAgICJjb250ZW50cyI6ICJJIHdhbnQgdG8gcHVyY2hhc2UgYW4gYXNzb3J0ZWQgc2V0IG9mIHJldGFpbCBlcXVpcG1lbnQuIEnigJltIG5vdCBhYmxlIHRvIGJ1aWxkIG15IGJ1bmRsZS4gQ2FuIHlvdSBoZWxwIG1lIHdpdGggdGhpcyBwdXJjaGFzZT8gTG9va2luZyBmb3J3YXJkIHRvIG1vcmUgaW5mb3JtYXRpb24hIiwKICAgICAgICAgICAgImNyZWF0b3IiOiB7CiAgICAgICAgICAgICAgICAiaWQiOiAxLAogICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAidXNlciIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgImlkZW50aXR5IjogewogICAgICAgICAgICAgICAgImlkIjogMSwKICAgICAgICAgICAgICAgICJlbWFpbCI6ICI8SU1QT1JUX0tBWUFLT19FTkRQT0lOVF9VU0VSTkFNRT4iLAogICAgICAgICAgICAgICAgImlzX3ByaW1hcnkiOiB0cnVlLAogICAgICAgICAgICAgICAgImlzX3ZhbGlkYXRlZCI6IHRydWUsCiAgICAgICAgICAgICAgICAiaXNfbm90aWZpY2F0aW9uX2VuYWJsZWQiOiBmYWxzZSwKICAgICAgICAgICAgICAgICJjcmVhdGVkX2F0IjogIjIwMjEtMDgtMjRUMTg6MjQ6MTErMDA6MDAiLAogICAgICAgICAgICAgICAgInVwZGF0ZWRfYXQiOiAiMjAyMS0wOC0yN1QwNjo1NzowOCswMDowMCIsCiAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJpZGVudGl0eV9lbWFpbCIsCiAgICAgICAgICAgICAgICAicmVzb3VyY2VfdXJsIjogImh0dHBzOi8vPElNUE9SVF9LQVlBS09fRU5EUE9JTlRfSE9TVE5BTUU+L2FwaS92MS9pZGVudGl0aWVzL2VtYWlscy8xIgogICAgICAgICAgICB9LAogICAgICAgICAgICAic291cmNlX2NoYW5uZWwiOiB7CiAgICAgICAgICAgICAgICAidXVpZCI6ICJjZjNjZDM5YS01NGJmLTVlNWUtOTEyYi04ODM5MTlmM2FiMWUiLAogICAgICAgICAgICAgICAgInR5cGUiOiAiTk9URSIsCiAgICAgICAgICAgICAgICAiY2hhcmFjdGVyX2xpbWl0IjogbnVsbCwKICAgICAgICAgICAgICAgICJhY2NvdW50IjogbnVsbCwKICAgICAgICAgICAgICAgICJyZXNvdXJjZV90eXBlIjogImNoYW5uZWwiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJhdHRhY2htZW50cyI6IFtdLAogICAgICAgICAgICAiZG93bmxvYWRfYWxsIjogbnVsbCwKICAgICAgICAgICAgImRlc3RpbmF0aW9uX21lZGl1bSI6IG51bGwsCiAgICAgICAgICAgICJzb3VyY2UiOiBudWxsLAogICAgICAgICAgICAibWV0YWRhdGEiOiB7CiAgICAgICAgICAgICAgICAidXNlcl9hZ2VudCI6ICIiLAogICAgICAgICAgICAgICAgInBhZ2VfdXJsIjogIiIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgIm9yaWdpbmFsIjogewogICAgICAgICAgICAgICAgImlkIjogMiwKICAgICAgICAgICAgICAgICJib2R5X3RleHQiOiAiSSB3YW50IHRvIHB1cmNoYXNlIGFuIGFzc29ydGVkIHNldCBvZiByZXRhaWwgZXF1aXBtZW50LiBJ4oCZbSBub3QgYWJsZSB0byBidWlsZCBteSBidW5kbGUuIENhbiB5b3UgaGVscCBtZSB3aXRoIHRoaXMgcHVyY2hhc2U/IExvb2tpbmcgZm9yd2FyZCB0byBtb3JlIGluZm9ybWF0aW9uISIsCiAgICAgICAgICAgICAgICAiYm9keV9odG1sIjogIkkgd2FudCB0byBwdXJjaGFzZSBhbiBhc3NvcnRlZCBzZXQgb2YgcmV0YWlsIGVxdWlwbWVudC4gSeKAmW0gbm90IGFibGUgdG8gYnVpbGQgbXkgYnVuZGxlLiBDYW4geW91IGhlbHAgbWUgd2l0aCB0aGlzIHB1cmNoYXNlPyBMb29raW5nIGZvcndhcmQgdG8gbW9yZSBpbmZvcm1hdGlvbiEiLAogICAgICAgICAgICAgICAgImlzX3Bpbm5lZCI6IGZhbHNlLAogICAgICAgICAgICAgICAgInBpbm5lZF9ieSI6IG51bGwsCiAgICAgICAgICAgICAgICAidXNlciI6IHsKICAgICAgICAgICAgICAgICAgICAiaWQiOiAxLAogICAgICAgICAgICAgICAgICAgICJyZXNvdXJjZV90eXBlIjogInVzZXIiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgImNyZWF0b3IiOiB7CiAgICAgICAgICAgICAgICAgICAgImlkIjogMSwKICAgICAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJ1c2VyIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJhdHRhY2htZW50cyI6IFtdLAogICAgICAgICAgICAgICAgImRvd25sb2FkX2FsbCI6IG51bGwsCiAgICAgICAgICAgICAgICAiY3JlYXRlZF9hdCI6ICIyMDIxLTA4LTI3VDEwOjQ1OjUxKzAwOjAwIiwKICAgICAgICAgICAgICAgICJ1cGRhdGVkX2F0IjogIjIwMjEtMDgtMjdUMTA6NDU6NTErMDA6MDAiLAogICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAibm90ZSIsCiAgICAgICAgICAgICAgICAicmVzb3VyY2VfdXJsIjogImh0dHBzOi8vPElNUE9SVF9LQVlBS09fRU5EUE9JTlRfSE9TVE5BTUU+L2FwaS92MS9jYXNlcy8yL25vdGVzLzIiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJwb3N0X3N0YXR1cyI6ICJERUxJVkVSRUQiLAogICAgICAgICAgICAicG9zdF9zdGF0dXNfcmVqZWN0X3R5cGUiOiBudWxsLAogICAgICAgICAgICAicG9zdF9zdGF0dXNfcmVqZWN0X3JlYXNvbiI6IG51bGwsCiAgICAgICAgICAgICJwb3N0X3N0YXR1c191cGRhdGVkX2F0IjogIjIwMjEtMDgtMjdUMTA6NDU6NTErMDA6MDAiLAogICAgICAgICAgICAiaXNfcmVxdWVzdGVyIjogZmFsc2UsCiAgICAgICAgICAgICJjcmVhdGVkX2F0IjogIjIwMjEtMDgtMjdUMTA6NDU6NTErMDA6MDAiLAogICAgICAgICAgICAidXBkYXRlZF9hdCI6ICIyMDIxLTA4LTI3VDEwOjQ1OjUxKzAwOjAwIiwKICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAicG9zdCIsCiAgICAgICAgICAgICJyZXNvdXJjZV91cmwiOiAiaHR0cHM6Ly88SU1QT1JUX0tBWUFLT19FTkRQT0lOVF9IT1NUTkFNRT4vYXBpL3YxL2Nhc2VzL3Bvc3RzLzM0IgogICAgICAgIH0KICAgIF0sCiAgICAicmVzb3VyY2UiOiAicG9zdCIsCiAgICAibGltaXQiOiAxMDAsCiAgICAidG90YWxfY291bnQiOiAxCn0= + recorded_at: Fri, 01 Oct 2021 15:59:00 GMT +- request: + method: get + uri: https:///api/v1/cases/1/posts?include=mailbox,message_recipient,channel,attachment,case_message,note,chat_message,identity_email,identity_twitter,identity_facebook,facebook_message,facebook_post,facebook_post_comment,twitter_message,twitter_tweet&limit=100 + body: + encoding: US-ASCII + string: '' + headers: + Content-Type: + - application/json + X-Session-Id: + - TayW6Qnt0Loid4b9a618960d7e46555d8d95657ab22808718f64lWdx9dau5cFE99JtQiSLIv2Y5Asz + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + User-Agent: + - Ruby + Host: + - "" + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx + Date: + - Fri, 01 Oct 2021 15:59:01 GMT + Content-Type: + - application/json + Transfer-Encoding: + - chunked + Connection: + - keep-alive + Cache-Control: + - private, max-age=0, must-revalidate + Expires: + - '0' + X-Api-Version: + - '1' + Date-Iso: + - '2021-10-01T15:59:01+00:00' + Access-Control-Expose-Headers: + - Date-ISO + X-Xss-Protection: + - 1; mode=block + X-Content-Type-Options: + - nosniff + Strict-Transport-Security: + - max-age=31536000; includeSubDomains preload + body: + encoding: ASCII-8BIT + string: !binary |- + ewogICAgInN0YXR1cyI6IDIwMCwKICAgICJkYXRhIjogWwogICAgICAgIHsKICAgICAgICAgICAgImlkIjogMjEsCiAgICAgICAgICAgICJ1dWlkIjogIjYwZGQxMjU3LTNlNTEtNDM3YS1iMjgyLTFlYjZmOWY4OGZkNCIsCiAgICAgICAgICAgICJjbGllbnRfaWQiOiAiIiwKICAgICAgICAgICAgInN1YmplY3QiOiAiV0hBVD8hIFRoYW5rIHlvdSB2ZXJ5IG11Y2ghIPCfmI0iLAogICAgICAgICAgICAiY29udGVudHMiOiAiV0hBVD8hIFRoYW5rIHlvdSB2ZXJ5IG11Y2ghIPCfmI0iLAogICAgICAgICAgICAiY3JlYXRvciI6IHsKICAgICAgICAgICAgICAgICJpZCI6IDMsCiAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJ1c2VyIgogICAgICAgICAgICB9LAogICAgICAgICAgICAiaWRlbnRpdHkiOiB7CiAgICAgICAgICAgICAgICAiaWQiOiAxLAogICAgICAgICAgICAgICAgInR3aXR0ZXJfaWQiOiAiODU0MjUwNjIzOTI3MjM3MTIiLAogICAgICAgICAgICAgICAgImZ1bGxfbmFtZSI6ICJUYXlsb3IgV2VzdCIsCiAgICAgICAgICAgICAgICAic2NyZWVuX25hbWUiOiAiVGF5bG9yV2VzdFJuYnciLAogICAgICAgICAgICAgICAgImZvbGxvd2VyX2NvdW50IjogMCwKICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6IG51bGwsCiAgICAgICAgICAgICAgICAidXJsIjogbnVsbCwKICAgICAgICAgICAgICAgICJsb2NhdGlvbiI6IG51bGwsCiAgICAgICAgICAgICAgICAicHJvZmlsZV9pbWFnZV91cmwiOiBudWxsLAogICAgICAgICAgICAgICAgImxvY2FsZSI6IG51bGwsCiAgICAgICAgICAgICAgICAiaXNfdmVyaWZpZWQiOiBmYWxzZSwKICAgICAgICAgICAgICAgICJpc19wcmltYXJ5IjogZmFsc2UsCiAgICAgICAgICAgICAgICAiaXNfdmFsaWRhdGVkIjogZmFsc2UsCiAgICAgICAgICAgICAgICAiY3JlYXRlZF9hdCI6ICIyMDIxLTA4LTI0VDE4OjI0OjM0KzAwOjAwIiwKICAgICAgICAgICAgICAgICJ1cGRhdGVkX2F0IjogIjIwMjEtMDgtMjRUMTg6MjQ6MzQrMDA6MDAiLAogICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAiaWRlbnRpdHlfdHdpdHRlciIsCiAgICAgICAgICAgICAgICAicmVzb3VyY2VfdXJsIjogImh0dHBzOi8vPElNUE9SVF9LQVlBS09fRU5EUE9JTlRfSE9TVE5BTUU+L2FwaS92MS9pZGVudGl0aWVzL3R3aXR0ZXIvMSIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgInNvdXJjZV9jaGFubmVsIjogewogICAgICAgICAgICAgICAgInV1aWQiOiAiYzIwYWZhYjItYzFiMS00YzkyLTg3NDQtYWIzNDI2YmFmZDI3IiwKICAgICAgICAgICAgICAgICJ0eXBlIjogIlRXSVRURVIiLAogICAgICAgICAgICAgICAgImNoYXJhY3Rlcl9saW1pdCI6IDI2NCwKICAgICAgICAgICAgICAgICJhY2NvdW50IjogewogICAgICAgICAgICAgICAgICAgICJpZCI6ICI4NTQyNTA2MjM5MjcyMzcxMiIsCiAgICAgICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAidHdpdHRlcl9hY2NvdW50IgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJyZXNvdXJjZV90eXBlIjogImNoYW5uZWwiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJhdHRhY2htZW50cyI6IFtdLAogICAgICAgICAgICAiZG93bmxvYWRfYWxsIjogbnVsbCwKICAgICAgICAgICAgImRlc3RpbmF0aW9uX21lZGl1bSI6IG51bGwsCiAgICAgICAgICAgICJzb3VyY2UiOiBudWxsLAogICAgICAgICAgICAibWV0YWRhdGEiOiB7CiAgICAgICAgICAgICAgICAidXNlcl9hZ2VudCI6ICIiLAogICAgICAgICAgICAgICAgInBhZ2VfdXJsIjogIiIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgIm9yaWdpbmFsIjogewogICAgICAgICAgICAgICAgImlkIjogIjg3NzUwNDQ1MDIwMTYxMjI4OCIsCiAgICAgICAgICAgICAgICAidXVpZCI6ICI2MGRkMTI1Ny0zZTUxLTQzN2EtYjI4Mi0xZWI2ZjlmODhmZDQiLAogICAgICAgICAgICAgICAgInNjcmVlbl9uYW1lIjogIlRheWxvcldlc3RSbmJ3IiwKICAgICAgICAgICAgICAgICJmdWxsX25hbWUiOiAiVGF5bG9yIFdlc3QiLAogICAgICAgICAgICAgICAgImNvbnRlbnRzIjogIldIQVQ/ISBUaGFuayB5b3UgdmVyeSBtdWNoISDwn5iNIiwKICAgICAgICAgICAgICAgICJyZXR3ZWV0X2NvdW50IjogMCwKICAgICAgICAgICAgICAgICJmYXZvcml0ZV9jb3VudCI6IDAsCiAgICAgICAgICAgICAgICAiaW5fcmVwbHlfdG9fdHdlZXQiOiBudWxsLAogICAgICAgICAgICAgICAgImluX3JlcGx5X3RvX2lkZW50aXR5IjogbnVsbCwKICAgICAgICAgICAgICAgICJtZWRpYSI6IFtdLAogICAgICAgICAgICAgICAgImF0dGFjaG1lbnRzIjogW10sCiAgICAgICAgICAgICAgICAiZG93bmxvYWRfYWxsIjogbnVsbCwKICAgICAgICAgICAgICAgICJpZGVudGl0eSI6IHsKICAgICAgICAgICAgICAgICAgICAiaWQiOiAxLAogICAgICAgICAgICAgICAgICAgICJ0d2l0dGVyX2lkIjogIjg1NDI1MDYyMzkyNzIzNzEyIiwKICAgICAgICAgICAgICAgICAgICAiZnVsbF9uYW1lIjogIlRheWxvciBXZXN0IiwKICAgICAgICAgICAgICAgICAgICAic2NyZWVuX25hbWUiOiAiVGF5bG9yV2VzdFJuYnciLAogICAgICAgICAgICAgICAgICAgICJmb2xsb3dlcl9jb3VudCI6IDAsCiAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogbnVsbCwKICAgICAgICAgICAgICAgICAgICAidXJsIjogbnVsbCwKICAgICAgICAgICAgICAgICAgICAibG9jYXRpb24iOiBudWxsLAogICAgICAgICAgICAgICAgICAgICJwcm9maWxlX2ltYWdlX3VybCI6IG51bGwsCiAgICAgICAgICAgICAgICAgICAgImxvY2FsZSI6IG51bGwsCiAgICAgICAgICAgICAgICAgICAgImlzX3ZlcmlmaWVkIjogZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgImlzX3ByaW1hcnkiOiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAiaXNfdmFsaWRhdGVkIjogZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgImNyZWF0ZWRfYXQiOiAiMjAyMS0wOC0yNFQxODoyNDozNCswMDowMCIsCiAgICAgICAgICAgICAgICAgICAgInVwZGF0ZWRfYXQiOiAiMjAyMS0wOC0yNFQxODoyNDozNCswMDowMCIsCiAgICAgICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAiaWRlbnRpdHlfdHdpdHRlciIsCiAgICAgICAgICAgICAgICAgICAgInJlc291cmNlX3VybCI6ICJodHRwczovLzxJTVBPUlRfS0FZQUtPX0VORFBPSU5UX0hPU1ROQU1FPi9hcGkvdjEvaWRlbnRpdGllcy90d2l0dGVyLzEiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgImNyZWF0ZWRfYXQiOiAiMjAyMS0wOC0yNFQxODowOTo0OSswMDowMCIsCiAgICAgICAgICAgICAgICAidXBkYXRlZF9hdCI6ICIyMDIxLTA4LTI0VDE4OjA5OjQ5KzAwOjAwIiwKICAgICAgICAgICAgICAgICJyZXNvdXJjZV90eXBlIjogInR3aXR0ZXJfdHdlZXQiLAogICAgICAgICAgICAgICAgInJlc291cmNlX3VybCI6ICJodHRwczovLzxJTVBPUlRfS0FZQUtPX0VORFBPSU5UX0hPU1ROQU1FPi9hcGkvdjEvdHdpdHRlci90d2VldHMvODc3NTA0NDUwMjAxNjEyMjg4IgogICAgICAgICAgICB9LAogICAgICAgICAgICAicG9zdF9zdGF0dXMiOiAiREVMSVZFUkVEIiwKICAgICAgICAgICAgInBvc3Rfc3RhdHVzX3JlamVjdF90eXBlIjogbnVsbCwKICAgICAgICAgICAgInBvc3Rfc3RhdHVzX3JlamVjdF9yZWFzb24iOiBudWxsLAogICAgICAgICAgICAicG9zdF9zdGF0dXNfdXBkYXRlZF9hdCI6ICIyMDIxLTA4LTI0VDE4OjI0OjM4KzAwOjAwIiwKICAgICAgICAgICAgImlzX3JlcXVlc3RlciI6IHRydWUsCiAgICAgICAgICAgICJjcmVhdGVkX2F0IjogIjIwMjEtMDgtMjRUMTg6MDk6NDkrMDA6MDAiLAogICAgICAgICAgICAidXBkYXRlZF9hdCI6ICIyMDIxLTA4LTI0VDE4OjA5OjQ5KzAwOjAwIiwKICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAicG9zdCIsCiAgICAgICAgICAgICJyZXNvdXJjZV91cmwiOiAiaHR0cHM6Ly88SU1QT1JUX0tBWUFLT19FTkRQT0lOVF9IT1NUTkFNRT4vYXBpL3YxL2Nhc2VzL3Bvc3RzLzIxIgogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICAiaWQiOiAyMCwKICAgICAgICAgICAgInV1aWQiOiAiZWM5NDgxNWYtMGI4My00OWZlLWFhMTItNmZjZTUzZDc2YjNiIiwKICAgICAgICAgICAgImNsaWVudF9pZCI6ICIiLAogICAgICAgICAgICAic3ViamVjdCI6ICJObyBwcm9iISBCVFcgLSBjb25ncmF0cyBvbiB5b3VyIDF5ciBhbm5pdmVyc2FyeSB3aXRoIHVzLiBFbmpveSBmcmVlIG5leHQgZGF5IHNoaXBwaW5nIG9uIHlvdXIgcHVyY2hhc2UgdG9kYXkhIiwKICAgICAgICAgICAgImNvbnRlbnRzIjogIk5vIHByb2IhIEJUVyAtIGNvbmdyYXRzIG9uIHlvdXIgMXlyIGFubml2ZXJzYXJ5IHdpdGggdXMuIEVuam95IGZyZWUgbmV4dCBkYXkgc2hpcHBpbmcgb24geW91ciBwdXJjaGFzZSB0b2RheSEiLAogICAgICAgICAgICAiY3JlYXRvciI6IHsKICAgICAgICAgICAgICAgICJpZCI6IDQsCiAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJ1c2VyIgogICAgICAgICAgICB9LAogICAgICAgICAgICAiaWRlbnRpdHkiOiB7CiAgICAgICAgICAgICAgICAiaWQiOiAyLAogICAgICAgICAgICAgICAgInR3aXR0ZXJfaWQiOiAiNzM4MTYwMjgxMjM1MjkyMTYwIiwKICAgICAgICAgICAgICAgICJmdWxsX25hbWUiOiAiVG9iaWFzIiwKICAgICAgICAgICAgICAgICJzY3JlZW5fbmFtZSI6ICJUb2J5QnJld2ZpY3R1cyIsCiAgICAgICAgICAgICAgICAiZm9sbG93ZXJfY291bnQiOiAwLAogICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogbnVsbCwKICAgICAgICAgICAgICAgICJ1cmwiOiBudWxsLAogICAgICAgICAgICAgICAgImxvY2F0aW9uIjogbnVsbCwKICAgICAgICAgICAgICAgICJwcm9maWxlX2ltYWdlX3VybCI6IG51bGwsCiAgICAgICAgICAgICAgICAibG9jYWxlIjogbnVsbCwKICAgICAgICAgICAgICAgICJpc192ZXJpZmllZCI6IGZhbHNlLAogICAgICAgICAgICAgICAgImlzX3ByaW1hcnkiOiBmYWxzZSwKICAgICAgICAgICAgICAgICJpc192YWxpZGF0ZWQiOiBmYWxzZSwKICAgICAgICAgICAgICAgICJjcmVhdGVkX2F0IjogIjIwMjEtMDgtMjRUMTg6MjQ6MzUrMDA6MDAiLAogICAgICAgICAgICAgICAgInVwZGF0ZWRfYXQiOiAiMjAyMS0wOC0yNFQxODoyNDozNSswMDowMCIsCiAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJpZGVudGl0eV90d2l0dGVyIiwKICAgICAgICAgICAgICAgICJyZXNvdXJjZV91cmwiOiAiaHR0cHM6Ly88SU1QT1JUX0tBWUFLT19FTkRQT0lOVF9IT1NUTkFNRT4vYXBpL3YxL2lkZW50aXRpZXMvdHdpdHRlci8yIgogICAgICAgICAgICB9LAogICAgICAgICAgICAic291cmNlX2NoYW5uZWwiOiB7CiAgICAgICAgICAgICAgICAidXVpZCI6ICIxMjdlNjllNy1jZWZkLTQ2YTAtYWFkMy02M2U4NTc1YTRlZWYiLAogICAgICAgICAgICAgICAgInR5cGUiOiAiVFdJVFRFUiIsCiAgICAgICAgICAgICAgICAiY2hhcmFjdGVyX2xpbWl0IjogMjY0LAogICAgICAgICAgICAgICAgImFjY291bnQiOiB7CiAgICAgICAgICAgICAgICAgICAgImlkIjogIjczODE2MDI4MTIzNTI5MjE2MCIsCiAgICAgICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAidHdpdHRlcl9hY2NvdW50IgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJyZXNvdXJjZV90eXBlIjogImNoYW5uZWwiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJhdHRhY2htZW50cyI6IFtdLAogICAgICAgICAgICAiZG93bmxvYWRfYWxsIjogbnVsbCwKICAgICAgICAgICAgImRlc3RpbmF0aW9uX21lZGl1bSI6IG51bGwsCiAgICAgICAgICAgICJzb3VyY2UiOiBudWxsLAogICAgICAgICAgICAibWV0YWRhdGEiOiB7CiAgICAgICAgICAgICAgICAidXNlcl9hZ2VudCI6ICIiLAogICAgICAgICAgICAgICAgInBhZ2VfdXJsIjogIiIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgIm9yaWdpbmFsIjogewogICAgICAgICAgICAgICAgImlkIjogIjg3NzUwNDE3NjQ4OTcxMzY2NSIsCiAgICAgICAgICAgICAgICAidXVpZCI6ICJlYzk0ODE1Zi0wYjgzLTQ5ZmUtYWExMi02ZmNlNTNkNzZiM2IiLAogICAgICAgICAgICAgICAgInNjcmVlbl9uYW1lIjogIlRvYnlCcmV3ZmljdHVzIiwKICAgICAgICAgICAgICAgICJmdWxsX25hbWUiOiAiVG9iaWFzIFNjaHJvZXRlciIsCiAgICAgICAgICAgICAgICAiY29udGVudHMiOiAiTm8gcHJvYiEgQlRXIC0gY29uZ3JhdHMgb24geW91ciAxeXIgYW5uaXZlcnNhcnkgd2l0aCB1cy4gRW5qb3kgZnJlZSBuZXh0IGRheSBzaGlwcGluZyBvbiB5b3VyIHB1cmNoYXNlIHRvZGF5ISIsCiAgICAgICAgICAgICAgICAicmV0d2VldF9jb3VudCI6IDAsCiAgICAgICAgICAgICAgICAiZmF2b3JpdGVfY291bnQiOiAwLAogICAgICAgICAgICAgICAgImluX3JlcGx5X3RvX3R3ZWV0IjogbnVsbCwKICAgICAgICAgICAgICAgICJpbl9yZXBseV90b19pZGVudGl0eSI6IG51bGwsCiAgICAgICAgICAgICAgICAibWVkaWEiOiBbXSwKICAgICAgICAgICAgICAgICJhdHRhY2htZW50cyI6IFtdLAogICAgICAgICAgICAgICAgImRvd25sb2FkX2FsbCI6IG51bGwsCiAgICAgICAgICAgICAgICAiaWRlbnRpdHkiOiB7CiAgICAgICAgICAgICAgICAgICAgImlkIjogMiwKICAgICAgICAgICAgICAgICAgICAidHdpdHRlcl9pZCI6ICI3MzgxNjAyODEyMzUyOTIxNjAiLAogICAgICAgICAgICAgICAgICAgICJmdWxsX25hbWUiOiAiVG9iaWFzIiwKICAgICAgICAgICAgICAgICAgICAic2NyZWVuX25hbWUiOiAiVG9ieUJyZXdmaWN0dXMiLAogICAgICAgICAgICAgICAgICAgICJmb2xsb3dlcl9jb3VudCI6IDAsCiAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogbnVsbCwKICAgICAgICAgICAgICAgICAgICAidXJsIjogbnVsbCwKICAgICAgICAgICAgICAgICAgICAibG9jYXRpb24iOiBudWxsLAogICAgICAgICAgICAgICAgICAgICJwcm9maWxlX2ltYWdlX3VybCI6IG51bGwsCiAgICAgICAgICAgICAgICAgICAgImxvY2FsZSI6IG51bGwsCiAgICAgICAgICAgICAgICAgICAgImlzX3ZlcmlmaWVkIjogZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgImlzX3ByaW1hcnkiOiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAiaXNfdmFsaWRhdGVkIjogZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgImNyZWF0ZWRfYXQiOiAiMjAyMS0wOC0yNFQxODoyNDozNSswMDowMCIsCiAgICAgICAgICAgICAgICAgICAgInVwZGF0ZWRfYXQiOiAiMjAyMS0wOC0yNFQxODoyNDozNSswMDowMCIsCiAgICAgICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAiaWRlbnRpdHlfdHdpdHRlciIsCiAgICAgICAgICAgICAgICAgICAgInJlc291cmNlX3VybCI6ICJodHRwczovLzxJTVBPUlRfS0FZQUtPX0VORFBPSU5UX0hPU1ROQU1FPi9hcGkvdjEvaWRlbnRpdGllcy90d2l0dGVyLzIiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgImNyZWF0ZWRfYXQiOiAiMjAyMS0wOC0yNFQxODowOTo0OCswMDowMCIsCiAgICAgICAgICAgICAgICAidXBkYXRlZF9hdCI6ICIyMDIxLTA4LTI0VDE4OjA5OjQ4KzAwOjAwIiwKICAgICAgICAgICAgICAgICJyZXNvdXJjZV90eXBlIjogInR3aXR0ZXJfdHdlZXQiLAogICAgICAgICAgICAgICAgInJlc291cmNlX3VybCI6ICJodHRwczovLzxJTVBPUlRfS0FZQUtPX0VORFBPSU5UX0hPU1ROQU1FPi9hcGkvdjEvdHdpdHRlci90d2VldHMvODc3NTA0MTc2NDg5NzEzNjY1IgogICAgICAgICAgICB9LAogICAgICAgICAgICAicG9zdF9zdGF0dXMiOiAiREVMSVZFUkVEIiwKICAgICAgICAgICAgInBvc3Rfc3RhdHVzX3JlamVjdF90eXBlIjogbnVsbCwKICAgICAgICAgICAgInBvc3Rfc3RhdHVzX3JlamVjdF9yZWFzb24iOiBudWxsLAogICAgICAgICAgICAicG9zdF9zdGF0dXNfdXBkYXRlZF9hdCI6ICIyMDIxLTA4LTI0VDE4OjI0OjM3KzAwOjAwIiwKICAgICAgICAgICAgImlzX3JlcXVlc3RlciI6IGZhbHNlLAogICAgICAgICAgICAiY3JlYXRlZF9hdCI6ICIyMDIxLTA4LTI0VDE4OjA5OjQ4KzAwOjAwIiwKICAgICAgICAgICAgInVwZGF0ZWRfYXQiOiAiMjAyMS0wOC0yNFQxODowOTo0OCswMDowMCIsCiAgICAgICAgICAgICJyZXNvdXJjZV90eXBlIjogInBvc3QiLAogICAgICAgICAgICAicmVzb3VyY2VfdXJsIjogImh0dHBzOi8vPElNUE9SVF9LQVlBS09fRU5EUE9JTlRfSE9TVE5BTUU+L2FwaS92MS9jYXNlcy9wb3N0cy8yMCIKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgImlkIjogMTgsCiAgICAgICAgICAgICJ1dWlkIjogImFhNGE5NDVmLTdjY2UtNGFlMC1hZmRhLWY4NDk4NmQwOTgyZiIsCiAgICAgICAgICAgICJjbGllbnRfaWQiOiAiIiwKICAgICAgICAgICAgInN1YmplY3QiOiAiVGF5bG9y4oCZcyBiZWVuIGEgZ3JlYXQgY3VzdG9tZXIgZm9yIGp1c3Qgb3ZlciBhIHllYXIuIFdlIGNhbiBwcm9iYWJseSB1cGdyYWRlIGhlciBzaGlwcGluZyB0b2RheSBmb3IgaGVyIGxveWFsdHkuIiwKICAgICAgICAgICAgImNvbnRlbnRzIjogIlRheWxvcuKAmXMgYmVlbiBhIGdyZWF0IGN1c3RvbWVyIGZvciBqdXN0IG92ZXIgYSB5ZWFyLiBXZSBjYW4gcHJvYmFibHkgdXBncmFkZSBoZXIgc2hpcHBpbmcgdG9kYXkgZm9yIGhlciBsb3lhbHR5LiIsCiAgICAgICAgICAgICJjcmVhdG9yIjogewogICAgICAgICAgICAgICAgImlkIjogNSwKICAgICAgICAgICAgICAgICJyZXNvdXJjZV90eXBlIjogInVzZXIiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJpZGVudGl0eSI6IHsKICAgICAgICAgICAgICAgICJpZCI6IDUsCiAgICAgICAgICAgICAgICAiZW1haWwiOiAic2ltb25AYnJld2ZpY3R1cy5jb20iLAogICAgICAgICAgICAgICAgImlzX3ByaW1hcnkiOiB0cnVlLAogICAgICAgICAgICAgICAgImlzX3ZhbGlkYXRlZCI6IGZhbHNlLAogICAgICAgICAgICAgICAgImlzX25vdGlmaWNhdGlvbl9lbmFibGVkIjogZmFsc2UsCiAgICAgICAgICAgICAgICAiY3JlYXRlZF9hdCI6ICIyMDIxLTA4LTI0VDE4OjI0OjEyKzAwOjAwIiwKICAgICAgICAgICAgICAgICJ1cGRhdGVkX2F0IjogIjIwMjEtMDgtMjRUMTg6MjQ6MTIrMDA6MDAiLAogICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAiaWRlbnRpdHlfZW1haWwiLAogICAgICAgICAgICAgICAgInJlc291cmNlX3VybCI6ICJodHRwczovLzxJTVBPUlRfS0FZQUtPX0VORFBPSU5UX0hPU1ROQU1FPi9hcGkvdjEvaWRlbnRpdGllcy9lbWFpbHMvNSIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgInNvdXJjZV9jaGFubmVsIjogewogICAgICAgICAgICAgICAgInV1aWQiOiAiY2YzY2QzOWEtNTRiZi01ZTVlLTkxMmItODgzOTE5ZjNhYjFlIiwKICAgICAgICAgICAgICAgICJ0eXBlIjogIk5PVEUiLAogICAgICAgICAgICAgICAgImNoYXJhY3Rlcl9saW1pdCI6IG51bGwsCiAgICAgICAgICAgICAgICAiYWNjb3VudCI6IG51bGwsCiAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJjaGFubmVsIgogICAgICAgICAgICB9LAogICAgICAgICAgICAiYXR0YWNobWVudHMiOiBbXSwKICAgICAgICAgICAgImRvd25sb2FkX2FsbCI6IG51bGwsCiAgICAgICAgICAgICJkZXN0aW5hdGlvbl9tZWRpdW0iOiBudWxsLAogICAgICAgICAgICAic291cmNlIjogbnVsbCwKICAgICAgICAgICAgIm1ldGFkYXRhIjogewogICAgICAgICAgICAgICAgInVzZXJfYWdlbnQiOiAiIiwKICAgICAgICAgICAgICAgICJwYWdlX3VybCI6ICIiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJvcmlnaW5hbCI6IHsKICAgICAgICAgICAgICAgICJpZCI6IDEsCiAgICAgICAgICAgICAgICAiYm9keV90ZXh0IjogIlRheWxvcuKAmXMgYmVlbiBhIGdyZWF0IGN1c3RvbWVyIGZvciBqdXN0IG92ZXIgYSB5ZWFyLiBXZSBjYW4gcHJvYmFibHkgdXBncmFkZSBoZXIgc2hpcHBpbmcgdG9kYXkgZm9yIGhlciBsb3lhbHR5LiIsCiAgICAgICAgICAgICAgICAiYm9keV9odG1sIjogbnVsbCwKICAgICAgICAgICAgICAgICJpc19waW5uZWQiOiBmYWxzZSwKICAgICAgICAgICAgICAgICJwaW5uZWRfYnkiOiBudWxsLAogICAgICAgICAgICAgICAgInVzZXIiOiB7CiAgICAgICAgICAgICAgICAgICAgImlkIjogNSwKICAgICAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJ1c2VyIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJjcmVhdG9yIjogewogICAgICAgICAgICAgICAgICAgICJpZCI6IDUsCiAgICAgICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAidXNlciIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAiYXR0YWNobWVudHMiOiBbXSwKICAgICAgICAgICAgICAgICJkb3dubG9hZF9hbGwiOiBudWxsLAogICAgICAgICAgICAgICAgImNyZWF0ZWRfYXQiOiAiMjAyMS0wOC0yNFQxODowOTo0NiswMDowMCIsCiAgICAgICAgICAgICAgICAidXBkYXRlZF9hdCI6ICIyMDIxLTA4LTI0VDE4OjA5OjQ2KzAwOjAwIiwKICAgICAgICAgICAgICAgICJyZXNvdXJjZV90eXBlIjogIm5vdGUiLAogICAgICAgICAgICAgICAgInJlc291cmNlX3VybCI6ICJodHRwczovLzxJTVBPUlRfS0FZQUtPX0VORFBPSU5UX0hPU1ROQU1FPi9hcGkvdjEvY2FzZXMvMS9ub3Rlcy8xIgogICAgICAgICAgICB9LAogICAgICAgICAgICAicG9zdF9zdGF0dXMiOiAiREVMSVZFUkVEIiwKICAgICAgICAgICAgInBvc3Rfc3RhdHVzX3JlamVjdF90eXBlIjogbnVsbCwKICAgICAgICAgICAgInBvc3Rfc3RhdHVzX3JlamVjdF9yZWFzb24iOiBudWxsLAogICAgICAgICAgICAicG9zdF9zdGF0dXNfdXBkYXRlZF9hdCI6ICIyMDIxLTA4LTI0VDE4OjI0OjM1KzAwOjAwIiwKICAgICAgICAgICAgImlzX3JlcXVlc3RlciI6IGZhbHNlLAogICAgICAgICAgICAiY3JlYXRlZF9hdCI6ICIyMDIxLTA4LTI0VDE4OjA5OjQ2KzAwOjAwIiwKICAgICAgICAgICAgInVwZGF0ZWRfYXQiOiAiMjAyMS0wOC0yNFQxODowOTo0NiswMDowMCIsCiAgICAgICAgICAgICJyZXNvdXJjZV90eXBlIjogInBvc3QiLAogICAgICAgICAgICAicmVzb3VyY2VfdXJsIjogImh0dHBzOi8vPElNUE9SVF9LQVlBS09fRU5EUE9JTlRfSE9TVE5BTUU+L2FwaS92MS9jYXNlcy9wb3N0cy8xOCIKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgImlkIjogMTcsCiAgICAgICAgICAgICJ1dWlkIjogImI3M2I1ZDg5LTAyZGMtNDQxOC1hYmY5LTcwNjUwNmIzMmY3YyIsCiAgICAgICAgICAgICJjbGllbnRfaWQiOiAiIiwKICAgICAgICAgICAgInN1YmplY3QiOiAiQEJyZXdmaWN0dXMgdGhhbmtzIHNvIG11Y2ggZm9yIHRoZSBxdWljayBoZWxwLCB0aGF0IHdhcyBhd2Vzb21lISIsCiAgICAgICAgICAgICJjb250ZW50cyI6ICJAQnJld2ZpY3R1cyB0aGFua3Mgc28gbXVjaCBmb3IgdGhlIHF1aWNrIGhlbHAsIHRoYXQgd2FzIGF3ZXNvbWUhIiwKICAgICAgICAgICAgImNyZWF0b3IiOiB7CiAgICAgICAgICAgICAgICAiaWQiOiAzLAogICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAidXNlciIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgImlkZW50aXR5IjogewogICAgICAgICAgICAgICAgImlkIjogMSwKICAgICAgICAgICAgICAgICJ0d2l0dGVyX2lkIjogIjg1NDI1MDYyMzkyNzIzNzEyIiwKICAgICAgICAgICAgICAgICJmdWxsX25hbWUiOiAiVGF5bG9yIFdlc3QiLAogICAgICAgICAgICAgICAgInNjcmVlbl9uYW1lIjogIlRheWxvcldlc3RSbmJ3IiwKICAgICAgICAgICAgICAgICJmb2xsb3dlcl9jb3VudCI6IDAsCiAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiBudWxsLAogICAgICAgICAgICAgICAgInVybCI6IG51bGwsCiAgICAgICAgICAgICAgICAibG9jYXRpb24iOiBudWxsLAogICAgICAgICAgICAgICAgInByb2ZpbGVfaW1hZ2VfdXJsIjogbnVsbCwKICAgICAgICAgICAgICAgICJsb2NhbGUiOiBudWxsLAogICAgICAgICAgICAgICAgImlzX3ZlcmlmaWVkIjogZmFsc2UsCiAgICAgICAgICAgICAgICAiaXNfcHJpbWFyeSI6IGZhbHNlLAogICAgICAgICAgICAgICAgImlzX3ZhbGlkYXRlZCI6IGZhbHNlLAogICAgICAgICAgICAgICAgImNyZWF0ZWRfYXQiOiAiMjAyMS0wOC0yNFQxODoyNDozNCswMDowMCIsCiAgICAgICAgICAgICAgICAidXBkYXRlZF9hdCI6ICIyMDIxLTA4LTI0VDE4OjI0OjM0KzAwOjAwIiwKICAgICAgICAgICAgICAgICJyZXNvdXJjZV90eXBlIjogImlkZW50aXR5X3R3aXR0ZXIiLAogICAgICAgICAgICAgICAgInJlc291cmNlX3VybCI6ICJodHRwczovLzxJTVBPUlRfS0FZQUtPX0VORFBPSU5UX0hPU1ROQU1FPi9hcGkvdjEvaWRlbnRpdGllcy90d2l0dGVyLzEiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJzb3VyY2VfY2hhbm5lbCI6IHsKICAgICAgICAgICAgICAgICJ1dWlkIjogImMyMGFmYWIyLWMxYjEtNGM5Mi04NzQ0LWFiMzQyNmJhZmQyNyIsCiAgICAgICAgICAgICAgICAidHlwZSI6ICJUV0lUVEVSIiwKICAgICAgICAgICAgICAgICJjaGFyYWN0ZXJfbGltaXQiOiAyNjQsCiAgICAgICAgICAgICAgICAiYWNjb3VudCI6IHsKICAgICAgICAgICAgICAgICAgICAiaWQiOiAiODU0MjUwNjIzOTI3MjM3MTIiLAogICAgICAgICAgICAgICAgICAgICJyZXNvdXJjZV90eXBlIjogInR3aXR0ZXJfYWNjb3VudCIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJjaGFubmVsIgogICAgICAgICAgICB9LAogICAgICAgICAgICAiYXR0YWNobWVudHMiOiBbXSwKICAgICAgICAgICAgImRvd25sb2FkX2FsbCI6IG51bGwsCiAgICAgICAgICAgICJkZXN0aW5hdGlvbl9tZWRpdW0iOiBudWxsLAogICAgICAgICAgICAic291cmNlIjogbnVsbCwKICAgICAgICAgICAgIm1ldGFkYXRhIjogewogICAgICAgICAgICAgICAgInVzZXJfYWdlbnQiOiAiIiwKICAgICAgICAgICAgICAgICJwYWdlX3VybCI6ICIiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJvcmlnaW5hbCI6IHsKICAgICAgICAgICAgICAgICJpZCI6ICI4Nzc1MDQwOTM1MTM3NjQ4NjUiLAogICAgICAgICAgICAgICAgInV1aWQiOiAiYjczYjVkODktMDJkYy00NDE4LWFiZjktNzA2NTA2YjMyZjdjIiwKICAgICAgICAgICAgICAgICJzY3JlZW5fbmFtZSI6ICJUYXlsb3JXZXN0Um5idyIsCiAgICAgICAgICAgICAgICAiZnVsbF9uYW1lIjogIlRheWxvciBXZXN0IiwKICAgICAgICAgICAgICAgICJjb250ZW50cyI6ICJAQnJld2ZpY3R1cyB0aGFua3Mgc28gbXVjaCBmb3IgdGhlIHF1aWNrIGhlbHAsIHRoYXQgd2FzIGF3ZXNvbWUhIiwKICAgICAgICAgICAgICAgICJyZXR3ZWV0X2NvdW50IjogMCwKICAgICAgICAgICAgICAgICJmYXZvcml0ZV9jb3VudCI6IDAsCiAgICAgICAgICAgICAgICAiaW5fcmVwbHlfdG9fdHdlZXQiOiBudWxsLAogICAgICAgICAgICAgICAgImluX3JlcGx5X3RvX2lkZW50aXR5IjogbnVsbCwKICAgICAgICAgICAgICAgICJtZWRpYSI6IFtdLAogICAgICAgICAgICAgICAgImF0dGFjaG1lbnRzIjogW10sCiAgICAgICAgICAgICAgICAiZG93bmxvYWRfYWxsIjogbnVsbCwKICAgICAgICAgICAgICAgICJpZGVudGl0eSI6IHsKICAgICAgICAgICAgICAgICAgICAiaWQiOiAxLAogICAgICAgICAgICAgICAgICAgICJ0d2l0dGVyX2lkIjogIjg1NDI1MDYyMzkyNzIzNzEyIiwKICAgICAgICAgICAgICAgICAgICAiZnVsbF9uYW1lIjogIlRheWxvciBXZXN0IiwKICAgICAgICAgICAgICAgICAgICAic2NyZWVuX25hbWUiOiAiVGF5bG9yV2VzdFJuYnciLAogICAgICAgICAgICAgICAgICAgICJmb2xsb3dlcl9jb3VudCI6IDAsCiAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogbnVsbCwKICAgICAgICAgICAgICAgICAgICAidXJsIjogbnVsbCwKICAgICAgICAgICAgICAgICAgICAibG9jYXRpb24iOiBudWxsLAogICAgICAgICAgICAgICAgICAgICJwcm9maWxlX2ltYWdlX3VybCI6IG51bGwsCiAgICAgICAgICAgICAgICAgICAgImxvY2FsZSI6IG51bGwsCiAgICAgICAgICAgICAgICAgICAgImlzX3ZlcmlmaWVkIjogZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgImlzX3ByaW1hcnkiOiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAiaXNfdmFsaWRhdGVkIjogZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgImNyZWF0ZWRfYXQiOiAiMjAyMS0wOC0yNFQxODoyNDozNCswMDowMCIsCiAgICAgICAgICAgICAgICAgICAgInVwZGF0ZWRfYXQiOiAiMjAyMS0wOC0yNFQxODoyNDozNCswMDowMCIsCiAgICAgICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAiaWRlbnRpdHlfdHdpdHRlciIsCiAgICAgICAgICAgICAgICAgICAgInJlc291cmNlX3VybCI6ICJodHRwczovLzxJTVBPUlRfS0FZQUtPX0VORFBPSU5UX0hPU1ROQU1FPi9hcGkvdjEvaWRlbnRpdGllcy90d2l0dGVyLzEiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgImNyZWF0ZWRfYXQiOiAiMjAyMS0wOC0yNFQxODowOTo0NSswMDowMCIsCiAgICAgICAgICAgICAgICAidXBkYXRlZF9hdCI6ICIyMDIxLTA4LTI0VDE4OjA5OjQ1KzAwOjAwIiwKICAgICAgICAgICAgICAgICJyZXNvdXJjZV90eXBlIjogInR3aXR0ZXJfdHdlZXQiLAogICAgICAgICAgICAgICAgInJlc291cmNlX3VybCI6ICJodHRwczovLzxJTVBPUlRfS0FZQUtPX0VORFBPSU5UX0hPU1ROQU1FPi9hcGkvdjEvdHdpdHRlci90d2VldHMvODc3NTA0MDkzNTEzNzY0ODY1IgogICAgICAgICAgICB9LAogICAgICAgICAgICAicG9zdF9zdGF0dXMiOiAiREVMSVZFUkVEIiwKICAgICAgICAgICAgInBvc3Rfc3RhdHVzX3JlamVjdF90eXBlIjogbnVsbCwKICAgICAgICAgICAgInBvc3Rfc3RhdHVzX3JlamVjdF9yZWFzb24iOiBudWxsLAogICAgICAgICAgICAicG9zdF9zdGF0dXNfdXBkYXRlZF9hdCI6ICIyMDIxLTA4LTI0VDE4OjI0OjM1KzAwOjAwIiwKICAgICAgICAgICAgImlzX3JlcXVlc3RlciI6IHRydWUsCiAgICAgICAgICAgICJjcmVhdGVkX2F0IjogIjIwMjEtMDgtMjRUMTg6MDk6NDUrMDA6MDAiLAogICAgICAgICAgICAidXBkYXRlZF9hdCI6ICIyMDIxLTA4LTI0VDE4OjA5OjQ1KzAwOjAwIiwKICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAicG9zdCIsCiAgICAgICAgICAgICJyZXNvdXJjZV91cmwiOiAiaHR0cHM6Ly88SU1QT1JUX0tBWUFLT19FTkRQT0lOVF9IT1NUTkFNRT4vYXBpL3YxL2Nhc2VzL3Bvc3RzLzE3IgogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICAiaWQiOiAxNiwKICAgICAgICAgICAgInV1aWQiOiAiYWE2MjJmNWItZDZmMy00OWNkLTlmYjUtMzZiODI2MTYwZDc2IiwKICAgICAgICAgICAgImNsaWVudF9pZCI6ICIiLAogICAgICAgICAgICAic3ViamVjdCI6ICJURVNUIiwKICAgICAgICAgICAgImNvbnRlbnRzIjogIlRoYXQgYXBwZWFycyB0byBoYXZlIHdvcmtlZC4gVGhhbmsgeW91ISIsCiAgICAgICAgICAgICJjcmVhdG9yIjogewogICAgICAgICAgICAgICAgImlkIjogMywKICAgICAgICAgICAgICAgICJyZXNvdXJjZV90eXBlIjogInVzZXIiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJpZGVudGl0eSI6IHsKICAgICAgICAgICAgICAgICJpZCI6IDMsCiAgICAgICAgICAgICAgICAiZW1haWwiOiAicmFpbmJvd2NpdHljYWZlQGdtYWlsLmNvbSIsCiAgICAgICAgICAgICAgICAiaXNfcHJpbWFyeSI6IHRydWUsCiAgICAgICAgICAgICAgICAiaXNfdmFsaWRhdGVkIjogZmFsc2UsCiAgICAgICAgICAgICAgICAiaXNfbm90aWZpY2F0aW9uX2VuYWJsZWQiOiBmYWxzZSwKICAgICAgICAgICAgICAgICJjcmVhdGVkX2F0IjogIjIwMjEtMDgtMjRUMTg6MjQ6MTIrMDA6MDAiLAogICAgICAgICAgICAgICAgInVwZGF0ZWRfYXQiOiAiMjAyMS0wOC0yNFQxODoyNDoxMiswMDowMCIsCiAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJpZGVudGl0eV9lbWFpbCIsCiAgICAgICAgICAgICAgICAicmVzb3VyY2VfdXJsIjogImh0dHBzOi8vPElNUE9SVF9LQVlBS09fRU5EUE9JTlRfSE9TVE5BTUU+L2FwaS92MS9pZGVudGl0aWVzL2VtYWlscy8zIgogICAgICAgICAgICB9LAogICAgICAgICAgICAic291cmNlX2NoYW5uZWwiOiB7CiAgICAgICAgICAgICAgICAidXVpZCI6ICJmZDNhODExNi05NWMyLTQ5MmUtOWFmMy1iM2FiNTdkYzlmMWEiLAogICAgICAgICAgICAgICAgInR5cGUiOiAiTUFJTCIsCiAgICAgICAgICAgICAgICAiY2hhcmFjdGVyX2xpbWl0IjogbnVsbCwKICAgICAgICAgICAgICAgICJhY2NvdW50IjogewogICAgICAgICAgICAgICAgICAgICJpZCI6IDEsCiAgICAgICAgICAgICAgICAgICAgInV1aWQiOiAiZmQzYTgxMTYtOTVjMi00OTJlLTlhZjMtYjNhYjU3ZGM5ZjFhIiwKICAgICAgICAgICAgICAgICAgICAiYWRkcmVzcyI6ICJzdXBwb3J0QDxJTVBPUlRfS0FZQUtPX0VORFBPSU5UX0hPU1ROQU1FPiIsCiAgICAgICAgICAgICAgICAgICAgImJyYW5kIjogewogICAgICAgICAgICAgICAgICAgICAgICAiaWQiOiAxLAogICAgICAgICAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJicmFuZCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJpc19zeXN0ZW0iOiB0cnVlLAogICAgICAgICAgICAgICAgICAgICJpc19jdXN0b20iOiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAiaXNfdmVyaWZpZWQiOiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAiaXNfZGVmYXVsdCI6IHRydWUsCiAgICAgICAgICAgICAgICAgICAgImlzX2VuYWJsZWQiOiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAiaXNfZGVsZXRlZCI6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgICJ2ZXJpZmllZF9hdCI6IG51bGwsCiAgICAgICAgICAgICAgICAgICAgImNyZWF0ZWRfYXQiOiAiMjAyMS0wOC0yNFQxODoyNDoxOCswMDowMCIsCiAgICAgICAgICAgICAgICAgICAgInVwZGF0ZWRfYXQiOiAiMjAyMS0wOC0yN1QwNjo1NzowOCswMDowMCIsCiAgICAgICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAibWFpbGJveCIsCiAgICAgICAgICAgICAgICAgICAgInJlc291cmNlX3VybCI6ICJodHRwczovLzxJTVBPUlRfS0FZQUtPX0VORFBPSU5UX0hPU1ROQU1FPi9hcGkvdjEvbWFpbGJveGVzLzEiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAiY2hhbm5lbCIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgImF0dGFjaG1lbnRzIjogW10sCiAgICAgICAgICAgICJkb3dubG9hZF9hbGwiOiBudWxsLAogICAgICAgICAgICAiZGVzdGluYXRpb25fbWVkaXVtIjogbnVsbCwKICAgICAgICAgICAgInNvdXJjZSI6IG51bGwsCiAgICAgICAgICAgICJtZXRhZGF0YSI6IHsKICAgICAgICAgICAgICAgICJ1c2VyX2FnZW50IjogIiIsCiAgICAgICAgICAgICAgICAicGFnZV91cmwiOiAiIgogICAgICAgICAgICB9LAogICAgICAgICAgICAib3JpZ2luYWwiOiB7CiAgICAgICAgICAgICAgICAiaWQiOiAzLAogICAgICAgICAgICAgICAgInV1aWQiOiAiYWE2MjJmNWItZDZmMy00OWNkLTlmYjUtMzZiODI2MTYwZDc2IiwKICAgICAgICAgICAgICAgICJzdWJqZWN0IjogIlRFU1QiLAogICAgICAgICAgICAgICAgImJvZHlfdGV4dCI6ICJUaGF0IGFwcGVhcnMgdG8gaGF2ZSB3b3JrZWQuIFRoYW5rIHlvdSEiLAogICAgICAgICAgICAgICAgImJvZHlfaHRtbCI6ICJUaGF0IGFwcGVhcnMgdG8gaGF2ZSB3b3JrZWQuIFRoYW5rIHlvdSEiLAogICAgICAgICAgICAgICAgInJlY2lwaWVudHMiOiBbXSwKICAgICAgICAgICAgICAgICJmdWxsbmFtZSI6ICJUYXlsb3IgV2VzdCIsCiAgICAgICAgICAgICAgICAiZW1haWwiOiBudWxsLAogICAgICAgICAgICAgICAgImNyZWF0b3IiOiB7CiAgICAgICAgICAgICAgICAgICAgImlkIjogMywKICAgICAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJ1c2VyIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJpZGVudGl0eSI6IHsKICAgICAgICAgICAgICAgICAgICAiaWQiOiAzLAogICAgICAgICAgICAgICAgICAgICJlbWFpbCI6ICJyYWluYm93Y2l0eWNhZmVAZ21haWwuY29tIiwKICAgICAgICAgICAgICAgICAgICAiaXNfcHJpbWFyeSI6IHRydWUsCiAgICAgICAgICAgICAgICAgICAgImlzX3ZhbGlkYXRlZCI6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgICJpc19ub3RpZmljYXRpb25fZW5hYmxlZCI6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgICJjcmVhdGVkX2F0IjogIjIwMjEtMDgtMjRUMTg6MjQ6MTIrMDA6MDAiLAogICAgICAgICAgICAgICAgICAgICJ1cGRhdGVkX2F0IjogIjIwMjEtMDgtMjRUMTg6MjQ6MTIrMDA6MDAiLAogICAgICAgICAgICAgICAgICAgICJyZXNvdXJjZV90eXBlIjogImlkZW50aXR5X2VtYWlsIiwKICAgICAgICAgICAgICAgICAgICAicmVzb3VyY2VfdXJsIjogImh0dHBzOi8vPElNUE9SVF9LQVlBS09fRU5EUE9JTlRfSE9TVE5BTUU+L2FwaS92MS9pZGVudGl0aWVzL2VtYWlscy8zIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJtYWlsYm94IjogewogICAgICAgICAgICAgICAgICAgICJpZCI6IDEsCiAgICAgICAgICAgICAgICAgICAgInV1aWQiOiAiZmQzYTgxMTYtOTVjMi00OTJlLTlhZjMtYjNhYjU3ZGM5ZjFhIiwKICAgICAgICAgICAgICAgICAgICAiYWRkcmVzcyI6ICJzdXBwb3J0QDxJTVBPUlRfS0FZQUtPX0VORFBPSU5UX0hPU1ROQU1FPiIsCiAgICAgICAgICAgICAgICAgICAgImJyYW5kIjogewogICAgICAgICAgICAgICAgICAgICAgICAiaWQiOiAxLAogICAgICAgICAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJicmFuZCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJpc19zeXN0ZW0iOiB0cnVlLAogICAgICAgICAgICAgICAgICAgICJpc19jdXN0b20iOiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAiaXNfdmVyaWZpZWQiOiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAiaXNfZGVmYXVsdCI6IHRydWUsCiAgICAgICAgICAgICAgICAgICAgImlzX2VuYWJsZWQiOiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAiaXNfZGVsZXRlZCI6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgICJ2ZXJpZmllZF9hdCI6IG51bGwsCiAgICAgICAgICAgICAgICAgICAgImNyZWF0ZWRfYXQiOiAiMjAyMS0wOC0yNFQxODoyNDoxOCswMDowMCIsCiAgICAgICAgICAgICAgICAgICAgInVwZGF0ZWRfYXQiOiAiMjAyMS0wOC0yN1QwNjo1NzowOCswMDowMCIsCiAgICAgICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAibWFpbGJveCIsCiAgICAgICAgICAgICAgICAgICAgInJlc291cmNlX3VybCI6ICJodHRwczovLzxJTVBPUlRfS0FZQUtPX0VORFBPSU5UX0hPU1ROQU1FPi9hcGkvdjEvbWFpbGJveGVzLzEiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgImF0dGFjaG1lbnRzIjogW10sCiAgICAgICAgICAgICAgICAiZG93bmxvYWRfYWxsIjogbnVsbCwKICAgICAgICAgICAgICAgICJsb2NhbGUiOiBudWxsLAogICAgICAgICAgICAgICAgInJlc3BvbnNlX3RpbWUiOiAwLAogICAgICAgICAgICAgICAgImNyZWF0ZWRfYXQiOiAiMjAyMS0wOC0yNFQxODowOTo0NCswMDowMCIsCiAgICAgICAgICAgICAgICAidXBkYXRlZF9hdCI6ICIyMDIxLTA4LTI0VDE4OjA5OjQ0KzAwOjAwIiwKICAgICAgICAgICAgICAgICJyZXNvdXJjZV90eXBlIjogImNhc2VfbWVzc2FnZSIsCiAgICAgICAgICAgICAgICAicmVzb3VyY2VfdXJsIjogImh0dHBzOi8vPElNUE9SVF9LQVlBS09fRU5EUE9JTlRfSE9TVE5BTUU+L2FwaS92MS9jYXNlcy8xL21lc3NhZ2VzLzMiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJwb3N0X3N0YXR1cyI6ICJTRU5UIiwKICAgICAgICAgICAgInBvc3Rfc3RhdHVzX3JlamVjdF90eXBlIjogbnVsbCwKICAgICAgICAgICAgInBvc3Rfc3RhdHVzX3JlamVjdF9yZWFzb24iOiBudWxsLAogICAgICAgICAgICAicG9zdF9zdGF0dXNfdXBkYXRlZF9hdCI6ICIyMDIxLTA4LTI0VDE4OjI0OjMzKzAwOjAwIiwKICAgICAgICAgICAgImlzX3JlcXVlc3RlciI6IHRydWUsCiAgICAgICAgICAgICJjcmVhdGVkX2F0IjogIjIwMjEtMDgtMjRUMTg6MDk6NDQrMDA6MDAiLAogICAgICAgICAgICAidXBkYXRlZF9hdCI6ICIyMDIxLTA4LTI0VDE4OjA5OjQ0KzAwOjAwIiwKICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAicG9zdCIsCiAgICAgICAgICAgICJyZXNvdXJjZV91cmwiOiAiaHR0cHM6Ly88SU1QT1JUX0tBWUFLT19FTkRQT0lOVF9IT1NUTkFNRT4vYXBpL3YxL2Nhc2VzL3Bvc3RzLzE2IgogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICAiaWQiOiAxMiwKICAgICAgICAgICAgInV1aWQiOiAiZDVmMDRhY2QtN2I5OS00ZWQ4LWFkYjEtYjE1MTdmMGM3MzEwIiwKICAgICAgICAgICAgImNsaWVudF9pZCI6ICIiLAogICAgICAgICAgICAic3ViamVjdCI6ICJURVNUIiwKICAgICAgICAgICAgImNvbnRlbnRzIjogIk9rYXksIGxldCBtZSBnaXZlIHRoYXQgYSB0cnkuIiwKICAgICAgICAgICAgImNyZWF0b3IiOiB7CiAgICAgICAgICAgICAgICAiaWQiOiAzLAogICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAidXNlciIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgImlkZW50aXR5IjogewogICAgICAgICAgICAgICAgImlkIjogMywKICAgICAgICAgICAgICAgICJlbWFpbCI6ICJyYWluYm93Y2l0eWNhZmVAZ21haWwuY29tIiwKICAgICAgICAgICAgICAgICJpc19wcmltYXJ5IjogdHJ1ZSwKICAgICAgICAgICAgICAgICJpc192YWxpZGF0ZWQiOiBmYWxzZSwKICAgICAgICAgICAgICAgICJpc19ub3RpZmljYXRpb25fZW5hYmxlZCI6IGZhbHNlLAogICAgICAgICAgICAgICAgImNyZWF0ZWRfYXQiOiAiMjAyMS0wOC0yNFQxODoyNDoxMiswMDowMCIsCiAgICAgICAgICAgICAgICAidXBkYXRlZF9hdCI6ICIyMDIxLTA4LTI0VDE4OjI0OjEyKzAwOjAwIiwKICAgICAgICAgICAgICAgICJyZXNvdXJjZV90eXBlIjogImlkZW50aXR5X2VtYWlsIiwKICAgICAgICAgICAgICAgICJyZXNvdXJjZV91cmwiOiAiaHR0cHM6Ly88SU1QT1JUX0tBWUFLT19FTkRQT0lOVF9IT1NUTkFNRT4vYXBpL3YxL2lkZW50aXRpZXMvZW1haWxzLzMiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJzb3VyY2VfY2hhbm5lbCI6IHsKICAgICAgICAgICAgICAgICJ1dWlkIjogImZkM2E4MTE2LTk1YzItNDkyZS05YWYzLWIzYWI1N2RjOWYxYSIsCiAgICAgICAgICAgICAgICAidHlwZSI6ICJNQUlMIiwKICAgICAgICAgICAgICAgICJjaGFyYWN0ZXJfbGltaXQiOiBudWxsLAogICAgICAgICAgICAgICAgImFjY291bnQiOiB7CiAgICAgICAgICAgICAgICAgICAgImlkIjogMSwKICAgICAgICAgICAgICAgICAgICAidXVpZCI6ICJmZDNhODExNi05NWMyLTQ5MmUtOWFmMy1iM2FiNTdkYzlmMWEiLAogICAgICAgICAgICAgICAgICAgICJhZGRyZXNzIjogInN1cHBvcnRAPElNUE9SVF9LQVlBS09fRU5EUE9JTlRfSE9TVE5BTUU+IiwKICAgICAgICAgICAgICAgICAgICAiYnJhbmQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJpZCI6IDEsCiAgICAgICAgICAgICAgICAgICAgICAgICJyZXNvdXJjZV90eXBlIjogImJyYW5kIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImlzX3N5c3RlbSI6IHRydWUsCiAgICAgICAgICAgICAgICAgICAgImlzX2N1c3RvbSI6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgICJpc192ZXJpZmllZCI6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgICJpc19kZWZhdWx0IjogdHJ1ZSwKICAgICAgICAgICAgICAgICAgICAiaXNfZW5hYmxlZCI6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgICJpc19kZWxldGVkIjogZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgInZlcmlmaWVkX2F0IjogbnVsbCwKICAgICAgICAgICAgICAgICAgICAiY3JlYXRlZF9hdCI6ICIyMDIxLTA4LTI0VDE4OjI0OjE4KzAwOjAwIiwKICAgICAgICAgICAgICAgICAgICAidXBkYXRlZF9hdCI6ICIyMDIxLTA4LTI3VDA2OjU3OjA4KzAwOjAwIiwKICAgICAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJtYWlsYm94IiwKICAgICAgICAgICAgICAgICAgICAicmVzb3VyY2VfdXJsIjogImh0dHBzOi8vPElNUE9SVF9LQVlBS09fRU5EUE9JTlRfSE9TVE5BTUU+L2FwaS92MS9tYWlsYm94ZXMvMSIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJjaGFubmVsIgogICAgICAgICAgICB9LAogICAgICAgICAgICAiYXR0YWNobWVudHMiOiBbXSwKICAgICAgICAgICAgImRvd25sb2FkX2FsbCI6IG51bGwsCiAgICAgICAgICAgICJkZXN0aW5hdGlvbl9tZWRpdW0iOiBudWxsLAogICAgICAgICAgICAic291cmNlIjogbnVsbCwKICAgICAgICAgICAgIm1ldGFkYXRhIjogewogICAgICAgICAgICAgICAgInVzZXJfYWdlbnQiOiAiIiwKICAgICAgICAgICAgICAgICJwYWdlX3VybCI6ICIiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJvcmlnaW5hbCI6IHsKICAgICAgICAgICAgICAgICJpZCI6IDIsCiAgICAgICAgICAgICAgICAidXVpZCI6ICJkNWYwNGFjZC03Yjk5LTRlZDgtYWRiMS1iMTUxN2YwYzczMTAiLAogICAgICAgICAgICAgICAgInN1YmplY3QiOiAiVEVTVCIsCiAgICAgICAgICAgICAgICAiYm9keV90ZXh0IjogIk9rYXksIGxldCBtZSBnaXZlIHRoYXQgYSB0cnkuIiwKICAgICAgICAgICAgICAgICJib2R5X2h0bWwiOiAiT2theSwgbGV0IG1lIGdpdmUgdGhhdCBhIHRyeS4iLAogICAgICAgICAgICAgICAgInJlY2lwaWVudHMiOiBbXSwKICAgICAgICAgICAgICAgICJmdWxsbmFtZSI6ICJUYXlsb3IgV2VzdCIsCiAgICAgICAgICAgICAgICAiZW1haWwiOiBudWxsLAogICAgICAgICAgICAgICAgImNyZWF0b3IiOiB7CiAgICAgICAgICAgICAgICAgICAgImlkIjogMywKICAgICAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJ1c2VyIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJpZGVudGl0eSI6IHsKICAgICAgICAgICAgICAgICAgICAiaWQiOiAzLAogICAgICAgICAgICAgICAgICAgICJlbWFpbCI6ICJyYWluYm93Y2l0eWNhZmVAZ21haWwuY29tIiwKICAgICAgICAgICAgICAgICAgICAiaXNfcHJpbWFyeSI6IHRydWUsCiAgICAgICAgICAgICAgICAgICAgImlzX3ZhbGlkYXRlZCI6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgICJpc19ub3RpZmljYXRpb25fZW5hYmxlZCI6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgICJjcmVhdGVkX2F0IjogIjIwMjEtMDgtMjRUMTg6MjQ6MTIrMDA6MDAiLAogICAgICAgICAgICAgICAgICAgICJ1cGRhdGVkX2F0IjogIjIwMjEtMDgtMjRUMTg6MjQ6MTIrMDA6MDAiLAogICAgICAgICAgICAgICAgICAgICJyZXNvdXJjZV90eXBlIjogImlkZW50aXR5X2VtYWlsIiwKICAgICAgICAgICAgICAgICAgICAicmVzb3VyY2VfdXJsIjogImh0dHBzOi8vPElNUE9SVF9LQVlBS09fRU5EUE9JTlRfSE9TVE5BTUU+L2FwaS92MS9pZGVudGl0aWVzL2VtYWlscy8zIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJtYWlsYm94IjogewogICAgICAgICAgICAgICAgICAgICJpZCI6IDEsCiAgICAgICAgICAgICAgICAgICAgInV1aWQiOiAiZmQzYTgxMTYtOTVjMi00OTJlLTlhZjMtYjNhYjU3ZGM5ZjFhIiwKICAgICAgICAgICAgICAgICAgICAiYWRkcmVzcyI6ICJzdXBwb3J0QDxJTVBPUlRfS0FZQUtPX0VORFBPSU5UX0hPU1ROQU1FPiIsCiAgICAgICAgICAgICAgICAgICAgImJyYW5kIjogewogICAgICAgICAgICAgICAgICAgICAgICAiaWQiOiAxLAogICAgICAgICAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJicmFuZCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJpc19zeXN0ZW0iOiB0cnVlLAogICAgICAgICAgICAgICAgICAgICJpc19jdXN0b20iOiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAiaXNfdmVyaWZpZWQiOiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAiaXNfZGVmYXVsdCI6IHRydWUsCiAgICAgICAgICAgICAgICAgICAgImlzX2VuYWJsZWQiOiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAiaXNfZGVsZXRlZCI6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgICJ2ZXJpZmllZF9hdCI6IG51bGwsCiAgICAgICAgICAgICAgICAgICAgImNyZWF0ZWRfYXQiOiAiMjAyMS0wOC0yNFQxODoyNDoxOCswMDowMCIsCiAgICAgICAgICAgICAgICAgICAgInVwZGF0ZWRfYXQiOiAiMjAyMS0wOC0yN1QwNjo1NzowOCswMDowMCIsCiAgICAgICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAibWFpbGJveCIsCiAgICAgICAgICAgICAgICAgICAgInJlc291cmNlX3VybCI6ICJodHRwczovLzxJTVBPUlRfS0FZQUtPX0VORFBPSU5UX0hPU1ROQU1FPi9hcGkvdjEvbWFpbGJveGVzLzEiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgImF0dGFjaG1lbnRzIjogW10sCiAgICAgICAgICAgICAgICAiZG93bmxvYWRfYWxsIjogbnVsbCwKICAgICAgICAgICAgICAgICJsb2NhbGUiOiBudWxsLAogICAgICAgICAgICAgICAgInJlc3BvbnNlX3RpbWUiOiAwLAogICAgICAgICAgICAgICAgImNyZWF0ZWRfYXQiOiAiMjAyMS0wOC0yNFQxODowOTo0MCswMDowMCIsCiAgICAgICAgICAgICAgICAidXBkYXRlZF9hdCI6ICIyMDIxLTA4LTI0VDE4OjA5OjQwKzAwOjAwIiwKICAgICAgICAgICAgICAgICJyZXNvdXJjZV90eXBlIjogImNhc2VfbWVzc2FnZSIsCiAgICAgICAgICAgICAgICAicmVzb3VyY2VfdXJsIjogImh0dHBzOi8vPElNUE9SVF9LQVlBS09fRU5EUE9JTlRfSE9TVE5BTUU+L2FwaS92MS9jYXNlcy8xL21lc3NhZ2VzLzIiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJwb3N0X3N0YXR1cyI6ICJTRU5UIiwKICAgICAgICAgICAgInBvc3Rfc3RhdHVzX3JlamVjdF90eXBlIjogbnVsbCwKICAgICAgICAgICAgInBvc3Rfc3RhdHVzX3JlamVjdF9yZWFzb24iOiBudWxsLAogICAgICAgICAgICAicG9zdF9zdGF0dXNfdXBkYXRlZF9hdCI6ICIyMDIxLTA4LTI0VDE4OjI0OjMwKzAwOjAwIiwKICAgICAgICAgICAgImlzX3JlcXVlc3RlciI6IHRydWUsCiAgICAgICAgICAgICJjcmVhdGVkX2F0IjogIjIwMjEtMDgtMjRUMTg6MDk6NDArMDA6MDAiLAogICAgICAgICAgICAidXBkYXRlZF9hdCI6ICIyMDIxLTA4LTI0VDE4OjA5OjQwKzAwOjAwIiwKICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAicG9zdCIsCiAgICAgICAgICAgICJyZXNvdXJjZV91cmwiOiAiaHR0cHM6Ly88SU1QT1JUX0tBWUFLT19FTkRQT0lOVF9IT1NUTkFNRT4vYXBpL3YxL2Nhc2VzL3Bvc3RzLzEyIgogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICAiaWQiOiAxMCwKICAgICAgICAgICAgInV1aWQiOiAiY2IzZWU3OWQtNDkxMi00ZWU0LTgxOWMtMzE3YWEzMDBlYjk4IiwKICAgICAgICAgICAgImNsaWVudF9pZCI6ICIiLAogICAgICAgICAgICAic3ViamVjdCI6ICJURVNUIiwKICAgICAgICAgICAgImNvbnRlbnRzIjogIkhpIFRheWxvcixcblxuSXQgbG9va3MgbGlrZSB5b3XigJl2ZSBoaXQgYSBzbmFnIHdoaWxlIGNoZWNraW5nIG91dCB3aXRoIHlvdXIgbmV3IFI1OCBjb2ZmZWUgbWFjaGluZSEgU29ycnkgYWJvdXQgdGhhdCAtIHRoZSByZWFzb24geW91ciBjYXJkIHdhcyBkZWNsaW5lZCBhcHBlYXJzIHRvIGJlIGFuIGluY29ycmVjdCBDVlYgbnVtYmVyICh0aHJlZSBkaWdpdCBudW1iZXIgb24gdGhlIGJhY2sgb2YgeW91ciBjYXJkKS4gSWYgeW91IGZpeCB0aGF0IGRldGFpbCwgeW91IHNob3VsZCBiZSBnb29kIHRvIGdvLiDimJVcblxuW2ltZyBzcmM9XCJodHRwczovL2NkbjIuaHVic3BvdC5uZXQvaHViZnMvNDUxMDA1L2theWFrby1jdXN0b21lci1qb3VybmV5LWN2di5qcGdcIiAvXVxuXG5MZXQgdXMga25vdyBpZiB5b3UgaGF2ZSBhbnkgbW9yZSBxdWVzdGlvbnMuXG5cblRvYmlhcyBTY2hyb2V0ZXJcbiIsCiAgICAgICAgICAgICJjcmVhdG9yIjogewogICAgICAgICAgICAgICAgImlkIjogNCwKICAgICAgICAgICAgICAgICJyZXNvdXJjZV90eXBlIjogInVzZXIiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJpZGVudGl0eSI6IHsKICAgICAgICAgICAgICAgICJpZCI6IDQsCiAgICAgICAgICAgICAgICAiZW1haWwiOiAidG9iaWFzQGJyZXdmaWN0dXMuY29tIiwKICAgICAgICAgICAgICAgICJpc19wcmltYXJ5IjogdHJ1ZSwKICAgICAgICAgICAgICAgICJpc192YWxpZGF0ZWQiOiBmYWxzZSwKICAgICAgICAgICAgICAgICJpc19ub3RpZmljYXRpb25fZW5hYmxlZCI6IGZhbHNlLAogICAgICAgICAgICAgICAgImNyZWF0ZWRfYXQiOiAiMjAyMS0wOC0yNFQxODoyNDoxMiswMDowMCIsCiAgICAgICAgICAgICAgICAidXBkYXRlZF9hdCI6ICIyMDIxLTA4LTI0VDE4OjI0OjEyKzAwOjAwIiwKICAgICAgICAgICAgICAgICJyZXNvdXJjZV90eXBlIjogImlkZW50aXR5X2VtYWlsIiwKICAgICAgICAgICAgICAgICJyZXNvdXJjZV91cmwiOiAiaHR0cHM6Ly88SU1QT1JUX0tBWUFLT19FTkRQT0lOVF9IT1NUTkFNRT4vYXBpL3YxL2lkZW50aXRpZXMvZW1haWxzLzQiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJzb3VyY2VfY2hhbm5lbCI6IHsKICAgICAgICAgICAgICAgICJ1dWlkIjogImZkM2E4MTE2LTk1YzItNDkyZS05YWYzLWIzYWI1N2RjOWYxYSIsCiAgICAgICAgICAgICAgICAidHlwZSI6ICJNQUlMIiwKICAgICAgICAgICAgICAgICJjaGFyYWN0ZXJfbGltaXQiOiBudWxsLAogICAgICAgICAgICAgICAgImFjY291bnQiOiB7CiAgICAgICAgICAgICAgICAgICAgImlkIjogMSwKICAgICAgICAgICAgICAgICAgICAidXVpZCI6ICJmZDNhODExNi05NWMyLTQ5MmUtOWFmMy1iM2FiNTdkYzlmMWEiLAogICAgICAgICAgICAgICAgICAgICJhZGRyZXNzIjogInN1cHBvcnRAPElNUE9SVF9LQVlBS09fRU5EUE9JTlRfSE9TVE5BTUU+IiwKICAgICAgICAgICAgICAgICAgICAiYnJhbmQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJpZCI6IDEsCiAgICAgICAgICAgICAgICAgICAgICAgICJyZXNvdXJjZV90eXBlIjogImJyYW5kIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImlzX3N5c3RlbSI6IHRydWUsCiAgICAgICAgICAgICAgICAgICAgImlzX2N1c3RvbSI6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgICJpc192ZXJpZmllZCI6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgICJpc19kZWZhdWx0IjogdHJ1ZSwKICAgICAgICAgICAgICAgICAgICAiaXNfZW5hYmxlZCI6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgICJpc19kZWxldGVkIjogZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgInZlcmlmaWVkX2F0IjogbnVsbCwKICAgICAgICAgICAgICAgICAgICAiY3JlYXRlZF9hdCI6ICIyMDIxLTA4LTI0VDE4OjI0OjE4KzAwOjAwIiwKICAgICAgICAgICAgICAgICAgICAidXBkYXRlZF9hdCI6ICIyMDIxLTA4LTI3VDA2OjU3OjA4KzAwOjAwIiwKICAgICAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJtYWlsYm94IiwKICAgICAgICAgICAgICAgICAgICAicmVzb3VyY2VfdXJsIjogImh0dHBzOi8vPElNUE9SVF9LQVlBS09fRU5EUE9JTlRfSE9TVE5BTUU+L2FwaS92MS9tYWlsYm94ZXMvMSIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJjaGFubmVsIgogICAgICAgICAgICB9LAogICAgICAgICAgICAiYXR0YWNobWVudHMiOiBbXSwKICAgICAgICAgICAgImRvd25sb2FkX2FsbCI6IG51bGwsCiAgICAgICAgICAgICJkZXN0aW5hdGlvbl9tZWRpdW0iOiBudWxsLAogICAgICAgICAgICAic291cmNlIjogbnVsbCwKICAgICAgICAgICAgIm1ldGFkYXRhIjogewogICAgICAgICAgICAgICAgInVzZXJfYWdlbnQiOiAiIiwKICAgICAgICAgICAgICAgICJwYWdlX3VybCI6ICIiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJvcmlnaW5hbCI6IHsKICAgICAgICAgICAgICAgICJpZCI6IDEsCiAgICAgICAgICAgICAgICAidXVpZCI6ICJjYjNlZTc5ZC00OTEyLTRlZTQtODE5Yy0zMTdhYTMwMGViOTgiLAogICAgICAgICAgICAgICAgInN1YmplY3QiOiAiVEVTVCIsCiAgICAgICAgICAgICAgICAiYm9keV90ZXh0IjogIkhpIFRheWxvcixcblxuSXQgbG9va3MgbGlrZSB5b3XigJl2ZSBoaXQgYSBzbmFnIHdoaWxlIGNoZWNraW5nIG91dCB3aXRoIHlvdXIgbmV3IFI1OCBjb2ZmZWUgbWFjaGluZSEgU29ycnkgYWJvdXQgdGhhdCAtIHRoZSByZWFzb24geW91ciBjYXJkIHdhcyBkZWNsaW5lZCBhcHBlYXJzIHRvIGJlIGFuIGluY29ycmVjdCBDVlYgbnVtYmVyICh0aHJlZSBkaWdpdCBudW1iZXIgb24gdGhlIGJhY2sgb2YgeW91ciBjYXJkKS4gSWYgeW91IGZpeCB0aGF0IGRldGFpbCwgeW91IHNob3VsZCBiZSBnb29kIHRvIGdvLiDimJVcblxuW2ltZyBzcmM9XCJodHRwczovL2NkbjIuaHVic3BvdC5uZXQvaHViZnMvNDUxMDA1L2theWFrby1jdXN0b21lci1qb3VybmV5LWN2di5qcGdcIiAvXVxuXG5MZXQgdXMga25vdyBpZiB5b3UgaGF2ZSBhbnkgbW9yZSBxdWVzdGlvbnMuXG5cblRvYmlhcyBTY2hyb2V0ZXJcbiIsCiAgICAgICAgICAgICAgICAiYm9keV9odG1sIjogIjxwPkhpIFRheWxvciw8L3A+XG5cdFx0PHA+SXQgbG9va3MgbGlrZSB5b3XigJl2ZSBoaXQgYSBzbmFnIHdoaWxlIGNoZWNraW5nIG91dCB3aXRoIHlvdXIgbmV3IFI1OCBjb2ZmZWUgbWFjaGluZSEgU29ycnkgYWJvdXQgdGhhdCAtIHRoZSByZWFzb24geW91ciBjYXJkIHdhcyBkZWNsaW5lZCBhcHBlYXJzIHRvIGJlIGFuIGluY29ycmVjdCBDVlYgbnVtYmVyICh0aHJlZSBkaWdpdCBudW1iZXIgb24gdGhlIGJhY2sgb2YgeW91ciBjYXJkKS4gSWYgeW91IGZpeCB0aGF0IGRldGFpbCwgeW91IHNob3VsZCBiZSBnb29kIHRvIGdvLiDimJU8L3A+XG4gXG5cdFx0PHA+PGltZyBzcmM9XCJodHRwczovL2NkbjIuaHVic3BvdC5uZXQvaHViZnMvNDUxMDA1L2theWFrby1jdXN0b21lci1qb3VybmV5LWN2di5qcGdcIiAvPjwvcD5cbiBcblx0XHQ8cD5MZXQgdXMga25vdyBpZiB5b3UgaGF2ZSBhbnkgbW9yZSBxdWVzdGlvbnMuPC9wPlxuIFxuXHRcdDxwPlRvYmlhcyBTY2hyb2V0ZXI8L3A+IiwKICAgICAgICAgICAgICAgICJyZWNpcGllbnRzIjogW10sCiAgICAgICAgICAgICAgICAiZnVsbG5hbWUiOiAiVG9iaWFzIFNjaHJvZXRlciIsCiAgICAgICAgICAgICAgICAiZW1haWwiOiBudWxsLAogICAgICAgICAgICAgICAgImNyZWF0b3IiOiB7CiAgICAgICAgICAgICAgICAgICAgImlkIjogNCwKICAgICAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJ1c2VyIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJpZGVudGl0eSI6IHsKICAgICAgICAgICAgICAgICAgICAiaWQiOiA0LAogICAgICAgICAgICAgICAgICAgICJlbWFpbCI6ICJ0b2JpYXNAYnJld2ZpY3R1cy5jb20iLAogICAgICAgICAgICAgICAgICAgICJpc19wcmltYXJ5IjogdHJ1ZSwKICAgICAgICAgICAgICAgICAgICAiaXNfdmFsaWRhdGVkIjogZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgImlzX25vdGlmaWNhdGlvbl9lbmFibGVkIjogZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgImNyZWF0ZWRfYXQiOiAiMjAyMS0wOC0yNFQxODoyNDoxMiswMDowMCIsCiAgICAgICAgICAgICAgICAgICAgInVwZGF0ZWRfYXQiOiAiMjAyMS0wOC0yNFQxODoyNDoxMiswMDowMCIsCiAgICAgICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAiaWRlbnRpdHlfZW1haWwiLAogICAgICAgICAgICAgICAgICAgICJyZXNvdXJjZV91cmwiOiAiaHR0cHM6Ly88SU1QT1JUX0tBWUFLT19FTkRQT0lOVF9IT1NUTkFNRT4vYXBpL3YxL2lkZW50aXRpZXMvZW1haWxzLzQiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgIm1haWxib3giOiB7CiAgICAgICAgICAgICAgICAgICAgImlkIjogMSwKICAgICAgICAgICAgICAgICAgICAidXVpZCI6ICJmZDNhODExNi05NWMyLTQ5MmUtOWFmMy1iM2FiNTdkYzlmMWEiLAogICAgICAgICAgICAgICAgICAgICJhZGRyZXNzIjogInN1cHBvcnRAPElNUE9SVF9LQVlBS09fRU5EUE9JTlRfSE9TVE5BTUU+IiwKICAgICAgICAgICAgICAgICAgICAiYnJhbmQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJpZCI6IDEsCiAgICAgICAgICAgICAgICAgICAgICAgICJyZXNvdXJjZV90eXBlIjogImJyYW5kIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImlzX3N5c3RlbSI6IHRydWUsCiAgICAgICAgICAgICAgICAgICAgImlzX2N1c3RvbSI6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgICJpc192ZXJpZmllZCI6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgICJpc19kZWZhdWx0IjogdHJ1ZSwKICAgICAgICAgICAgICAgICAgICAiaXNfZW5hYmxlZCI6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgICJpc19kZWxldGVkIjogZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgInZlcmlmaWVkX2F0IjogbnVsbCwKICAgICAgICAgICAgICAgICAgICAiY3JlYXRlZF9hdCI6ICIyMDIxLTA4LTI0VDE4OjI0OjE4KzAwOjAwIiwKICAgICAgICAgICAgICAgICAgICAidXBkYXRlZF9hdCI6ICIyMDIxLTA4LTI3VDA2OjU3OjA4KzAwOjAwIiwKICAgICAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJtYWlsYm94IiwKICAgICAgICAgICAgICAgICAgICAicmVzb3VyY2VfdXJsIjogImh0dHBzOi8vPElNUE9SVF9LQVlBS09fRU5EUE9JTlRfSE9TVE5BTUU+L2FwaS92MS9tYWlsYm94ZXMvMSIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAiYXR0YWNobWVudHMiOiBbXSwKICAgICAgICAgICAgICAgICJkb3dubG9hZF9hbGwiOiBudWxsLAogICAgICAgICAgICAgICAgImxvY2FsZSI6IG51bGwsCiAgICAgICAgICAgICAgICAicmVzcG9uc2VfdGltZSI6IDAsCiAgICAgICAgICAgICAgICAiY3JlYXRlZF9hdCI6ICIyMDIxLTA4LTI0VDE4OjA5OjM4KzAwOjAwIiwKICAgICAgICAgICAgICAgICJ1cGRhdGVkX2F0IjogIjIwMjEtMDgtMjRUMTg6MDk6MzgrMDA6MDAiLAogICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAiY2FzZV9tZXNzYWdlIiwKICAgICAgICAgICAgICAgICJyZXNvdXJjZV91cmwiOiAiaHR0cHM6Ly88SU1QT1JUX0tBWUFLT19FTkRQT0lOVF9IT1NUTkFNRT4vYXBpL3YxL2Nhc2VzLzEvbWVzc2FnZXMvMSIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgInBvc3Rfc3RhdHVzIjogIlNFTlQiLAogICAgICAgICAgICAicG9zdF9zdGF0dXNfcmVqZWN0X3R5cGUiOiBudWxsLAogICAgICAgICAgICAicG9zdF9zdGF0dXNfcmVqZWN0X3JlYXNvbiI6IG51bGwsCiAgICAgICAgICAgICJwb3N0X3N0YXR1c191cGRhdGVkX2F0IjogIjIwMjEtMDgtMjRUMTg6MjQ6MjcrMDA6MDAiLAogICAgICAgICAgICAiaXNfcmVxdWVzdGVyIjogZmFsc2UsCiAgICAgICAgICAgICJjcmVhdGVkX2F0IjogIjIwMjEtMDgtMjRUMTg6MDk6MzgrMDA6MDAiLAogICAgICAgICAgICAidXBkYXRlZF9hdCI6ICIyMDIxLTA4LTI0VDE4OjA5OjM4KzAwOjAwIiwKICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAicG9zdCIsCiAgICAgICAgICAgICJyZXNvdXJjZV91cmwiOiAiaHR0cHM6Ly88SU1QT1JUX0tBWUFLT19FTkRQT0lOVF9IT1NUTkFNRT4vYXBpL3YxL2Nhc2VzL3Bvc3RzLzEwIgogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICAiaWQiOiA5LAogICAgICAgICAgICAidXVpZCI6ICI1ZmY2NTQyZi05OWZmLTQ5NzYtYjQ4My1iMDk5MTcxZGNlYTYiLAogICAgICAgICAgICAiY2xpZW50X2lkIjogIiIsCiAgICAgICAgICAgICJzdWJqZWN0IjogIkhpLCBuZWVkIHNvbWUgaGVscCB3aXRoIHBheW1lbnQiLAogICAgICAgICAgICAiY29udGVudHMiOiAiSGksIG5lZWQgc29tZSBoZWxwIHdpdGggcGF5bWVudCIsCiAgICAgICAgICAgICJjcmVhdG9yIjogewogICAgICAgICAgICAgICAgImlkIjogMywKICAgICAgICAgICAgICAgICJyZXNvdXJjZV90eXBlIjogInVzZXIiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJpZGVudGl0eSI6IHsKICAgICAgICAgICAgICAgICJpZCI6IDMsCiAgICAgICAgICAgICAgICAiZW1haWwiOiAicmFpbmJvd2NpdHljYWZlQGdtYWlsLmNvbSIsCiAgICAgICAgICAgICAgICAiaXNfcHJpbWFyeSI6IHRydWUsCiAgICAgICAgICAgICAgICAiaXNfdmFsaWRhdGVkIjogZmFsc2UsCiAgICAgICAgICAgICAgICAiaXNfbm90aWZpY2F0aW9uX2VuYWJsZWQiOiBmYWxzZSwKICAgICAgICAgICAgICAgICJjcmVhdGVkX2F0IjogIjIwMjEtMDgtMjRUMTg6MjQ6MTIrMDA6MDAiLAogICAgICAgICAgICAgICAgInVwZGF0ZWRfYXQiOiAiMjAyMS0wOC0yNFQxODoyNDoxMiswMDowMCIsCiAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJpZGVudGl0eV9lbWFpbCIsCiAgICAgICAgICAgICAgICAicmVzb3VyY2VfdXJsIjogImh0dHBzOi8vPElNUE9SVF9LQVlBS09fRU5EUE9JTlRfSE9TVE5BTUU+L2FwaS92MS9pZGVudGl0aWVzL2VtYWlscy8zIgogICAgICAgICAgICB9LAogICAgICAgICAgICAic291cmNlX2NoYW5uZWwiOiB7CiAgICAgICAgICAgICAgICAidXVpZCI6ICJlNWNjZjYwNC1jZGVkLTU0ZmItYmFhZC1jNGQ5ZTk5OWQwNDMiLAogICAgICAgICAgICAgICAgInR5cGUiOiAiTUVTU0VOR0VSIiwKICAgICAgICAgICAgICAgICJjaGFyYWN0ZXJfbGltaXQiOiBudWxsLAogICAgICAgICAgICAgICAgImFjY291bnQiOiBudWxsLAogICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAiY2hhbm5lbCIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgImF0dGFjaG1lbnRzIjogW10sCiAgICAgICAgICAgICJkb3dubG9hZF9hbGwiOiBudWxsLAogICAgICAgICAgICAiZGVzdGluYXRpb25fbWVkaXVtIjogbnVsbCwKICAgICAgICAgICAgInNvdXJjZSI6IG51bGwsCiAgICAgICAgICAgICJtZXRhZGF0YSI6IHsKICAgICAgICAgICAgICAgICJ1c2VyX2FnZW50IjogIiIsCiAgICAgICAgICAgICAgICAicGFnZV91cmwiOiAiIgogICAgICAgICAgICB9LAogICAgICAgICAgICAib3JpZ2luYWwiOiB7CiAgICAgICAgICAgICAgICAiaWQiOiAxLAogICAgICAgICAgICAgICAgImZyb20iOiB7CiAgICAgICAgICAgICAgICAgICAgImlkIjogMywKICAgICAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJ1c2VyX21pbmltYWwiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgImV2ZW50IjogIm1lc3NhZ2UiLAogICAgICAgICAgICAgICAgInV1aWQiOiAiNWZmNjU0MmYtOTlmZi00OTc2LWI0ODMtYjA5OTE3MWRjZWE2IiwKICAgICAgICAgICAgICAgICJ0ZXh0IjogIkhpLCBuZWVkIHNvbWUgaGVscCB3aXRoIHBheW1lbnQiLAogICAgICAgICAgICAgICAgInR5cGUiOiAiIiwKICAgICAgICAgICAgICAgICJhdHRhY2htZW50cyI6IFtdLAogICAgICAgICAgICAgICAgImNoYXQiOiB7CiAgICAgICAgICAgICAgICAgICAgImlkIjogMSwKICAgICAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJjaGF0IgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJjcmVhdGVkX2F0IjogIjIwMjEtMDgtMjRUMTg6MDk6MzcrMDA6MDAiLAogICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAiY2hhdF9tZXNzYWdlIiwKICAgICAgICAgICAgICAgICJyZXNvdXJjZV91cmwiOiAiaHR0cHM6Ly88SU1QT1JUX0tBWUFLT19FTkRQT0lOVF9IT1NUTkFNRT4vYXBpL3YxL2NoYXRzLzEvbWVzc2FnZXMvMSIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgInBvc3Rfc3RhdHVzIjogIkRFTElWRVJFRCIsCiAgICAgICAgICAgICJwb3N0X3N0YXR1c19yZWplY3RfdHlwZSI6IG51bGwsCiAgICAgICAgICAgICJwb3N0X3N0YXR1c19yZWplY3RfcmVhc29uIjogbnVsbCwKICAgICAgICAgICAgInBvc3Rfc3RhdHVzX3VwZGF0ZWRfYXQiOiAiMjAyMS0wOC0yNFQxODoyNDoyNSswMDowMCIsCiAgICAgICAgICAgICJpc19yZXF1ZXN0ZXIiOiB0cnVlLAogICAgICAgICAgICAiY3JlYXRlZF9hdCI6ICIyMDIxLTA4LTI0VDE4OjA5OjM3KzAwOjAwIiwKICAgICAgICAgICAgInVwZGF0ZWRfYXQiOiAiMjAyMS0wOC0yNFQxODowOTozNyswMDowMCIsCiAgICAgICAgICAgICJyZXNvdXJjZV90eXBlIjogInBvc3QiLAogICAgICAgICAgICAicmVzb3VyY2VfdXJsIjogImh0dHBzOi8vPElNUE9SVF9LQVlBS09fRU5EUE9JTlRfSE9TVE5BTUU+L2FwaS92MS9jYXNlcy9wb3N0cy85IgogICAgICAgIH0KICAgIF0sCiAgICAicmVzb3VyY2UiOiAicG9zdCIsCiAgICAibGltaXQiOiAxMDAsCiAgICAidG90YWxfY291bnQiOiA4Cn0= + recorded_at: Fri, 01 Oct 2021 15:59:01 GMT +- request: + method: get + uri: https:///api/v1/timetracking?limit=100 + body: + encoding: US-ASCII + string: '' + headers: + Content-Type: + - application/json + X-Session-Id: + - TayW6Qnt0Loid4b9a618960d7e46555d8d95657ab22808718f64lWdx9dau5cFE99JtQiSLIv2Y5Asz + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + User-Agent: + - Ruby + Host: + - "" + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx + Date: + - Fri, 01 Oct 2021 15:59:02 GMT + Content-Type: + - application/json + Transfer-Encoding: + - chunked + Connection: + - keep-alive + Cache-Control: + - private, max-age=0, must-revalidate + Expires: + - '0' + X-Api-Version: + - '1' + Date-Iso: + - '2021-10-01T15:59:02+00:00' + Access-Control-Expose-Headers: + - Date-ISO + X-Xss-Protection: + - 1; mode=block + X-Content-Type-Options: + - nosniff + Strict-Transport-Security: + - max-age=31536000; includeSubDomains preload + body: + encoding: ASCII-8BIT + string: |- + { + "status": 200, + "data": [ + { + "id": 1, + "time_tracking_log_id": 1, + "case": { + "id": 3, + "resource_type": "case" + }, + "agent": { + "id": 1, + "resource_type": "user" + }, + "log_type": "VIEWED", + "time_spent": 90, + "creator": { + "id": 1, + "resource_type": "user" + }, + "created_at": "2021-08-27T11:25:30+00:00", + "updated_at": "2021-08-27T11:26:30+00:00", + "resource_type": "timetracking_log", + "resource_url": "https:///api/v1/cases/time_track/log/1" + }, + { + "id": 2, + "time_tracking_log_id": 2, + "case": { + "id": 4, + "resource_type": "case" + }, + "agent": { + "id": 1, + "resource_type": "user" + }, + "log_type": "VIEWED", + "time_spent": 30, + "creator": { + "id": 1, + "resource_type": "user" + }, + "created_at": "2021-08-27T12:19:53+00:00", + "updated_at": "2021-08-27T12:19:53+00:00", + "resource_type": "timetracking_log", + "resource_url": "https:///api/v1/cases/time_track/log/2" + }, + { + "id": 3, + "time_tracking_log_id": 3, + "case": { + "id": 3, + "resource_type": "case" + }, + "agent": { + "id": 1, + "resource_type": "user" + }, + "log_type": "WORKED", + "time_spent": 3780, + "creator": { + "id": 1, + "resource_type": "user" + }, + "created_at": "2021-08-30T08:18:08+00:00", + "updated_at": "2021-08-30T08:18:08+00:00", + "resource_type": "timetracking_log", + "resource_url": "https:///api/v1/cases/time_track/log/3" + }, + { + "id": 4, + "time_tracking_log_id": 4, + "case": { + "id": 3, + "resource_type": "case" + }, + "agent": { + "id": 1, + "resource_type": "user" + }, + "log_type": "WORKED", + "time_spent": 1800, + "creator": { + "id": 1, + "resource_type": "user" + }, + "created_at": "2021-08-30T08:18:18+00:00", + "updated_at": "2021-08-30T08:18:18+00:00", + "resource_type": "timetracking_log", + "resource_url": "https:///api/v1/cases/time_track/log/4" + }, + { + "id": 5, + "time_tracking_log_id": 5, + "case": { + "id": 3, + "resource_type": "case" + }, + "agent": { + "id": 1, + "resource_type": "user" + }, + "log_type": "VIEWED", + "time_spent": 91, + "creator": { + "id": 1, + "resource_type": "user" + }, + "created_at": "2021-08-30T08:18:31+00:00", + "updated_at": "2021-08-30T08:19:32+00:00", + "resource_type": "timetracking_log", + "resource_url": "https:///api/v1/cases/time_track/log/5" + }, + { + "id": 6, + "time_tracking_log_id": 6, + "case": { + "id": 3, + "resource_type": "case" + }, + "agent": { + "id": 1, + "resource_type": "user" + }, + "log_type": "VIEWED", + "time_spent": 6982, + "creator": { + "id": 1, + "resource_type": "user" + }, + "created_at": "2021-10-01T14:02:51+00:00", + "updated_at": "2021-10-01T15:58:43+00:00", + "resource_type": "timetracking_log", + "resource_url": "https:///api/v1/cases/time_track/log/6" + } + ], + "resource": "timetracking_log", + "offset": 0, + "limit": 100, + "total_count": 6 + } + recorded_at: Fri, 01 Oct 2021 15:59:02 GMT +recorded_with: VCR 6.0.0 diff --git a/test/data/vcr_cassettes/requests/import_kayako/importkayako_post_api_v1_import_kayako_url_check_check_invalid_subdomain.yml b/test/data/vcr_cassettes/requests/import_kayako/importkayako_post_api_v1_import_kayako_url_check_check_invalid_subdomain.yml new file mode 100644 index 000000000..bc2d8d379 --- /dev/null +++ b/test/data/vcr_cassettes/requests/import_kayako/importkayako_post_api_v1_import_kayako_url_check_check_invalid_subdomain.yml @@ -0,0 +1,40 @@ +--- +http_interactions: +- request: + method: get + uri: https://reallybadexample.kayako.com/api/v1/teams + body: + encoding: US-ASCII + string: '' + headers: + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + User-Agent: + - Zammad User Agent + Host: + - reallybadexample.kayako.com + response: + status: + code: 490 + message: + headers: + Server: + - nginx + Date: + - Mon, 30 Aug 2021 12:29:21 GMT + Content-Type: + - text/html; charset=UTF-8 + Transfer-Encoding: + - chunked + Connection: + - keep-alive + Strict-Transport-Security: + - max-age=31536000; includeSubDomains preload + body: + encoding: UTF-8 + string: Either this Kayako instance does not exist or we are facing temporary + problems. Please try again in a few minutes + recorded_at: Mon, 30 Aug 2021 12:29:21 GMT +recorded_with: VCR 6.0.0 diff --git a/test/data/vcr_cassettes/requests/import_kayako/importkayako_post_api_v1_import_kayako_url_check_check_valid_subdomain.yml b/test/data/vcr_cassettes/requests/import_kayako/importkayako_post_api_v1_import_kayako_url_check_check_valid_subdomain.yml new file mode 100644 index 000000000..cb1293df4 --- /dev/null +++ b/test/data/vcr_cassettes/requests/import_kayako/importkayako_post_api_v1_import_kayako_url_check_check_valid_subdomain.yml @@ -0,0 +1,57 @@ +--- +http_interactions: +- request: + method: get + uri: https:///api/v1/teams + body: + encoding: US-ASCII + string: '' + headers: + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + User-Agent: + - Zammad User Agent + Host: + - "" + response: + status: + code: 401 + message: Unauthorized + headers: + Server: + - nginx + Date: + - Mon, 30 Aug 2021 12:29:22 GMT + Content-Type: + - application/json + Content-Length: + - '302' + Connection: + - keep-alive + Www-Authenticate: + - Basic realm="Zammad GmbH" + Cache-Control: + - private, max-age=0, must-revalidate + Expires: + - '0' + X-Api-Version: + - '1' + Strict-Transport-Security: + - max-age=31536000; includeSubDomains preload + body: + encoding: UTF-8 + string: |- + { + "status": 401, + "errors": [ + { + "code": "AUTHORIZATION_REQUIRED", + "message": "Performing this action on this resource requires authorization", + "more_info": "https://developer.kayako.com/api/v1/reference/errors/AUTHORIZATION_REQUIRED" + } + ] + } + recorded_at: Mon, 30 Aug 2021 12:29:22 GMT +recorded_with: VCR 6.0.0 diff --git a/test/data/vcr_cassettes/system/import/kayako/import_kayako_fields_validation_invalid_credentials.yml b/test/data/vcr_cassettes/system/import/kayako/import_kayako_fields_validation_invalid_credentials.yml new file mode 100644 index 000000000..ac66ca653 --- /dev/null +++ b/test/data/vcr_cassettes/system/import/kayako/import_kayako_fields_validation_invalid_credentials.yml @@ -0,0 +1,187 @@ +--- +http_interactions: +- request: + method: get + uri: https:///api/v1/teams + body: + encoding: US-ASCII + string: '' + headers: + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + User-Agent: + - Zammad User Agent + Host: + - "" + response: + status: + code: 401 + message: Unauthorized + headers: + Server: + - nginx + Date: + - Fri, 01 Oct 2021 16:05:12 GMT + Content-Type: + - application/json + Content-Length: + - '302' + Connection: + - keep-alive + Www-Authenticate: + - Basic realm="Zammad GmbH" + Cache-Control: + - private, max-age=0, must-revalidate + Expires: + - '0' + X-Api-Version: + - '1' + Strict-Transport-Security: + - max-age=31536000; includeSubDomains preload + body: + encoding: UTF-8 + string: |- + { + "status": 401, + "errors": [ + { + "code": "AUTHORIZATION_REQUIRED", + "message": "Performing this action on this resource requires authorization", + "more_info": "https://developer.kayako.com/api/v1/reference/errors/AUTHORIZATION_REQUIRED" + } + ] + } + recorded_at: Fri, 01 Oct 2021 16:05:12 GMT +- request: + method: get + uri: https:///api/v1/me + body: + encoding: US-ASCII + string: '' + headers: + Content-Type: + - application/json + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + User-Agent: + - Ruby + Host: + - "" + Authorization: + - Basic ZGV2ZWxvcG1lbnRAemFtbWFkLmNvbToxbnY0bDFkVDBLM04= + response: + status: + code: 401 + message: Unauthorized + headers: + Server: + - nginx + Date: + - Fri, 01 Oct 2021 16:05:14 GMT + Content-Type: + - application/json + Content-Length: + - '489' + Connection: + - keep-alive + Www-Authenticate: + - Basic realm="Zammad GmbH" + Cache-Control: + - private, max-age=0, must-revalidate + Expires: + - '0' + X-Api-Version: + - '1' + Strict-Transport-Security: + - max-age=31536000; includeSubDomains preload + body: + encoding: UTF-8 + string: |- + { + "status": 401, + "errors": [ + { + "code": "AUTHENTICATION_FAILED", + "message": "Used authentication credentials are invalid or signature verification failed", + "more_info": "https://developer.kayako.com/api/v1/reference/errors/AUTHENTICATION_FAILED" + } + ], + "notifications": [ + { + "type": "ERROR", + "message": "Invalid email or password (attempt: 1/10)", + "sticky": false + } + ] + } + recorded_at: Fri, 01 Oct 2021 16:05:14 GMT +- request: + method: get + uri: https:///api/v1/me + body: + encoding: US-ASCII + string: '' + headers: + Content-Type: + - application/json + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + User-Agent: + - Ruby + Host: + - "" + Authorization: + - Basic ZGV2ZWxvcG1lbnRAemFtbWFkLmNvbToxbnY0bDFkVDBLM04= + response: + status: + code: 401 + message: Unauthorized + headers: + Server: + - nginx + Date: + - Fri, 01 Oct 2021 16:05:15 GMT + Content-Type: + - application/json + Content-Length: + - '489' + Connection: + - keep-alive + Www-Authenticate: + - Basic realm="Zammad GmbH" + Cache-Control: + - private, max-age=0, must-revalidate + Expires: + - '0' + X-Api-Version: + - '1' + Strict-Transport-Security: + - max-age=31536000; includeSubDomains preload + body: + encoding: UTF-8 + string: |- + { + "status": 401, + "errors": [ + { + "code": "AUTHENTICATION_FAILED", + "message": "Used authentication credentials are invalid or signature verification failed", + "more_info": "https://developer.kayako.com/api/v1/reference/errors/AUTHENTICATION_FAILED" + } + ], + "notifications": [ + { + "type": "ERROR", + "message": "Invalid email or password (attempt: 2/10)", + "sticky": false + } + ] + } + recorded_at: Fri, 01 Oct 2021 16:05:15 GMT +recorded_with: VCR 6.0.0 diff --git a/test/data/vcr_cassettes/system/import/kayako/import_kayako_fields_validation_invalid_hostname.yml b/test/data/vcr_cassettes/system/import/kayako/import_kayako_fields_validation_invalid_hostname.yml new file mode 100644 index 000000000..a28bb0b5b --- /dev/null +++ b/test/data/vcr_cassettes/system/import/kayako/import_kayako_fields_validation_invalid_hostname.yml @@ -0,0 +1,40 @@ +--- +http_interactions: +- request: + method: get + uri: https://reallybadexample.kayako.com/api/v1/teams + body: + encoding: US-ASCII + string: '' + headers: + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + User-Agent: + - Zammad User Agent + Host: + - reallybadexample.kayako.com + response: + status: + code: 490 + message: + headers: + Server: + - nginx + Date: + - Fri, 01 Oct 2021 16:05:08 GMT + Content-Type: + - text/html; charset=UTF-8 + Transfer-Encoding: + - chunked + Connection: + - keep-alive + Strict-Transport-Security: + - max-age=31536000; includeSubDomains preload + body: + encoding: UTF-8 + string: Either this Kayako instance does not exist or we are facing temporary + problems. Please try again in a few minutes + recorded_at: Fri, 01 Oct 2021 16:05:08 GMT +recorded_with: VCR 6.0.0 diff --git a/test/data/vcr_cassettes/system/import/kayako/import_kayako_fields_validation_shows_start_button.yml b/test/data/vcr_cassettes/system/import/kayako/import_kayako_fields_validation_shows_start_button.yml new file mode 100644 index 000000000..f29e5f7ad --- /dev/null +++ b/test/data/vcr_cassettes/system/import/kayako/import_kayako_fields_validation_shows_start_button.yml @@ -0,0 +1,340 @@ +--- +http_interactions: +- request: + method: get + uri: https:///api/v1/teams + body: + encoding: US-ASCII + string: '' + headers: + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + User-Agent: + - Zammad User Agent + Host: + - "" + response: + status: + code: 401 + message: Unauthorized + headers: + Server: + - nginx + Date: + - Fri, 01 Oct 2021 16:05:21 GMT + Content-Type: + - application/json + Content-Length: + - '302' + Connection: + - keep-alive + Www-Authenticate: + - Basic realm="Zammad GmbH" + Cache-Control: + - private, max-age=0, must-revalidate + Expires: + - '0' + X-Api-Version: + - '1' + Strict-Transport-Security: + - max-age=31536000; includeSubDomains preload + body: + encoding: UTF-8 + string: |- + { + "status": 401, + "errors": [ + { + "code": "AUTHORIZATION_REQUIRED", + "message": "Performing this action on this resource requires authorization", + "more_info": "https://developer.kayako.com/api/v1/reference/errors/AUTHORIZATION_REQUIRED" + } + ] + } + recorded_at: Fri, 01 Oct 2021 16:05:21 GMT +- request: + method: get + uri: https:///api/v1/me + body: + encoding: US-ASCII + string: '' + headers: + Content-Type: + - application/json + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + User-Agent: + - Ruby + Host: + - "" + Authorization: + - Basic + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx + Date: + - Fri, 01 Oct 2021 16:05:24 GMT + Content-Type: + - application/json + Transfer-Encoding: + - chunked + Connection: + - keep-alive + X-Csrf-Token: + - jtJJZ4aiV4LzNq6JOIRHBU3QVu6ZUp1ssJrjWZMMr4A67wFjgBVYfZo7LXEg4CQbmltMmTIgQpO9ieZ6zm12G3JFCYqOYzxqFTAv + Content-Location: + - https:///api/v1/users/1 + Last-Modified: + - Fri, 01 Oct 2021 16:05:24 +0000 + Cache-Control: + - private, max-age=0, must-revalidate + Expires: + - '0' + X-Api-Version: + - '1' + Date-Iso: + - '2021-10-01T16:05:24+00:00' + Access-Control-Expose-Headers: + - Date-ISO + X-Xss-Protection: + - 1; mode=block + X-Content-Type-Options: + - nosniff + Strict-Transport-Security: + - max-age=31536000; includeSubDomains preload + body: + encoding: ASCII-8BIT + string: |- + { + "status": 200, + "data": { + "id": 1, + "uuid": "a8dfe5fd-b08d-5d07-ad8b-74b113f5d726", + "full_name": "Thorsten Eckel", + "legacy_id": null, + "designation": null, + "is_enabled": true, + "is_mfa_enabled": false, + "role": { + "id": 5, + "resource_type": "role" + }, + "avatar": "https:///avatar/get/a8dfe5fd-b08d-5d07-ad8b-74b113f5d726?1633104104", + "agent_case_access": "ALL", + "organization_case_access": null, + "organization": { + "id": 3, + "resource_type": "organization" + }, + "teams": [ + { + "id": 1, + "resource_type": "team" + }, + { + "id": 2, + "resource_type": "team" + } + ], + "emails": [ + { + "id": 1, + "resource_type": "identity_email" + } + ], + "phones": [], + "twitter": [], + "facebook": [], + "external_identifiers": [], + "custom_fields": [], + "pinned_notes_count": 0, + "locale": { + "id": 3, + "resource_type": "locale" + }, + "time_zone": "UTC", + "time_zone_offset": 0, + "greeting": null, + "signature": null, + "status_message": null, + "last_seen_user_agent": "Ruby", + "last_seen_ip": "5.231.138.208", + "last_seen_at": "2021-10-01T16:01:44+00:00", + "last_active_at": "2021-10-01T16:01:44+00:00", + "realtime_channel": "presence-442543cd422877504001eb0550f189ad362d6475fa6d95fd0f2d8ee0ff770f65@v1_users_1", + "presence_channel": "user_presence-442543cd422877504001eb0550f189ad362d6475fa6d95fd0f2d8ee0ff770f65@cf0274b394db3af555dbc136fc70aab6e45bee42", + "password_updated_at": "2021-08-27T07:18:23+00:00", + "avatar_updated_at": null, + "last_logged_in_at": "2021-10-01T16:05:24+00:00", + "last_activity_at": "2021-10-01T16:05:24+00:00", + "created_at": "2021-08-24T18:24:11+00:00", + "updated_at": "2021-10-01T16:01:44+00:00", + "permissions": [ + { + "id": 87, + "resource_type": "permission" + }, + { + "id": 26, + "resource_type": "permission" + }, + { + "id": 22, + "resource_type": "permission" + }, + { + "id": 21, + "resource_type": "permission" + }, + { + "id": 25, + "resource_type": "permission" + }, + { + "id": 23, + "resource_type": "permission" + }, + { + "id": 30, + "resource_type": "permission" + }, + { + "id": 29, + "resource_type": "permission" + }, + { + "id": 19, + "resource_type": "permission" + }, + { + "id": 20, + "resource_type": "permission" + }, + { + "id": 18, + "resource_type": "permission" + }, + { + "id": 24, + "resource_type": "permission" + }, + { + "id": 28, + "resource_type": "permission" + }, + { + "id": 27, + "resource_type": "permission" + }, + { + "id": 56, + "resource_type": "permission" + }, + { + "id": 53, + "resource_type": "permission" + }, + { + "id": 54, + "resource_type": "permission" + }, + { + "id": 58, + "resource_type": "permission" + }, + { + "id": 60, + "resource_type": "permission" + }, + { + "id": 59, + "resource_type": "permission" + }, + { + "id": 61, + "resource_type": "permission" + }, + { + "id": 63, + "resource_type": "permission" + }, + { + "id": 62, + "resource_type": "permission" + }, + { + "id": 57, + "resource_type": "permission" + }, + { + "id": 52, + "resource_type": "permission" + }, + { + "id": 55, + "resource_type": "permission" + }, + { + "id": 64, + "resource_type": "permission" + }, + { + "id": 67, + "resource_type": "permission" + }, + { + "id": 75, + "resource_type": "permission" + }, + { + "id": 76, + "resource_type": "permission" + }, + { + "id": 74, + "resource_type": "permission" + }, + { + "id": 80, + "resource_type": "permission" + }, + { + "id": 85, + "resource_type": "permission" + }, + { + "id": 86, + "resource_type": "permission" + } + ], + "settings": [ + { + "id": 4, + "resource_type": "setting" + }, + { + "id": 6, + "resource_type": "setting" + }, + { + "id": 5, + "resource_type": "setting" + } + ], + "notification_channel": "presence-442543cd422877504001eb0550f189ad362d6475fa6d95fd0f2d8ee0ff770f65@c78aaa8dab17000045571b17b135409a48bac06a", + "resource_type": "user", + "resource_url": "https:///api/v1/users/1" + }, + "resource": "user", + "session_id": "gdi6n3BqKfRxbpj404ff61fa7018ddad6c6135fde1872067558a57clJf7mIDAWXNOXlxq5e1VXSLK" + } + recorded_at: Fri, 01 Oct 2021 16:05:24 GMT +recorded_with: VCR 6.0.0 diff --git a/test/data/vcr_cassettes/system/import/kayako/import_kayako_fields_validation_valid_credentials.yml b/test/data/vcr_cassettes/system/import/kayako/import_kayako_fields_validation_valid_credentials.yml new file mode 100644 index 000000000..a0a6ea41f --- /dev/null +++ b/test/data/vcr_cassettes/system/import/kayako/import_kayako_fields_validation_valid_credentials.yml @@ -0,0 +1,187 @@ +--- +http_interactions: +- request: + method: get + uri: https:///api/v1/teams + body: + encoding: US-ASCII + string: '' + headers: + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + User-Agent: + - Zammad User Agent + Host: + - "" + response: + status: + code: 401 + message: Unauthorized + headers: + Server: + - nginx + Date: + - Fri, 01 Oct 2021 16:05:17 GMT + Content-Type: + - application/json + Content-Length: + - '302' + Connection: + - keep-alive + Www-Authenticate: + - Basic realm="Zammad GmbH" + Cache-Control: + - private, max-age=0, must-revalidate + Expires: + - '0' + X-Api-Version: + - '1' + Strict-Transport-Security: + - max-age=31536000; includeSubDomains preload + body: + encoding: UTF-8 + string: |- + { + "status": 401, + "errors": [ + { + "code": "AUTHORIZATION_REQUIRED", + "message": "Performing this action on this resource requires authorization", + "more_info": "https://developer.kayako.com/api/v1/reference/errors/AUTHORIZATION_REQUIRED" + } + ] + } + recorded_at: Fri, 01 Oct 2021 16:05:17 GMT +- request: + method: get + uri: https:///api/v1/me + body: + encoding: US-ASCII + string: '' + headers: + Content-Type: + - application/json + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + User-Agent: + - Ruby + Host: + - "" + Authorization: + - Basic ZGV2ZWxvcG1lbnRAemFtbWFkLmNvbToxbnY0bDFkVDBLM04= + response: + status: + code: 401 + message: Unauthorized + headers: + Server: + - nginx + Date: + - Fri, 01 Oct 2021 16:05:19 GMT + Content-Type: + - application/json + Content-Length: + - '489' + Connection: + - keep-alive + Www-Authenticate: + - Basic realm="Zammad GmbH" + Cache-Control: + - private, max-age=0, must-revalidate + Expires: + - '0' + X-Api-Version: + - '1' + Strict-Transport-Security: + - max-age=31536000; includeSubDomains preload + body: + encoding: UTF-8 + string: |- + { + "status": 401, + "errors": [ + { + "code": "AUTHENTICATION_FAILED", + "message": "Used authentication credentials are invalid or signature verification failed", + "more_info": "https://developer.kayako.com/api/v1/reference/errors/AUTHENTICATION_FAILED" + } + ], + "notifications": [ + { + "type": "ERROR", + "message": "Invalid email or password (attempt: 3/10)", + "sticky": false + } + ] + } + recorded_at: Fri, 01 Oct 2021 16:05:19 GMT +- request: + method: get + uri: https:///api/v1/me + body: + encoding: US-ASCII + string: '' + headers: + Content-Type: + - application/json + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + User-Agent: + - Ruby + Host: + - "" + Authorization: + - Basic ZGV2ZWxvcG1lbnRAemFtbWFkLmNvbToxbnY0bDFkVDBLM04= + response: + status: + code: 401 + message: Unauthorized + headers: + Server: + - nginx + Date: + - Fri, 01 Oct 2021 16:05:19 GMT + Content-Type: + - application/json + Content-Length: + - '489' + Connection: + - keep-alive + Www-Authenticate: + - Basic realm="Zammad GmbH" + Cache-Control: + - private, max-age=0, must-revalidate + Expires: + - '0' + X-Api-Version: + - '1' + Strict-Transport-Security: + - max-age=31536000; includeSubDomains preload + body: + encoding: UTF-8 + string: |- + { + "status": 401, + "errors": [ + { + "code": "AUTHENTICATION_FAILED", + "message": "Used authentication credentials are invalid or signature verification failed", + "more_info": "https://developer.kayako.com/api/v1/reference/errors/AUTHENTICATION_FAILED" + } + ], + "notifications": [ + { + "type": "ERROR", + "message": "Invalid email or password (attempt: 4/10)", + "sticky": false + } + ] + } + recorded_at: Fri, 01 Oct 2021 16:05:19 GMT +recorded_with: VCR 6.0.0 diff --git a/test/data/vcr_cassettes/system/import/kayako/import_kayako_fields_validation_valid_hostname.yml b/test/data/vcr_cassettes/system/import/kayako/import_kayako_fields_validation_valid_hostname.yml new file mode 100644 index 000000000..173d1d6d2 --- /dev/null +++ b/test/data/vcr_cassettes/system/import/kayako/import_kayako_fields_validation_valid_hostname.yml @@ -0,0 +1,40 @@ +--- +http_interactions: +- request: + method: get + uri: https://reallybadexample.kayako.com/api/v1/teams + body: + encoding: US-ASCII + string: '' + headers: + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + User-Agent: + - Zammad User Agent + Host: + - reallybadexample.kayako.com + response: + status: + code: 490 + message: + headers: + Server: + - nginx + Date: + - Fri, 01 Oct 2021 16:05:10 GMT + Content-Type: + - text/html; charset=UTF-8 + Transfer-Encoding: + - chunked + Connection: + - keep-alive + Strict-Transport-Security: + - max-age=31536000; includeSubDomains preload + body: + encoding: UTF-8 + string: Either this Kayako instance does not exist or we are facing temporary + problems. Please try again in a few minutes + recorded_at: Fri, 01 Oct 2021 16:05:10 GMT +recorded_with: VCR 6.0.0 diff --git a/test/data/vcr_cassettes/system/import/kayako/import_progress_setup.yml b/test/data/vcr_cassettes/system/import/kayako/import_progress_setup.yml new file mode 100644 index 000000000..9e7b0e6f0 --- /dev/null +++ b/test/data/vcr_cassettes/system/import/kayako/import_progress_setup.yml @@ -0,0 +1,340 @@ +--- +http_interactions: +- request: + method: get + uri: https:///api/v1/teams + body: + encoding: US-ASCII + string: '' + headers: + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + User-Agent: + - Zammad User Agent + Host: + - "" + response: + status: + code: 401 + message: Unauthorized + headers: + Server: + - nginx + Date: + - Fri, 01 Oct 2021 16:05:26 GMT + Content-Type: + - application/json + Content-Length: + - '302' + Connection: + - keep-alive + Www-Authenticate: + - Basic realm="Zammad GmbH" + Cache-Control: + - private, max-age=0, must-revalidate + Expires: + - '0' + X-Api-Version: + - '1' + Strict-Transport-Security: + - max-age=31536000; includeSubDomains preload + body: + encoding: UTF-8 + string: |- + { + "status": 401, + "errors": [ + { + "code": "AUTHORIZATION_REQUIRED", + "message": "Performing this action on this resource requires authorization", + "more_info": "https://developer.kayako.com/api/v1/reference/errors/AUTHORIZATION_REQUIRED" + } + ] + } + recorded_at: Fri, 01 Oct 2021 16:05:26 GMT +- request: + method: get + uri: https:///api/v1/me + body: + encoding: US-ASCII + string: '' + headers: + Content-Type: + - application/json + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + User-Agent: + - Ruby + Host: + - "" + Authorization: + - Basic + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx + Date: + - Fri, 01 Oct 2021 16:05:28 GMT + Content-Type: + - application/json + Transfer-Encoding: + - chunked + Connection: + - keep-alive + X-Csrf-Token: + - 0SUHpWF2KvDU8kyJ8qYGobKCIoMIdVS8p2GWZ82LNgu5TJ8XEtt4gQtCJ9KyT7HsBrxBD9GJPc0pqaPqsGq9ZmyfUJdOysVVFbz9 + Content-Location: + - https:///api/v1/users/1 + Last-Modified: + - Fri, 01 Oct 2021 16:05:28 +0000 + Cache-Control: + - private, max-age=0, must-revalidate + Expires: + - '0' + X-Api-Version: + - '1' + Date-Iso: + - '2021-10-01T16:05:28+00:00' + Access-Control-Expose-Headers: + - Date-ISO + X-Xss-Protection: + - 1; mode=block + X-Content-Type-Options: + - nosniff + Strict-Transport-Security: + - max-age=31536000; includeSubDomains preload + body: + encoding: ASCII-8BIT + string: |- + { + "status": 200, + "data": { + "id": 1, + "uuid": "a8dfe5fd-b08d-5d07-ad8b-74b113f5d726", + "full_name": "Thorsten Eckel", + "legacy_id": null, + "designation": null, + "is_enabled": true, + "is_mfa_enabled": false, + "role": { + "id": 5, + "resource_type": "role" + }, + "avatar": "https:///avatar/get/a8dfe5fd-b08d-5d07-ad8b-74b113f5d726?1633104104", + "agent_case_access": "ALL", + "organization_case_access": null, + "organization": { + "id": 3, + "resource_type": "organization" + }, + "teams": [ + { + "id": 1, + "resource_type": "team" + }, + { + "id": 2, + "resource_type": "team" + } + ], + "emails": [ + { + "id": 1, + "resource_type": "identity_email" + } + ], + "phones": [], + "twitter": [], + "facebook": [], + "external_identifiers": [], + "custom_fields": [], + "pinned_notes_count": 0, + "locale": { + "id": 3, + "resource_type": "locale" + }, + "time_zone": "UTC", + "time_zone_offset": 0, + "greeting": null, + "signature": null, + "status_message": null, + "last_seen_user_agent": "Ruby", + "last_seen_ip": "5.231.138.208", + "last_seen_at": "2021-10-01T16:01:44+00:00", + "last_active_at": "2021-10-01T16:01:44+00:00", + "realtime_channel": "presence-442543cd422877504001eb0550f189ad362d6475fa6d95fd0f2d8ee0ff770f65@v1_users_1", + "presence_channel": "user_presence-442543cd422877504001eb0550f189ad362d6475fa6d95fd0f2d8ee0ff770f65@cf0274b394db3af555dbc136fc70aab6e45bee42", + "password_updated_at": "2021-08-27T07:18:23+00:00", + "avatar_updated_at": null, + "last_logged_in_at": "2021-10-01T16:05:28+00:00", + "last_activity_at": "2021-10-01T16:05:28+00:00", + "created_at": "2021-08-24T18:24:11+00:00", + "updated_at": "2021-10-01T16:01:44+00:00", + "permissions": [ + { + "id": 87, + "resource_type": "permission" + }, + { + "id": 26, + "resource_type": "permission" + }, + { + "id": 22, + "resource_type": "permission" + }, + { + "id": 21, + "resource_type": "permission" + }, + { + "id": 25, + "resource_type": "permission" + }, + { + "id": 23, + "resource_type": "permission" + }, + { + "id": 30, + "resource_type": "permission" + }, + { + "id": 29, + "resource_type": "permission" + }, + { + "id": 19, + "resource_type": "permission" + }, + { + "id": 20, + "resource_type": "permission" + }, + { + "id": 18, + "resource_type": "permission" + }, + { + "id": 24, + "resource_type": "permission" + }, + { + "id": 28, + "resource_type": "permission" + }, + { + "id": 27, + "resource_type": "permission" + }, + { + "id": 56, + "resource_type": "permission" + }, + { + "id": 53, + "resource_type": "permission" + }, + { + "id": 54, + "resource_type": "permission" + }, + { + "id": 58, + "resource_type": "permission" + }, + { + "id": 60, + "resource_type": "permission" + }, + { + "id": 59, + "resource_type": "permission" + }, + { + "id": 61, + "resource_type": "permission" + }, + { + "id": 63, + "resource_type": "permission" + }, + { + "id": 62, + "resource_type": "permission" + }, + { + "id": 57, + "resource_type": "permission" + }, + { + "id": 52, + "resource_type": "permission" + }, + { + "id": 55, + "resource_type": "permission" + }, + { + "id": 64, + "resource_type": "permission" + }, + { + "id": 67, + "resource_type": "permission" + }, + { + "id": 75, + "resource_type": "permission" + }, + { + "id": 76, + "resource_type": "permission" + }, + { + "id": 74, + "resource_type": "permission" + }, + { + "id": 80, + "resource_type": "permission" + }, + { + "id": 85, + "resource_type": "permission" + }, + { + "id": 86, + "resource_type": "permission" + } + ], + "settings": [ + { + "id": 4, + "resource_type": "setting" + }, + { + "id": 6, + "resource_type": "setting" + }, + { + "id": 5, + "resource_type": "setting" + } + ], + "notification_channel": "presence-442543cd422877504001eb0550f189ad362d6475fa6d95fd0f2d8ee0ff770f65@c78aaa8dab17000045571b17b135409a48bac06a", + "resource_type": "user", + "resource_url": "https:///api/v1/users/1" + }, + "resource": "user", + "session_id": "MRTxBWpNiHo1cjNYcbvT7mU777Ixu83a7405b1171e15f03e4cf94d41ec757f9d87f68p5WR8OnCqLi5QD8W" + } + recorded_at: Fri, 01 Oct 2021 16:05:28 GMT +recorded_with: VCR 6.0.0