gooddata 2.1.9-java → 2.1.14-java

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (47) hide show
  1. checksums.yaml +4 -4
  2. data/.gdc-ii-config.yaml +1 -1
  3. data/.rubocop.yml +1 -0
  4. data/.travis.yml +1 -3
  5. data/CHANGELOG.md +49 -0
  6. data/Dockerfile +17 -7
  7. data/README.md +17 -0
  8. data/SDK_VERSION +1 -1
  9. data/VERSION +1 -1
  10. data/bin/run_brick.rb +3 -0
  11. data/bin/test_projects_cleanup.rb +6 -2
  12. data/ci/bigquery/pom.xml +54 -0
  13. data/ci/redshift/pom.xml +73 -0
  14. data/ci/snowflake/pom.xml +57 -0
  15. data/dev-gooddata-sso.pub.encrypted +40 -40
  16. data/gdc_fossa_lcm.yaml +2 -0
  17. data/gdc_fossa_ruby_sdk.yaml +4 -0
  18. data/gooddata.gemspec +3 -3
  19. data/k8s/charts/lcm-bricks/Chart.yaml +1 -1
  20. data/k8s/charts/lcm-bricks/templates/prometheus/alertingRules.yaml +22 -12
  21. data/lcm.rake +10 -6
  22. data/lib/gooddata/cloud_resources/bigquery/bigquery_client.rb +86 -0
  23. data/lib/gooddata/cloud_resources/bigquery/drivers/.gitkeepme +0 -0
  24. data/lib/gooddata/cloud_resources/redshift/redshift_client.rb +3 -2
  25. data/lib/gooddata/cloud_resources/snowflake/drivers/.gitkeepme +0 -0
  26. data/lib/gooddata/cloud_resources/snowflake/snowflake_client.rb +84 -0
  27. data/lib/gooddata/helpers/data_helper.rb +1 -1
  28. data/lib/gooddata/helpers/data_source_helpers.rb +47 -0
  29. data/lib/gooddata/helpers/global_helpers_params.rb +2 -2
  30. data/lib/gooddata/lcm/actions/collect_clients.rb +6 -6
  31. data/lib/gooddata/lcm/actions/collect_dynamic_schedule_params.rb +6 -6
  32. data/lib/gooddata/lcm/actions/collect_tagged_objects.rb +2 -1
  33. data/lib/gooddata/lcm/actions/collect_users_brick_users.rb +7 -6
  34. data/lib/gooddata/lcm/actions/migrate_gdc_date_dimension.rb +116 -0
  35. data/lib/gooddata/lcm/actions/set_master_project.rb +76 -0
  36. data/lib/gooddata/lcm/actions/synchronize_ldm.rb +10 -1
  37. data/lib/gooddata/lcm/actions/synchronize_user_filters.rb +2 -2
  38. data/lib/gooddata/lcm/actions/synchronize_users.rb +31 -30
  39. data/lib/gooddata/lcm/lcm2.rb +22 -1
  40. data/lib/gooddata/models/domain.rb +17 -15
  41. data/lib/gooddata/models/from_wire.rb +1 -0
  42. data/lib/gooddata/models/metadata/scheduled_mail.rb +1 -1
  43. data/lib/gooddata/models/process.rb +11 -3
  44. data/lib/gooddata/models/project.rb +118 -29
  45. data/rubydev_public.gpg.encrypted +51 -51
  46. data/rubydev_secret_keys.gpg.encrypted +109 -109
  47. metadata +22 -10
@@ -105,6 +105,7 @@ module GoodData
105
105
  d[:title] = date_dim['dateDimension']['title']
106
106
  d[:urn] = date_dim['dateDimension']['urn']
107
107
  d[:identifier_prefix] = date_dim['dateDimension']['identifierPrefix']
108
+ d[:identifier] = date_dim['dateDimension']['identifier'] if date_dim['dateDimension']['identifier']
108
109
  d[:columns] = parse_bridges(date_dim)
109
110
  end
110
111
  end
@@ -30,7 +30,7 @@ module GoodData
30
30
  :deprecated => 0,
31
31
 
32
32
  # Content When options
33
- :recurrency => '0:0:0:12:0:0',
33
+ :recurrency => '0:0:0:1*12:0:0',
34
34
  :startDate => '2012-06-05',
35
35
  :timeZone => 'America/Los_Angeles',
36
36
 
@@ -118,11 +118,13 @@ module GoodData
118
118
  GoodData.logger.info("Deploying #{path}") if verbose
119
119
 
120
120
  deployed_path = Process.upload_package(path, files_to_exclude, client: client, project: project)
121
+ data_sources = options[:data_sources] || []
121
122
  data = {
122
123
  :process => {
123
124
  :name => deploy_name,
124
125
  :path => "/uploads/#{File.basename(deployed_path)}",
125
- :type => type
126
+ :type => type,
127
+ :dataSources => data_sources
126
128
  }
127
129
  }
128
130
 
@@ -171,10 +173,12 @@ module GoodData
171
173
  verbose = options[:verbose] || false
172
174
  GoodData.logger.info("Deploying #{path}") if verbose
173
175
 
176
+ data_sources = options[:data_sources] || []
174
177
  data = {
175
178
  process: {
176
179
  name: deploy_name,
177
180
  path: path,
181
+ dataSources: data_sources,
178
182
  type: 'RUBY'
179
183
  }
180
184
  }
@@ -185,7 +189,7 @@ module GoodData
185
189
  def deploy_component(data, options = { client: GoodData.client, project: GoodData.project })
186
190
  client, project = GoodData.get_client_and_project(options)
187
191
  data = { process: data } unless data[:process]
188
- data[:process] = GoodData::Helpers.symbolize_keys(data[:process]).select { |k| %i[type name component].include? k }
192
+ data[:process] = GoodData::Helpers.symbolize_keys(data[:process]).select { |k| %i[type name component dataSources].include? k }
189
193
  data[:process][:component] = GoodData::Helpers.symbolize_keys(data[:process][:component]).select { |k| %i[name version configLocation config].include? k }
190
194
 
191
195
  save(data, options)
@@ -266,7 +270,7 @@ module GoodData
266
270
  # @option options [String] :name Readable name of the process
267
271
  # @option options [Boolean] :verbose (false) Switch on verbose mode for detailed logging
268
272
  def deploy(path, options = {})
269
- Process.deploy(path, { client: client, process_id: process_id, :project => project, :name => name, :type => type }.merge(options))
273
+ Process.deploy(path, { client: client, process_id: process_id, :project => project, :name => name, :type => type, :data_sources => data_sources }.merge(options))
270
274
  end
271
275
 
272
276
  # Downloads the process from S3 in a zipped form.
@@ -326,6 +330,10 @@ module GoodData
326
330
  process['component']
327
331
  end
328
332
 
333
+ def data_sources
334
+ process['dataSources']
335
+ end
336
+
329
337
  # Determines whether the process is an ADDv2 component.
330
338
  # @return [Bool] True if the process is an ADDv2 component.
331
339
  def add_v2_component?
@@ -261,21 +261,26 @@ module GoodData
261
261
  # @option ads_output_stage_uri Uri of the source output stage. It must be in the same domain as the target project.
262
262
  def transfer_processes(from_project, to_project, options = {})
263
263
  options = GoodData::Helpers.symbolize_keys(options)
264
+ aliases = {}
264
265
  to_project_processes = to_project.processes
265
266
  additional_hidden_params = options[:additional_hidden_params] || {}
266
267
  result = from_project.processes.uniq(&:name).map do |process|
267
- fail "The process name #{process.name} must be unique in transfered project #{to_project}" if to_project_processes.count { |p| p.name == process.name } > 1
268
+ fail "The process name #{process.name} must be unique in transferred project #{to_project}" if to_project_processes.count { |p| p.name == process.name } > 1
268
269
  next if process.type == :dataload || process.add_v2_component?
270
+ collect_process_aliases(process.data, from_project.client, aliases)
269
271
 
270
272
  to_process = to_project_processes.find { |p| p.name == process.name }
271
273
 
274
+ data_sources = GoodData::Helpers.symbolize_keys_recursively!(process.data_sources)
275
+ data_sources = replace_data_source_ids(data_sources, to_project.client, aliases)
272
276
  to_process = if process.path
273
277
  to_process.delete if to_process
274
- GoodData::Process.deploy_from_appstore(process.path, name: process.name, client: to_project.client, project: to_project)
278
+ Process.deploy_from_appstore(process.path, name: process.name, client: to_project.client, project: to_project, data_sources: data_sources)
275
279
  elsif process.component
276
280
  to_process.delete if to_process
277
281
  process_hash = GoodData::Helpers::DeepMergeableHash[GoodData::Helpers.symbolize_keys(process.to_hash)].deep_merge(additional_hidden_params)
278
- GoodData::Process.deploy_component(process_hash, project: to_project, client: to_project.client)
282
+ process_hash = replace_process_data_source_ids(process_hash, to_project.client, aliases)
283
+ Process.deploy_component(process_hash, project: to_project, client: to_project.client)
279
284
  else
280
285
  Dir.mktmpdir('etl_transfer') do |dir|
281
286
  dir = Pathname(dir)
@@ -283,11 +288,10 @@ module GoodData
283
288
  File.open(filename, 'w') do |f|
284
289
  f << process.download
285
290
  end
286
-
287
291
  if to_process
288
- to_process.deploy(filename, type: process.type, name: process.name)
292
+ to_process.deploy(filename, type: process.type, name: process.name, data_sources: data_sources)
289
293
  else
290
- to_project.deploy_process(filename, type: process.type, name: process.name)
294
+ to_project.deploy_process(filename, type: process.type, name: process.name, data_sources: data_sources)
291
295
  end
292
296
  end
293
297
  end
@@ -318,6 +322,56 @@ module GoodData
318
322
  result.compact
319
323
  end
320
324
 
325
+ def collect_process_aliases(process_data, client, aliases)
326
+ data_sources = process_data.dig('process', 'dataSources')
327
+ unless data_sources.blank?
328
+ data_sources.map do |data_source|
329
+ get_data_source_alias(data_source['id'], client, aliases)
330
+ end
331
+ end
332
+ component = process_data.dig('process', 'component')
333
+ get_data_source_alias(component['configLocation']['dataSourceConfig']['id'], client, aliases) if component&.dig('configLocation', 'dataSourceConfig')
334
+ aliases
335
+ end
336
+
337
+ def get_data_source_alias(data_source_id, client, aliases)
338
+ unless aliases[data_source_id]
339
+ data_source = GoodData::Helpers.get_data_source_by_id(data_source_id, client)
340
+ if data_source&.dig('dataSource', 'alias')
341
+ aliases[data_source_id] = {
342
+ :type => get_data_source_type(data_source),
343
+ :alias => data_source['dataSource']['alias']
344
+ }
345
+ end
346
+ end
347
+ aliases[data_source_id]
348
+ end
349
+
350
+ def get_data_source_type(data_source_data)
351
+ data_source_data&.dig('dataSource', 'connectionInfo') ? data_source_data['dataSource']['connectionInfo'].first[0].upcase : ""
352
+ end
353
+
354
+ def replace_process_data_source_ids(process_data, client, aliases)
355
+ component = process_data.dig(:process, :component)
356
+ if component&.dig(:configLocation, :dataSourceConfig)
357
+ the_alias = aliases[component[:configLocation][:dataSourceConfig][:id]]
358
+ process_data[:process][:component][:configLocation][:dataSourceConfig][:id] = GoodData::Helpers.verify_data_source_alias(the_alias, client)
359
+ end
360
+ process_data[:process][:dataSources] = replace_data_source_ids(process_data[:process][:dataSources], client, aliases)
361
+ process_data
362
+ end
363
+
364
+ def replace_data_source_ids(data_sources, client, aliases)
365
+ array_data_sources = []
366
+ if data_sources && !data_sources.empty?
367
+ data_sources.map do |data_source|
368
+ new_id = GoodData::Helpers.verify_data_source_alias(aliases[data_source[:id]], client)
369
+ array_data_sources.push(:id => new_id)
370
+ end
371
+ end
372
+ array_data_sources
373
+ end
374
+
321
375
  def transfer_user_groups(from_project, to_project)
322
376
  from_project.user_groups.map do |ug|
323
377
  # migrate groups
@@ -625,6 +679,7 @@ module GoodData
625
679
  def blueprint(options = {})
626
680
  options = { include_ca: true }.merge(options)
627
681
  result = client.get("/gdc/projects/#{pid}/model/view", params: { includeDeprecated: true, includeGrain: true, includeCA: options[:include_ca] })
682
+
628
683
  polling_url = result['asyncTask']['link']['poll']
629
684
  model = client.poll_on_code(polling_url, options)
630
685
  bp = GoodData::Model::FromWire.from_wire(model, options)
@@ -1546,26 +1601,28 @@ module GoodData
1546
1601
  # @return [Array<GoodData::User>] List of users
1547
1602
  def users(opts = {})
1548
1603
  client = client(opts)
1549
- Enumerator.new do |y|
1550
- offset = opts[:offset] || 0
1551
- limit = opts[:limit] || 1_000
1552
- loop do
1553
- tmp = client.get("/gdc/projects/#{pid}/users", params: { offset: offset, limit: limit })
1554
- tmp['users'].each do |user_data|
1555
- user = client.create(GoodData::Membership, user_data, project: self)
1556
-
1557
- if opts[:all]
1558
- y << user
1559
- elsif opts[:disabled]
1560
- y << user if user && user.disabled?
1561
- else
1562
- y << user if user && user.enabled?
1563
- end
1604
+ all_users = []
1605
+ offset = opts[:offset] || 0
1606
+ limit = opts[:limit] || 1_000
1607
+ loop do
1608
+ tmp = client.get("/gdc/projects/#{pid}/users", params: { offset: offset, limit: limit })
1609
+ tmp['users'].each do |user_data|
1610
+ user = client.create(GoodData::Membership, user_data, project: self)
1611
+
1612
+ if opts[:all]
1613
+ all_users << user
1614
+ elsif opts[:disabled]
1615
+ all_users << user if user&.disabled?
1616
+ else
1617
+ all_users << user if user&.enabled?
1564
1618
  end
1565
- break if tmp['users'].count < limit
1566
- offset += limit
1567
1619
  end
1620
+ break if tmp['users'].count < limit
1621
+
1622
+ offset += limit
1568
1623
  end
1624
+
1625
+ all_users
1569
1626
  end
1570
1627
 
1571
1628
  alias_method :members, :users
@@ -1604,14 +1661,19 @@ module GoodData
1604
1661
  def import_users(new_users, options = {})
1605
1662
  role_list = roles
1606
1663
  users_list = users
1607
- new_users = new_users.map { |x| ((x.is_a?(Hash) && x[:user] && x[:user].to_hash.merge(role: x[:role])) || x.to_hash).tap { |u| u[:login].downcase! } }
1608
1664
 
1609
1665
  GoodData.logger.warn("Importing users to project (#{pid})")
1666
+ new_users = new_users.map { |x| ((x.is_a?(Hash) && x[:user] && x[:user].to_hash.merge(role: x[:role])) || x.to_hash).tap { |u| u[:login].downcase! } }
1667
+ # First check that if groups are provided we have them set up
1668
+ user_groups_cache, change_groups = check_groups(new_users.map(&:to_hash).flat_map { |u| u[:user_group] || [] }.uniq, options[:user_groups_cache], options)
1610
1669
 
1611
- whitelisted_new_users, whitelisted_users = whitelist_users(new_users.map(&:to_hash), users_list, options[:whitelists])
1670
+ unless change_groups.empty?
1671
+ new_users.each do |user|
1672
+ user[:user_group].map! { |e| change_groups[e].nil? ? e : change_groups[e] }
1673
+ end
1674
+ end
1612
1675
 
1613
- # First check that if groups are provided we have them set up
1614
- user_groups_cache = check_groups(new_users.map(&:to_hash).flat_map { |u| u[:user_group] || [] }.uniq, options[:user_groups_cache], options)
1676
+ whitelisted_new_users, whitelisted_users = whitelist_users(new_users.map(&:to_hash), users_list, options[:whitelists])
1615
1677
 
1616
1678
  # conform the role on list of new users so we can diff them with the users coming from the project
1617
1679
  diffable_new_with_default_role = whitelisted_new_users.map do |u|
@@ -1758,7 +1820,20 @@ module GoodData
1758
1820
  def check_groups(specified_groups, user_groups_cache = nil, options = {})
1759
1821
  current_user_groups = user_groups if user_groups_cache.nil? || user_groups_cache.empty?
1760
1822
  groups = current_user_groups.map(&:name)
1761
- missing_groups = specified_groups - groups
1823
+ missing_groups = []
1824
+ change_groups = {}
1825
+ specified_groups.each do |group|
1826
+ found_group = groups.find { |name| name.casecmp(group).zero? }
1827
+ if found_group.nil?
1828
+ missing_groups << group
1829
+ else
1830
+ # Change groups when they have similar group name with difference of case sensitivity
1831
+ if found_group != group
1832
+ change_groups[group] = found_group
1833
+ GoodData.logger.warn("Group with name #{group} is existed in project with name #{found_group}.")
1834
+ end
1835
+ end
1836
+ end
1762
1837
  if options[:create_non_existing_user_groups]
1763
1838
  missing_groups.each do |g|
1764
1839
  GoodData.logger.info("Creating group #{g}")
@@ -1771,7 +1846,7 @@ module GoodData
1771
1846
  "#{groups.join(',')} and you asked for #{missing_groups.join(',')}"
1772
1847
  end
1773
1848
  end
1774
- current_user_groups
1849
+ [current_user_groups, change_groups]
1775
1850
  end
1776
1851
 
1777
1852
  # Update user
@@ -1902,6 +1977,20 @@ module GoodData
1902
1977
  [user, roles]
1903
1978
  end
1904
1979
 
1980
+ def upgrade_custom_v2(message, options = {})
1981
+ uri = "/gdc/md/#{pid}/datedimension/upgrade"
1982
+ poll_result = client&.post(uri, message)
1983
+
1984
+ return poll_result['wTaskStatus']['status'] if poll_result['wTaskStatus'] && poll_result['wTaskStatus']['status']
1985
+
1986
+ polling_uri = poll_result['asyncTask']['link']['poll']
1987
+ result = client&.poll_on_response(polling_uri, options) do |body|
1988
+ body && body['wTaskStatus'] && body['wTaskStatus']['status'] == 'RUNNING'
1989
+ end
1990
+
1991
+ result['wTaskStatus']['status'] == 'OK' ? 'OK' : 'FAIL'
1992
+ end
1993
+
1905
1994
  def add
1906
1995
  @add ||= GoodData::AutomatedDataDistribution.new(self)
1907
1996
  @add
@@ -1,51 +1,51 @@
1
- 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
- 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
- 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
- 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
- 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
- /0BJmRmQl18otPuJ2hXOO1a6238C8GpMe2Thf/F6DnzlRrM5EQkYoZILCTdy
7
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- jdmrCZNJY8V0zdpAWmStReoRGghSiidk3wUPbRu1aBq9o/akBdvvY5OlUkME
21
- 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
- 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
- 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
- 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
- foQbhplaZc3qb/lHhhppVHx6VG6bJX4eePm9sBNHB6brEZjUKJ/Y7wrDTeVo
26
- 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
- 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
- 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
- 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
- 0Xee3s7cgHHSAOV086vroMvfJVjIeD8JDBrK0hgc/tGCogJyKhyMcoyrlnB5
31
- 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
- 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
- +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
- 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
- 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
- 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
- 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
- +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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- CdB6Lad/+w1ymY8S+pDPYJZ3xc10ijQjNo8ahJe9H/ZNgxBq7nS+6jvGFN1l
51
- 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
@@ -1,109 +1,109 @@
1
- dHdX4t3Yx2DpETJZCoyCPGy3tXxCBsyldBoRiB2+z9+XhIoe0w1pdRT05tRt
2
- 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
- uQwuWQmasWNoD4rFBI0w0vyqFMf+q7Ddf/FxusB4llRohJgEnOezz/O8Az9Y
4
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- +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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- SCO28NF993Bg2+euHqzJEAJ4SwjAtxF6lP8576hVWXgT0Wp0LMm8qLJwO8y7
29
- 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
- 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
- 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
- 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
- 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
- +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
- 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
- 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
- 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
- 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
- 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
- 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
- i8k1676HdzreCayviZukkWRryHiuH53tS3LSkNt7HItSrRyNvVuIdOqzX1Hr
42
- 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
- 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
- 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
- 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
- POazKUDCnMb3LHcKZc9Sfs4Z/jBwuLcESSrtRzk34/MBLrwaXfHAiq78heht
47
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- /wG+PvAM5P0lJzsrXVVKhKyicw+oJMkSSHaSw1MJSDK0IgOOSer1lE4tJmlU
62
- e6pd/+jX4oww0ZBKw0koEWECQb8TOMohZMwaFDPsujbfjXBylDIaeGmK9k4r
63
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- uIcB0RPcc34vTl6SOPti7m01/SZf/PaLF3LC/hpgjOdJSD9qcbEGgCOEGrdZ
78
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- begNUkRy7jwonPGFgmm17QZt3YR2YMqObJrgeAWAkCPTTitumuzPtlCw8r+O
109
- 2Tt1yw==
1
+ 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
109
+ 3pSK3Q==