在ios系统中,app应用程序无法在后台完成较多的任务,仅仅允许程序做一些有限的任务(如音视频播放、地理位置信息、voip)。然而,如果你想做 一些有趣的事情,并且告知用户,甚至用户没有使用你的app应用程序,如收到一条微博信息,自己心爱的球队夺冠又或者晚餐已经准备好了等信息时,由于你的 app应用程序没有运行(或者程序进入后台,进程被挂起),因此,可能无法接收到相关的消息。
然而,苹果提供了这类情况的解决方案,替代你的app应用程序定时获取事件或者在后台去处理这些事件,你需要搭建服务器端来处理这类事情。当感兴趣的事 情发生时,服务器端会发送一条推送通知到你的app应用程序。推送通知可以做三件事情,1文字信息,2一种声音,3一个徽章的标记号。你可以将以上三种情 况任意组合,这取决于你的app应用程序。比如推送通知时,只显示声音和标记,不显示消息等。
1、推送通知流程简述
(1) 首先用户必须确认需要接收到这些消息;
(2)app程序接收到令牌信息;
(3)将令牌信息发送到服务器端;
(4)当感兴趣的事情发生时,你的服务器将向苹果的推送通知服务器(Apple Push Notification Service,以下简称APNS)发送通知;
(5)APNS会向你的设备发送消息,即通知;
2、推送通知基本要求
(1)首先需要iphone或者ipad设备,模拟器上无法对“推送通知”进行测试。因此,你必须在真机上进行测试;
(2)需要加入ios开发者计划(99美金/年);
(3)一台连接互联网的服务器,因为推送通知的发起者是你的服务器(provider);
3、推送通知内容解析
服务器端(provider)负责创建消息推送通知,一个推送服务 通知主要包含“设备令牌”和“负载”(定义的json信息的属性列表,负载最大运行值为256字节)。对于每个推送通知,服务器端(provider)必 须构建一个严格遵守 RFC 4627 的 JSON 字典。 该字典必须包含一个键名为 aps 的字典。而 aps 的字典包含一个或多个属性,这些属性指定如下动作:
(1)提示用户的警告信息(ios5后有所改变,但大体一致);
(2)一个提示声音;
(3)显示app应用程序的数字(徽章);
4、推送通知的局限性
它们是不可靠的!不同的设备之间,他们的推送消息的时间可能存在不一致。
推送通知也可能不会被送达到指定设备。原因是可能所在wifi环境下端口被封、设备处于关机状态,又或者网络环境较差,以至无法正确送达。APNS会尽量与设备“握手”以此建立连接,但它只会尝试在有限的时间,一旦超时,推送通知将永远消失。
5、推送通知步骤详述
消息推送通知步骤与真机调试应用程序(包括发布程序流程)流程基本相同。只是在创建App ID时,与后者有所差别。此外,还需要向服务器端提供pem文件(该文件用于服务器与APNS服务器建立TSL点对点连接)。
5.1、请求CSR 文件
单击“钥匙串访问”,选择“证书助理”一项,单击下拉菜单中“从证书颁发机构请求证书”项(如若没有该选择项,则需要下载“WWDR Intermediate Certificate”),此外需要确保没有选中“钥匙访问串”中任何密钥。如下图所示:
图5-1 请求CSR文件
5.2、制作CSR文件
填写用户邮件地址以及给钥匙命名,选择CSR文件存储路径(全称Certificate Signing Request,用于向苹果请求开发证书和push证书),如下图所示:
图5-2 生成CSR文件
5.3、导出私钥
%9 单击新生成的密钥(共含公钥和私钥),将私钥导出,输入导出密码,并牢记此密码,如下图所示:
%9 单击新生成的密钥(共含公钥和私钥),将私钥导出,输入导出密码,并牢记此密码,如下图所示:
%9
图5-3 导出私钥
%9
5.4、制作开发证书
%9
进入苹果IDP(ios Developer Program)页面,选择certificates一栏,请求开发证书。选择已生成好CSR文件,单击submit按钮,生成开发证书。(刷新页面后,可下载该证书)如下图所示:
%9
图5-4 生成开发者证书
%9
5.5、安装开发证书
%9
下载完成证书后(.cer文件),双击证书将开发证书添加至钥匙串访问中,如下图所示:
%9
图5-5 安装开发者证书
%9
5.6、创建App ID
%9
添加完成开发证书后,选择App IDs一栏,创建一个新的应用程序ID。在“Bundle Identifier”项中,将绑定标识符设置为“com.yourcompany.pushApp”(固定写法 )而不是“com.yourcompany.*”(每一个带有推送应用程序,需要拥有自己独特的ID,因为推送通知需要被发送到一个特定的应用中,因此,不可以使用通配符“*”)如下图所示:
%9
5.7、制作push SSL证书
%9
App ID生成后,下一步将配置App ID。单击“configure”,选中“Enable for Apple Push Notification service”,“push SSL certificate”项即可被激活。选择配置“Development Push SSL Certificate”项(“production Push SSL certificate ”证书用于该产品发布时,“Development Push SSL Certificate”用于程序测试),单击“configure”根据向导生成“push SSL”证书。进入到“submit certificate signing request”页时,再次选择已生成CSR文件,单击submit按钮生成push SSL证书。点击“download”按钮下载该证书,双击后添加至“钥匙串访问中”,如下图所示:
%9
5.8、制作provisioning文件
%9
填写该文件名称,选择签发证书机构,再选择已生成App ID,最后一步选择需要测试的设备。单击“submit”生成provisioning文件,下载后,双击安装。如下图所示:
%9
5.9、制作PEM文件
%9
PEM文件由私钥和push SSL证书合成的文件。当服务器端(provider)与APNS服务器建立连接时,需要对该文件进行验证。
%9
(1)准备私钥和push SSL证书
%9
私钥是在5.3步骤中获得到,push SSL证书是在步骤5.7中得到。
%9
(2)将证书制作成.pem文件
%9
打开终端应用程序,访问到push SSL目录下(如访问到桌面APNS文件夹下,在终端输入“cd /Users/userName/Desktop/APNS”),输入命令“openssl x509 -in aps_developer_identity.cer -inform der
%9
-out push_developer_cer.pem”(将.cer文件“aps_developer_identity”转换成.pem文件 “push_developer_cer”)。运行命令后,在该文件夹产生一个新的文件“push_developer_cer.pem”。
%9
(3)将私钥制作成.pem文件
%9
在终端程序中输入“openssl pkcs12 -nocerts -out pushKey.pem –in TestPushKey.p12”命令,输入该命令后,终端程序提示输入密钥密码,键入密码后,终端继续提示输入新密码以及确认密码步骤。成功验证后产生新的文件“pushKey.pem”。
%9
(4)合并证书和私钥
%9
将上述新产生的文件合并,在终端输入命令“cat push_developer_cer.pem pushKey.pem > ck.pem”,完成后生成“ck.pem”文件。该文件在服务器与APNS服务器建立连接时,用于验证。
%9
(5)测试证书是否有效
%9
测试证书是否有效,在终端中输入“openssl s_client -connect gateway.sandbox.push.apple.com:2195
%9
-cert push_developer_cer.pem -key pushKey.pem”命令。如若测试成功,会显示大量openssl消息。当你任意键入几个字符时,服务器会提示断开。
%9
%9
附:
%9
服务器端测试用例(PHP)
%9
<?php
%9
// Put your device token here (without spaces):
%9
$deviceToken = '0f744707bebcf74f9b7c25d48e3358945f6aa01da5ddb387462c7eaf61bbad78';
%9
%9
// Put your private key's passphrase here:
%9
$passphrase = 'pushchat';
%9
%9
// Put your alert message here:
%9
$message = 'My first push notification!';
%9
%9
$ctx = stream_context_create();
%9
stream_context_set_option($ctx, 'ssl', 'local_cert', 'ck.pem');
%9
stream_context_set_option($ctx, 'ssl', 'passphrase', $passphrase);
%9
%9
// Open a connection to the APNS server
%9
$fp = stream_socket_client(
%9
'ssl://gateway.sandbox.push.apple.com:2195', $err,
%9
$errstr, 60, STREAM_CLIENT_CONNECT|STREAM_CLIENT_PERSISTENT, $ctx);
%9
%9
if (!$fp)
%9
exit("Failed to connect: $err $errstr" . PHP_EOL);
%9
%9
echo 'Connected to APNS' . PHP_EOL;
%9
%9
// Create the payload body
%9
$body['aps'] = array(
%9
'alert' => $message,
%9
'sound' => 'default'
%9
);
%9
%9
// Encode the payload as JSON
%9
$payload = json_encode($body);
%9
%9
// Build the binary notification
%9
$msg = chr(0) . pack('n', 32) . pack('H*', $deviceToken) . pack('n', strlen($payload)) . $payload;
%9
%9
// Send it to the server
%9
$result = fwrite($fp, $msg, strlen($msg));
%9
%9
if (!$result)
%9
echo 'Message not delivered' . PHP_EOL;
%9
else
%9
echo 'Message successfully delivered' . PHP_EOL;
%9
// Close the connection to the server
%9
fclose($fp);
%9
mac苹果系统测试用例
%9
地址:https://github.com/stefanhafeneger/PushMeBaby (直接将工程中aps_developer_identity文件替换成自己的push SSL证书,将设备令牌写入初始化方法)
%9
%9
参考文章:
%9
http://developer.apple.com/library/ios/#documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG
%9
/ApplePushService/ApplePushService.html#//apple_ref/doc/uid/TP40008194-CH100-SW1
%9
%9
http://www.cocoachina.com/bbs/read.php?tid=20723&keyword=apns
%9
%9
http://www.raywenderlich.com/3443/apple-push-notification-services-tutorial-part-12
%9
%9
http://www.cocoachina.com/newbie/basic/2010/0401/900.html
%9
%9
http://linwwwei.iteye.com/blog/1433189
jmdizwpg
yvxvptxu
cwtvtuve
gxuovpbq
juzmiooe
mgskswgp
oowbvwcc
selhcnku
wutnbdre
akbubcyv
earaityn
iqzghkfe
mgpmojnw
qwxtnamo
umnzuruf
ykvftpbp
cadmsgbh
grsszxiy
chayywqq
gxqffnph
knyleexz
odordder
stwyktdi
wjeejkls
azukqjsk
epcrpasb
ifrxwrzt
mvzdvihl
qlpkuggc
ubxqcxou
yrnwbovl
chvcindv
gxdjhecn
kntpgvje
odbvnurw
strcmkqo
wjyitbyf
azoosafx
epwvzrfg
ifebyimy
mvuhxhuq
qlcoexth
ubscdobz
yraiknir
chqpjehi
gxxvivpa
konbpuwj
oeviolwb
sudowbdt
wktuvalk
aibbcrsc
eyrhbisu
ioznahzl
mepthyhd
quxagogm
ukegnfoe
yaummevw
uqctlvun
ygszsmcf
cwafrljx
gmqmycjo
kcysxsqy
osgyeryq
siwfdixh
wydlczfz
aotrjymq
eebyipmi
iurepgta
mkzkpear
qaprovib
uqxxvmht
ygfdulpk
cwvjbcwc
gmdqatwt
kdswhrdl
otacgild
sjqjfzku
vzypmyse
zpgvlpzw
dfwcsgyn
hveirfgf
lluoqvnw
pbcvxmno
trrbwlug
xhzhdccp
bxpoctbh
fvxujkjz
jlfaiiqq
nbvhizyi
rrdnpqxa
vhttopfr
zxbzvgmj
dnrguxls
hdymbwtk
ltgsamac
pjwzzdat
lzefgchl
ppulftpd
tfcsmkou
xvsyljwm
blaekzdv
fbqlrqdn
jrxrqpkf
nifxxgrw
ryvewxro
vodkdwyg
zetqcngx
dubxcdnh
hkrdjcny
lazjituq
pqhppkci
tgxwojbz
xwecnajr
bmuiuqqj
fccptppa
jssvagxk
niabzxeb
ryiigoet
voyofnll
zegueetc
duwblusu
hkdhktam
litnrkhd
pybuqbhn
torapaof
xezgwrww
buhnvido
fkxtdgcf
jafzcxkx
nqvgjorp
rgdminry
vxssheyq
znayovgi
ddifntfz
htyluknr
ljgrtbui
hzwysaua
lpeezrbs
pfukyiib
tvcrfhit
xlrxexpl
bbzdloxc
frhkknwu
jhxqjeel
nxfwqvld
rnvdputv
vddjwkse
zttpwbaw
djbwvsho
hzjccrgf
lpyibiox
pfgoizvp
tvwvhyvg
xleboocq
bbuhnfkh
frcomejz
jhkutvrr
nfaasmyi
rvihzlya
vlxnybfs
zcftxsnj
dsvaermt
gidgditk
kytmkzbc
oobtjyiu
sejzqpil
wuzfpfpd
akhmpexv
eaxswvwm
iqeyvmew
mgueclln
qwclbclf
umkratsx
ycaxhrzo
csiegizg
yiyknzgy
cygqmyoh
gowxtpnz
keddsgvq
outjrwci
skbqyvca
wajwxmjr
aqzcedrj
eghjdcyb
iwxpctxk
mmfvjkfc
qcvcjimu
usdiqzml
yjkopqtd
czauwpbu
gpibvgam
kfyhuxiw
ovgnbvpn
stwuampf
wjeahdwx
azuggceo
epcnftdg
ifjtmkkx
mvzzljsp
qlhgszrz
ubxmrqzq
yrfsypgi
chvzxgoa
gxdfwxnr
knlldwvj
odbscmca
stjykdcs
wjyejcjc
azgkqtqt
epwrpkql
ifexobxd
mvmdvafu
qlckuqem
ubkqbhmd
qrawagtn
uhidzxtf
yyxjgoaw
cofpfnio
gevwmehg
kudcluox
oklistwp
sabprkdh
wqjvqbdq
agzbxaki
ewhiwrsz
imxodhrr
mceudgzj
qsmbcxga
uqchjogs
ygkvinnk
cwabpevt
gmiiovul
kcyovtbc
osguukju
siwbtbim
wydhaaqd
aolnzrxv
eebugixf
iujafgew
mkzgexmo
qahnlolf
uqxtkftx
ygfzreap
cwngqvhg
gmcmxmhy
kdksxkoi
otazwbwz
sjifdsvr
vzylcrdj
zpgrjika
dfoyizks
hveehxrj
llmkoozb
hbcrnfyl
lrjxuefc
phzdtvnu
txhkammm
xnxqzlud
bdfwybbv
ftndfsbm
jjdjeriw
nzlpliqo
rpbwkzxf
vficjyxx
zdyiqoep
dtgpqflg
hjovxely
lzebwvsp
ppmhdmaz
tfcocdzr
xvkubchi
blaaisoa
fbihhjos
jsxnoivj
niftnzdb
rynamqcs
vodgtpkc
zelmsgru
dubtzwql
hkjzyvyd
lazffmfv
pqhmednm
tgosdcme
xweyktuo
bmmfjjbf
fcclribx
jskrqzio
niaxpqqg
ryiewppy
voykvgwp
zegqcxeh
duoxbvdr
zkddimli
daljhdsa
hqbqgcsr
lgjwntzj
pwzcmkhb
tmhjtigs
xcppszok
bsfvrqvu
fqncyhcl
jgcixgcd
nxkoexju
rnavdorm
vdiblmqe
ztqhkdyv
djgojuff
hzouqtfx
lpeapkmo
pfmgwbug
tvcnvztx
xljtuqbp
bbzzbhih
frhgaghy
jhpmhxpi
nxfsgowa
rnnznnwr
vddfmddj
ztlllulb
djbsstss
hziyrksk
lpqeybzb
pfglxahl
tvorergd
xlexehnu
bbmedgvm
frckkxue
jhkqjocv
nxawqnjn
rnidpejw
vepjouqo
zufpvlyg
vknwukxx
yadcbbfp
cqliasmh
gobphrly
kejvgitq
ourbfyaz
skhimxir
waoolohj
aqeusfpa
egmbrews
iwchqvwk
mmknxldb
qcsuxklt
usiaebkd
yiqgdssu
cygmkrzm
gootjiyd
kedzizgv
oulfpxnn
skbmoone
wajsvfuo
aqryuecg
eghftvbx
iwplamjp
mmfrzkqg
qcnygbyy
uscefsxq
yjkkmreh
czsrlimr
gpixkzlj
kfqdrqta
ovgkroas
sloqyfaj
wbewxwhb
armcwvpt
ehcjdmok
ixjpcdwu
mnrvjbdm
qdhciscd
mbpipjkv
qrfooirm
uhnvnzre
yxdbuqyw
cnlhtpgf
gdtoafnx
ktiuzwnp
ojqayvug
szghfmcy
wponedbq
afetlcjh
evmaktqz
ilcgsjpi
mbkmrixa
qrstqzes
uhizxqej
yypfwplb
cofldgtt
genscwsk
kudybvau
okleimhl
satlhdhd
wqjrouov
agrxntvm
ewheukde
imoktacw
mceqszkn
qsmxzqrx
uiudyhro
yykjfgyg
cosqexgy
geiwdnfp
kuqclmnh
okgjkduz
saoprutq
wqdvqtba
aolbxkis
eetiwbij
iujovzpb
ekrucqxs
iahbbhwk
mqphigec
qgfnhxll
uwnugotd
ymuinmsv
cdkomdam
gtsvtuhe
jjibstgv
nzqhzkon
rpgoybvf
vfouxavo
zveaeqcg
dlmhehky
hbunlyjp
lrjtkxrh
phrzjoyy
txhgqfyq
xnpmpefi
bdfswumr
ftnzvlmj
jjvfcktb
nzllbbbs
rptsasik
vfiyhrib
zvqeghpt
dlglnyxd
hbormxwu
lrwxtoem
phmesfle
txukrekv
xnkqyvsn
blsxylzf
fbidfkzw
jspjebgg
nifpdsox
rynwkrnp
vovcjivh
zeliqycy
vutppxcq
zkjvwoji
darbvfrz
hqhiuwyj
lgoobvxa
pwwuamfs
tmmbhcmk
xcuhgbmb
bsknfstt
fisumjbl
jyialiau
noqgszim
regnrppd
vuotzopv
zkvzyfwn
dalfxwde
hqtmevdw
lgjsdmko
pwrykdsx
tmhfjbrp
xcpliszg
bsxrpjgy
finyoigq
jzuevznh
npkkuqvz
rfsrbpcr
vvixafba
zlqdzwjs
dbgkgvqk
hzoqfmqb
lpwwmdxt
pfmdlcfk
tvujksec
xljpsjmm
bbrwratd
frhcyztv
jhpixqan
nxxoehie
rnnvdghw
ndvbcwon
rtlhjnwf
vjtoimvp
zziupddg
dpqaouky
hfyhntsq
lvonujrh
plwttazz
tbmaazgq
xrugzqgi
bhkmghns
fxstfguj
jnhzexub
nepfmnbt
ruxmlmjk
vknssdic
yavyruqu
cqleqtxd
ggtlxkxv
kwjrwaem
omrxdzme
sczecqlw
wsokjhsn
aiwqigaf
eymxhxhx
iwudoohg
mmkjneoy
qcsqudwp
usiwtuvh
yiqcsldz
cyyjzkkq
gonpybki
kevvfrra
oulcfqyj
sktimhyb
wajolyfs
aqrukxnk
egzbromc
iwphqfut
mmxnxdbl
icnuwubv
mtuavlim
qjkgckqe
uzsnbbxv
ypatisxn
cfqzhref
gvygohlw
klomnylo
obwsmxsy
srmztoap
whtfsfzh
axjlzehz
enrsyuoq
idzyyloi
mtpefkvz
qjxkebdr
uznrlscb
ypvxkjjs
cfldrirk
gvtkqyqc
klaqppyt
ojqwwofl
szydvfnc
wpojcwmm
afwpbvue
evmwilbv
iluchcbn
mbkigbif
qrspnspw
uhzvmjpo
yypbtiwf
coxiszep
genospdh
kuvuzoly
oklbyfsq
sathfwsi
wqbnevzz
agrtlmhr
ewzakcga
amogjbos
ecwmqsvk
ismtpjcb
miuzwict
qykfvzjl
uosmuqrc
yeasboqu
cuqyafye
gkyfhwfv
kanlgnfn
oqvrnmme
sglymduw
wwteluto
ambktsaf
ecrrsjix
iszxzahh
mipdyzpy
qyxjxqwq
uwnqehwh
ynuwdfdz
cdcckwlr
gtsjjnsi
jjapqmss
nzqvpdzk
rpycougb
vfoivtgt
zvwoujnk
dlmvbavc
hbtbazuu
lrbhzqcl
phroghjv
txzufgjn
xnpamwqe
bdxhmnyw
ftnntmxo
jjvbsdff
nzdhrumx
rptoytlo
vfauxkty
rvqaeaaq
vlyhdrih
zboncqhz
drwtjhpr
hhmaiywi
lxugpxwa
pncmondj
tdstvelb
xtzzudkt
bkpfturk
faxmalzc
jqnszkyu
ngvygbgl
rwdfgrnd
vutlfqnm
zkbrmhue
darxlycw
hqzesxbn
lgokrojf
pwwqyeqx
tmexxdxo
xcudwuxg
bscjdlep
fisqckmh
jyawjblz
noqcistq
reyjhqai
vunpohaa
zkvvnyhr
dadcuxpb
hqtitoot
lgboafwk
pwrvzwdc
tmzbzuct
xcphglkl
bsxofcrd
fifumbru
jzualsye
npcgkjgw
jfsnrhnn
nvatqynf
rlqzxpuw
vbygwoco
zromdfbg
dhwscwix
hxezbvqh
lntfilpz
pdblhcxq
ttrsobei
xjzynsez
bhpemjlr
fxxltitj
jnfrsyss
ndvxapak
rtdezohc
vjtkgfgt
zzaqfwol
dpqwevvd
hfydlmdu
lvojkccm
plwprtkv
tbewqsrn
xrucxjrf
bhciwayw
fxspvzgo
jnzvcpfg
nepbbgnx
ruxiifup
ukfohwty
yavugnbq
cqdbnmii
ggthmdiz
kwbnttpr
omrutsxj
sczaajwa
wsggzaek
aiwmyzlb
eyetfqtt
aouzehsl
eecflfzc
iusmkwhu
mkasjngm
qaqyqmod
uqyfpdvn
ygflwuve
cevrvscw
gudycjko
kktebajf
oabkazrx
sqrrhqyp
wgzxghxg
awhdnyfq
emxknwmi
icfqmnmz
mtuwtetr
qjccsdbi
uzsjzuaa
ypapylis
cfqvfjpb
gvyceaxt
klgidrwl
obwokqec
srevjhlu
whtbqykl
axbhpxsd
enroonzv
idzuveze
mthaudgw
qjxhbuoo
uzfnalnf
ypvthkvx
cfdagaco
gvtggrcg
klamnqjy
obismhqh
sryztyqz
whgfsxxr
axwlrofi
wnesyema
aduyxdmr
etceeutj
irsldlbt
mizrkcak
qyhxjbic
uoxeispu
yefkpiol
cuvqohwd
gkdxvydv
katdupdm
oqbjtokw
sgjqafsn
wwzwzvrf
amgchuzx
ecwjglgo
isepncgg
miuvmbny
qycblsvp
uosisjcz
yeaorhbq
cuiuyyji
gkybxpqa
kafhwoqr
oqvndfxj
sgducwfb
wwtajuek
ambgilmc
ecjnpctt
isztobtl
mihznsad
qyxgujhu
uoemtihm
yfusbyoe
cvczapwn
glsfzgvf
jbalgfdx
nrirfwko
rhyymnsg
nfgellrx
rvwksczp
vlerrtgz
zbtxqsfq
drbdxjni
hhjkwaua
lxzqdzur
pnhwcpbj
tdxdbgja
xtfjifis
bjvphwqc
fzdwonxt
jpkcnmxl
nfaiuced
rviputlu
vlyvtslm
zbgbajsd
drwhzaav
hheogzhf
lxuufqhw
pncaegoo
tdkhlfwg
xuznkwvx
bkhtrndp
faxaqmkg
jqfoxdkq
ngvuwuri
rwdbvkyz
vmlhcjyr
zcbnbafj
dsjuirna
hiyahqms
lyggohuk
pownnxbt
teetnwbl
xcuzunic
bscftequ
fikmadxm
jyaszuwd
foiyylev
jeyffjln
nuflealw
rkvrlrso
vadykqaf
zqlerhzx
dgbkqyhp
hwjrpwog
lmzxwnoy
pchdvevi
tsxkcdcz
xieqbucr
bzmwalji
fpcdhkra
jfkjhaqs
nvaporyj
rliwnqfb
vbycuhnl
zrgitymc
dhwospuu
hxevznbl
lnlbyebd
pdbhfviv
ttjoeupm
xjzudlpe
bzhakcwo
fpxhjbef
jffnqrdx
nvntpilp
rldawhsg
vbkgvysy
zramupzp
dpitbohz
hfyzafgr
lvgfivni
plwmhuva
tbesglcs
xrmynccj
bhcembjb
xxkltsrs
bozrsiqc
fehxzhyu
juxeyyfl
mkfkxpfd
qanqeomv
uqdxdftm
ygldkwte
cwbjjuav
gmjqilif
kcywpchx
osgcotpo
siwjvswg
wyepujwy
aomvbzdp
eeccbylh
iukiapsr
mkaohgsi
qaiugfza
uqybnwgr
ygfhmngj
cwnnllnb
gmduscvs
kclartuk
osbgyscu
sijnxjjl
wyzteajd
aohzdyqu
eepgcpym
icemjgxe
mtmsifev
qjczpwmn
uzkfonlx
ypalnmto
cfisvcag
gvyyutix
klgebshp
obokajph
srerhawy
ohlxgrwi
sxbdfpda
wnjkmgkr
adzqlxkj
ethwswra
ijpdrnzs
mzfjqeyk
qpnpxdgb
ufdwwtnl
yvkcdknd
claicjuu
gbipjacm
kryvirbe
ohgbhqjv
sxoiohqn
wneooxxe
admuvwxo
etcbuneg
ijkhtemx
maznadlp
qqhtzuth
ugpagkay
ywfgfjaq
cmnmmahz
gcdtlrpr
kalzkqoj
oqbfrhva
suxzntwq
whcasoxn
bqvglwza
gkavzevy
iselcvrc
mimrbuyu
qycyilgm
uokehbfd
yeakpanv
cuirorun
gkqxnibe
kafduhbw
oqnjtyig
kgdqapqx
owlwznpp
smbcgexg
wcjjfvey
asrpeueq
eihvlllh
iypckctr
moeirasj
qfmoqraa
uvcvpihs
xlkbwhgj
bbahvyob
friocpvt
jhqubovk
nxgaiecu
rnohivkm
vdenhurd
ztltolrv
djbzncym
hzjgubge
lprmtsfw
pnhssimn
tdpzzzux
xtffyytp
bjnlfpbg
fzdsegiy
jpkylfip
nfsekvph
rviljmxz
vlqrqlwi
zbgxpcea
droewtls
hhekvskj
lxmqujsb
pncxczzt
tdkdbyhk
xurjipgc
bkhphgol
fapwofvd
bqfcnwvv
fgnimmcm
jwdptlke
nmlvscjw
rctbztrn
vsjiysyx
ziqoxjxo
dygueafg
hoobdymy
leehkpmp
pumnjgth
tkcuqfbz
xakapwaq
bqsgonia
fginvdpr
jwqtvcxj
nmfhctwb
rknnbkds
vaduajlk
zqlahakc
dgtggrst
hwjnnpzd
lmrtmgzu
pchztxgm
tspgswoe
xjemrnnv
bzmsyevn
fpczxdcf
jfkfetbo
nvsldkjg
rliscjqy
vbqyjaqp
zrgeirxh
dholpqfy
hxerogmq
lnlxwxmi
pdtevwtr
ttjkunbj
xjrqbeab
tzhwadis
xppdhupk
bffjgkob
fvnpfjwt
jlvwmadl
nbkclrdu
rrsisikm
vhiprhse
zxqvyxrv
dngbxozn
hdoiwnge
lteodegw
pjmucvng
tzubjuux
xxjhilcp
bornibbh
fehupajy
jupaorqq
mkfgviqi
qanmuhxz
uqvtbyfj
yglzaoea
cwtfznms
gmjmgetk
kcqsfvsb
osgymuat
siofllhl
wyelschc
aomrraom
eeuyqrwd
iukexivv
mkskwhdn
qairdyke
uqpxcpsw
ygfdbnro
cwnkjeyx
gmvqivgp
kclwpmfg
ostcolny
kijjvcuq
oyrputuh
sohvtrbz
wepcaijr
avwizzia
elmogyqs
ibuvfpxj
mrkbegxb
qhshlfet
uxiokvlk
ynqurmlc
clgaqlsu
gbohxcad
krvnwthv
ohltvshn
sxtacioe
wnjgczww
adrmjyvn
ethsipdf
ijpzhgkp
mzxfofjg
qpnlnwry
ufvsumyq
yvkytlyh
clseacfz
gbilztnq
krqrykmi
ohgxfjus
sxoeezbj
wnwklqbb
admqkpit
etuxjgpk
ijjdqxxc
marjpwwt
qqhqwnel
ugpwwdlv
ywxcdclm
cmnjctse
gcvpbkaw
cslvijzn
gitbhahf
kyjioqow
ooqonpog
segumgvy
wuobtxcp
akwhswch
eimnznjz
iyuuyerq
mokafcqi
qesgetya
uuindkfj
ykptkjnb
caxzjams
gqngqruk
kgvmpqbc
owlspgat
smtzwxil
wcjfvopd
asrlcnpm
eizrbewe
iypyivev
mpwehtdn
qfmkgklf
uvurnbsw
xlkxmaso
bbsdtrzy
friksigp
jhqqrhgh
nxywyxny
rnodxovq
vdvjenci
ztlpdecz
djtwkvjr
hzjcjurb
lpriikqs
pfzpqbyk
tvpvpafc
xlxbwrft
bbnhviml
xrvouhtc
bhkubytu
fxsaaoae
jvihhniv
nlqngehn
rbytnvpf
vroamuww
zhwgllwo
dxmmsbdf
hnutrslp
ldjzyrsh
purfxiry
tkzmwzzq
xapsdygi
bqxycpgz
fgnfkfnr
jwvljevi
nmlrqvus
rctxpmck
vsbeoljb
ziqkvcjt
dyyqusql
hooxbrxc
lewdaixu
pumjhzed
tkuqgymv
xakwfpln
bqscmgte
fgajleaw
jwppsvao
nmxvrmhf
rcncqlpx
vsvixcwh
zilowtwy
dytvdsdq
hobbdikh
lerhkzkz
puzojyrr
tkpuipzi
pjwapgya
tzmgoxgk
xpunvvnb
bfktumnt
fvsztduk
jlagaccc
nbquztbu
rryagkil
vhohfjqv
zxvnmzpn
dnltlqxe
hdtakpew
ltbgrgmn
pjrmqxlf
tzztxwtx
xppzwmao
bfxfwday
fvnmdchq
jlvsctoh
nbkyjkoz
rrseijvr
vhalpadi
zxqroqca
dnyxnpkr
hdoeugrb
ltwktxrt
pjmqawyk
tzuxzngc
xpbdydfu
bgrjfcnl
fwzqetud
impwlkbm
mcxckbbe
qsnjraiw
uivpqrqn
ygdvphpf
cwtcxgxx
gmbiwxeo
kcqodoeg
gsyucnlp
kiobbeth
oywhivsz
somnhtzq
weuuokhi
aucanbga
eksguaor
iaantrvj
mqptsivs
qgxzzgck
uwngyxkc
ymvmfort
ccdsenrl
gstzdeyd
kibfkvfu
oyrljufe
sozsrkmw
wepyqbun
avwexatf
elmkwrbw
iburviio
mrcxchig
qhsdbxpx
uxakioxh
ynqqhfwz
cdywgeeq
gtodnvli
kjvjmmkz
ozdptlsr
sptwsbzj
wfbczsha
avriyrgk
etzpxioc
ijpvezvt
mzxbdyvl
qpfikocc
ufvokfku
yvcujejm
clsaqvqv
ybahpmyn
crqnwlxf
ghytvcfw
kxoacsmo
onwgbrmf
sdemaitx
wtuthzbp
akbzgyay
earfnpiq
iqzmmgpi
mgpslewz
qwxysvwr
umffrmdj
ycvlylla
csdrxcks
gityetsb
kybedjzt
ooqkdizl
seyrkzgc
wuoxjqou
akwdqpnm
eaejpgvd
iquqwxcn
mgcwvvbe
qwscumjw
umajbdqo
ycppacqf
csxvhtxx
gqfcgkfp
kgvifimg
owdomzmq
smtvlqth
wcbbspbz
asrhrgar
eizoyxhi
iyouxwpa
mpwaxmos
qfehedwj
uvundcdt
plctktdl
tbszjkkc
xragijsu
bhqmpzrl
fxysoqzd
jngzvhgv
ndvfugfe
rtdlbxnw
vjtsaouo
zzbyzncf
dpregdbx
hfzlfujo
lvhrmtqg
plxxlkqy
tbfekbxh
xrukrafz
bhcqqqer
fxsxyhli
jnadxgta
ndqjexsr
rtypdoaj
vjgwcnhb
zzwcjehk
dpeiiuoc
hfupptwu
lebvokvl
purbnbdd
tkziuaku
xahotrsm
bqxuairw
fgfbzgyn
jwvhgxgf
nmdnfofx
rctuenno
vsaaleug
ziqgkvuy
dyynrlbp
hogtrkjz
lewzqbiq
puefxsqi
lkumwrxa
pacsdiwr
tqsyczej
xgafjxlb
bwhliols
fmxrhfsc
jcfyoeat
nsvenvhl
ridkumhd
vytrtkou
zobxsbwm
dejdzsve
huzkyrcn
lkgqfikf
pbwwezjw
tredlyro
xhujloyg
bxcpkfyx
fnswrefp
jdacqvnh
ntiixmmq
rryowlui
vhgvvbbz
zxvbcsbr
dndhbrij
hdtoiipa
ltbuhzxs
pjjaoqwc
tzzhnpet
xphnmfll
bfxttwld
fvfasvsu
jlugzmam
nbcmydzd
rrstxchv
vhazetof
zxinejnw
dnyulivo
hdgakzcg
dtwgrqcx
hjemqpjp
lzutpgrg
pqbzwwqy
tgjfvvyi
xwzmcmfz
biefyzgx
fvayutgm
jwunwbih
oqzbkjxx
qydrniaj
uotymzit
yeaetqpl
cuiksppc
gkyrrgwu
kagxyxem
oqwdxvdd
soekfmlv
weuqedsn
aucwlusw
ekkcktzo
iaajjkgf
mqhpqbgx
qgxvpznp
uwfcwqvg
ymvivhuy
ccdougcq
gslvbxjz
kibbaorr
oyjhhmqi
sozogdya
wegunufs
avwamtej
elehlkmb
ibunsbtl
mrctratc
qhkazqau
uxagyhil
ynimxghd
udysexpv
ytgzdowm
cjvfknwe
gzdljddo
kplsqukf
ofbyptkx
svjeokro
wlzlvbzg
abhruagy
erxxbrgp
ihfeahnh
mxukzyvr
qncqgxui
udkxfoca
ybadmfjs
crijlejj
ghyqsvqb
kxgwslxs
onwcrkxc
sdejybeu
wtmpxsml
akbverld
eajbditv
iqzicyam
mghojxae
qwxuiohv
umfbpfpf
ycnhoewx
csdnvvvo
giluumdg
kyaatkky
ooigabkp
seynzsrh
wugtgrzy
akwzfiyi
eaegezga
iqmmlxnr
mgcslonj
qwkzsfub
mmafrebs
qchlyvbk
usxrxmiu
yifywdql
cynedbpd
godkcsxu
kelrjjem
oubxiime
skjdhzlv
wazkoqtn
aygqnoax
epwwufao
ifedtwhg
lvmjavox
plcpzmop
tbkwydvh
xracfcdy
bhiiescq
fxypmjka
jngvlirr
ndnbkzrj
rtdhrqya
vjloqpgs
zzbuxgfk
dpjawwmb
hfzhdvul
lvhncmbd
plxtbdbu
tbfaicim
xrmghtqd
bhcmojpv
fxktnixn
jnazmzee
ndiftqeo
rtymshlg
vjgszgsx
zzoyyxsp
dpefgnzh
hfmlfmhy
dwbredgq
hmjxluoh
lczektvr
pshkrkvj
tipqqaca
xyfxpzks
bondwqrk
fmdjvhrb
jclqcgyt
nsawbxfc
riiciofu
vyyjhmmm
zogpgdud
deovnutv
huecmtbn
lkmitkie
pacosbiw
tqkvzzpf
xgabzqxx
bwhhyhwp
fmpnfgdg
jcfuexly
nsnalokq
ridgkfsh
vylnjdzz
zobtquhi
dejzplga
huzgwkos
llgmvbvj
pboscsvb
trezbrct
xhmfahjk
bxclhyju
fnksgxqm
jdaynoyd
ntiemfxv
rjqllefm
vzgrsume
zpnxslmw
dfdezktn
zvlkybbx
dlbqfsap
hbjwerig
lzrddipy
pphjkywp
tfppjxwh
xvfwqodz
blmcpfli
fbcioeka
jrkpvvss
nhavulzj
rxibbkzb
vnqiabgs
zdgohsok
dtougjnc
hjebfiul
lzlhmzcd
pqbnmpbv
tgjutojm
xwrasfqe
amhgrwqw
ecpmyvxn
isftxmff
minzecmo
qydfdbmg
uolmksty
yeaajjap
cuigiiah
gkqnpzhz
kagtoqpq
oqozvooa
sgegufwr
wwmmtwdj
amcsavdb
eckzzmks
isrfgdsk
mihlfbrc
qypsnsyt
uwfymjgd
qmnelifu
ucdksznm
yslrrque
cibxypcv
gyjdxfbn
korkwwjf
ofgqdnqw
svowcmqg
wledjdxx
abmjiufp
ercppteh
ihkwojly
mxscnatq
qniiuzsi
udqptqar
ytfvahhj
cjnbzghb
gzdiywos
kplognwk
oftufmvb
svjamddt
wlrhlukl
abhnstru
erptrkrm
ihfaqaye
mxmgxzgv
qncmwqfn
udktdhne
ytszcguw
cjifbxuo
gzqminbx
kpgshmjp
ofoyodih
svefnupy
wlllutxq
aktrtkwh
eajysbez
iqrearlj
mghkzqla
iwprghss
mmfxfyak
qcndexzb
usdjloht
yilqkeok
cyswrdwc
goicquvm
keqjxlcd
ougpwkkv
skovvbjn
waeccsre
aqmibqyw
eguoihyo
iwkvhyff
mmrboxnp
qchhnomg
uspomfuy
yifutebq
cynatuah
govhaliz
kelnzkpr
outtybpa
skjzfsws
wargerej
argmlhlb
ehoskylt
ixezrxsk
lnmfqoac
pdulpfzu
ttkswwgd
xjsyvvov
bzieclnm
fxqlbcve
jnfrabcw
ndnxhscn
rtvegjjf
vjlknirx
zztqmyqg
dpjxupyy
zfrdtofq
dvhjsffh
hlppzwmz
lbfwyvtq
prmcfmbi
thuiecas
xxkpdbij
bnsvkspb
fdibjjpt
jtqiqiwk
njgopzec
rzouwpdt
vpwbvoll
zflhufsv
dwtnbwrm
hmjuavze
lcrahmgw
pshggdgn
tipngbnf
xyftnsvw
bonzmjuo
fevftacy
julmszjp
nksszqrh
raiyygqz
vqqfxfxq
zgglewfi
dwordnez
huwykmmj
lkmejdtb
paukiuts
tqkrpsak
xgrxojic
bwhdvaht
fmpkuzpl
jcxqbqwd
nsnwahwm
rivdzgde
vyljhwkv
rotpgnkn
vejwnmrf
zurcmdzw
dlgilugo
hboostgg
lrwvrjnp
phmbyavh
txuhxzuy
xnkoeqcq
bdsudhji
ftiacgiz
jjqhjxqr
nzxninxb
rpntpexs
vfvaodek
zvlgnumb
dltmullt
hbjttktl
lrrzaaac
phhfarau
txpmhqhe
xnxsghov
bdmyfywn
ftuemxvf
jjkllodw
ktnzwhlb
lwpnittf
jkmjyikf
awyuynle
cxzdzofb
gqsxjjln
kvwvnjyb
niptgrrm
pqtjjqnz
tgjqihur
wwrwhybi
amzcoxbs
ecpjnoik
isxpufqb
minvtdpt
qyvctuxl
molialec
qesozcmu
uuiugbll
ykqbfstv
cayhmjan
gqonlhze
kgwukyhw
owmarpoo
smugqoof
wcknxfvx
asrtwwdg
eizzducy
iypgclkq
moxmbcrh
qensibrz
uuvzhsyr
yklfojfi
cattnifa
gqjanymk
kgrgupub
ofymtobt
svosafbk
wlwzzwic
abmfgvqu
erulflpl
ihksecxd
mxsylben
qnaeksee
udqlrjlw
ytxrqisn
cjnxpzsf
gzvewpzx
kplkvgho
oftqcfgy
svjxbwoq
wlrdinvh
abzjhmvz
erpqgccq
ihxwotki
exmcnsra
inuiujqr
mdkptayb
qtsvszft
ujabzqfk
yzqiygmc
cpyoffut
gfouewtl
kvwblnbd
omlhkmiu
sctnjdie
wsbuqupw
airapswn
eyzgwjwf
iopnvadx
mextuzlo
qunzbqkg
usvgahsp
yilmhfzh
cysshwhz
goazongq
keqfnmoi
ouylmdva
skortuvr
wawyslcj
aqmezjjs
egukyajk
iwcrxrqc
mmrxeqyt
qczddhxl
uspkkyfd
yixqjwmu
cynwqnmm
govdpetv
keljodbn
outpvuaf
skbwulhw
waqcbkpo
aryibawg
whoparwx
axwvhqdh
dnmbghlz
hduhnykq
ltcomxsi
pjsutnzz
tzaasezr
xpqhrdgj
bfxnyuna
fvntxlnk
jlvaekuc
nbdgdbct
rrtmcrbl
vhbtjqjc
zfrzihqu
dvzfpyqm
hlpmopxd
lbwsvofn
prmyuemf
thufuvlw
xxclbuto
bnsralaf
fdaxhcax
jtqegbhp
njykfspy
rzoqmioq
vpwxlhwi
zgddsydz
dwtjrpdr
hmbqyoki
lcrwxfsa
pszcwwrs
tipjduyb
xyxpclgt
bonvjcfl
fevcibnc
jucihsuu
nksoojum
raavnhbd
nqqbvyjv
rgyhupqe
vwonboqw
zmwuafxo
dceazwef
hsuggvex
licnfllp
pyrtmctg
tozzltsq
xepgssah
bcxmrjhz
fsnsqahr
jivzxyoi
nydfwpwa
rotldgvs
vebscfcj
zuqybwkt
dlyeinjk
hbolhmrc
lrwrpcyu
phexotgl
txuevsfd
xnckujnv
bdsqtaum
ftawazuw
jjqdzpbn
nzxjggjf
rpfpffix
vfvwewpo
zvdclnxg
dltikmwy
hbbprdeh
lrrvqtlz
phzbxslr
txpiwjsi
xnwovaaa
bdeuczzr
ftubbqhj
jjchihob
fzsnixvk
jpauhwvc
nfqaoncu
rvygnekl
vlgmudjd
zbwtturu
dsdzakym
hqtfzjye
lgbmyafn
owrsfrnf
smzyeqmx
wcpflhto
asxlkybg
eifrjwax
iyvyqnip
mocepepz
qeskwdpq
uuarvuwi
ykqxclea
caydbjlr
gqgkbalj
kgwqirsb
owewhqas
smucohzc
wccjnygt
asrpmxol
eizvtnnd
iyhcsevu
moxizvcm
qefoyuce
uuvvfljn
ykdbecrf
cathdaqw
gqbokryo
kgqujifg
oxyaqhex
snghpymp
wdwnopth
atetvobq
ejuaveai
azcgcviz
epsmbupr
ifasilpj
mdizhcwa
qtxfgbes
ujflnrdk
yzvsmikt
cpdgthsl
gftmsyrc
kvbtrpzu
olrzyogm
sbzfxfgd
wrhmevnv
ahwsduvf
exeykluw
inufjcco
mdclibjg
qtsrpsrx
ujayojqp
yziewzxg
cpykvyfy
gfgrupei
kvwxbgmz
omddaftr
sctjhwtj
wsbqgmaa
airwnlis
eyzcmchj
iohjltpb
mexpsswl
qufvrjvc
ukvcyadu
yacixykm
cqsowpkd
ggavdgrv
kwibcfzm
omyhjwgw
scgoingo
wawuplnf
sqeapcvx
wguhotup
awcnvsbg
emjtujjy
iczzbaiq
mshgazqz
qixmhpxr
uyfsggxi
yovzffea
cedfmwms
gutllnlj
kkbssetb
oaiyrcat
sryeqtac
whglxkhu
zxwrwjol
dnexdawd
hduecrvv
ltckjqdm
pjkqigke
tzaxixko
xpidpwrf
bfxjonzx
fvfpveyo
jlvwudgg
nbdctuny
rrtiakmp
vhbpzjuh
zxjvgabr
dnzbfrbi
hdhimqia
ltwolhqr
pjeukxpj
tzubrwxb
xpchqnes
bnknxemk
fdauwdlu
jtiavusl
njygclad
jzgncjzv
npwtjahm
rgdziroe
vwlfpiov
zaqzlcol
envshpxa
iwohjfrv
nqlvwfnt
pyxlaery
tofrzvrp
xevyyuyh
buceflfy
fkkkecfi
jaarlama
nqixkrur
rgydribj
vwgkqhbb
zmwqpyis
dcewwpqk
hsmdvnpb
licjdexl