calabash-cucumber 0.9.163.pre6 → 0.9.163.pre7

Sign up to get free protection for your applications and to get access to all the features.
Files changed (42) hide show
  1. checksums.yaml +4 -4
  2. data/calabash-cucumber.gemspec +1 -1
  3. data/lib/calabash-cucumber/actions/instruments_actions.rb +135 -0
  4. data/lib/calabash-cucumber/actions/playback_actions.rb +104 -0
  5. data/lib/calabash-cucumber/connection.rb +16 -0
  6. data/lib/calabash-cucumber/connection_helpers.rb +17 -0
  7. data/lib/calabash-cucumber/core.rb +80 -553
  8. data/lib/calabash-cucumber/failure_helpers.rb +44 -0
  9. data/lib/calabash-cucumber/http_helpers.rb +102 -0
  10. data/lib/calabash-cucumber/ios7_operations.rb +46 -31
  11. data/lib/calabash-cucumber/keyboard_helpers.rb +26 -16
  12. data/lib/calabash-cucumber/launcher.rb +42 -8
  13. data/lib/calabash-cucumber/map.rb +28 -0
  14. data/lib/calabash-cucumber/operations.rb +0 -4
  15. data/lib/calabash-cucumber/playback_helpers.rb +200 -0
  16. data/lib/calabash-cucumber/query_helpers.rb +32 -0
  17. data/lib/calabash-cucumber/resources/double_tap_ios5_ipad.base64 +15 -0
  18. data/lib/calabash-cucumber/resources/double_tap_ios5_iphone.base64 +15 -0
  19. data/lib/calabash-cucumber/resources/double_tap_ios6_ipad.base64 +22 -0
  20. data/lib/calabash-cucumber/resources/double_tap_ios6_iphone.base64 +22 -0
  21. data/lib/calabash-cucumber/resources/swipe_down_ios5_iphone.base64 +31 -18
  22. data/lib/calabash-cucumber/resources/swipe_down_ios6_ipad.base64 +25 -0
  23. data/lib/calabash-cucumber/resources/swipe_down_ios6_iphone.base64 +25 -0
  24. data/lib/calabash-cucumber/resources/swipe_left_ios5_iphone.base64 +34 -79
  25. data/lib/calabash-cucumber/resources/swipe_left_ios6_ipad.base64 +28 -0
  26. data/lib/calabash-cucumber/resources/swipe_left_ios6_iphone.base64 +28 -0
  27. data/lib/calabash-cucumber/resources/swipe_right_ios6_ipad.base64 +25 -0
  28. data/lib/calabash-cucumber/resources/swipe_right_ios6_iphone.base64 +25 -0
  29. data/lib/calabash-cucumber/resources/swipe_up_ios5_iphone.base64 +28 -34
  30. data/lib/calabash-cucumber/resources/swipe_up_ios6_ipad.base64 +25 -0
  31. data/lib/calabash-cucumber/resources/swipe_up_ios6_iphone.base64 +25 -0
  32. data/lib/calabash-cucumber/resources/touch_hold_ios5_ipad.base64 +9 -0
  33. data/lib/calabash-cucumber/resources/touch_hold_ios5_iphone.base64 +9 -0
  34. data/lib/calabash-cucumber/resources/touch_hold_ios6_ipad.base64 +9 -0
  35. data/lib/calabash-cucumber/resources/touch_hold_ios6_iphone.base64 +9 -0
  36. data/lib/calabash-cucumber/rotation_helpers.rb +112 -0
  37. data/lib/calabash-cucumber/status_bar_helpers.rb +30 -0
  38. data/lib/calabash-cucumber/tests_helpers.rb +3 -42
  39. data/lib/calabash-cucumber/uia.rb +8 -7
  40. data/lib/calabash-cucumber/version.rb +2 -2
  41. data/lib/calabash-cucumber/wait_helpers.rb +19 -2
  42. metadata +31 -4
@@ -0,0 +1,28 @@
1
+ require 'json'
2
+
3
+ module Calabash
4
+ module Cucumber
5
+ module Map #=> Connection
6
+
7
+ def map(query, method_name, *method_args)
8
+ raw_map(query,method_name, *method_args)['results']
9
+ end
10
+
11
+ def raw_map(query, method_name, *method_args)
12
+ operation_map = {
13
+ :method_name => method_name,
14
+ :arguments => method_args
15
+ }
16
+ res = http({:method => :post, :path => 'map'},
17
+ {:query => query, :operation => operation_map})
18
+ res = JSON.parse(res)
19
+ if res['outcome'] != 'SUCCESS'
20
+ screenshot_and_raise "map #{query}, #{method_name} failed because: #{res['reason']}\n#{res['details']}"
21
+ end
22
+
23
+ res
24
+ end
25
+
26
+ end
27
+ end
28
+ end
@@ -45,10 +45,6 @@ module Calabash
45
45
  end
46
46
  end
47
47
 
48
- def escape_quotes(str)
49
- str.gsub("'", "\\\\'")
50
- end
51
-
52
48
  def label(uiquery)
53
49
  query(uiquery, :accessibilityLabel)
54
50
  end
@@ -0,0 +1,200 @@
1
+ module Calabash
2
+ module Cucumber
3
+ module PlaybackHelpers
4
+
5
+ DATA_PATH = File.expand_path(File.dirname(__FILE__))
6
+
7
+ def recording_name_for(recording_name, os, device)
8
+ if !recording_name.end_with? ".base64"
9
+ "#{recording_name}_#{os}_#{device}.base64"
10
+ else
11
+ recording_name
12
+ end
13
+ end
14
+
15
+ def load_recording(recording, rec_dir)
16
+ directories = playback_file_directories(rec_dir)
17
+ directories.each { |dir|
18
+ path = "#{dir}/#{recording}"
19
+ if File.exists?(path)
20
+ # useful for debugging recordings, but too verbose for release
21
+ # suggest (yet) another variable CALABASH_DEBUG_PLAYBACK ?
22
+ #if ENV['CALABASH_FULL_CONSOLE_OUTPUT'] == '1'
23
+ # puts "found compatible playback: '#{path}'"
24
+ #end
25
+ return File.read(path)
26
+ end
27
+ }
28
+ nil
29
+ end
30
+
31
+ def playback_file_directories (rec_dir)
32
+ # rec_dir is either ENV['PLAYBACK_DIR'] or ./features/playback
33
+ [File.expand_path(rec_dir),
34
+ "#{Dir.pwd}",
35
+ "#{Dir.pwd}/features",
36
+ "#{Dir.pwd}/features/playback",
37
+ "#{DATA_PATH}/resources/"].uniq
38
+ end
39
+
40
+ def load_playback_data(recording_name, options={})
41
+ os = options["OS"] || ENV["OS"]
42
+ device = options["DEVICE"] || ENV["DEVICE"] || "iphone"
43
+
44
+ unless os
45
+ if @calabash_launcher && @calabash_launcher.active?
46
+ major = @calabash_launcher.ios_major_version
47
+ else
48
+ major = Calabash::Cucumber::SimulatorHelper.ios_major_version
49
+ end
50
+
51
+ unless major
52
+ raise <<EOF
53
+ Unable to determine iOS major version
54
+ Most likely you have updated your calabash-cucumber client
55
+ but not your server. Please follow closely:
56
+
57
+ https://github.com/calabash/calabash-ios/wiki/B1-Updating-your-Calabash-iOS-version
58
+
59
+ If you are running version 0.9.120+ then please report this message as a bug.
60
+ EOF
61
+ end
62
+ os = "ios#{major}"
63
+ end
64
+
65
+ rec_dir = ENV['PLAYBACK_DIR'] || "#{Dir.pwd}/features/playback"
66
+
67
+ candidates = []
68
+ data = find_compatible_recording(recording_name, os, rec_dir, device, candidates)
69
+
70
+ if data.nil? and device=='ipad'
71
+ if ENV['CALABASH_FULL_CONSOLE_OUTPUT'] == '1'
72
+ puts "Unable to find recording for #{os} and #{device}. Trying with #{os} iphone"
73
+ end
74
+ data = find_compatible_recording(recording_name, os, rec_dir, 'iphone', candidates)
75
+ end
76
+
77
+ if data.nil?
78
+ searched_for = " searched for => \n"
79
+ candidates.each { |file| searched_for.concat(" * '#{file}'\n") }
80
+ searched_in = " in directories =>\n"
81
+ playback_file_directories(rec_dir).each { |dir| searched_in.concat(" * '#{dir}'\n") }
82
+ screenshot_and_raise "Playback file not found for: '#{recording_name}'\n#{searched_for}#{searched_in}"
83
+ end
84
+
85
+ data
86
+ end
87
+
88
+ def find_compatible_recording (recording_name, os, rec_dir, device, candidates)
89
+ recording = recording_name_for(recording_name, os, device)
90
+ data = load_recording(recording, rec_dir)
91
+ if data.nil?
92
+ candidates << recording
93
+ version_counter = os[-1, 1].to_i
94
+ loop do
95
+ version_counter = version_counter - 1
96
+ break if version_counter < 5
97
+ loop_os = "ios#{version_counter}"
98
+ recording = recording_name_for(recording_name, loop_os, device)
99
+ candidates << recording
100
+ data = load_recording(recording, rec_dir)
101
+ break if !data.nil?
102
+ end
103
+ end
104
+ data
105
+ end
106
+
107
+ def playback(recording, options={})
108
+ data = load_playback_data(recording)
109
+
110
+ post_data = %Q|{"events":"#{data}"|
111
+ post_data<< %Q|,"query":"#{escape_quotes(options[:query])}"| if options[:query]
112
+ post_data<< %Q|,"offset":#{options[:offset].to_json}| if options[:offset]
113
+ post_data<< %Q|,"reverse":#{options[:reverse]}| if options[:reverse]
114
+ post_data<< %Q|,"uia_gesture":"#{options[:uia_gesture]}"| if options[:uia_gesture]
115
+ post_data<< %Q|,"prototype":"#{options[:prototype]}"| if options[:prototype]
116
+ post_data << "}"
117
+
118
+ res = http({:method => :post, :raw => true, :path => 'play'}, post_data)
119
+
120
+ res = JSON.parse(res)
121
+ if res['outcome'] != 'SUCCESS'
122
+ screenshot_and_raise "playback failed because: #{res['reason']}\n#{res['details']}"
123
+ end
124
+ res['results']
125
+ end
126
+
127
+ def interpolate(recording, options={})
128
+ data = load_playback_data(recording)
129
+
130
+ post_data = %Q|{"events":"#{data}"|
131
+ post_data<< %Q|,"start":"#{escape_quotes(options[:start])}"| if options[:start]
132
+ post_data<< %Q|,"end":"#{escape_quotes(options[:end])}"| if options[:end]
133
+ post_data<< %Q|,"offset_start":#{options[:offset_start].to_json}| if options[:offset_start]
134
+ post_data<< %Q|,"offset_end":#{options[:offset_end].to_json}| if options[:offset_end]
135
+ post_data << "}"
136
+
137
+ res = http({:method => :post, :raw => true, :path => 'interpolate'}, post_data)
138
+
139
+ res = JSON.parse(res)
140
+ if res['outcome'] != 'SUCCESS'
141
+ screenshot_and_raise "interpolate failed because: #{res['reason']}\n#{res['details']}"
142
+ end
143
+ res['results']
144
+ end
145
+
146
+ def record_begin
147
+ http({:method => :post, :path => 'record'}, {:action => :start})
148
+ end
149
+
150
+ def record_end(file_name)
151
+ res = http({:method => :post, :path => 'record'}, {:action => :stop})
152
+ File.open("_recording.plist", 'wb') do |f|
153
+ f.write res
154
+ end
155
+
156
+ device = ENV['DEVICE'] || 'iphone'
157
+ os = ENV['OS']
158
+
159
+ unless os
160
+ if @calabash_launcher && @calabash_launcher.active?
161
+ major = @calabash_launcher.ios_major_version
162
+ else
163
+ major = Calabash::Cucumber::SimulatorHelper.ios_major_version
164
+ end
165
+
166
+ unless major
167
+ raise <<EOF
168
+ Unable to determine iOS major version
169
+ Most likely you have updated your calabash-cucumber client
170
+ but not your server. Please follow closely:
171
+
172
+ https://github.com/calabash/calabash-ios/wiki/B1-Updating-your-Calabash-iOS-version
173
+
174
+ If you are running version 0.9.120+ then please report this message as a bug.
175
+ EOF
176
+ end
177
+ os = "ios#{major}"
178
+ end
179
+
180
+ file_name = "#{file_name}_#{os}_#{device}.base64"
181
+ system("/usr/bin/plutil -convert binary1 -o _recording_binary.plist _recording.plist")
182
+ system("openssl base64 -in _recording_binary.plist -out '#{file_name}'")
183
+ system("rm _recording.plist _recording_binary.plist")
184
+
185
+ rec_dir = ENV['PLAYBACK_DIR'] || "#{Dir.pwd}/features/playback"
186
+ unless File.directory?(rec_dir)
187
+ if ENV['CALABASH_FULL_CONSOLE_OUTPUT'] == '1'
188
+ puts "creating playback directory at '#{rec_dir}'"
189
+ end
190
+ system("mkdir -p #{rec_dir}")
191
+ end
192
+
193
+ system("mv #{file_name} #{rec_dir}")
194
+ "#{file_name} ==> '#{rec_dir}/#{file_name}'"
195
+
196
+ end
197
+
198
+ end
199
+ end
200
+ end
@@ -0,0 +1,32 @@
1
+ module Calabash
2
+ module Cucumber
3
+ module QueryHelpers
4
+
5
+ def escape_quotes(str)
6
+ str.gsub("'", "\\\\'")
7
+ end
8
+
9
+ def point_from(query_result, options={})
10
+ offset_x = 0
11
+ offset_y = 0
12
+ if options[:offset]
13
+ offset_x += options[:offset][:x] || 0
14
+ offset_y += options[:offset][:y] || 0
15
+ end
16
+ x = offset_x
17
+ y = offset_y
18
+ rect = query_result['rect'] || query_result[:rect]
19
+ if rect
20
+ x += rect['center_x'] || rect[:center_x] || rect[:x] || 0
21
+ y += rect['center_y'] || rect[:center_y] || rect[:y] || 0
22
+ else
23
+ x += query_result['center_x'] || query_result[:center_x] || query_result[:x] || 0
24
+ y += query_result['center_y'] || query_result[:center_y] || query_result[:y] || 0
25
+ end
26
+
27
+ {:x => x, :y => y}
28
+ end
29
+
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,15 @@
1
+ YnBsaXN0MDCkARIcJdUCAwQFBgcICQ4RVFRpbWVURGF0YV5XaW5kb3dMb2NhdGlv
2
+ blhMb2NhdGlvblRUeXBlEwAANNCNhOloTxBAAQAAAAEAAQAAAAAAAAAAAAAAAAAA
3
+ AAAAAAAAAAAAAAAAAAEAAgICAAAAgD8AAIA/AAAcQwAAP0MAoIZAAAAAANIKCwwN
4
+ UVhRWSNAY4AAAAAAACNAZ+AAAAAAANIKCw8QI0BjgAAAAAAAI0Bn4AAAAAAAEQu5
5
+ 1QITBAUGFBUWGRFURGF0YRMAADTQkuDv208QQAYAAAABAAEAAAAAAAAAAAAAAAAA
6
+ AAAAAAAAAAAAAAAAAAABAAICAQAAAIA/AACAPwAAHEMAAD9D/38AAE52xJLSCgsX
7
+ GCNAY4AAAAAAACNAZ+AAAAAAANIKCxobI0BjgAAAAAAAI0Bn4AAAAAAA1QITBAUG
8
+ HR4fIhETAAA00Jg8n41PEEABAAAAAQABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
9
+ AAAAAQACAgIAAACAPwAAgD8AABxDAAA/QwCghkAAAAAA0goLICEjQGOAAAAAAAAj
10
+ QGfgAAAAAADSCgsjJCNAY4AAAAAAACNAZ+AAAAAAANUCEwQFBiYnKCsREwAANNCa
11
+ 5tq1TxBABgAAAAEAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAgIBAAAA
12
+ gD8AAIA/AAAcQwAAP0P/fwAATnbEktIKCykqI0BjgAAAAAAAI0Bn4AAAAAAA0goL
13
+ LC0jQGOAAAAAAAAjQGfgAAAAAAAACAANABgAHQAiADEAOgA/AEgAiwCQAJIAlACd
14
+ AKYAqwC0AL0AwADLANAA2QEcASEBKgEzATgBQQFKAVUBXgGhAaYBrwG4Ab0BxgHP
15
+ AdoB4wImAisCNAI9AkICSwAAAAAAAAIBAAAAAAAAAC4AAAAAAAAAAAAAAAAAAAJU
@@ -0,0 +1,15 @@
1
+ YnBsaXN0MDCkARIcJdUCAwQFBgcICQ4RVFRpbWVURGF0YV5XaW5kb3dMb2NhdGlv
2
+ blhMb2NhdGlvblRUeXBlEwAANNCNhOloTxBAAQAAAAEAAQAAAAAAAAAAAAAAAAAA
3
+ AAAAAAAAAAAAAAAAAAEAAgICAAAAgD8AAIA/AAAcQwAAP0MAoIZAAAAAANIKCwwN
4
+ UVhRWSNAY4AAAAAAACNAZ+AAAAAAANIKCw8QI0BjgAAAAAAAI0Bn4AAAAAAAEQu5
5
+ 1QITBAUGFBUWGRFURGF0YRMAADTQkuDv208QQAYAAAABAAEAAAAAAAAAAAAAAAAA
6
+ AAAAAAAAAAAAAAAAAAABAAICAQAAAIA/AACAPwAAHEMAAD9D/38AAE52xJLSCgsX
7
+ GCNAY4AAAAAAACNAZ+AAAAAAANIKCxobI0BjgAAAAAAAI0Bn4AAAAAAA1QITBAUG
8
+ HR4fIhETAAA00Jg8n41PEEABAAAAAQABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
9
+ AAAAAQACAgIAAACAPwAAgD8AABxDAAA/QwCghkAAAAAA0goLICEjQGOAAAAAAAAj
10
+ QGfgAAAAAADSCgsjJCNAY4AAAAAAACNAZ+AAAAAAANUCEwQFBiYnKCsREwAANNCa
11
+ 5tq1TxBABgAAAAEAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAgIBAAAA
12
+ gD8AAIA/AAAcQwAAP0P/fwAATnbEktIKCykqI0BjgAAAAAAAI0Bn4AAAAAAA0goL
13
+ LC0jQGOAAAAAAAAjQGfgAAAAAAAACAANABgAHQAiADEAOgA/AEgAiwCQAJIAlACd
14
+ AKYAqwC0AL0AwADLANAA2QEcASEBKgEzATgBQQFKAVUBXgGhAaYBrwG4Ab0BxgHP
15
+ AdoB4wImAisCNAI9AkICSwAAAAAAAAIBAAAAAAAAAC4AAAAAAAAAAAAAAAAAAAJU
@@ -0,0 +1,22 @@
1
+ YnBsaXN0MDCmARIcJS431QIDBAUGBwgJDhFUVGltZVREYXRhXldpbmRvd0xvY2F0
2
+ aW9uWExvY2F0aW9uVFR5cGUTAAA0oLBqf5xPEEABAAAAAQABAAAAAAAAAAAAAAAA
3
+ AAAAAAAAAAAAAAAAAAAAAQABAgMAAAAAAAAAoEAAAA9DAACBQysKswYAAAAA0goL
4
+ DA1RWFFZI0Bh4AAAAAAAI0BwIAAAAAAA0goLDxAjQGHgAAAAAAAjQHAgAAAAAAAR
5
+ C7nVAhMEBQYUFRYZEVREYXRhEwAANKC1ZkWoTxBABgAAAAEAAAAAAAAAAAAAAAAA
6
+ AAAAAAAAAAAAAAAAAAAAAAEAAQIAAAAAAAAAAKBAAAAPQwAAgUMrCrMGAAAAANIK
7
+ CxcYI0Bh4AAAAAAAI0BwIAAAAAAA0goLGhsjQGHgAAAAAAAjQHAgAAAAAADVAhME
8
+ BQYdHh8iERMAADSguiC7pE8QQAEAAAABAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
9
+ AAAAAAABAAECAwAAAAAAAACgQAAAD0MAAIFD/zFrnwAAAADSCgsgISNAYeAAAAAA
10
+ ACNAcCAAAAAAANIKCyMkI0Bh4AAAAAAAI0BwIAAAAAAA1QITBAUGJicoKxETAAA0
11
+ oLohDQRPEEAGAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQABAgAA
12
+ AAAAAAAAoEAAAA9DAACBQ/8xa58AAAAA0goLKSojQGHgAAAAAAAjQHAgAAAAAADS
13
+ CgssLSNAYeAAAAAAACNAcCAAAAAAANUCEwQFBi8wMTQREwAANKC6IcAUTxBAAQAA
14
+ AAEAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAQIDAAAAAAAAAKBAAAAP
15
+ QwAAgUP/MWufAAAAANIKCzIzI0Bh4AAAAAAAI0BwIAAAAAAA0goLNTYjQGHgAAAA
16
+ AAAjQHAgAAAAAADVAhMEBQY4OTo9ERMAADSgvhhKlk8QQAYAAAABAAAAAAAAAAAA
17
+ AAAAAAAAAAAAAAAAAAAAAAAAAAEBAAECAAAAAAAAAACgQAAAD0MAAIFD/zFrnwAA
18
+ AADSCgs7PCNAYeAAAAAAACNAcCAAAAAAANIKCz4/I0Bh4AAAAAAAI0BwIAAAAAAA
19
+ AAgADwAaAB8AJAAzADwAQQBKAI0AkgCUAJYAnwCoAK0AtgC/AMIAzQDSANsBHgEj
20
+ ASwBNQE6AUMBTAFXAWABowGoAbEBugG/AcgB0QHcAeUCKAItAjYCPwJEAk0CVgJh
21
+ AmoCrQKyArsCxALJAtIC2wLmAu8DMgM3A0ADSQNOA1cAAAAAAAACAQAAAAAAAABA
22
+ AAAAAAAAAAAAAAAAAAADYA==
@@ -0,0 +1,22 @@
1
+ YnBsaXN0MDCmARIcJS431QIDBAUGBwgJDhFUVGltZVREYXRhXldpbmRvd0xvY2F0
2
+ aW9uWExvY2F0aW9uVFR5cGUTAAA0oLBqf5xPEEABAAAAAQABAAAAAAAAAAAAAAAA
3
+ AAAAAAAAAAAAAAAAAAAAAQABAgMAAAAAAAAAoEAAAA9DAACBQysKswYAAAAA0goL
4
+ DA1RWFFZI0Bh4AAAAAAAI0BwIAAAAAAA0goLDxAjQGHgAAAAAAAjQHAgAAAAAAAR
5
+ C7nVAhMEBQYUFRYZEVREYXRhEwAANKC1ZkWoTxBABgAAAAEAAAAAAAAAAAAAAAAA
6
+ AAAAAAAAAAAAAAAAAAAAAAEAAQIAAAAAAAAAAKBAAAAPQwAAgUMrCrMGAAAAANIK
7
+ CxcYI0Bh4AAAAAAAI0BwIAAAAAAA0goLGhsjQGHgAAAAAAAjQHAgAAAAAADVAhME
8
+ BQYdHh8iERMAADSguiC7pE8QQAEAAAABAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
9
+ AAAAAAABAAECAwAAAAAAAACgQAAAD0MAAIFD/zFrnwAAAADSCgsgISNAYeAAAAAA
10
+ ACNAcCAAAAAAANIKCyMkI0Bh4AAAAAAAI0BwIAAAAAAA1QITBAUGJicoKxETAAA0
11
+ oLohDQRPEEAGAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQABAgAA
12
+ AAAAAAAAoEAAAA9DAACBQ/8xa58AAAAA0goLKSojQGHgAAAAAAAjQHAgAAAAAADS
13
+ CgssLSNAYeAAAAAAACNAcCAAAAAAANUCEwQFBi8wMTQREwAANKC6IcAUTxBAAQAA
14
+ AAEAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAQIDAAAAAAAAAKBAAAAP
15
+ QwAAgUP/MWufAAAAANIKCzIzI0Bh4AAAAAAAI0BwIAAAAAAA0goLNTYjQGHgAAAA
16
+ AAAjQHAgAAAAAADVAhMEBQY4OTo9ERMAADSgvhhKlk8QQAYAAAABAAAAAAAAAAAA
17
+ AAAAAAAAAAAAAAAAAAAAAAAAAAEBAAECAAAAAAAAAACgQAAAD0MAAIFD/zFrnwAA
18
+ AADSCgs7PCNAYeAAAAAAACNAcCAAAAAAANIKCz4/I0Bh4AAAAAAAI0BwIAAAAAAA
19
+ AAgADwAaAB8AJAAzADwAQQBKAI0AkgCUAJYAnwCoAK0AtgC/AMIAzQDSANsBHgEj
20
+ ASwBNQE6AUMBTAFXAWABowGoAbEBugG/AcgB0QHcAeUCKAItAjYCPwJEAk0CVgJh
21
+ AmoCrQKyArsCxALJAtIC2wLmAu8DMgM3A0ADSQNOA1cAAAAAAAACAQAAAAAAAABA
22
+ AAAAAAAAAAAAAAAAAAADYA==
@@ -1,18 +1,31 @@
1
- YnBsaXN0MDClARIbJC3VAgMEBQYHCAkOEVRUaW1lVERhdGFeV2luZG93TG9jYXRp
2
- b25YTG9jYXRpb25UVHlwZRMAAKTtDqh8Vk8QPAEAAAABAAEAAAAAAAAAAAAAAAAA
3
- AAAAAAAAAAAAAAAAAAABRAICAgAAAIA/AACAPwCAJEQAAEhCAeUXANIKCwwNUVhR
4
- WSNAhJAAAAAAACNASQAAAAAAANIKCw8QI0CEkAAAAAAAI0BJAAAAAAAAEQu51QID
5
- BAUGExQVGBETAACk7ReMAFdPEDwCAAAAAQABAAAAAAAAAAAAAAAAAAAAAAAAAAAA
6
- AAAAAAAAAZgCAgIAAACAPwAAgD8AQCREAABgQgFQJETSCgsWFyNAhIgAAAAAACNA
7
- TAAAAAAAANIKCxkaI0CEiAAAAAAAI0BMAAAAAAAA1QIDBAUGHB0eIRETAACk7SAd
8
- mU1PEDwCAAAAAQABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAZgCAgIAAACA
9
- PwAAgD8AQCREAAC9QwFQJETSCgsfICNAhIgAAAAAACNAd6AAAAAAANIKCyIjI0CE
10
- iAAAAAAAI0B3oAAAAAAA1QIDBAUGJSYnKhETAACk7SPCCFBPEDwCAAAAAQABAAAA
11
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAZgCAgIAAACAPwAAgD8AQCREAIDRQwFQ
12
- JETSCgsoKSNAhIgAAAAAACNAejAAAAAAANIKCyssI0CEiAAAAAAAI0B6MAAAAAAA
13
- 1QIDBAUGLi8wMxETAACk7SPEbrVPEDwGAAAAAQABAAAAAAAAAAAAAAAAAAAAAAAA
14
- AAAAAAAAAAAAAZgCAgEAAACAPwAAgD8AgCREAADRQwGAJETSCgsxMiNAhJAAAAAA
15
- ACNAeiAAAAAAANIKCzQ1I0CEkAAAAAAAI0B6IAAAAAAAAAgADgAZAB4AIwAyADsA
16
- QABJAIgAjQCPAJEAmgCjAKgAsQC6AL0AyADRARABFQEeAScBLAE1AT4BSQFSAZEB
17
- lgGfAagBrQG2Ab8BygHTAhICFwIgAikCLgI3AkACSwJUApMCmAKhAqoCrwK4AAAA
18
- AAAAAgEAAAAAAAAANgAAAAAAAAAAAAAAAAAAAsE=
1
+ YnBsaXN0MDCpARIcJS43QElS1QIDBAUGBwgJDhFUVGltZVREYXRhXldpbmRvd0xv
2
+ Y2F0aW9uWExvY2F0aW9uVFR5cGUTAAA07zUa5kpPEEABAAAAAQABAAAAAAAAAAAA
3
+ JpbVwHBDecMAAAAAAAAAAAAAAQACAgIAAACAPwAAgD8AABlDAABGQwCghkAAAAAA
4
+ 0goLDA1RWFFZI0BjIAAAAAAAI0BowAAAAAAA0goLDxAjQGMgAAAAAAAjQGjAAAAA
5
+ AAARC7nVAhMEBQYUFRYZEVREYXRhEwAANO9L+02wTxBAAgAAAAEAAQAAAAAAAAAA
6
+ ACaW1cBwQ3nDAAAAAAAAAAAAAAEAAgICAAAAgD8AAIA/AAAZQwAAR0P/fwAATnbE
7
+ ktIKCxcYI0BjIAAAAAAAI0Bo4AAAAAAA0goLGhsjQGMgAAAAAAAjQGjgAAAAAADV
8
+ AhMEBQYdHh8iERMAADTvTP2+5U8QQAIAAAABAAEAAAAAAAAAAAAmltXAcEN5wwAA
9
+ AAAAAAAAAAABAAICAgAAAIA/AACAPwAAGUMAAFBD/38AAE52xJLSCgsgISNAYyAA
10
+ AAAAACNAagAAAAAAANIKCyMkI0BjIAAAAAAAI0BqAAAAAAAA1QITBAUGJicoKxET
11
+ AAA07036AYhPEEACAAAAAQABAAAAAAAAAAAAJpbVwHBDecMAAAAAAAAAAAAAAQAC
12
+ AgIAAACAPwAAgD8AABlDAABbQ/9/AABOdsSS0goLKSojQGMgAAAAAAAjQGtgAAAA
13
+ AADSCgssLSNAYyAAAAAAACNAa2AAAAAAANUCEwQFBi8wMTQREwAANO9O/HDCTxBA
14
+ AgAAAAEAAQAAAAAAAAAAACaW1cBwQ3nDAAAAAAAAAAAAAAEAAgICAAAAgD8AAIA/
15
+ AAAZQwAAZ0P/fwAATnbEktIKCzIzI0BjIAAAAAAAI0Bs4AAAAAAA0goLNTYjQGMg
16
+ AAAAAAAjQGzgAAAAAADVAhMEBQY4OTo9ERMAADTvT/TgXU8QQAIAAAABAAEAAAAA
17
+ AAAAAAAmltXAcEN5wwAAAAAAAAAAAAABAAICAgAAAIA/AACAPwAAGUMAAHJD/38A
18
+ AE52xJLSCgs7PCNAYyAAAAAAACNAbkAAAAAAANIKCz4/I0BjIAAAAAAAI0BuQAAA
19
+ AAAA1QITBAUGQUJDRhETAAA071D49A5PEEACAAAAAQABAAAAAAAAAAAAJpbVwHBD
20
+ ecMAAAAAAAAAAAAAAQACAgIAAACAPwAAgD8AABlDAAB+Q/9/AABOdsSS0goLREUj
21
+ QGMgAAAAAAAjQG/AAAAAAADSCgtHSCNAYyAAAAAAACNAb8AAAAAAANUCEwQFBkpL
22
+ TE8REwAANO9R8YBdTxBAAgAAAAEAAQAAAAAAAAAAACaW1cBwQ3nDAAAAAAAAAAAA
23
+ AAEAAgICAAAAgD8AAIA/AAAZQwCAhkP/fwAATnbEktIKC01OI0BjIAAAAAAAI0Bw
24
+ 0AAAAAAA0goLUFEjQGMgAAAAAAAjQHDQAAAAAADVAhMEBQZTVFVYERMAADTvUiXW
25
+ b08QQAYAAAABAAEAAAAAAAAAAAAmltXAcEN5wwAAAAAAAAAAAAABAAICAQAAAIA/
26
+ AACAPwAAGUMAgIZD/38AAE52xJLSCgtWVyNAYyAAAAAAACNAcNAAAAAAANIKC1la
27
+ I0BjIAAAAAAAI0Bw0AAAAAAAAAgAEgAdACIAJwA2AD8ARABNAJAAlQCXAJkAogCr
28
+ ALAAuQDCAMUA0ADVAN4BIQEmAS8BOAE9AUYBTwFaAWMBpgGrAbQBvQHCAcsB1AHf
29
+ AegCKwIwAjkCQgJHAlACWQJkAm0CsAK1Ar4CxwLMAtUC3gLpAvIDNQM6A0MDTANR
30
+ A1oDYwNuA3cDugO/A8gD0QPWA98D6APzA/wEPwREBE0EVgRbBGQEbQR4BIEExATJ
31
+ BNIE2wTgBOkAAAAAAAACAQAAAAAAAABbAAAAAAAAAAAAAAAAAAAE8g==
@@ -0,0 +1,25 @@
1
+ YnBsaXN0MDCnARIcJS43QNUCAwQFBgcICQ4RVFRpbWVURGF0YV5XaW5kb3dMb2Nh
2
+ dGlvblhMb2NhdGlvblRUeXBlEwAABDj0QU/0TxBAAQAAAAEAAQAAAAAAAAAAAAAA
3
+ AAAAAAAAAAAAAAAAAAAAAAEAAQIDAAAAAAAAAKBAAIAYQwAAbUONN5TmAAAAANIK
4
+ CwwNUVhRWSNAYxAAAAAAACNAbaAAAAAAANIKCw8QI0BjEAAAAAAAI0BtoAAAAAAA
5
+ EQu51QITBAUGFBUWGRFURGF0YRMAAAQ5BiTQ7k8QQAIAAAABAAEAAAAAAAAAAAAA
6
+ AAAAAAAAAAAAAAAAAAAAAAABAAECAwAAAAAAAACgQACAGEMAgHBDjTeU5gAAAADS
7
+ CgsXGCNAYxAAAAAAACNAbhAAAAAAANIKCxobI0BjEAAAAAAAI0BuEAAAAAAA1QIT
8
+ BAUGHR4fIhETAAAEOQcrp+hPEEACAAAAAQABAAAAAAAAAAAAAAAAAAAAAAAAAAAA
9
+ AAAAAAAAAQABAgMAAAAAAAAAoEAAgBhDAIB5Q403lOYAAAAA0goLICEjQGMQAAAA
10
+ AAAjQG8wAAAAAADSCgsjJCNAYxAAAAAAACNAbzAAAAAAANUCEwQFBiYnKCsREwAA
11
+ BDkIJ0wrTxBAAgAAAAEAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAQID
12
+ AAAAAAAAAKBAAIAYQwDAgkONN5TmAAAAANIKCykqI0BjEAAAAAAAI0BwWAAAAAAA
13
+ 0goLLC0jQGMQAAAAAAAjQHBYAAAAAADVAhMEBQYvMDE0ERMAAAQ5CSXFXk8QQAIA
14
+ AAABAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAECAwAAAAAAAACgQAAA
15
+ GEMAAIxDjTeU5gAAAADSCgsyMyNAYwAAAAAAACNAcYAAAAAAANIKCzU2I0BjAAAA
16
+ AAAAI0BxgAAAAAAA1QITBAUGODk6PRETAAAEOQos23JPEEACAAAAAQABAAAAAAAA
17
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAQABAgMAAAAAAAAAoEAAgBZDAICcQ403lOYA
18
+ AAAA0goLOzwjQGLQAAAAAAAjQHOQAAAAAADSCgs+PyNAYtAAAAAAACNAc5AAAAAA
19
+ ANUCEwQFBkFCQ0YREwAABDkMr21BTxBABgAAAAEAAAAAAAAAAAAAAAAAAAAAAAAA
20
+ AAAAAAAAAAAAAAEAAQIAAAAAAAAAAKBAAIAWQwAAtEONN5TmAAAAANIKC0RFI0Bi
21
+ 0AAAAAAAI0B2gAAAAAAA0goLR0gjQGLQAAAAAAAjQHaAAAAAAAAACAAQABsAIAAl
22
+ ADQAPQBCAEsAjgCTAJUAlwCgAKkArgC3AMAAwwDOANMA3AEfASQBLQE2ATsBRAFN
23
+ AVgBYQGkAakBsgG7AcAByQHSAd0B5gIpAi4CNwJAAkUCTgJXAmICawKuArMCvALF
24
+ AsoC0wLcAucC8AMzAzgDQQNKA08DWANhA2wDdQO4A70DxgPPA9QD3QAAAAAAAAIB
25
+ AAAAAAAAAEkAAAAAAAAAAAAAAAAAAAPm
@@ -0,0 +1,25 @@
1
+ YnBsaXN0MDCnARIcJS43QNUCAwQFBgcICQ4RVFRpbWVURGF0YV5XaW5kb3dMb2Nh
2
+ dGlvblhMb2NhdGlvblRUeXBlEwAABDj0QU/0TxBAAQAAAAEAAQAAAAAAAAAAAAAA
3
+ AAAAAAAAAAAAAAAAAAAAAAEAAQIDAAAAAAAAAKBAAIAYQwAAbUONN5TmAAAAANIK
4
+ CwwNUVhRWSNAYxAAAAAAACNAbaAAAAAAANIKCw8QI0BjEAAAAAAAI0BtoAAAAAAA
5
+ EQu51QITBAUGFBUWGRFURGF0YRMAAAQ5BiTQ7k8QQAIAAAABAAEAAAAAAAAAAAAA
6
+ AAAAAAAAAAAAAAAAAAAAAAABAAECAwAAAAAAAACgQACAGEMAgHBDjTeU5gAAAADS
7
+ CgsXGCNAYxAAAAAAACNAbhAAAAAAANIKCxobI0BjEAAAAAAAI0BuEAAAAAAA1QIT
8
+ BAUGHR4fIhETAAAEOQcrp+hPEEACAAAAAQABAAAAAAAAAAAAAAAAAAAAAAAAAAAA
9
+ AAAAAAAAAQABAgMAAAAAAAAAoEAAgBhDAIB5Q403lOYAAAAA0goLICEjQGMQAAAA
10
+ AAAjQG8wAAAAAADSCgsjJCNAYxAAAAAAACNAbzAAAAAAANUCEwQFBiYnKCsREwAA
11
+ BDkIJ0wrTxBAAgAAAAEAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAQID
12
+ AAAAAAAAAKBAAIAYQwDAgkONN5TmAAAAANIKCykqI0BjEAAAAAAAI0BwWAAAAAAA
13
+ 0goLLC0jQGMQAAAAAAAjQHBYAAAAAADVAhMEBQYvMDE0ERMAAAQ5CSXFXk8QQAIA
14
+ AAABAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAECAwAAAAAAAACgQAAA
15
+ GEMAAIxDjTeU5gAAAADSCgsyMyNAYwAAAAAAACNAcYAAAAAAANIKCzU2I0BjAAAA
16
+ AAAAI0BxgAAAAAAA1QITBAUGODk6PRETAAAEOQos23JPEEACAAAAAQABAAAAAAAA
17
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAQABAgMAAAAAAAAAoEAAgBZDAICcQ403lOYA
18
+ AAAA0goLOzwjQGLQAAAAAAAjQHOQAAAAAADSCgs+PyNAYtAAAAAAACNAc5AAAAAA
19
+ ANUCEwQFBkFCQ0YREwAABDkMr21BTxBABgAAAAEAAAAAAAAAAAAAAAAAAAAAAAAA
20
+ AAAAAAAAAAAAAAEAAQIAAAAAAAAAAKBAAIAWQwAAtEONN5TmAAAAANIKC0RFI0Bi
21
+ 0AAAAAAAI0B2gAAAAAAA0goLR0gjQGLQAAAAAAAjQHaAAAAAAAAACAAQABsAIAAl
22
+ ADQAPQBCAEsAjgCTAJUAlwCgAKkArgC3AMAAwwDOANMA3AEfASQBLQE2ATsBRAFN
23
+ AVgBYQGkAakBsgG7AcAByQHSAd0B5gIpAi4CNwJAAkUCTgJXAmICawKuArMCvALF
24
+ AsoC0wLcAucC8AMzAzgDQQNKA08DWANhA2wDdQO4A70DxgPPA9QD3QAAAAAAAAIB
25
+ AAAAAAAAAEkAAAAAAAAAAAAAAAAAAAPm