aws-sdk-iotwireless 1.28.0 → 1.30.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: ed2eb3d0c66694b79b5cdb4385ca3902f6c5632d868c122c2dc90b00a89f8531
4
- data.tar.gz: '0815007f9ef9aee4e6e9d55b3b522cb8bae9487bfad1d8d4d72354ada4c4e2c4'
3
+ metadata.gz: 3d9a3099381e5e0df41a43711fb5563375ce43c2410deeb62cde2f2d58a2224b
4
+ data.tar.gz: f5676df5cc1a4ac3642840a18ceabb015ac182be5c5f1e239005c87cddca57ab
5
5
  SHA512:
6
- metadata.gz: 482f8a0eab10bbc67403c9ab7f3bc11eaefb2a4a2fe366a3eaa2a084eea0d22cc044ca7c2990c47f360246e5c89060183d212fcd25c7cbacec5c46be65c674d4
7
- data.tar.gz: 0f8a8878f0b871b1482d2dd2a66645112298bf2916a2ce3be7cf58419c630ff09bca889477ba7234644caad3fb004b90a817c5724f6cfa6e456a7a966f48bafe
6
+ metadata.gz: 443f50e83defec76ebf872cc7980907ccc326f11aa2f31bdf4d7cec57dc2efe3c5dc24d34e5227470f02888d058e5feaedbad3d0a1b02518cf087ef59327dace
7
+ data.tar.gz: dfcb37b0b3daa471d792bbd22853458a3e5f4c796740f2e4323e0244e0db4105bfd2b62b4ed00eb4bf0f3606b0ae082d04816aff1ff74f479803a28859d87bc3
data/CHANGELOG.md CHANGED
@@ -1,6 +1,18 @@
1
1
  Unreleased Changes
2
2
  ------------------
3
3
 
4
+ 1.30.0 (2023-02-23)
5
+ ------------------
6
+
7
+ * Feature - In this release, we add additional capabilities for the FUOTA which allows user to configure the fragment size, the sending interval and the redundancy ratio of the FUOTA tasks
8
+
9
+ 1.29.0 (2023-01-18)
10
+ ------------------
11
+
12
+ * Feature - Code Generated Changes, see `./build_tools` or `aws-sdk-core`'s CHANGELOG.md for details.
13
+
14
+ * Issue - Replace runtime endpoint resolution approach with generated ruby code.
15
+
4
16
  1.28.0 (2022-11-28)
5
17
  ------------------
6
18
 
data/VERSION CHANGED
@@ -1 +1 @@
1
- 1.28.0
1
+ 1.30.0
@@ -758,6 +758,23 @@ module Aws::IoTWireless
758
758
  # The tag to attach to the specified resource. Tags are metadata that
759
759
  # you can use to manage a resource.
760
760
  #
761
+ # @option params [Integer] :redundancy_percent
762
+ # The percentage of added redundant fragments. For example, if firmware
763
+ # file is 100 bytes and fragment size is 10 bytes, with
764
+ # `RedundancyPercent` set to 50(%), the final number of encoded
765
+ # fragments is (100 / 10) + (100 / 10 * 50%) = 15.
766
+ #
767
+ # @option params [Integer] :fragment_size_bytes
768
+ # The size of each fragment in bytes. Currently only supported in fuota
769
+ # tasks with multicast groups.
770
+ #
771
+ # @option params [Integer] :fragment_interval_ms
772
+ # The interval of sending fragments in milliseconds. Currently the
773
+ # interval will be rounded to the nearest second. Note that this
774
+ # interval only controls the timing when the cloud sends the fragments
775
+ # down. The actual delay of receiving fragments at device side depends
776
+ # on the device's class and the communication delay with the cloud.
777
+ #
761
778
  # @return [Types::CreateFuotaTaskResponse] Returns a {Seahorse::Client::Response response} object which responds to the following methods:
762
779
  #
763
780
  # * {Types::CreateFuotaTaskResponse#arn #arn} => String
@@ -780,6 +797,9 @@ module Aws::IoTWireless
780
797
  # value: "TagValue", # required
781
798
  # },
782
799
  # ],
800
+ # redundancy_percent: 1,
801
+ # fragment_size_bytes: 1,
802
+ # fragment_interval_ms: 1,
783
803
  # })
784
804
  #
785
805
  # @example Response structure
@@ -1794,6 +1814,9 @@ module Aws::IoTWireless
1794
1814
  # * {Types::GetFuotaTaskResponse#firmware_update_image #firmware_update_image} => String
1795
1815
  # * {Types::GetFuotaTaskResponse#firmware_update_role #firmware_update_role} => String
1796
1816
  # * {Types::GetFuotaTaskResponse#created_at #created_at} => Time
1817
+ # * {Types::GetFuotaTaskResponse#redundancy_percent #redundancy_percent} => Integer
1818
+ # * {Types::GetFuotaTaskResponse#fragment_size_bytes #fragment_size_bytes} => Integer
1819
+ # * {Types::GetFuotaTaskResponse#fragment_interval_ms #fragment_interval_ms} => Integer
1797
1820
  #
1798
1821
  # @example Request syntax with placeholder values
1799
1822
  #
@@ -1813,6 +1836,9 @@ module Aws::IoTWireless
1813
1836
  # resp.firmware_update_image #=> String
1814
1837
  # resp.firmware_update_role #=> String
1815
1838
  # resp.created_at #=> Time
1839
+ # resp.redundancy_percent #=> Integer
1840
+ # resp.fragment_size_bytes #=> Integer
1841
+ # resp.fragment_interval_ms #=> Integer
1816
1842
  #
1817
1843
  # @overload get_fuota_task(params = {})
1818
1844
  # @param [Hash] params ({})
@@ -2118,7 +2144,7 @@ module Aws::IoTWireless
2118
2144
  #
2119
2145
  # @option params [Time,DateTime,Date,Integer,String] :timestamp
2120
2146
  # Optional information that specifies the time when the position
2121
- # information will be resolved. It uses the UNIX timestamp format. If
2147
+ # information will be resolved. It uses the Unix timestamp format. If
2122
2148
  # not specified, the time at which the request was received will be
2123
2149
  # used.
2124
2150
  #
@@ -2367,7 +2393,7 @@ module Aws::IoTWireless
2367
2393
  end
2368
2394
 
2369
2395
  # Get the position information for a given wireless device or a wireless
2370
- # gateway resource. The postion information uses the [ World Geodetic
2396
+ # gateway resource. The position information uses the [ World Geodetic
2371
2397
  # System (WGS84)][1].
2372
2398
  #
2373
2399
  #
@@ -2376,8 +2402,8 @@ module Aws::IoTWireless
2376
2402
  #
2377
2403
  # @option params [required, String] :resource_identifier
2378
2404
  # The identifier of the resource for which position information is
2379
- # retrieved. It can be the wireless device ID or the wireless gateway ID
2380
- # depending on the resource type.
2405
+ # retrieved. It can be the wireless device ID or the wireless gateway
2406
+ # ID, depending on the resource type.
2381
2407
  #
2382
2408
  # @option params [required, String] :resource_type
2383
2409
  # The type of resource for which position information is retrieved,
@@ -4062,6 +4088,23 @@ module Aws::IoTWireless
4062
4088
  # @option params [String] :firmware_update_role
4063
4089
  # The firmware update role that is to be used with a FUOTA task.
4064
4090
  #
4091
+ # @option params [Integer] :redundancy_percent
4092
+ # The percentage of added redundant fragments. For example, if firmware
4093
+ # file is 100 bytes and fragment size is 10 bytes, with
4094
+ # `RedundancyPercent` set to 50(%), the final number of encoded
4095
+ # fragments is (100 / 10) + (100 / 10 * 50%) = 15.
4096
+ #
4097
+ # @option params [Integer] :fragment_size_bytes
4098
+ # The size of each fragment in bytes. Currently only supported in fuota
4099
+ # tasks with multicast groups.
4100
+ #
4101
+ # @option params [Integer] :fragment_interval_ms
4102
+ # The interval of sending fragments in milliseconds. Currently the
4103
+ # interval will be rounded to the nearest second. Note that this
4104
+ # interval only controls the timing when the cloud sends the fragments
4105
+ # down. The actual delay of receiving fragments at device side depends
4106
+ # on the device's class and the communication delay with the cloud.
4107
+ #
4065
4108
  # @return [Struct] Returns an empty {Seahorse::Client::Response response}.
4066
4109
  #
4067
4110
  # @example Request syntax with placeholder values
@@ -4075,6 +4118,9 @@ module Aws::IoTWireless
4075
4118
  # },
4076
4119
  # firmware_update_image: "FirmwareUpdateImage",
4077
4120
  # firmware_update_role: "FirmwareUpdateRole",
4121
+ # redundancy_percent: 1,
4122
+ # fragment_size_bytes: 1,
4123
+ # fragment_interval_ms: 1,
4078
4124
  # })
4079
4125
  #
4080
4126
  # @overload update_fuota_task(params = {})
@@ -4371,7 +4417,7 @@ module Aws::IoTWireless
4371
4417
  end
4372
4418
 
4373
4419
  # Update the position information of a given wireless device or a
4374
- # wireless gateway resource. The postion coordinates are based on the [
4420
+ # wireless gateway resource. The position coordinates are based on the [
4375
4421
  # World Geodetic System (WGS84)][1].
4376
4422
  #
4377
4423
  #
@@ -4380,7 +4426,7 @@ module Aws::IoTWireless
4380
4426
  #
4381
4427
  # @option params [required, String] :resource_identifier
4382
4428
  # The identifier of the resource for which position information is
4383
- # updated. It can be the wireless device ID or the wireless gateway ID
4429
+ # updated. It can be the wireless device ID or the wireless gateway ID,
4384
4430
  # depending on the resource type.
4385
4431
  #
4386
4432
  # @option params [required, String] :resource_type
@@ -4530,7 +4576,7 @@ module Aws::IoTWireless
4530
4576
  params: params,
4531
4577
  config: config)
4532
4578
  context[:gem_name] = 'aws-sdk-iotwireless'
4533
- context[:gem_version] = '1.28.0'
4579
+ context[:gem_version] = '1.30.0'
4534
4580
  Seahorse::Client::Request.new(handlers, context)
4535
4581
  end
4536
4582
 
@@ -189,6 +189,8 @@ module Aws::IoTWireless
189
189
  Fingerprint = Shapes::StringShape.new(name: 'Fingerprint')
190
190
  FirmwareUpdateImage = Shapes::StringShape.new(name: 'FirmwareUpdateImage')
191
191
  FirmwareUpdateRole = Shapes::StringShape.new(name: 'FirmwareUpdateRole')
192
+ FragmentIntervalMS = Shapes::IntegerShape.new(name: 'FragmentIntervalMS')
193
+ FragmentSizeBytes = Shapes::IntegerShape.new(name: 'FragmentSizeBytes')
192
194
  FuotaDeviceStatus = Shapes::StringShape.new(name: 'FuotaDeviceStatus')
193
195
  FuotaTask = Shapes::StructureShape.new(name: 'FuotaTask')
194
196
  FuotaTaskArn = Shapes::StringShape.new(name: 'FuotaTaskArn')
@@ -427,6 +429,7 @@ module Aws::IoTWireless
427
429
  RSRQ = Shapes::FloatShape.new(name: 'RSRQ')
428
430
  RSS = Shapes::IntegerShape.new(name: 'RSS')
429
431
  RaAllowed = Shapes::BooleanShape.new(name: 'RaAllowed')
432
+ RedundancyPercent = Shapes::IntegerShape.new(name: 'RedundancyPercent')
430
433
  RegParamsRevision = Shapes::StringShape.new(name: 'RegParamsRevision')
431
434
  RegistrationZone = Shapes::IntegerShape.new(name: 'RegistrationZone')
432
435
  ReportDevStatusBattery = Shapes::BooleanShape.new(name: 'ReportDevStatusBattery')
@@ -765,6 +768,9 @@ module Aws::IoTWireless
765
768
  CreateFuotaTaskRequest.add_member(:firmware_update_image, Shapes::ShapeRef.new(shape: FirmwareUpdateImage, required: true, location_name: "FirmwareUpdateImage"))
766
769
  CreateFuotaTaskRequest.add_member(:firmware_update_role, Shapes::ShapeRef.new(shape: FirmwareUpdateRole, required: true, location_name: "FirmwareUpdateRole"))
767
770
  CreateFuotaTaskRequest.add_member(:tags, Shapes::ShapeRef.new(shape: TagList, location_name: "Tags"))
771
+ CreateFuotaTaskRequest.add_member(:redundancy_percent, Shapes::ShapeRef.new(shape: RedundancyPercent, location_name: "RedundancyPercent"))
772
+ CreateFuotaTaskRequest.add_member(:fragment_size_bytes, Shapes::ShapeRef.new(shape: FragmentSizeBytes, location_name: "FragmentSizeBytes"))
773
+ CreateFuotaTaskRequest.add_member(:fragment_interval_ms, Shapes::ShapeRef.new(shape: FragmentIntervalMS, location_name: "FragmentIntervalMS"))
768
774
  CreateFuotaTaskRequest.struct_class = Types::CreateFuotaTaskRequest
769
775
 
770
776
  CreateFuotaTaskResponse.add_member(:arn, Shapes::ShapeRef.new(shape: FuotaTaskArn, location_name: "Arn"))
@@ -1057,6 +1063,9 @@ module Aws::IoTWireless
1057
1063
  GetFuotaTaskResponse.add_member(:firmware_update_image, Shapes::ShapeRef.new(shape: FirmwareUpdateImage, location_name: "FirmwareUpdateImage"))
1058
1064
  GetFuotaTaskResponse.add_member(:firmware_update_role, Shapes::ShapeRef.new(shape: FirmwareUpdateRole, location_name: "FirmwareUpdateRole"))
1059
1065
  GetFuotaTaskResponse.add_member(:created_at, Shapes::ShapeRef.new(shape: CreatedAt, location_name: "CreatedAt"))
1066
+ GetFuotaTaskResponse.add_member(:redundancy_percent, Shapes::ShapeRef.new(shape: RedundancyPercent, location_name: "RedundancyPercent"))
1067
+ GetFuotaTaskResponse.add_member(:fragment_size_bytes, Shapes::ShapeRef.new(shape: FragmentSizeBytes, location_name: "FragmentSizeBytes"))
1068
+ GetFuotaTaskResponse.add_member(:fragment_interval_ms, Shapes::ShapeRef.new(shape: FragmentIntervalMS, location_name: "FragmentIntervalMS"))
1060
1069
  GetFuotaTaskResponse.struct_class = Types::GetFuotaTaskResponse
1061
1070
 
1062
1071
  GetLogLevelsByResourceTypesRequest.struct_class = Types::GetLogLevelsByResourceTypesRequest
@@ -1937,6 +1946,9 @@ module Aws::IoTWireless
1937
1946
  UpdateFuotaTaskRequest.add_member(:lo_ra_wan, Shapes::ShapeRef.new(shape: LoRaWANFuotaTask, location_name: "LoRaWAN"))
1938
1947
  UpdateFuotaTaskRequest.add_member(:firmware_update_image, Shapes::ShapeRef.new(shape: FirmwareUpdateImage, location_name: "FirmwareUpdateImage"))
1939
1948
  UpdateFuotaTaskRequest.add_member(:firmware_update_role, Shapes::ShapeRef.new(shape: FirmwareUpdateRole, location_name: "FirmwareUpdateRole"))
1949
+ UpdateFuotaTaskRequest.add_member(:redundancy_percent, Shapes::ShapeRef.new(shape: RedundancyPercent, location_name: "RedundancyPercent"))
1950
+ UpdateFuotaTaskRequest.add_member(:fragment_size_bytes, Shapes::ShapeRef.new(shape: FragmentSizeBytes, location_name: "FragmentSizeBytes"))
1951
+ UpdateFuotaTaskRequest.add_member(:fragment_interval_ms, Shapes::ShapeRef.new(shape: FragmentIntervalMS, location_name: "FragmentIntervalMS"))
1940
1952
  UpdateFuotaTaskRequest.struct_class = Types::UpdateFuotaTaskRequest
1941
1953
 
1942
1954
  UpdateFuotaTaskResponse.struct_class = Types::UpdateFuotaTaskResponse
@@ -50,9 +50,6 @@ module Aws::IoTWireless
50
50
 
51
51
  def initialize(options = {})
52
52
  self[:region] = options[:region]
53
- if self[:region].nil?
54
- raise ArgumentError, "Missing required EndpointParameter: :region"
55
- end
56
53
  self[:use_dual_stack] = options[:use_dual_stack]
57
54
  self[:use_dual_stack] = false if self[:use_dual_stack].nil?
58
55
  if self[:use_dual_stack].nil?
@@ -9,104 +9,61 @@
9
9
 
10
10
  module Aws::IoTWireless
11
11
  class EndpointProvider
12
- def initialize(rule_set = nil)
13
- @@rule_set ||= begin
14
- endpoint_rules = Aws::Json.load(Base64.decode64(RULES))
15
- Aws::Endpoints::RuleSet.new(
16
- version: endpoint_rules['version'],
17
- service_id: endpoint_rules['serviceId'],
18
- parameters: endpoint_rules['parameters'],
19
- rules: endpoint_rules['rules']
20
- )
12
+ def resolve_endpoint(parameters)
13
+ region = parameters.region
14
+ use_dual_stack = parameters.use_dual_stack
15
+ use_fips = parameters.use_fips
16
+ endpoint = parameters.endpoint
17
+ if Aws::Endpoints::Matchers.set?(endpoint)
18
+ if Aws::Endpoints::Matchers.boolean_equals?(use_fips, true)
19
+ raise ArgumentError, "Invalid Configuration: FIPS and custom endpoint are not supported"
20
+ end
21
+ if Aws::Endpoints::Matchers.boolean_equals?(use_dual_stack, true)
22
+ raise ArgumentError, "Invalid Configuration: Dualstack and custom endpoint are not supported"
23
+ end
24
+ return Aws::Endpoints::Endpoint.new(url: endpoint, headers: {}, properties: {})
21
25
  end
22
- @provider = Aws::Endpoints::RulesProvider.new(rule_set || @@rule_set)
23
- end
26
+ if Aws::Endpoints::Matchers.set?(region)
27
+ if (partition_result = Aws::Endpoints::Matchers.aws_partition(region))
28
+ if Aws::Endpoints::Matchers.boolean_equals?(use_fips, true) && Aws::Endpoints::Matchers.boolean_equals?(use_dual_stack, true)
29
+ if Aws::Endpoints::Matchers.boolean_equals?(true, Aws::Endpoints::Matchers.attr(partition_result, "supportsFIPS")) && Aws::Endpoints::Matchers.boolean_equals?(true, Aws::Endpoints::Matchers.attr(partition_result, "supportsDualStack"))
30
+ return Aws::Endpoints::Endpoint.new(url: "https://api.iotwireless-fips.#{region}.#{partition_result['dualStackDnsSuffix']}", headers: {}, properties: {})
31
+ end
32
+ raise ArgumentError, "FIPS and DualStack are enabled, but this partition does not support one or both"
33
+ end
34
+ if Aws::Endpoints::Matchers.boolean_equals?(use_fips, true)
35
+ if Aws::Endpoints::Matchers.boolean_equals?(true, Aws::Endpoints::Matchers.attr(partition_result, "supportsFIPS"))
36
+ return Aws::Endpoints::Endpoint.new(url: "https://api.iotwireless-fips.#{region}.#{partition_result['dnsSuffix']}", headers: {}, properties: {})
37
+ end
38
+ raise ArgumentError, "FIPS is enabled but this partition does not support FIPS"
39
+ end
40
+ if Aws::Endpoints::Matchers.boolean_equals?(use_dual_stack, true)
41
+ if Aws::Endpoints::Matchers.boolean_equals?(true, Aws::Endpoints::Matchers.attr(partition_result, "supportsDualStack"))
42
+ return Aws::Endpoints::Endpoint.new(url: "https://api.iotwireless.#{region}.#{partition_result['dualStackDnsSuffix']}", headers: {}, properties: {})
43
+ end
44
+ raise ArgumentError, "DualStack is enabled but this partition does not support DualStack"
45
+ end
46
+ if Aws::Endpoints::Matchers.string_equals?(region, "ap-northeast-1")
47
+ return Aws::Endpoints::Endpoint.new(url: "https://api.iotwireless.ap-northeast-1.amazonaws.com", headers: {}, properties: {})
48
+ end
49
+ if Aws::Endpoints::Matchers.string_equals?(region, "ap-southeast-2")
50
+ return Aws::Endpoints::Endpoint.new(url: "https://api.iotwireless.ap-southeast-2.amazonaws.com", headers: {}, properties: {})
51
+ end
52
+ if Aws::Endpoints::Matchers.string_equals?(region, "eu-west-1")
53
+ return Aws::Endpoints::Endpoint.new(url: "https://api.iotwireless.eu-west-1.amazonaws.com", headers: {}, properties: {})
54
+ end
55
+ if Aws::Endpoints::Matchers.string_equals?(region, "us-east-1")
56
+ return Aws::Endpoints::Endpoint.new(url: "https://api.iotwireless.us-east-1.amazonaws.com", headers: {}, properties: {})
57
+ end
58
+ if Aws::Endpoints::Matchers.string_equals?(region, "us-west-2")
59
+ return Aws::Endpoints::Endpoint.new(url: "https://api.iotwireless.us-west-2.amazonaws.com", headers: {}, properties: {})
60
+ end
61
+ return Aws::Endpoints::Endpoint.new(url: "https://api.iotwireless.#{region}.#{partition_result['dnsSuffix']}", headers: {}, properties: {})
62
+ end
63
+ end
64
+ raise ArgumentError, "Invalid Configuration: Missing Region"
65
+ raise ArgumentError, 'No endpoint could be resolved'
24
66
 
25
- def resolve_endpoint(parameters)
26
- @provider.resolve_endpoint(parameters)
27
67
  end
28
-
29
- # @api private
30
- RULES = <<-JSON
31
- eyJ2ZXJzaW9uIjoiMS4wIiwicGFyYW1ldGVycyI6eyJSZWdpb24iOnsiYnVp
32
- bHRJbiI6IkFXUzo6UmVnaW9uIiwicmVxdWlyZWQiOnRydWUsImRvY3VtZW50
33
- YXRpb24iOiJUaGUgQVdTIHJlZ2lvbiB1c2VkIHRvIGRpc3BhdGNoIHRoZSBy
34
- ZXF1ZXN0LiIsInR5cGUiOiJTdHJpbmcifSwiVXNlRHVhbFN0YWNrIjp7ImJ1
35
- aWx0SW4iOiJBV1M6OlVzZUR1YWxTdGFjayIsInJlcXVpcmVkIjp0cnVlLCJk
36
- ZWZhdWx0IjpmYWxzZSwiZG9jdW1lbnRhdGlvbiI6IldoZW4gdHJ1ZSwgdXNl
37
- IHRoZSBkdWFsLXN0YWNrIGVuZHBvaW50LiBJZiB0aGUgY29uZmlndXJlZCBl
38
- bmRwb2ludCBkb2VzIG5vdCBzdXBwb3J0IGR1YWwtc3RhY2ssIGRpc3BhdGNo
39
- aW5nIHRoZSByZXF1ZXN0IE1BWSByZXR1cm4gYW4gZXJyb3IuIiwidHlwZSI6
40
- IkJvb2xlYW4ifSwiVXNlRklQUyI6eyJidWlsdEluIjoiQVdTOjpVc2VGSVBT
41
- IiwicmVxdWlyZWQiOnRydWUsImRlZmF1bHQiOmZhbHNlLCJkb2N1bWVudGF0
42
- aW9uIjoiV2hlbiB0cnVlLCBzZW5kIHRoaXMgcmVxdWVzdCB0byB0aGUgRklQ
43
- Uy1jb21wbGlhbnQgcmVnaW9uYWwgZW5kcG9pbnQuIElmIHRoZSBjb25maWd1
44
- cmVkIGVuZHBvaW50IGRvZXMgbm90IGhhdmUgYSBGSVBTIGNvbXBsaWFudCBl
45
- bmRwb2ludCwgZGlzcGF0Y2hpbmcgdGhlIHJlcXVlc3Qgd2lsbCByZXR1cm4g
46
- YW4gZXJyb3IuIiwidHlwZSI6IkJvb2xlYW4ifSwiRW5kcG9pbnQiOnsiYnVp
47
- bHRJbiI6IlNESzo6RW5kcG9pbnQiLCJyZXF1aXJlZCI6ZmFsc2UsImRvY3Vt
48
- ZW50YXRpb24iOiJPdmVycmlkZSB0aGUgZW5kcG9pbnQgdXNlZCB0byBzZW5k
49
- IHRoaXMgcmVxdWVzdCIsInR5cGUiOiJTdHJpbmcifX0sInJ1bGVzIjpbeyJj
50
- b25kaXRpb25zIjpbeyJmbiI6ImF3cy5wYXJ0aXRpb24iLCJhcmd2IjpbeyJy
51
- ZWYiOiJSZWdpb24ifV0sImFzc2lnbiI6IlBhcnRpdGlvblJlc3VsdCJ9XSwi
52
- dHlwZSI6InRyZWUiLCJydWxlcyI6W3siY29uZGl0aW9ucyI6W3siZm4iOiJp
53
- c1NldCIsImFyZ3YiOlt7InJlZiI6IkVuZHBvaW50In1dfSx7ImZuIjoicGFy
54
- c2VVUkwiLCJhcmd2IjpbeyJyZWYiOiJFbmRwb2ludCJ9XSwiYXNzaWduIjoi
55
- dXJsIn1dLCJ0eXBlIjoidHJlZSIsInJ1bGVzIjpbeyJjb25kaXRpb25zIjpb
56
- eyJmbiI6ImJvb2xlYW5FcXVhbHMiLCJhcmd2IjpbeyJyZWYiOiJVc2VGSVBT
57
- In0sdHJ1ZV19XSwiZXJyb3IiOiJJbnZhbGlkIENvbmZpZ3VyYXRpb246IEZJ
58
- UFMgYW5kIGN1c3RvbSBlbmRwb2ludCBhcmUgbm90IHN1cHBvcnRlZCIsInR5
59
- cGUiOiJlcnJvciJ9LHsiY29uZGl0aW9ucyI6W10sInR5cGUiOiJ0cmVlIiwi
60
- cnVsZXMiOlt7ImNvbmRpdGlvbnMiOlt7ImZuIjoiYm9vbGVhbkVxdWFscyIs
61
- ImFyZ3YiOlt7InJlZiI6IlVzZUR1YWxTdGFjayJ9LHRydWVdfV0sImVycm9y
62
- IjoiSW52YWxpZCBDb25maWd1cmF0aW9uOiBEdWFsc3RhY2sgYW5kIGN1c3Rv
63
- bSBlbmRwb2ludCBhcmUgbm90IHN1cHBvcnRlZCIsInR5cGUiOiJlcnJvciJ9
64
- LHsiY29uZGl0aW9ucyI6W10sImVuZHBvaW50Ijp7InVybCI6eyJyZWYiOiJF
65
- bmRwb2ludCJ9LCJwcm9wZXJ0aWVzIjp7fSwiaGVhZGVycyI6e319LCJ0eXBl
66
- IjoiZW5kcG9pbnQifV19XX0seyJjb25kaXRpb25zIjpbeyJmbiI6ImJvb2xl
67
- YW5FcXVhbHMiLCJhcmd2IjpbeyJyZWYiOiJVc2VGSVBTIn0sdHJ1ZV19LHsi
68
- Zm4iOiJib29sZWFuRXF1YWxzIiwiYXJndiI6W3sicmVmIjoiVXNlRHVhbFN0
69
- YWNrIn0sdHJ1ZV19XSwidHlwZSI6InRyZWUiLCJydWxlcyI6W3siY29uZGl0
70
- aW9ucyI6W3siZm4iOiJib29sZWFuRXF1YWxzIiwiYXJndiI6W3RydWUseyJm
71
- biI6ImdldEF0dHIiLCJhcmd2IjpbeyJyZWYiOiJQYXJ0aXRpb25SZXN1bHQi
72
- fSwic3VwcG9ydHNGSVBTIl19XX0seyJmbiI6ImJvb2xlYW5FcXVhbHMiLCJh
73
- cmd2IjpbdHJ1ZSx7ImZuIjoiZ2V0QXR0ciIsImFyZ3YiOlt7InJlZiI6IlBh
74
- cnRpdGlvblJlc3VsdCJ9LCJzdXBwb3J0c0R1YWxTdGFjayJdfV19XSwidHlw
75
- ZSI6InRyZWUiLCJydWxlcyI6W3siY29uZGl0aW9ucyI6W10sImVuZHBvaW50
76
- Ijp7InVybCI6Imh0dHBzOi8vYXBpLmlvdHdpcmVsZXNzLWZpcHMue1JlZ2lv
77
- bn0ue1BhcnRpdGlvblJlc3VsdCNkdWFsU3RhY2tEbnNTdWZmaXh9IiwicHJv
78
- cGVydGllcyI6e30sImhlYWRlcnMiOnt9fSwidHlwZSI6ImVuZHBvaW50In1d
79
- fSx7ImNvbmRpdGlvbnMiOltdLCJlcnJvciI6IkZJUFMgYW5kIER1YWxTdGFj
80
- ayBhcmUgZW5hYmxlZCwgYnV0IHRoaXMgcGFydGl0aW9uIGRvZXMgbm90IHN1
81
- cHBvcnQgb25lIG9yIGJvdGgiLCJ0eXBlIjoiZXJyb3IifV19LHsiY29uZGl0
82
- aW9ucyI6W3siZm4iOiJib29sZWFuRXF1YWxzIiwiYXJndiI6W3sicmVmIjoi
83
- VXNlRklQUyJ9LHRydWVdfV0sInR5cGUiOiJ0cmVlIiwicnVsZXMiOlt7ImNv
84
- bmRpdGlvbnMiOlt7ImZuIjoiYm9vbGVhbkVxdWFscyIsImFyZ3YiOlt0cnVl
85
- LHsiZm4iOiJnZXRBdHRyIiwiYXJndiI6W3sicmVmIjoiUGFydGl0aW9uUmVz
86
- dWx0In0sInN1cHBvcnRzRklQUyJdfV19XSwidHlwZSI6InRyZWUiLCJydWxl
87
- cyI6W3siY29uZGl0aW9ucyI6W10sInR5cGUiOiJ0cmVlIiwicnVsZXMiOlt7
88
- ImNvbmRpdGlvbnMiOltdLCJlbmRwb2ludCI6eyJ1cmwiOiJodHRwczovL2Fw
89
- aS5pb3R3aXJlbGVzcy1maXBzLntSZWdpb259LntQYXJ0aXRpb25SZXN1bHQj
90
- ZG5zU3VmZml4fSIsInByb3BlcnRpZXMiOnt9LCJoZWFkZXJzIjp7fX0sInR5
91
- cGUiOiJlbmRwb2ludCJ9XX1dfSx7ImNvbmRpdGlvbnMiOltdLCJlcnJvciI6
92
- IkZJUFMgaXMgZW5hYmxlZCBidXQgdGhpcyBwYXJ0aXRpb24gZG9lcyBub3Qg
93
- c3VwcG9ydCBGSVBTIiwidHlwZSI6ImVycm9yIn1dfSx7ImNvbmRpdGlvbnMi
94
- Olt7ImZuIjoiYm9vbGVhbkVxdWFscyIsImFyZ3YiOlt7InJlZiI6IlVzZUR1
95
- YWxTdGFjayJ9LHRydWVdfV0sInR5cGUiOiJ0cmVlIiwicnVsZXMiOlt7ImNv
96
- bmRpdGlvbnMiOlt7ImZuIjoiYm9vbGVhbkVxdWFscyIsImFyZ3YiOlt0cnVl
97
- LHsiZm4iOiJnZXRBdHRyIiwiYXJndiI6W3sicmVmIjoiUGFydGl0aW9uUmVz
98
- dWx0In0sInN1cHBvcnRzRHVhbFN0YWNrIl19XX1dLCJ0eXBlIjoidHJlZSIs
99
- InJ1bGVzIjpbeyJjb25kaXRpb25zIjpbXSwiZW5kcG9pbnQiOnsidXJsIjoi
100
- aHR0cHM6Ly9hcGkuaW90d2lyZWxlc3Mue1JlZ2lvbn0ue1BhcnRpdGlvblJl
101
- c3VsdCNkdWFsU3RhY2tEbnNTdWZmaXh9IiwicHJvcGVydGllcyI6e30sImhl
102
- YWRlcnMiOnt9fSwidHlwZSI6ImVuZHBvaW50In1dfSx7ImNvbmRpdGlvbnMi
103
- OltdLCJlcnJvciI6IkR1YWxTdGFjayBpcyBlbmFibGVkIGJ1dCB0aGlzIHBh
104
- cnRpdGlvbiBkb2VzIG5vdCBzdXBwb3J0IER1YWxTdGFjayIsInR5cGUiOiJl
105
- cnJvciJ9XX0seyJjb25kaXRpb25zIjpbXSwiZW5kcG9pbnQiOnsidXJsIjoi
106
- aHR0cHM6Ly9hcGkuaW90d2lyZWxlc3Mue1JlZ2lvbn0ue1BhcnRpdGlvblJl
107
- c3VsdCNkbnNTdWZmaXh9IiwicHJvcGVydGllcyI6e30sImhlYWRlcnMiOnt9
108
- fSwidHlwZSI6ImVuZHBvaW50In1dfV19
109
-
110
- JSON
111
68
  end
112
69
  end