孕妇什么水果不能吃| 大刀阔斧是什么意思| 腰困是什么原因| 胆囊切除后可以吃什么水果| 2021年属什么| 藿香正气水什么味道| 吃猪腰子有什么好处和坏处| 中午十一点是什么时辰| 孤独症是什么| 女装什么牌子好| 肝不好挂什么科室| 占卜什么意思| 百什么争什么| 阁字五行属什么| 犹太人是什么| 忏悔什么意思| 一枚什么| 处女膜破了什么症状| 什么平稳| 脚趾缝脱皮是什么原因| 什么时候锻炼身体最佳时间| 艾灸有什么作用| 怀孕脚浮肿是什么原因引起的| 脉压是什么| 水痘可以吃什么| 肺部挂什么科| 欠钱不还被起诉会有什么后果| 心口疼吃什么药| 什么的柳树| 十一月二十二是什么星座| 饺子是什么意思| 拉拉裤后面的胶片是做什么用的| 百合和什么一起煮可以治失眠| 老是放屁什么原因| 两胸中间疼是什么原因| 甲钴胺治疗什么病| 肝硬化是什么| 儒家是什么意思| 迎风流泪是什么原因| 凉茶是什么茶| 一失足成千古恨是什么意思| 为什么会长癣| wb是什么| 饱和脂肪是什么意思| 12月15日什么星座| 配裙子穿什么鞋子好看| 大理寺是什么机构| 什么的雷雨| 总放屁是什么病的前兆| 点到为止是什么意思| dic医学上是什么意思| 兔死狐悲是什么生肖| 喝红牛有什么好处和坏处| 空调不出水是什么原因| 大腿前侧是什么经络| 心动过速吃什么药最好| 什么叫熬夜| 什么是社会考生| rh(d)血型阳性是什么意思| 院感是什么意思| 梦见黑蛇是什么意思| 什么是月食| p是什么单位| 大便潜血什么意思| 异卵双胞胎是什么意思| 区长是什么级别的干部| 得性病有什么症状| 幽门螺旋杆菌吃什么药| 气喘是什么原因| 多吃木耳有什么好处和坏处| 梦到被蛇咬是什么意思周公解梦| 住院医师是什么意思| 释迦摩尼是什么意思| 大姨妈来了不能吃什么水果| 1月7号什么星座| 什么是反流性咽喉炎| 王安石是什么朝代的| 美仑美奂什么意思| 考法医需要什么条件| 什么是碱中毒| 晨勃消失是什么原因| 孕早期可以吃什么水果| 阳虚吃什么中药调理| 喉咙痛吃什么水果| 小番茄有什么营养价值| 野生型是什么意思| 补肾吃什么食物| 什么颜色的衣服显白| 改编是什么意思| 被螨虫咬了用什么药膏| 稚嫩是什么意思| 耳声发射检查是什么| 什么是骨质疏松| 逆钟向转位是什么意思| 指甲变厚是什么原因| 皮肤黑穿什么颜色的衣服| 学习机什么牌子好| 芥末是用什么做的| 七星鱼吃什么食物| 预约转账什么时候到账| 门静脉高压是什么意思| 蛇怕什么东西| 什么布料最凉快| 夹腿什么意思| 采耳是什么意思| 灰什么丧什么| 姨妈是什么意思| 下颌关节紊乱挂什么科| 立秋抓秋膘吃什么| 1951属什么生肖| 骑自行车有什么好处| 什么网站可以看毛片| 介入医学科是什么科室| 两弹一星是什么| 木耳中毒什么症状| 常吃火龙果有什么好处| 山川载不动太多悲哀是什么歌| 胸口痛挂什么科| 低钾会出现什么症状| 什么是铅中毒| 肺癌早期有什么症状| 天麻加什么治头晕| 亚甲减是什么意思| 什么水果含钾| 早唐筛查是检查什么| 吃什么容易排大便| 疱疹是一种什么病| 操姓氏读什么| 产后能吃什么水果| 犹太人属于什么人种| 且行且珍惜是什么意思| 胃热是什么原因引起的| 蝙蝠属于什么动物| 5年存活率是什么意思| 肌酐偏低有什么危害| 01是什么意思| 唐筛21三体临界风险是什么意思| 白眼狼是什么意思| 早上4点是什么时辰| 什么药可以减肥瘦身| 小腿灼热感是什么原因| esr医学上是什么意思| 宫外孕和宫内孕有什么区别| 脾的作用是什么| 逝者如斯夫是什么意思| 耳朵后面疼是什么原因| 庚申五行属什么| 阴囊长白毛是什么原因| 贫血看什么指标| 艾滋病是一种什么病| 抠是什么意思| 犹太人为什么聪明| 贞操锁是什么| 气管炎挂什么科| 气场强大是什么意思| 格格不入什么意思| 桑葚和什么泡酒壮阳| 势如破竹是什么意思| 黄瓜有什么功效| 见路不走是什么意思| 没有白带是什么原因| 什么是水解奶粉| 语字五行属什么| 口干口臭是什么原因引起的| 小便解不出来是什么原因| 1.9号是什么星座| 罗汉局是什么意思| dr拍片是检查什么的| hpv45型阳性是什么意思| 什么路不能走| 吃炒黑豆有什么好处和坏处| 大校相当于地方什么级别| 蛇盘疮是什么症状| 鼠肚鸡肠是什么生肖| 心脏杂音是什么意思| 手指指尖发麻是什么原因| 在屋顶唱着你的歌是什么歌| 阴道口溃疡用什么药| 幽冥是什么意思| 站着腰疼是什么原因引起的| 属龙和什么属相最配| 过敏性结膜炎用什么眼药水| 离经之血是什么意思| 祖庭是什么意思| 手脚麻木是什么原因引起的| 敏感的反义词是什么| 孕妇吃什么坚果比较好| 参加追悼会穿什么衣服| 知恩图报是什么意思| 关羽姓什么| 小月子是什么意思| 内膜b型是什么意思啊| em是什么意思| 胃胀是什么原因引起的| 6.5号是什么星座| 今天什么日子| 梦见和死人说话是什么意思| 牙肿了吃什么消炎药| 什么食物对眼睛好| 醪糟是什么东西| 什么叫精神出轨| 白细胞酯酶阳性是什么| 茹毛饮血什么意思| 什么是996| 分别心是什么意思| 马克杯是什么意思| 流鼻子打喷嚏吃什么药| 1213是什么日子| 肺有问题会出现什么症状| 四十年婚姻是什么婚| 正财透干是什么意思| 小肚子疼是什么原因| 家里为什么有蜈蚣| 黄色搭配什么颜色| 血热皮肤瘙痒吃什么药| 出阁宴是什么意思| 来姨妈下面疼是为什么| 打脚是什么意思| 34周为什么不建议保胎| 全身发麻是什么原因引起的| 阿司匹林治什么病| 武将是什么生肖| 一路卷风迎大年是什么生肖| 口干口苦吃什么药最好| 一个合一个页读什么| 梦见带小孩是什么意思| 三五成群十双在是什么生肖| 红枣不能和什么一起吃| 豆汁是什么味道| 风向是指风什么的方向| 什么富什么车| 中午十二点是什么时辰| 什么是树莓| 喉结下面是什么部位| 红烧肉可以放什么配菜| 鲜章是什么意思| 嘴里起血泡是什么原因| 肚子胀打嗝是什么原因| 科伦是什么药| 恐龙为什么会灭绝| 验尿白细胞高是什么原因| 晒太阳补什么| 吃什么油对心脑血管好| 7月4号是什么星座| 上火便秘吃什么最快排便| 世界上最多笔画的字是什么字| 屋里喷什么消毒最好| 什么样的男人不能嫁| 1972年是什么年| 很多屁放是什么原因| 维生素d低是什么原因| 唐僧最后成了什么佛| 阴蒂长什么样| 胸闷喘不上气什么原因| 丹毒用什么药膏| 阴茎不硬吃什么药| 一比吊糟什么意思| 眼眶发青是什么原因| 菩提有什么寓意| 光年是什么单位| 男人吃什么可以补精| 狗怀孕有什么症状| 寮房是什么意思| 印巴冲突中国做了什么| 百度
tree: fb914a144b148ce3c758550c6791514eae915da8 [path history] [tgz]
  1. BUILD.gn
  2. OWNERS
  3. README.md
  4. resource_ids.spec
  5. startup_resources_mac.txt
  6. startup_resources_win.txt
  7. translation_expectations.pyl
tools/gritsettings/README.md

tools/gritsettings README

This directory contains several files that apply globally to the Chrome resource generation system (which uses GRIT - see tools/grit).

resource_ids.spec: This file is used to assign fake start IDs for resources and strings used by Chromium. This is done to ensure that resource ids are unique across all .grd files. If you are adding a new .grd file, please add a new entry to this file. Detailed instructions are found below.

translation_expectations.pyl: Specifies which grd files should be translated and into which languages they should be translated. Used by the internal translation process.

startup_resources_[platform].txt: These files provide a pre-determined resource id ordering that will be used by GRIT when assigning resources ids. The goal is to have the resource loaded during Chrome startup be ordered first in the .pak files, so that fewer page faults are suffered during Chrome start up. To update or generate one of these files, follow these instructions:

  1. Build a Chrome official release build and launch it with command line: --print-resource-ids and save the output to a file (e.g. res.txt).

  2. Generate the startup_resources_[platform].txt via the following command (you can redirect its output to the new file location):

    tools/grit/grit/format/gen_predetermined_ids.py res_ids.txt out/gn

    In the above command, res_ids.txt is the file produced in step 1 and out/gn is you Chrome build directory where you compiled Chrome. The output of the command can be added as a new startup_resource_[platform]

  3. If this is a new file, modify tools/grit/grit_rule.gni to set its path via grit_predetermined_resource_ids_file for the given platform.

Updating resource_ids.spec

The [###] integers in resource_ids.spec are fake start IDs, whose relative ordering determine relationship among .grd entries. Actual resource IDs are dynamically generated, with ID usage requirements from .grd files if static, or injected using "META": {"sizes": {...}} if generated.

To add a new .grd entry, first find the location to add it:

  • Find the matching section (chrome/app/, chrome/browser/, etc.).
  • Preserve alphabetical order within a section.
Simple case: Sufficient most of the time

This applies if the new entry is not at the beginning or end of sections, and nearby .grd entries have distinct-looking fake start IDs without "META": {"join": 2} oddity. For example, adding foo/bar/ccc.grd here:

  "foo/bar/aaa.grd": {
    "includes": [1140],
    "structures": [1160],
  },
  "foo/bar/bbb.grd": {
    "includes": [1180],
  },
  "foo/bar/ddd.grd": {
    "includes": [1200],
  },

The best location is between bbb.grd and ddd.grd. Each resource type (say, includes and messages) must have a sub-entry with fake start IDs. The values select should be intermediate to neighboring ones, and sorted, e.g.:

  "foo/bar/aaa.grd": {
    "includes": [1140],
    "structures": [1160],
  },
  "foo/bar/bbb.grd": {
    "includes": [1180],
  },
  "foo/bar/ccc.grd": {  # NEW [comment for illustration only]
    "includes": [1185],
    "messages": [1190],
  },
  "foo/bar/ddd.grd": {
    "includes": [1200],
  },

Done!

Special case: Crowded fake start IDs

If fake start IDs get too crowded, then (from this directory) run

python3 ../grit/grit.py update_resource_ids -i resource_ids.spec --fake > temp
mv temp resource_ids.spec

before (and/or after) your edit to make room. After this, your CLs will have many diffs in fake start IDs, but that's okay since relative orderings are preserved.

Special case: Generated .grd files

If your .grd file is generated, then in general it's unavailable (e.g., due to build config) for ID assignment to detect how many IDs to reserve. You will need to provide a bound on resources for each resource type ({includes, messages, structures}) to reserve, specified using "META": {"sizes": {}}. For example, in

  "foo/bar/aaa.grd": {
    "includes": [1140],
    "structures": [1160],
  },
  "foo/bar/bbb.grd": {
    "includes": [1180],
  },
  "<(SHARED_INTERMEDIATE_DIR)/foo/bar/ccc.grd": {  # NEW
    "META": {"sizes": {"includes": [20], "messages": [50],}},
    "includes": [1185],
    "messages": [1190],
  },
  "foo/bar/ddd.grd": {
    "includes": [1200],
  },

we reserved 20 IDs for <include> resources, and 50 for <message> resources. Hopefully you‘ll only need to do this once, but if in the future the generated resources exceeds the bound, then you’ll need to update resource_ids.spec.

Special case: Add at end of split

Suppose you desired location is preceded by repeated values (“splits”) and followed by "META": {"join": ##}, e.g.:

  "foo/bar/bbb.grd": {
    "includes": [1160],
  },
  "foo/bar/bbb_helper.grd": {
    "includes": [1180],
  },
  "foo/bar/bbb_testing.grd": {
    "includes": [1160],
  },
  "foo/bar/bbb_testing_helper.grd": {
    "includes": [1180],
  },
  "foo/bar/ddd.grd": {
    "META": {"join": 2}
    "includes": [1200],
  },

This means:

  • {bbb.grd, bbb_helper.grd} is one group.
  • {bbb_testing.grd, bbb_testing_helper.grd} is another group.
  • The two groups are mutually exclusive, and IDs can be reused.
  • ddd.grd is used by everyone; it “joins” the mutually exclusive branches.

If you‘re adding foo/bar/ccc.grd, and it’s unrelated to bbb*.grd then the required update would be:

  "foo/bar/bbb.grd": {
    "includes": [1160],
  },
  "foo/bar/bbb_helper.grd": {
    "includes": [1180],
  },
  "foo/bar/bbb_testing.grd": {
    "includes": [1160],
  },
  "foo/bar/bbb_testing_helper.grd": {
    "includes": [1180],
  },
  "foo/bar/ccc.grd": {  # NEW
    "META": {"join": 2}
    "includes": [1190],
  },
  "foo/bar/ddd.grd": {  # "META": {"join": 2} got moved.
    "includes": [1200],
  },

If you're adding a new entry to the start or end of sections, pay attention to potential splits across sections. In particular, note that chrome/ and ios/chrome/ sections are very long splits that finally get joined by the “everything else” section!

Special case: Add new alternative to existing split

Using the same example as above: If you're adding a new alternative, say, foo/bar/bbb_demo.grd then the change should be:

  "foo/bar/bbb.grd": {
    "includes": [1160],
  },
  "foo/bar/bbb_helper.grd": {
    "includes": [1180],
  },
  "foo/bar/bbb_demo.grd": {  # NEW, with 1160 to specify alternative.
    "includes": [1160],
  },
  "foo/bar/bbb_testing.grd": {
    "includes": [1160],
  },
  "foo/bar/bbb_testing_helper.grd": {
    "includes": [1180],
  },
  "foo/bar/ddd.grd": {
    "META": {"join": 3}  # 2 became 3.
    "includes": [1200],
  },
Special case: Creating split

Starting from the simple case again:

  "foo/bar/aaa.grd": {
    "includes": [1140],
    "structures": [1160],
  },
  "foo/bar/bbb.grd": {
    "includes": [1180],
  },
  "foo/bar/ddd.grd": {
    "includes": [1200],
  },

If you want to add mutually-exclusive foo/bar/ccc.grd and foo/bar/ccc_testing.grd, then you'd create a split by repeating a fake start ID, then update the succeeding entry to join these splits:

  "foo/bar/aaa.grd": {
    "includes": [1140],
    "structures": [1160],
  },
  "foo/bar/bbb.grd": {
    "includes": [1180],
  },
  "foo/bar/ccc.grd": {  # NEW
    "includes": [1190],
  },
  "foo/bar/ccc_testing.grd": {  # NEW, reusing number to indicate split.
    "includes": [1190],
  },
  "foo/bar/ddd.grd": {
    "META": {"join": 2},  # Add join.
    "includes": [1200],
  },

Details on resource_ids.spec

For simplicity, let's disregard that .grd files can have different types of resources ({includes, messages, structures}). Henceforth, each x.grd specifies count(x.grd) to specify the number of globally distinct resource IDs (integers from 0 to 32767) it needs.

Automatic resource ID assignment computes for each x.grd, a start ID start(x.grd), which indicates that resource IDs start(x.grd), start(x.grd) + 1, ..., start(x.grd) + count(x.grd) - 1 are reserved for x.grd.

Complication arise from the following:

  • Start IDs among .grd files must follow a preassigned order for determinism (i.e., no “first-come, first-serve” assignment).
  • Generated .grd files' count() are in general not known a priori. By contrast, static .grd files in the source can have count() determined by parsing.
  • Depending on build config, some .grd files may be excluded. To avoid wasteful large gaps in resource ID space, mutually exclusive .grd files can share resource IDs.

The (former) resource_ids file was introduced to coordinate resource ID assignment. The file lists every (static and generated) .grd file across all build configs, and specifies start IDs for lookup. This allows resource targets to be built independently.

However, resource_ids required frequent curation. Moreover, adding new resources to a .grd entry (even with extra IDs reserved for buffering) can “bump” start IDs of adjacent entries. This process can cascade downward, leading to multiple updates. The workflow was tedious and error-prone.

Automatic start ID assignment was later introduced. It utilizes the following:

  • For static .grd files, count() can be easily parsed.
  • For generated .grd files, a bound on count() can be specified as extra data, stored in new field ("META": {"size": {...}}).
  • The order of elements in resource_ids along with preassigned start IDs encode some implicit “ordering structure” that specifies:
    • Ordering of start IDs among .grd files.
    • Mutual exclusion among groups of .grd files.

resource_ids is still used, but it‘s now generated from resource_id.spec, which is a new “specification” file that’s largely similar to resource_ids, featuring the following:

  • .grd entries and order are kept.
  • {"META": {"size": {...}} is used to specify size bounds of generated .grd files.
  • Start IDs are replaced with “fake start IDs” to capture “ordering structure”.

It remains to clarify what “ordering structure” is, and how to represent it with fake start IDs.

Suppose that all .grd files are used, then start ID generation is straightforward: Visit .grd files sequentially, then evaluate start() as cumulative sums of count(). We call this a “chain”, which conceptually resembles some “series” connection looking like A <-- B <-- C.

In reality, multiple chains exist and .grd files in different chains can be mutually exclusive, allowing ID reuse. Conceptually these resemble “parallel” connections looking like:

A <-- B1 <-- C1 <-- D
|                   |
+ <-- B2 <-- C2 <-- +

Here, A is a split and D is a join. The vertical bars | and + merely stretches vertices downward.

So we're getting into graph theory territory. It turns out that a suitable representation is subtle. To avoid redundant and confusing artifacts, we need to be more precise:

  • Each X.grd file is represented by a directed edge weighed by count(X.grd), embodying a constraint (more on this later).
  • Vertices are variables representing potential start() ID values, possibly shared among multiple .grd files owing to mutual exclusivity.
  • Define sentinel vertex S as the minimal resource ID available. Abstractly We can see it as 0, though in practice 400 is used.
  • Define sentinel vertex ‘T = 32768’ as the (invalid) terminal resource ID.

Consider the following graph generation rules:

  1. Start from S <-- T. This depicts a S.grd file with start(S.grd) = S, and that is (trivially) constrained by start(S.grd) + count(S.grd) <= T.
  2. Series op: Transform A <-- C into A <-- B <-- C. Meaning: Initially A.grd (old edge) has start(A.grd) = A assigned. C can be T, or the start ID of some other .grd file(s). IDs are constrained by A + count(A.grd) <= C. The transformation adds B.grd (new edge) with start ID start(B.grd) = B. The old constraint (edge) is replaced by 2 new constraints A + count(A.grd) <= B and B + count(B.grd) <= C.
  3. Parallel op: Transform A <-- B into A <== B, i.e., create a double edge. Meaning: Initially A1.grd (old edge) has start(A1.grd) = A assigned. B can be T, or the start ID of some other .grd file(s). IDs are constrained by A + count(A1.grd) <= B. The transformation adds A2.grd (new edge) that‘s mutually exclusive with A1.grd, and can therefore share the same start value A, i.e., start(A2.grd) = A. The old constraint remains, and we’re adding a new one A + count(A2.grd) <= B. The combined effect of the constraints is A + max(count(A1.grd), count(A2.grd)) <= B.

Composing rule 1 with arbitrary copies of rule {2, 3] (each targeting an existing edge, while adding a new one from a new .grd file) results in a series-parallel graph with one source T, one sink S, and no cycles. This graph exactly represents “ordering structure”. Computationally it represents assigning each .grd file's start ID to some to a variables (vertices), subject to constraints (edges weighted by count()).

Given the above graph, solving the assignment problem is easy (omitted). The challenge is to represent the series-parallel graph in resource_ids.spec. Some possibilities:

  • Explicitly define vertices, then list .grd files as edges (each with 2 vertices): It turns out this has “too much freedom”, and can lead to errors (e.g., cycles), requiring validation. Also, how do we name vertices?
  • Use bracketing: Series op is associative; parallel op is associative and commutative (over isomorphism). Therefore we can represent series op with a list (order important) and parallel op as a set (order unimportant). The graph becomes an alternating-nested list and set (noting that list of lists and set of sets can be flattened)! For example, [a,{b,[c,{d,e},f]},{g,h,i},j] would represent (using # for vertices):
S <-(a)- # <----------(b)---------- # <-(g)- # <-(j)- T
         |                          |        |
         + <-(c)- # <-(d)- # <-(f)- + <-(h)- +
                  |        |        |        |
                  + <-(e)- +        + <-(i)- +

We might do this in the future -- but this would be a drastic change.

  • Use fake start IDs: This is the choice taken, since it mostly maintains the old “API” of updating numbers in a file.

To encode a series-parallel graph as a sequence of fake start IDs, first we note that chains formed by repeated series ops can be represented by increasing fake start IDs. For example: [0, 1, 2, 3, 4] matches:

S <-0-- # <-1-- # <-2-- # <-3-- # <-4-- T

Note: The numbers are not to be confused with count() as edge weights.

Next, repeated or decreasing fake start IDs can be thought of “rewinding” to the past, which create splits (like time travel) that parallel ops can use. This can also be done in a hierarchical fashion. For example, [1, 2, 4, 2, 3, 4, 5, 6, 4, 7, 7, 2, 3, 4, 3] can create

S <-1-- # <-2-- # <-4--
        |
        + <-2-- # <-3-- # <-4-- # <-5-- # <-6--
        |               |
        |               + <-4-- # <-7--
        |                       |
        |                       + <-7--
        |
        + <-2-- # <-3-- # <-4--
                |
                # <-3--

The tree building algorithm uses a stack: Increasing values are pushed; repeated or decreasing values cause pops until a match is found, to which linkage can be applied.

Therefore fake start IDs can represent a tree. However, parallel op also requires “joins”. To do this, we‘ll need to add “join” to literally “tie up loose ends”. Let’s consider a smaller example: [1, 2, 2, 3, 4]. The resulting tree is:

S <-1-- # <-2--
        |
        + <-2-- # <-3-- # <-4--

If “join” is placed at 3, we'd get [1, 2, 2, 3*, 4], which represents:

S <-1-- # <-2-- # <-3-- # <-4-- T
        |       |
        + <-2-- +

If “join” is placed at 4, we'd get [1, 2, 2, 3, 4*], which represents:

S <-1-- # <-----2------ # <-4-- T
        |               |
        + <-2-- # <-3-- +

Note that the end sentinel T can be thought to absorb all unjoined branches. Therefore the original tree [1, 2, 2, 3, 4] actually represents:

S <-1-- # <---------2---------- T
        |                       |
        + <-2-- # <-3-- # <-4-- +

Next, joins have a multiplicity, so since more than 2 branches can be joined at the same node. For example, [1, 2, 2, 3, 3, 4*, 5*, 5, 5, 6**] (with * representing a join) results in:

S <-1-- # <---------2---------- # <-5-- # <-6-- T
        |                       |       |
        + <-2-- # <-3-- # <-4-- + <-5-- +
                |       |       |       |
                + <-3-- +       + <-5-- +

In fact, this is just an earlier example we've seen.

Finally, note that the running count of joints, i.e., *, must be less than or equal to the running count of splits.

芝麻吃多了有什么坏处 掉头发去医院看什么科 前辈是什么意思 妃嫔是什么意思 房颤是什么意思
阴阳怪气是什么意思 咳嗽黄痰吃什么药 戒指戴哪个手指代表什么 梦见割草是什么意思 什么叫质子
相得益彰是什么意思 棉麻是什么面料 彩云之南是什么意思 检查眼睛挂什么科 自缢死亡是什么意思
无机磷测定是检查什么 眼线是什么意思 母胎单身什么意思 身上长白点是什么原因 海东青是什么鸟
双肺微结节是什么意思inbungee.com 吃什么可以养胃hlguo.com 一什么菜地hcv7jop4ns6r.cn 三羊开泰是什么意思hcv8jop2ns8r.cn 浠字五行属什么hcv8jop5ns3r.cn
下巴长痘痘是什么原因引起的hcv8jop8ns5r.cn 梦见猫是什么预兆dayuxmw.com 为什么会得中耳炎hcv8jop3ns6r.cn 什么叫主动脉硬化youbangsi.com 红楼梦是什么朝代zhiyanzhang.com
禅悟是什么意思gysmod.com 圣诞节适合送什么礼物hcv9jop6ns8r.cn 慢性胃炎能吃什么水果zsyouku.com 胃出血有什么症状表现hcv9jop6ns4r.cn 肺在五行中属什么hcv9jop7ns2r.cn
小肚子一直疼是什么原因hcv9jop7ns3r.cn 财鱼是什么鱼hcv9jop2ns5r.cn 月经突然提前一周是什么原因hcv7jop5ns5r.cn 否极泰来是什么生肖hcv7jop4ns7r.cn 高血压有什么危害hcv9jop6ns7r.cn
百度