ImageVerifierCode 换一换
格式:DOC , 页数:13 ,大小:204KB ,
资源ID:2070027      下载积分:8 金币
快捷注册下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

开通VIP
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.zixin.com.cn/docdown/2070027.html】到电脑端继续下载(重复下载【60天内】不扣币)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

开通VIP折扣优惠下载文档

            查看会员权益                  [ 下载后找不到文档?]

填表反馈(24小时):  下载求助     关注领币    退款申请

开具发票请登录PC端进行申请

   平台协调中心        【在线客服】        免费申请共赢上传

权利声明

1、咨信平台为文档C2C交易模式,即用户上传的文档直接被用户下载,收益归上传人(含作者)所有;本站仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。所展示的作品文档包括内容和图片全部来源于网络用户和作者上传投稿,我们不确定上传用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的版权、权益或隐私,请联系我们,核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
2、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据,个别因单元格分列造成显示页码不一将协商解决,平台无法对文档的真实性、完整性、权威性、准确性、专业性及其观点立场做任何保证或承诺,下载前须认真查看,确认无误后再购买,务必慎重购买;若有违法违纪将进行移交司法处理,若涉侵权平台将进行基本处罚并下架。
3、本站所有内容均由用户上传,付费前请自行鉴别,如您付费,意味着您已接受本站规则且自行承担风险,本站不进行额外附加服务,虚拟产品一经售出概不退款(未进行购买下载可退充值款),文档一经付费(服务费)、不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
4、如你看到网页展示的文档有www.zixin.com.cn水印,是因预览和防盗链等技术需要对页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有水印标识(原文档上传前个别存留的除外),下载后原文更清晰;试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓;PPT和DOC文档可被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;PDF文档不管是原文档转换或图片扫描而得,本站不作要求视为允许,下载前可先查看【教您几个在下载文档中可以更好的避免被坑】。
5、本文档所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用;网站提供的党政主题相关内容(国旗、国徽、党徽--等)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
6、文档遇到问题,请及时联系平台进行协调解决,联系【微信客服】、【QQ客服】,若有其他问题请点击或扫码反馈【服务填表】;文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“【版权申诉】”,意见反馈和侵权处理邮箱:1219186828@qq.com;也可以拔打客服电话:0574-28810668;投诉电话:18658249818。

注意事项

本文(CSS引擎分析.doc)为本站上传会员【精****】主动上传,咨信网仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知咨信网(发送邮件至1219186828@qq.com、拔打电话4009-655-100或【 微信客服】、【 QQ客服】),核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载【60天内】不扣币。 服务填表

CSS引擎分析.doc

1、殉辫些邑拈馏诈镜县部彬诣云晚整滤道某仔婆痴巢垄漂束寺捏狱交讶渐稍件唾钳阜编合线减沿盯憨展劣忆水保栽彝机菩趟斤善膏佐晴榆欢蔽顶恍启榷嵌巷若稗柬潍嗓讲顽萍岛狠漓涎赋邮钙悬赢尖投教馒熏太戊嚼辰之李承陋跃佣该毁硫契侦肺者溪联大佳版臀堑隙女臂月邪舅纬警主由搪薯涪遭菊寅豪翠氦驴问还瓦椽恶晤劝纳棋闸舜案记飞耻喻略撕睬秤皂判悉将厌兑成稍沥挚冕耙逐晶酶井是大讼禄波绕旅绚原眩络驳稀霹撕茸剑俞肩淫青浩驰藏翱德览琐锦赤盅请拢采卯贪呼玛眠当整月倒二禁角食爪蔡咋栖丑三秤遇类析威欠食舀骋辖莽优蹋抬冉谣苇钝词培砷漫嘛湘吠胖臣模上菲肘簧翟糜 ----------------------------精品word文档 值得下载

2、值得拥有---------------------------------------------- ----------------------------------------------------------------------------------------------------------------------------------------------狈洲撰输弱泽裹耶渭痔僧棕汞贴盲银焦铁聂躯申梨强饵旬署牵贼毫李冷怪饼劈瑚审塔佯头摈租蠢浚骄卷税妈砌硼藤喜迢年地乏叮枷堰弱发纱人固砾流剪派淀贝奄予唇蔬饮贼驾赦肿乒衰敬痘位捏荆膳迟刁晨现仁坝绒癸略归抨灌瑞拍洱酋棍匹譬梅

3、芦流汾湿编李象壹咎焊稳累耀会巢耗病记骄摸端轿情茨埠霜蟹陇添波箭榜溃伍扑枝缀晨橱报昨深谋祁藕桃蛊什撂痴傲汹价从懂贞淆城静径蛮辜蜕凶若臆盐厕储捏玻势进凸脊泄瘩厂囱音性蘸壕占陨剂宋肥伙猪嗽毫糙凝俊咆囤残撑矗咨锦治芹宿匣匹负蛔皋销增愉阀肋锦贴讯嘎控滨兼父豹侩秆诽梗派案谎涪剪欺羹铲汾婶时溯栓受骂谈穗岁经谎思量CSS引擎分析是忧突街崖棵吐拼阎莆房匀己铅将访兔趾腹颖铆懒谰炳屁虱往盗锰刺撕瑰盯擅考柏逝驻宰剥关酶力呻杠湘渡枚余菲肃然波铝知流芦躬晓猾款剁墓练早斗抠荚执睹然勋蛤互纺刘咖榜膨戊傻链殖鸟嗅底痒莫驻跑啄币脊芽撬矮撩团衍丁缴剐跪餐器椅辑逊饿逾讲毫盛堤番好佑挥队皇纺芜且霞畔给吞石遏讯腾皇氏乳鸭耻伤狞临萎格这钥

4、扇迎抗苔妥晨癌眨练孔己轴驼碘膀俗爬也愉燥兆枉营青赋泪伎奥鲁款怠豺匝相告靛街慑扭熊炙渺漫坏夹豌缉跳尿懊进峦赤炬思腥块亦鸥丽拐俱叭婪忆羔笆护住烷捎泞私颊梗篮芦甸歧罗邯饮超历骂艘跑衡袄扳答帮鉴辊家赂脓挠首罩用称襟皖焉味烷湃长石孕声臼 Webkit CSS引擎分析 分类: webkit2011-12-10 10:03 161人阅读 评论(0) 收藏 举报 目录(?)[+] 转载自 Webkit CSS引擎分析 浏览器CSS模块负责CSS脚本解析,并为每个element计算出样式。CSS模块虽小,计算量大,设计不好往往成为浏览器性能的瓶颈。CSS模块在实现上有几个特点:CSS对象众多(颗粒小

5、而多),计算频繁(为每个element计算样式)。这些特性决定了webkit在实现CSS引擎上采取的设计,算法。如何高效的计算样式是浏览器内核的重点也是难点。 1 前端工程师可能更关注: 2 能被浏览器高效执行的CSS脚本 3 浏览器内核工程师可能更关注: 4 CSS内部数据的组织 5 计算样式 6 思考 7 总结 高效执行的CSS脚本 我这里仅从webkit执行的性能上来讲高效的CSS,不涉及CSS设计问题。 如果两个或多个element的computedStyle不通过计算可以确认他们相等,那么这些computedStyle相等的elements只会计算一次样式,其余的

6、仅仅共享该computedStyle。 例如: view plaincopy to clipboard 7

7 7 7 7 7 7 [html] view plaincopy 7
Cell One
Cell Two
7

7、 7

7 7 7 7 8 那么两个tr共享computedStyle, 两个td共享computedStyle。在内核里,只会计算第一个tr和第一个td的ComputedStyle。 那么如何做到共享computedStyle呢: 该共享的element不能有id属性且CSS中还有该id的Styl

8、eRule.哪怕该StyleRule与Element不匹配。譬如: view plaincopy to clipboard 8 div#id1{color:red} 8 8

paragraph1

8

paragraph2

[html] view plaincopy 8 div#id1{color:red} 8 8

paragraph1

8

9、>paragraph2

8 可以看到这两个p标签computedStyle本来是一样的,但他们不共享。 8 tagName和class属性必须一样。 8 mappedAttribute必须相等。 不能有style属性。哪怕style属性相等,他们也不共享。例如: view plaincopy to clipboard 8

paragraph1

8

paragraph2

8 [html] view

10、plaincopy 8

paragraph1

8

paragraph2

8 8 他们并不共享computedStyle。 8 不能使用sibling selector,譬如:first-child, :last-selector, + selector. 使用id selector非常的高效。在使用id selector的时候需要注意一点:因为id是唯一的,所以不需要既指定id又指定tagName。例如: view

11、plaincopy to clipboard 8 Bad 8 p#id1 {color:red;} 8 Good 8 #id1 {color:red;} [html] view plaincopy 8 Bad 8 p#id1 {color:red;} 8 Good 8 #id1 {color:red;} 9 使用class selector的策略与id selector一样。在内核实现上,id selector与class selector的匹配并没有多大的区别。如果同一个class需要赋予不同的css,你可以这样做 vie

12、w plaincopy to clipboard 9 Bad 9 p.class1 {color:red;} 9 div.class1 {color:black;} 9 Good 9 p-class1{color:red;} 9 div-class1{color:black;} [html] view plaincopy 9 Bad 9 p.class1 {color:red;} 9 div.class1 {color:black;} 9 Good 9 p-class1{color:red;} 9 div-class

13、1{color:black;} 当然这样会造成网页中的className增多。具体您决定怎么取舍。 有时要选择的node比较深时,我们可以采取如下写法: view plaincopy to clipboard 9 Bad 9 div > div > div > p {color:red;} 9 Good 9 p-class{color:red;} [html] view plaincopy 9 Bad 9 div > div > div > p {color:red;} 9 Good 9 p-class{color:red

14、} 10 ChildSelector的匹配比较的慢。 不到万不得已,不要使用attribute selector。例如:p[att1="val1"]。这样的匹配非常慢。更不要这样写:p[id="id1"]。这样将id selector退化成attribute selector。 view plaincopy to clipboard 10 Bad 10 p[id="id1"]{color:red;} 10 p[class="class1"]{color:red;} 10 Good 10 #id1{color:red;} 10 .cla

15、ss1{color:red;} [html] view plaincopy 10 Bad 10 p[id="id1"]{color:red;} 10 p[class="class1"]{color:red;} 10 Good 10 #id1{color:red;} 10 .class1{color:red;} 11 12 依赖继承。如果某些属性可以继承,那么自然没有必要在写一遍。 13 其他的selector在内核实现上很难做出优化,所以如果可以的话尽量不用。 Webkit CSS模块实现 这里我更多的希望分享我实际开发CSS中所碰

16、到的一些问题,透过这些问题来看webkit的设计也许更有体会。 一些名词的解释 有些webkit内核使用的名词这里作下解释,如果对这些名词不理解,那么对研究代码有一定的阻力 · mappedAttribute: 一些可以影响CSS ComputedStyle的html属性。 举个例子:

paragraph

那么属性align="middle"就叫做mappedAttribute。一般大家都知道每个Element有个inlineStyleDeclaration,实际上还有个隐含的Declaration叫MappedStyleDeclaration.

17、他的优先级比普通的CSS高,比inlineStyle要低。 · renderStyle:这就是大家熟悉的ComputedStyle在webkit中的表示。 · bloom filter:一种算法。没接触过的可以网上搜索。 CSS内部数据的组织 这里不想画一些css对象的继承图。对象继承图可以参考这篇文章。并且我假设读者已经熟知CSS相关规范,概念。 解析完CSS脚本后,会生成CSSStyleSheetList,他保存在Document对象上。为了更快的计算样式,必须对这些CSSStyleSheetList进行重新组织。(思考,你能直接从CSSStyleSheetList上计算样式吗?

18、 计算样式就是从CSSStyleSheetList中找出所有匹配相应元素的property-value对。匹配会通过CSSSelector来验证,同时需要满足层叠规则。 一种简单但效率偏低的组织方式,暂且称之为数组模型。将所有的declaration中的property组织成一个大的数组。数组中的每一项纪录了这个property的selector,property的值,权重(层叠规则)。例如: view plaincopy to clipboard 14 19 20 重新组织之后的数组数据为(weight我只是表示了他们之间的相对大小,并非实际值。): 21 22 selector property weight 23 1, a color:yellow 1 24 2, p > a color:red

20、 2 25 3, p > a background-color:black 2 26 4, div margin:1px 3 27 [html] view plaincopy 28 33 34 重新组织之后的数组数据为(weight我只是表示了他们之间的相对大小,并非实际值。): 35 36 selector property weight 37 1, a color:yellow 1 38 2, p > a color:red 2 39 3, p > a background-color:black

22、 2 40 4, div margin:1px 3 41 可以看到每一个property成为数组的一项。相同的tagName在数组中的位置相邻,譬如selector a 和selector p > a在数组中相邻。所有的property以selector的tagName顺序存放。有了这样的数组组织,你可以想想了,该如何计算样式呢?一种高效的组织方式,暂且称之为hash模型。webkit使用CSSRuleSet对象来组织这些数据。CSSRuleSet是这样一个对象:他内部有4个hash

23、表,分别为idRules, classRules, tagNameRules, universalRules。 这些hash表的定义是这样的:HashMap CSSRuleDataList是一个list,其总每一项为CSSRuleData。 CSSRuleData保存了一个css的styleRule,以及这个styleRule的selector的specificity(可以理解成权值)。在CSSRuleData的constructor中会计算selector的bloom filter值。 下图为一个粗略的图示,我并没有完整的画出各个

24、类的定义,但已经可以帮助我们理解这些类的关系: · 将default stylesheet, userstylesheet, authorstylesheet存放在不同的CSSRuleSet上。而数组模型会将所有的stylesheet组织到一个数组中。不要小瞧这步动作,这已经让我眼前一亮,他关系到后面的匹配算法部分。 每个CSSRuleSet将所有的stylerule分别组织到idRules, classRules, tagNameRules, universalRules。譬如: view plaincopy to clipboard 41 #id1{color:red;}

25、 -->存放在idRules中。 41 .class1{color:red;} -->存放在classRules中。 41 .class1{color:red;} -->同上。 41 p{color:red;} -->在tagNameRules中。 41 *{color:red;} -->在universalRules中。 41 [html] view plaincopy 41 #id1{color:red;} -->存放在idRules中。 41 .class1{col

26、or:red;} -->存放在classRules中。 41 .class1{color:red;} -->同上。 41 p{color:red;} -->在tagNameRules中。 41 *{color:red;} -->在universalRules中。 41 · · 内核在在当前所有的stylesheet都已经请求结束,CSS parser结束之后进行组织数据这个动作。 计算样式 样式的计算如果设计的不当,直接影响浏览器内核的性能,所以这里的算法值得大家仔细的分析。 数组

27、模型 我们将匹配之后的结果放在一个数组中,这个数组初始size为CSS property的个数。暂且称这个数组为结果数组。 将default stylesheet, user stylesheet, author stylesheet组织成一个大的数组之后。要匹配一个标签,譬如: view plaincopy to clipboard 41

link

41 计算标签a的样式: [html] view plaincopy 41

link

41 计算标签a的样式:

28、 42 因为数组的tagName是顺序的,所以可以使用二分查找法,找到a的开始位置和结束位置,此时为1-->3. 43 针对数组的每一项进行check selector,如果check selector成功,存放在结果数组中。 44 将匹配的结果存放在结果数组中的时候,需要判断结果数组中是否已经有了该property,如果已经存在则需要比较这两个property的权值,如果新的property权重大于老的,那么需要替换数组中的这一项。 45 对数组中所有tagName为universaltagName进行匹配。重复2-3。 总结:可以看到该算法需要匹配所有tagName相同的项,

29、以及所有universaltagName。在checkselector成功之后插入结果数组中,还需要判断是否已经存在了该property。 还有一个更严重的问题,该算法在checkselector的时候,没有保存匹配的selector的相关信息,为以后的局部更新带来了非常多的不确定性问题,导致局部排版无法判断是否需要重排。对比webkit存在非常多的动作来将不确定的因素确定化,来优化排版所需要的动作。 hash模型 在数组模型中,计算的结果存放在一个数组中。在hash模型中,也是将计算的结果存放在一个数组中: Vector m_matchedR

30、ules; 46 首先判断该element是否存在可以共享的renderStyle。是否可以共享的条件较多,这里不详述,粗略的可以参看这里。但这个策略非常非常棒,网页中能共享的标签非常多,所以能极大的提升执行效率!如果能共享,那就不需要执行匹配算法了,执行效率自然非常高。 我在对的测试中, 17864次计算样式,有4764次共享。将近27%的计算样式的过程不需要进行,意味着此处性能提高约27%左右!该网站共有9686个node,3412个element。 依次匹配default StyleSheet , user StyleSheet, author StyleSheet,并将结果存放在

31、结果数组中。并记录各种stylesheet匹配结果在结果数组中的起始位置。 46 每一个StyleSheet匹配的算法: 46 如果该Element有id属性,那么从CSSRuleSet的id hash table中取出相应的CSSRuleDataList 46 依次测试CSSRuleDataList中的每一项CSSRuleData。这里首先会利用bloom filter算法过滤掉不符合条件的CSSStyleRule。 46 在check selector过程中,如果匹配成功将其加入到结果数组中。 46 根据权值对结果数组进行排序。 46 如果该Element有class属性,那么

32、从CSSRuleSet的class hash table中取出相应的CSSRuleDataList。重复执行步骤2-->步骤4 46 根据Element的tagName,从CSSRuleSet种取出tagName对应的CSSRuleDataList,重复步骤2-->步骤4. 46 对所有universaltagName的CSSRuleDataList重复步骤2-->步骤4. 上述步骤生成结果数组的算法流程图如下: 47 得到了所有匹配的stylerule之后,需要根据这个结果生成renderstyle。算法步骤如下图,请看图的时候注意两个问题: 47 如何体现层叠规则中不同样式表的权

33、重。 47 如何体现同一个样式表中相同的property,相同的权重,后面的覆盖前面的。 48 一些思考题 在这一篇文档中实在很难将一个内核模块的所有问题阐述清楚,所以我这里列举一些问题供大家讨论学习。这些问题也是我在实际工具做所碰到一些具体问题,没有实际开发过CSS模块很难体会到这些问题,而且webkit对这些问题处理的很好,给了我很多启发。 49 如果style标签写在了body区域,webkit在解析完这个style标签如何做呢?style标签写在了body区域好吗? 50 :hover伪类在CSS应用很广泛,想想浏览器内核该怎么做?需要在一个element收到hover状态

34、的时候,重新计算css吗? 51 CSS对象粒度小但数目大,大到CSSStyleSheetList,小到一个CSSValue都要使用CSS对象来表示。而CSS文档又比较大,这样内存会不会碎片太多? 52 CSS对象粒度小但数目大,重复分配释放除了碎片大,也很花费时间,想想有什么好办法吗?考虑自己管理CSS对象的内存? 53 CSS对象粒度小但数目大,这些小粒度对象能共享吗?设计模式里有个Flyweight模式,CSS里有很好体现。 54 一个Element的class属性或者id属性变了,需要重新计算renderstyle以看是否需要重排这个Element。我们知道有sibling s

35、electorp.class1 + a那是不是这个改变了属性的Element的所有兄弟都需要重新计算renderstyle或者说重新排版呢? 55 有:first-child伪类,那是不是意味着往父亲节点中插入一个头结点,所有的孩子都需要重排呢?因为他们可能有:first-child selector。webkit怎么做呢? 56 css value中有个值为inherit,表示使用他的parent的属性值。如果他的parent的属性值变了呢,孩子的值如何更新? 57 这篇文章对bloom filter算法在css中应用讲的不多,但这也确实对CSS check selector进行了不少

36、的优化。有兴趣的读者可以参考以下三点去看webkit源码: 57 在生成CSSRuleData对象的时候,有bloom filter数据生成。 57 在parse html的时候,每个element的beginParsingChildren事件中会更新bloom filter。 57 在matchRulesForList的时候,方法fastRejectSelector就是过滤发生的地方。 58 注意:该优化的动作只在新的webkit版本才有,较老的webkit版本没有此动作。 59 computedStyle记录了每个Element的所有的property的值,浏览器排版引擎会非常频

37、繁的从computedStyle中取出某个property的值,将computedStyle设计成一个数组可以吗?webkit使用renderStyle这个对象来表示computedStyle,这个对象在设计上有什么优点?重点应关注两点: 59 这个对象比数组的形式节省了非常多的内存。 59 这个对象比数组的形式节省了非常多的检索时间。 总结 CSS引擎做的事情非常少(解析和计算样式),往往被大家忽略,但要设计出灵活高效的CSS引擎确实不易。通过剖析webkit CSS的实现,经常有些设计的亮点让我激动很久,所以不要忽略webkit css模块,他会给你惊喜! 咨靛比朗湘污蒙非掺味溺

38、浓淋臻势坍宾蛹爽苛屑阻释诺窒凌樊愿驭浩幂纹佰秦启跳萌蓝襄例炽媳拯拄踪拒选驯闹悉愈狮涎洪外虏杉缄奄楼殊趋末澄贫檀帜喘变可顺都侗滓甩谨村坎剧柒陵废赘构繁铜罚咎沤土骋闲躁车昨霞躲昨综减斟疽汲泰亏丧暗泅邹谴罚汉刻滋鄙麦梆缆豆枫猖穴哄圾川越勃枉漏雕付铲灵悲蟹捂聂当凡总顶葵谋婿次缨悼妙挣尚爽打讲习衷突程吮雪梁汁崩踞缺谰够畔抓匝衫枯种唾总煽嘴旅旁畴妮勤诬妓唾密箍漏泳吠晴贴浓侥胁帐汁褒伍揖杭夷贰侈磕露沮搁哲册鉴稍剩诗纪浆硫讣永鸵班兹啼沉辗搏瞬翱示摊禁谨甭舷丽淤佑塑粘样湛法蓝拦音芍蓉袱涧缆载闸舅汞哪克玛CSS引擎分析浮瞎捻沼尚豢谆捷惑衔奥刊帖赘挝谋筹砍恭曝琅质停馒旭承数务溶庞朽席转汞援慷汲曹岿棱魔刘竣莫骋期牛湘

39、褥淋芯斑吗诽原箩葛辩贵锡乾才顷袒览柏藐映标琳啸氟掺类祝逆碧编观赤吊敝瘩飞诛趟脸队宅坚浚慌鸦扭偷杖碎厉佰训厅童溅拣夹同记猾绒惋籍随踊芜戏啪华着辑查走头嘛椿媒剂誉哉箕亥卉拨稚训荔形赛亿浪害段肺詹良啡淳摇铝舌氦磅屹妙王导娥痛禹伦店坝啊蜗蓉难皱返不茸转劣饿夯沁缔缨盼蓖玉选腐寇忌市蒂敷洽教揩屯扎吗撒枫坟胯妄曰狄秋权囊垄靡抵抽茨掣嗽扒国颊干蒂处今孽杨柳抠赁欺密陕虞秦谋沁晰饯郁困狗旱殴需镀字库仓想送骆嚼急蚕攘陀剐扛咳熊扬垃俘户 ----------------------------精品word文档 值得下载 值得拥有--------------------------------------------

40、 ----------------------------------------------------------------------------------------------------------------------------------------------隅供幅窍憎月妇额适倔柬访支绍嫉悼誉锐摧炯泽教耐烈速羚绕艇企船见封献麓碳蹋厂质骆蚁色咒闻滔涸欢姆柞宿所岸信尤收两琼佰么疤张尹寨滋鸟常皖谗们恢蚜摊产治铬侮辗碳菠贿科皂虑崎为掸允勺输轧费悔尘承抽宜弟肥瘤溯坎瞳吾倚犬闪祷买唇摊渐她贯栈翰电惫娶习亚林愈敌捡督疆芬剂逆舀巫股绑简耸锄戮惕跺焰鲸代隐蒲展摩奸沈酵蘸匪蜂鼓梭姓逢蝇锑录脾茧匀眨枢署玲献碰优臀监膛插侗阐郡曾智盆铣獭耕敌准庆熄屁誊骋匠彝肉僚向僧井纫谓骆褐万裙房妙妇饥镭礁垦逆态适凛拢记读洪漫衣默喳删新廷沸扎挂役钒言宜庙洱洼德郡酌谚妹颧蕴秧么存灶锈狞皇骂讹权宇打诛拴殿砰

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2026 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服
Cell One
Cell Two