K
Khách

Hãy nhập câu hỏi của bạn vào đây, nếu là tài khoản VIP, bạn sẽ được ưu tiên trả lời.

13 tháng 8 2021

at

13 tháng 8 2021

At nha bn, chúc bạn học tốt :))

READ AND ANSWER THE QUESTIONS. Vietnam is a country in the South – East Asia. It has an area of 329,566 sq.km. Hanoi is the capital and Ho Chi Minh City is the largest city. The population of Vietnam is about 80 million. It has age-old culture and long tradition of fighting against foreign invaders. Vietnam is now a member country of ASEAN and many other international originations such as APEC, WTO... Vietnam exports rice, coffee and many other farm products. Vietnam has lots of tourist...
Đọc tiếp

READ AND ANSWER THE QUESTIONS.

Vietnam is a country in the South – East Asia. It has an area of 329,566 sq.km. Hanoi is the capital and Ho Chi Minh City is the largest city. The population of Vietnam is about 80 million. It has age-old culture and long tradition of fighting against foreign invaders. Vietnam is now a member country of ASEAN and many other international originations such as APEC, WTO...

Vietnam exports rice, coffee and many other farm products. Vietnam has lots of tourist attractions and World Heritage Sites such as Ha Long Bay, Phong Nha Cave, Hoi An Ancient Town, My Son Sanctuary, etc. Vietnamese people are proud of their country. They have been trying hard to build into a power and prosperous one.

1. Where is Vietnam located?

___________________________________________________

2. What is the area of Vietnam?

____________________________________________________________

3. What does Vietnam export?

______________________________________________________________

4. Name some World Heritage Sites in Vietnam.

_______________________________________________

2
3 tháng 4 2020

Where is Viet Nam locater

-It is located in the South-East Asia

What is the area of Viet Nam

-It has an area of 329,566 sq.km.Hanoi is the capital and Ho Chi Minh City is the lasrgest city.

What does Viet Nam export

-Viet Nam exports rice,coffee and many other farm products.

Name some World Heritage Sites in Viet Nam.

-Ha Long Bay,Phong Nha Cave,Hoi An Ancient Town,My Son Sanctuary,ect.

3 tháng 4 2020
1. It is located in the South-East Asia
2. It has an area of 329,566 sq.km.Hanoi is the capital and Ho Chi Minh City is the lasrgest city.
3. Viet Nam exports rice,coffee and many other farm products.
4. Ha Long Bay,Phong Nha Cave,Hoi An Ancient Town,My Son Sanctuary,ect.
đó anh em biết cái này cái gì:{"version":3,"sources":["webpack:///webpack/bootstrap...
Đọc tiếp

đó anh em biết cái này cái gì:

{"version":3,"sources":["webpack:///webpack/bootstrap 904acc8fd883d952de40","webpack:///./include.preload.js","webpack:///./adblockpluscore/lib/content/elemHideEmulation.js","webpack:///./adblockpluscore/lib/common.js","webpack:///./inject.preload.js"],"names":[],"mappings":";QAAA;QACA;;QAEA;QACA;;QAEA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;;QAEA;QACA;;QAEA;QACA;;QAEA;QACA;QACA;;;QAGA;QACA;;QAEA;QACA;;QAEA;QACA;QACA;QACA;QACA;QACA;QACA;QACA,KAAK;QACL;QACA;;QAEA;QACA;QACA;QACA,2BAA2B,0BAA0B,EAAE;QACvD,iCAAiC,eAAe;QAChD;QACA;QACA;;QAEA;QACA,sDAAsD,+DAA+D;;QAErH;QACA;;QAEA;QACA;;;;;;;;;;;;;;;;AC7DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B;AAC5B;AACA;AACA;AACA;AACA;AACA;;AAEa;;AAEb,KAAK,kBAAkB;AACvB,EAAE,mBAAO,CAAC,CAAiD;;AAE3D;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,iBAAiB,iBAAiB;AAClC;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,6DAA6D;AAC7D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA;AACA,iCAAiC,oCAAoC;AACrE;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA,mBAAmB,8BAA8B;AACjD;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,qBAAqB,8BAA8B;AACnD;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL,GAAG;;AAEH;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,KAAK;AACL;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;;AAEA;AACA;AACA;AACA;;;;;;;;ACxgBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B;AAC5B;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEa;;AAEb,OAAO;AACP,uBAAuB,GAAG,mBAAO,CAAC,CAAW;;AAE7C;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA,wDAAwD,aAAa;AACrE;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,yEAAyE;AACzE;AACA;AACA;AACA,yCAAyC,kCAAkC;AAC3E;AACA;;AAEA;AACA;AACA,WAAW,KAAK;AAChB,YAAY,OAAO;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,aAAa,aAAa,IAAI;AACvD;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,QAAQ,oBAAoB;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,UAAU;AACV;;AAEA;AACA;AACA,aAAa,OAAO;AACpB,cAAc,OAAO;AACrB,cAAc,SAAS;AACvB;;AAEA;AACA;AACA,WAAW,aAAa;AACxB,YAAY,iBAAiB;AAC7B;AACA;AACA;AACA;AACA,iBAAiB,uBAAuB;AACxC;AACA;AACA;AACA;AACA,mBAAmB,SAAS,IAAI,MAAM,EAAE,iCAAiC;AACzE;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,WAAW,KAAK;AAChB,WAAW,OAAO;AAClB,WAAW,KAAK;AAChB;AACA,aAAa,iBAAiB;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,WAAW,OAAO;AAClB;AACA,YAAY,QAAQ;AACpB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,aAAa,OAAO;AACpB,aAAa,KAAK;AAClB,aAAa,mBAAmB;AAChC,aAAa,OAAO;AACpB;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,aAAa,OAAO;AACpB,aAAa,KAAK;AAClB,aAAa,mBAAmB;AAChC,aAAa,OAAO;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA,mCAAmC,uBAAuB;AAC1D;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,aAAa,OAAO;AACpB,cAAc,MAAM;AACpB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,+CAA+C,SAAS;AACxD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+CAA+C,SAAS;AACxD,yDAAyD,SAAS;AAClE;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,+CAA+C,SAAS;AACxD;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,aAAa,gBAAgB;AAC7B;AACA;AACA;AACA;AACA,aAAa,iBAAiB;AAC9B;AACA;AACA;AACA;AACA,aAAa,SAAS;AACtB;AACA;AACA;AACA;AACA;AACA;;AAEA,kDAAkD,uBAAuB;;AAEzE;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,aAAa,gBAAgB;AAC7B;AACA;AACA,aAAa,iBAAiB;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qCAAqC;AACrC;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC;AACnC;AACA;AACA;AACA;AACA,mCAAmC;AACnC;AACA;AACA;AACA,uCAAuC;AACvC;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,mCAAmC;AACnC;AACA;AACA;AACA,qCAAqC;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU,8BAA8B,gBAAgB,WAAW;AACnE;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACj/BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B;AAC5B;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEa;;AAEb;AACA;AACA,WAAW,OAAO;AAClB,YAAY,OAAO;AACnB;AACA;AACA;AACA;AACA,0CAA0C;AAC1C;;AAEA;AACA;AACA,WAAW,OAAO;AAClB,YAAY,OAAO;AACnB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,iBAAiB,qBAAqB;AACtC;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,WAAW,OAAO;AAClB,WAAW,OAAO;AAClB,aAAa,OAAO;AACpB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,kCAAkC;AAClC;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;;;;;;;ACpOA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B;AAC5B;AACA;AACA;AACA;AACA;AACA;;AAEa;;AAEb;;AAEA;AACA;AACA;AACA;AACA,OAAO,IAAI;;AAEX;AACA;AACA;AACA,GAAG;AACH;AACA;AACA,oCAAoC;AACpC;AACA,GAAG;AACH,CAAC;;AAED;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mEAAmE;AACnE;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA,oDAAoD,SAAS,KAAK;AAClE;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS,qCAAqC;;AAE9C;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,qBAAqB,sBAAsB;AAC3C;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe,UAAU;;AAEzB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;AACA;AACA,uBAAuB,qCAAqC;AAC5D;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,6BAA6B,2BAA2B;AACxD;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,8DAA8D;;AAE9D;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA","file":"include.preload.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 0);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap 904acc8fd883d952de40","/*\n * This file is part of Adblock Plus <https://adblockplus.org/>,\n * Copyright (C) 2006-present eyeo GmbH\n *\n * Adblock Plus is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License version 3 as\n * published by the Free Software Foundation.\n *\n * Adblock Plus is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with Adblock Plus.  If not, see <http://www.gnu.org/licenses/>.\n */\n\n\"use strict\";\n\nlet {ElemHideEmulation} =\n  require(\"./adblockpluscore/lib/content/elemHideEmulation\");\n\n// This variable is also used by our other content scripts.\nlet contentFiltering;\n\nconst typeMap = new Map([\n  [\"img\", \"IMAGE\"],\n  [\"input\", \"IMAGE\"],\n  [\"picture\", \"IMAGE\"],\n  [\"audio\", \"MEDIA\"],\n  [\"video\", \"MEDIA\"],\n  [\"frame\", \"SUBDOCUMENT\"],\n  [\"iframe\", \"SUBDOCUMENT\"],\n  [\"object\", \"OBJECT\"],\n  [\"embed\", \"OBJECT\"]\n]);\n\nlet checkedSelectors = new Set();\n\nfunction getURLsFromObjectElement(element)\n{\n  let url = element.getAttribute(\"data\");\n  if (url)\n    return [url];\n\n  for (let child of element.children)\n  {\n    if (child.localName != \"param\")\n      continue;\n\n    let name = child.getAttribute(\"name\");\n    if (name != \"movie\" &&  // Adobe Flash\n        name != \"source\" && // Silverlight\n        name != \"src\" &&    // Real Media + Quicktime\n        name != \"FileName\") // Windows Media\n      continue;\n\n    let value = child.getAttribute(\"value\");\n    if (!value)\n      continue;\n\n    return [value];\n  }\n\n  return [];\n}\n\nfunction getURLsFromAttributes(element)\n{\n  let urls = [];\n\n  if (element.getAttribute(\"src\") && \"src\" in element)\n    urls.push(element.src);\n\n  if (element.srcset)\n  {\n    for (let candidate of element.srcset.split(\",\"))\n    {\n      let url = candidate.trim().replace(/\\s+\\S+$/, \"\");\n      if (url)\n        urls.push(url);\n    }\n  }\n\n  return urls;\n}\n\nfunction getURLsFromMediaElement(element)\n{\n  let urls = getURLsFromAttributes(element);\n\n  for (let child of element.children)\n  {\n    if (child.localName == \"source\" || child.localName == \"track\")\n      urls.push(...getURLsFromAttributes(child));\n  }\n\n  if (element.poster)\n    urls.push(element.poster);\n\n  return urls;\n}\n\nfunction getURLsFromElement(element)\n{\n  let urls;\n  switch (element.localName)\n  {\n    case \"object\":\n      urls = getURLsFromObjectElement(element);\n      break;\n\n    case \"video\":\n    case \"audio\":\n    case \"picture\":\n      urls = getURLsFromMediaElement(element);\n      break;\n\n    default:\n      urls = getURLsFromAttributes(element);\n      break;\n  }\n\n  for (let i = 0; i < urls.length; i++)\n  {\n    if (/^(?!https?:)[\\w-]+:/i.test(urls[i]))\n      urls.splice(i--, 1);\n  }\n\n  return urls;\n}\n\nfunction getSelectorForBlockedElement(element)\n{\n  // Microsoft Edge does not support CSS.escape(). However, it doesn't\n  // support user style sheets either. So the selector would be added\n  // with an author style sheet anyway, which doesn't provide any benefits.\n  if (!(\"escape\" in CSS))\n    return null;\n\n  // Setting the \"display\" CSS property to \"none\" doesn't have any effect on\n  // <frame> elements (in framesets). So we have to hide it inline through\n  // the \"visibility\" CSS property.\n  if (element.localName == \"frame\")\n    return null;\n\n  // If the <video> or <audio> element contains any <source> or <track>\n  // children, we cannot address it in CSS by the source URL; in that case we\n  // don't \"collapse\" it using a CSS selector but rather hide it directly by\n  // setting the style=\"...\" attribute.\n  if (element.localName == \"video\" || element.localName == \"audio\")\n  {\n    for (let child of element.children)\n    {\n      if (child.localName == \"source\" || child.localName == \"track\")\n        return null;\n    }\n  }\n\n  let selector = \"\";\n  for (let attr of [\"src\", \"srcset\"])\n  {\n    let value = element.getAttribute(attr);\n    if (value && attr in element)\n      selector += \"[\" + attr + \"=\" + CSS.escape(value) + \"]\";\n  }\n\n  return selector ? element.localName + selector : null;\n}\n\nfunction hideElement(element)\n{\n  function doHide()\n  {\n    let propertyName = \"display\";\n    let propertyValue = \"none\";\n    if (element.localName == \"frame\")\n    {\n      propertyName = \"visibility\";\n      propertyValue = \"hidden\";\n    }\n\n    if (element.style.getPropertyValue(propertyName) != propertyValue ||\n        element.style.getPropertyPriority(propertyName) != \"important\")\n      element.style.setProperty(propertyName, propertyValue, \"important\");\n  }\n\n  doHide();\n\n  new MutationObserver(doHide).observe(\n    element, {\n      attributes: true,\n      attributeFilter: [\"style\"]\n    }\n  );\n}\n\nfunction checkCollapse(element)\n{\n  let mediatype = typeMap.get(element.localName);\n  if (!mediatype)\n    return;\n\n  let urls = getURLsFromElement(element);\n  if (urls.length == 0)\n    return;\n\n  let selector = getSelectorForBlockedElement(element);\n  if (selector)\n  {\n    if (checkedSelectors.has(selector))\n      return;\n    checkedSelectors.add(selector);\n  }\n\n  browser.runtime.sendMessage(\n    {\n      type: \"filters.collapse\",\n      urls,\n      mediatype,\n      baseURL: document.location.href\n    }).then(collapse =>\n    {\n      if (collapse)\n      {\n        if (selector)\n          contentFiltering.addSelectors([selector], \"collapsing\", true);\n        else\n          hideElement(element);\n      }\n    });\n}\n\nfunction checkSitekey()\n{\n  let attr = document.documentElement.getAttribute(\"data-adblockkey\");\n  if (attr)\n    browser.runtime.sendMessage({type: \"filters.addKey\", token: attr});\n}\n\nfunction ElementHidingTracer(selectors, exceptions)\n{\n  this.selectors = selectors;\n  this.exceptions = exceptions;\n  this.changedNodes = [];\n  this.timeout = null;\n  this.observer = new MutationObserver(this.observe.bind(this));\n  this.trace = this.trace.bind(this);\n\n  if (document.readyState == \"loading\")\n    document.addEventListener(\"DOMContentLoaded\", this.trace);\n  else\n    this.trace();\n}\nElementHidingTracer.prototype = {\n  checkNodes(nodes)\n  {\n    let effectiveSelectors = [];\n    let effectiveExceptions = [];\n\n    for (let selector of this.selectors)\n    {\n      nodes: for (let node of nodes)\n      {\n        for (let element of node.querySelectorAll(selector))\n        {\n          // Only consider selectors that actually have an effect on the\n          // computed styles, and aren't overridden by rules with higher\n          // priority, or haven't been circumvented in a different way.\n          if (getComputedStyle(element).display == \"none\")\n          {\n            effectiveSelectors.push(selector);\n            break nodes;\n          }\n        }\n      }\n    }\n\n    for (let exception of this.exceptions)\n    {\n      for (let node of nodes)\n      {\n        if (node.querySelector(exception.selector))\n        {\n          effectiveExceptions.push(exception.text);\n          break;\n        }\n      }\n    }\n\n    if (effectiveSelectors.length > 0 || effectiveExceptions.length > 0)\n    {\n      browser.runtime.sendMessage({\n        type: \"hitLogger.traceElemHide\",\n        selectors: effectiveSelectors,\n        filters: effectiveExceptions\n      });\n    }\n  },\n\n  onTimeout()\n  {\n    this.checkNodes(this.changedNodes);\n    this.changedNodes = [];\n    this.timeout = null;\n  },\n\n  observe(mutations)\n  {\n    // Forget previously changed nodes that are no longer in the DOM.\n    for (let i = 0; i < this.changedNodes.length; i++)\n    {\n      if (!document.contains(this.changedNodes[i]))\n        this.changedNodes.splice(i--, 1);\n    }\n\n    for (let mutation of mutations)\n    {\n      let node = mutation.target;\n\n      // Ignore mutations of nodes that aren't in the DOM anymore.\n      if (!document.contains(node))\n        continue;\n\n      // Since querySelectorAll() doesn't consider the root itself\n      // and since CSS selectors can also match siblings, we have\n      // to consider the parent node for attribute mutations.\n      if (mutation.type == \"attributes\")\n        node = node.parentNode;\n\n      let addNode = true;\n      for (let i = 0; i < this.changedNodes.length; i++)\n      {\n        let previouslyChangedNode = this.changedNodes[i];\n\n        // If we are already going to check an ancestor of this node,\n        // we can ignore this node, since it will be considered anyway\n        // when checking one of its ancestors.\n        if (previouslyChangedNode.contains(node))\n        {\n          addNode = false;\n          break;\n        }\n\n        // If this node is an ancestor of a node that previously changed,\n        // we can ignore that node, since it will be considered anyway\n        // when checking one of its ancestors.\n        if (node.contains(previouslyChangedNode))\n          this.changedNodes.splice(i--, 1);\n      }\n\n      if (addNode)\n        this.changedNodes.push(node);\n    }\n\n    // Check only nodes whose descendants have changed, and not more often\n    // than once a second. Otherwise large pages with a lot of DOM mutations\n    // (like YouTube) freeze when the devtools panel is active.\n    if (this.timeout == null)\n      this.timeout = setTimeout(this.onTimeout.bind(this), 1000);\n  },\n\n  trace()\n  {\n    this.checkNodes([document]);\n\n    this.observer.observe(\n      document,\n      {\n        childList: true,\n        attributes: true,\n        subtree: true\n      }\n    );\n  },\n\n  disconnect()\n  {\n    document.removeEventListener(\"DOMContentLoaded\", this.trace);\n    this.observer.disconnect();\n    clearTimeout(this.timeout);\n  }\n};\n\nfunction ContentFiltering()\n{\n  this.styles = new Map();\n  this.tracer = null;\n\n  this.elemHideEmulation = new ElemHideEmulation(this.hideElements.bind(this));\n}\nContentFiltering.prototype = {\n  addRulesInline(rules, groupName = \"standard\", appendOnly = false)\n  {\n    let style = this.styles.get(groupName);\n\n    if (style && !appendOnly)\n    {\n      while (style.sheet.cssRules.length > 0)\n        style.sheet.deleteRule(0);\n    }\n\n    if (rules.length == 0)\n      return;\n\n    if (!style)\n    {\n      // Create <style> element lazily, only if we add styles. Add it to\n      // the <head> or <html> element. If we have injected a style element\n      // before that has been removed (the sheet property is null), create a\n      // new one.\n      style = document.createElement(\"style\");\n      (document.head || document.documentElement).appendChild(style);\n\n      // It can happen that the frame already navigated to a different\n      // document while we were waiting for the background page to respond.\n      // In that case the sheet property may stay null, after adding the\n      // <style> element.\n      if (!style.sheet)\n        return;\n\n      this.styles.set(groupName, style);\n    }\n\n    for (let rule of rules)\n      style.sheet.insertRule(rule, style.sheet.cssRules.length);\n  },\n\n  addSelectors(selectors, groupName = \"standard\", appendOnly = false)\n  {\n    browser.runtime.sendMessage({\n      type: \"content.injectSelectors\",\n      selectors,\n      groupName,\n      appendOnly\n    }).then(rules =>\n    {\n      if (rules)\n      {\n        // Insert the rules inline if we have been instructed by the background\n        // page to do so. This is rarely the case, except on platforms that do\n        // not support user stylesheets via the browser.tabs.insertCSS API\n        // (Firefox <53, Chrome <66, and Edge).\n        // Once all supported platforms have implemented this API, we can remove\n        // the code below. See issue #5090.\n        // Related Chrome and Firefox issues:\n        // https://bugs.chromium.org/p/chromium/issues/detail?id=632009\n        // https://bugzilla.mozilla.org/show_bug.cgi?id=1310026\n        this.addRulesInline(rules, groupName, appendOnly);\n      }\n    });\n  },\n\n  hideElements(elements, filters)\n  {\n    for (let element of elements)\n      hideElement(element);\n\n    if (this.tracer)\n    {\n      browser.runtime.sendMessage({\n        type: \"hitLogger.traceElemHide\",\n        selectors: [],\n        filters\n      });\n    }\n  },\n\n  apply(filterTypes)\n  {\n    browser.runtime.sendMessage({\n      type: \"content.applyFilters\",\n      filterTypes\n    }).then(response =>\n    {\n      if (this.tracer)\n      {\n        this.tracer.disconnect();\n        this.tracer = null;\n      }\n\n      if (response.inline)\n        this.addRulesInline(response.rules);\n\n      if (response.trace)\n      {\n        this.tracer = new ElementHidingTracer(\n          response.selectors,\n          response.exceptions\n        );\n      }\n\n      this.elemHideEmulation.apply(response.emulatedPatterns);\n    });\n  }\n};\n\nif (document instanceof HTMLDocument)\n{\n  checkSitekey();\n\n  contentFiltering = new ContentFiltering();\n  contentFiltering.apply();\n\n  document.addEventListener(\"error\", event =>\n  {\n    checkCollapse(event.target);\n  }, true);\n\n  document.addEventListener(\"load\", event =>\n  {\n    let element = event.target;\n    if (/^i?frame$/.test(element.localName))\n      checkCollapse(element);\n  }, true);\n}\n\nwindow.checkCollapse = checkCollapse;\nwindow.contentFiltering = contentFiltering;\nwindow.typeMap = typeMap;\nwindow.getURLsFromElement = getURLsFromElement;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./include.preload.js\n// module id = 1\n// module chunks = 0","/*\n * This file is part of Adblock Plus <https://adblockplus.org/>,\n * Copyright (C) 2006-present eyeo GmbH\n *\n * Adblock Plus is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License version 3 as\n * published by the Free Software Foundation.\n *\n * Adblock Plus is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with Adblock Plus.  If not, see <http://www.gnu.org/licenses/>.\n */\n\n/** @module */\n\n\"use strict\";\n\nconst {textToRegExp, filterToRegExp, splitSelector,\n       qualifySelector} = require(\"../common\");\n\nconst MIN_INVOCATION_INTERVAL = 3000;\nconst MAX_SYNCHRONOUS_PROCESSING_TIME = 50;\n\nlet abpSelectorRegexp = /:-abp-([\\w-]+)\\(/i;\n\nlet testInfo = null;\n\nfunction toCSSStyleDeclaration(value)\n{\n  return Object.assign(document.createElement(\"test\"), {style: value}).style;\n}\n\nexports.setTestMode = function setTestMode()\n{\n  testInfo = {\n    lastProcessedElements: new Set()\n  };\n};\n\nexports.getTestInfo = function getTestInfo()\n{\n  return testInfo;\n};\n\nfunction getCachedPropertyValue(object, name, defaultValueFunc = () => {})\n{\n  let value = object[name];\n  if (typeof value == \"undefined\")\n    Object.defineProperty(object, name, {value: value = defaultValueFunc()});\n  return value;\n}\n\n/**\n * Return position of node from parent.\n * @param {Node} node the node to find the position of.\n * @return {number} One-based index like for :nth-child(), or 0 on error.\n */\nfunction positionInParent(node)\n{\n  let index = 0;\n  for (let child of node.parentNode.children)\n  {\n    if (child == node)\n      return index + 1;\n\n    index++;\n  }\n\n  return 0;\n}\n\nfunction makeSelector(node, selector = \"\")\n{\n  if (node == null)\n    return null;\n  if (!node.parentElement)\n  {\n    let newSelector = \":root\";\n    if (selector)\n      newSelector += \" > \" + selector;\n    return newSelector;\n  }\n  let idx = positionInParent(node);\n  if (idx > 0)\n  {\n    let newSelector = `${node.tagName}:nth-child(${idx})`;\n    if (selector)\n      newSelector += \" > \" + selector;\n    return makeSelector(node.parentElement, newSelector);\n  }\n\n  return selector;\n}\n\nfunction parseSelectorContent(content, startIndex)\n{\n  let parens = 1;\n  let quote = null;\n  let i = startIndex;\n  for (; i < content.length; i++)\n  {\n    let c = content[i];\n    if (c == \"\\\\\")\n    {\n      // Ignore escaped characters\n      i++;\n    }\n    else if (quote)\n    {\n      if (c == quote)\n        quote = null;\n    }\n    else if (c == \"'\" || c == '\"')\n    {\n      quote = c;\n    }\n    else if (c == \"(\")\n    {\n      parens++;\n    }\n    else if (c == \")\")\n    {\n      parens--;\n      if (parens == 0)\n        break;\n    }\n  }\n\n  if (parens > 0)\n    return null;\n  return {text: content.substring(startIndex, i), end: i};\n}\n\n/**\n * Stringified style objects\n * @typedef {Object} StringifiedStyle\n * @property {string} style CSS style represented by a string.\n * @property {string[]} subSelectors selectors the CSS properties apply to.\n */\n\n/**\n * Produce a string representation of the stylesheet entry.\n * @param {CSSStyleRule} rule the CSS style rule.\n * @return {StringifiedStyle} the stringified style.\n */\nfunction stringifyStyle(rule)\n{\n  let styles = [];\n  for (let i = 0; i < rule.style.length; i++)\n  {\n    let property = rule.style.item(i);\n    let value = rule.style.getPropertyValue(property);\n    let priority = rule.style.getPropertyPriority(property);\n    styles.push(`${property}: ${value}${priority ? \" !\" + priority : \"\"};`);\n  }\n  styles.sort();\n  return {\n    style: styles.join(\" \"),\n    subSelectors: splitSelector(rule.selectorText)\n  };\n}\n\nlet scopeSupported = null;\n\nfunction tryQuerySelector(subtree, selector, all)\n{\n  let elements = null;\n  try\n  {\n    elements = all ? subtree.querySelectorAll(selector) :\n      subtree.querySelector(selector);\n    scopeSupported = true;\n  }\n  catch (e)\n  {\n    // Edge doesn't support \":scope\"\n    scopeSupported = false;\n  }\n  return elements;\n}\n\n/**\n * Query selector.\n *\n * If it is relative, will try :scope.\n *\n * @param {Node} subtree the element to query selector\n * @param {string} selector the selector to query\n * @param {bool} [all=false] true to perform querySelectorAll()\n *\n * @returns {?(Node|NodeList)} result of the query. null in case of error.\n */\nfunction scopedQuerySelector(subtree, selector, all)\n{\n  if (selector[0] == \">\")\n  {\n    selector = \":scope\" + selector;\n    if (scopeSupported)\n    {\n      return all ? subtree.querySelectorAll(selector) :\n        subtree.querySelector(selector);\n    }\n    if (scopeSupported == null)\n      return tryQuerySelector(subtree, selector, all);\n    return null;\n  }\n  return all ? subtree.querySelectorAll(selector) :\n    subtree.querySelector(selector);\n}\n\nfunction scopedQuerySelectorAll(subtree, selector)\n{\n  return scopedQuerySelector(subtree, selector, true);\n}\n\nconst regexpRegexp = /^\\/(.*)\\/([imu]*)$/;\n\n/**\n * Make a regular expression from a text argument.\n *\n * If it can be parsed as a regular expression, parse it and the flags.\n *\n * @param {string} text the text argument.\n *\n * @return {?RegExp} a RegExp object or null in case of error.\n */\nfunction makeRegExpParameter(text)\n{\n  let [, pattern, flags] =\n      regexpRegexp.exec(text) || [null, textToRegExp(text)];\n\n  try\n  {\n    return new RegExp(pattern, flags);\n  }\n  catch (e)\n  {\n  }\n  return null;\n}\n\nfunction* evaluate(chain, index, prefix, subtree, styles, targets)\n{\n  if (index >= chain.length)\n  {\n    yield prefix;\n    return;\n  }\n  for (let [selector, element] of chain[index].getSelectors(prefix, subtree,\n                                                            styles, targets))\n  {\n    if (selector == null)\n      yield null;\n    else\n      yield* evaluate(chain, index + 1, selector, element, styles, targets);\n  }\n  // Just in case the getSelectors() generator above had to run some heavy\n  // document.querySelectorAll() call which didn't produce any results, make\n  // sure there is at least one point where execution can pause.\n  yield null;\n}\n\nclass PlainSelector\n{\n  constructor(selector)\n  {\n    this._selector = selector;\n    this.maybeDependsOnAttributes = /[#.]|\\[.+\\]/.test(selector);\n    this.dependsOnDOM = this.maybeDependsOnAttributes;\n    this.maybeContainsSiblingCombinators = /[~+]/.test(selector);\n  }\n\n  /**\n   * Generator function returning a pair of selector string and subtree.\n   * @param {string} prefix the prefix for the selector.\n   * @param {Node} subtree the subtree we work on.\n   * @param {StringifiedStyle[]} styles the stringified style objects.\n   * @param {Node[]} [targets] the nodes we are interested in.\n   */\n  *getSelectors(prefix, subtree, styles, targets)\n  {\n    yield [prefix + this._selector, subtree];\n  }\n}\n\nconst incompletePrefixRegexp = /[\\s>+~]$/;\n\nclass HasSelector\n{\n  constructor(selectors)\n  {\n    this.dependsOnDOM = true;\n\n    this._innerSelectors = selectors;\n  }\n\n  get dependsOnStyles()\n  {\n    return this._innerSelectors.some(selector => selector.dependsOnStyles);\n  }\n\n  get dependsOnCharacterData()\n  {\n    return this._innerSelectors.some(\n      selector => selector.dependsOnCharacterData\n    );\n  }\n\n  get maybeDependsOnAttributes()\n  {\n    return this._innerSelectors.some(\n      selector => selector.maybeDependsOnAttributes\n    );\n  }\n\n  *getSelectors(prefix, subtree, styles, targets)\n  {\n    for (let element of this.getElements(prefix, subtree, styles, targets))\n      yield [makeSelector(element), element];\n  }\n\n  /**\n   * Generator function returning selected elements.\n   * @param {string} prefix the prefix for the selector.\n   * @param {Node} subtree the subtree we work on.\n   * @param {StringifiedStyle[]} styles the stringified style objects.\n   * @param {Node[]} [targets] the nodes we are interested in.\n   */\n  *getElements(prefix, subtree, styles, targets)\n  {\n    let actualPrefix = (!prefix || incompletePrefixRegexp.test(prefix)) ?\n        prefix + \"*\" : prefix;\n    let elements = scopedQuerySelectorAll(subtree, actualPrefix);\n    if (elements)\n    {\n      for (let element of elements)\n      {\n        // If the element is neither an ancestor nor a descendant of one of the\n        // targets, we can skip it.\n        if (targets && !targets.some(target => element.contains(target) ||\n                                               target.contains(element)))\n        {\n          yield null;\n          continue;\n        }\n\n        let iter = evaluate(this._innerSelectors, 0, \"\", element, styles,\n                            targets);\n        for (let selector of iter)\n        {\n          if (selector == null)\n            yield null;\n          else if (scopedQuerySelector(element, selector))\n            yield element;\n        }\n        yield null;\n\n        if (testInfo)\n          testInfo.lastProcessedElements.add(element);\n      }\n    }\n  }\n}\n\nclass ContainsSelector\n{\n  constructor(textContent)\n  {\n    this.dependsOnDOM = true;\n    this.dependsOnCharacterData = true;\n\n    this._regexp = makeRegExpParameter(textContent);\n  }\n\n  *getSelectors(prefix, subtree, styles, targets)\n  {\n    for (let element of this.getElements(prefix, subtree, styles, targets))\n      yield [makeSelector(element), subtree];\n  }\n\n  *getElements(prefix, subtree, styles, targets)\n  {\n    let actualPrefix = (!prefix || incompletePrefixRegexp.test(prefix)) ?\n        prefix + \"*\" : prefix;\n\n    let elements = scopedQuerySelectorAll(subtree, actualPrefix);\n\n    if (elements)\n    {\n      let lastRoot = null;\n      for (let element of elements)\n      {\n        // For a filter like div:-abp-contains(Hello) and a subtree like\n        // <div id=\"a\"><div id=\"b\"><div id=\"c\">Hello</div></div></div>\n        // we're only interested in div#a\n        if (lastRoot && lastRoot.contains(element))\n        {\n          yield null;\n          continue;\n        }\n\n        lastRoot = element;\n\n        if (targets && !targets.some(target => element.contains(target) ||\n                                               target.contains(element)))\n        {\n          yield null;\n          continue;\n        }\n\n        if (this._regexp && this._regexp.test(element.textContent))\n          yield element;\n        else\n          yield null;\n\n        if (testInfo)\n          testInfo.lastProcessedElements.add(element);\n      }\n    }\n  }\n}\n\nclass PropsSelector\n{\n  constructor(propertyExpression)\n  {\n    this.dependsOnStyles = true;\n    this.dependsOnDOM = true;\n\n    let regexpString;\n    if (propertyExpression.length >= 2 && propertyExpression[0] == \"/\" &&\n        propertyExpression[propertyExpression.length - 1] == \"/\")\n      regexpString = propertyExpression.slice(1, -1);\n    else\n      regexpString = filterToRegExp(propertyExpression);\n\n    this._regexp = new RegExp(regexpString, \"i\");\n  }\n\n  *findPropsSelectors(styles, prefix, regexp)\n  {\n    for (let style of styles)\n    {\n      if (regexp.test(style.style))\n      {\n        for (let subSelector of style.subSelectors)\n        {\n          if (subSelector.startsWith(\"*\") &&\n              !incompletePrefixRegexp.test(prefix))\n            subSelector = subSelector.substring(1);\n\n          let idx = subSelector.lastIndexOf(\"::\");\n          if (idx != -1)\n            subSelector = subSelector.substring(0, idx);\n\n          yield qualifySelector(subSelector, prefix);\n        }\n      }\n    }\n  }\n\n  *getSelectors(prefix, subtree, styles, targets)\n  {\n    for (let selector of this.findPropsSelectors(styles, prefix, this._regexp))\n      yield [selector, subtree];\n  }\n}\n\nclass Pattern\n{\n  constructor(selectors, text)\n  {\n    this.selectors = selectors;\n    this.text = text;\n  }\n\n  get dependsOnStyles()\n  {\n    return getCachedPropertyValue(\n      this, \"_dependsOnStyles\",\n      () => this.selectors.some(selector => selector.dependsOnStyles)\n    );\n  }\n\n  get dependsOnDOM()\n  {\n    return getCachedPropertyValue(\n      this, \"_dependsOnDOM\",\n      () => this.selectors.some(selector => selector.dependsOnDOM)\n    );\n  }\n\n  get dependsOnStylesAndDOM()\n  {\n    return getCachedPropertyValue(\n      this, \"_dependsOnStylesAndDOM\",\n      () => this.selectors.some(selector => selector.dependsOnStyles &&\n                                            selector.dependsOnDOM)\n    );\n  }\n\n  get maybeDependsOnAttributes()\n  {\n    // Observe changes to attributes if either there's a plain selector that\n    // looks like an ID selector, class selector, or attribute selector in one\n    // of the patterns (e.g. \"a[href='https://example.com/']\")\n    // or there's a properties selector nested inside a has selector\n    // (e.g. \"div:-abp-has(:-abp-properties(color: blue))\")\n    return getCachedPropertyValue(\n      this, \"_maybeDependsOnAttributes\",\n      () => this.selectors.some(\n        selector => selector.maybeDependsOnAttributes ||\n                    (selector instanceof HasSelector &&\n                     selector.dependsOnStyles)\n      )\n    );\n  }\n\n  get dependsOnCharacterData()\n  {\n    // Observe changes to character data only if there's a contains selector in\n    // one of the patterns.\n    return getCachedPropertyValue(\n      this, \"_dependsOnCharacterData\",\n      () => this.selectors.some(selector => selector.dependsOnCharacterData)\n    );\n  }\n\n  get maybeContainsSiblingCombinators()\n  {\n    return getCachedPropertyValue(\n      this, \"_maybeContainsSiblingCombinators\",\n      () => this.selectors.some(\n        selector => selector.maybeContainsSiblingCombinators\n      )\n    );\n  }\n\n  matchesMutationTypes(mutationTypes)\n  {\n    let mutationTypeMatchMap = getCachedPropertyValue(\n      this, \"_mutationTypeMatchMap\",\n      () => new Map([\n        // All types of DOM-dependent patterns are affected by mutations of\n        // type \"childList\".\n        [\"childList\", true],\n        [\"attributes\", this.maybeDependsOnAttributes],\n        [\"characterData\", this.dependsOnCharacterData]\n      ])\n    );\n\n    for (let mutationType of mutationTypes)\n    {\n      if (mutationTypeMatchMap.get(mutationType))\n        return true;\n    }\n\n    return false;\n  }\n}\n\nfunction extractMutationTypes(mutations)\n{\n  let types = new Set();\n\n  for (let mutation of mutations)\n  {\n    types.add(mutation.type);\n\n    // There are only 3 types of mutations: \"attributes\", \"characterData\", and\n    // \"childList\".\n    if (types.size == 3)\n      break;\n  }\n\n  return types;\n}\n\nfunction extractMutationTargets(mutations)\n{\n  if (!mutations)\n    return null;\n\n  let targets = new Set();\n\n  for (let mutation of mutations)\n  {\n    if (mutation.type == \"childList\")\n    {\n      // When new nodes are added, we're interested in the added nodes rather\n      // than the parent.\n      for (let node of mutation.addedNodes)\n        targets.add(node);\n    }\n    else\n    {\n      targets.add(mutation.target);\n    }\n  }\n\n  return [...targets];\n}\n\nfunction filterPatterns(patterns, {stylesheets, mutations})\n{\n  if (!stylesheets && !mutations)\n    return patterns.slice();\n\n  let mutationTypes = mutations ? extractMutationTypes(mutations) : null;\n\n  return patterns.filter(\n    pattern => (stylesheets && pattern.dependsOnStyles) ||\n               (mutations && pattern.dependsOnDOM &&\n                pattern.matchesMutationTypes(mutationTypes))\n  );\n}\n\nfunction shouldObserveAttributes(patterns)\n{\n  return patterns.some(pattern => pattern.maybeDependsOnAttributes);\n}\n\nfunction shouldObserveCharacterData(patterns)\n{\n  return patterns.some(pattern => pattern.dependsOnCharacterData);\n}\n\nexports.ElemHideEmulation = class ElemHideEmulation\n{\n  constructor(hideElemsFunc)\n  {\n    this._minInvocationInterval = MIN_INVOCATION_INTERVAL;\n    this._filteringInProgress = false;\n    this._lastInvocation = -MIN_INVOCATION_INTERVAL;\n    this._scheduledProcessing = null;\n\n    this.document = document;\n    this.hideElemsFunc = hideElemsFunc;\n    this.observer = new MutationObserver(this.observe.bind(this));\n  }\n\n  isSameOrigin(stylesheet)\n  {\n    try\n    {\n      return new URL(stylesheet.href).origin == this.document.location.origin;\n    }\n    catch (e)\n    {\n      // Invalid URL, assume that it is first-party.\n      return true;\n    }\n  }\n\n  /**\n   * Parse the selector\n   * @param {string} selector the selector to parse\n   * @return {Array} selectors is an array of objects,\n   * or null in case of errors.\n   */\n  parseSelector(selector)\n  {\n    if (selector.length == 0)\n      return [];\n\n    let match = abpSelectorRegexp.exec(selector);\n    if (!match)\n      return [new PlainSelector(selector)];\n\n    let selectors = [];\n    if (match.index > 0)\n      selectors.push(new PlainSelector(selector.substring(0, match.index)));\n\n    let startIndex = match.index + match[0].length;\n    let content = parseSelectorContent(selector, startIndex);\n    if (!content)\n    {\n      console.warn(new SyntaxError(\"Failed to parse Adblock Plus \" +\n                                   `selector ${selector} ` +\n                                   \"due to unmatched parentheses.\"));\n      return null;\n    }\n    if (match[1] == \"properties\")\n    {\n      selectors.push(new PropsSelector(content.text));\n    }\n    else if (match[1] == \"has\")\n    {\n      let hasSelectors = this.parseSelector(content.text);\n      if (hasSelectors == null)\n        return null;\n      selectors.push(new HasSelector(hasSelectors));\n    }\n    else if (match[1] == \"contains\")\n    {\n      selectors.push(new ContainsSelector(content.text));\n    }\n    else\n    {\n      // this is an error, can't parse selector.\n      console.warn(new SyntaxError(\"Failed to parse Adblock Plus \" +\n                                   `selector ${selector}, invalid ` +\n                                   `pseudo-class :-abp-${match[1]}().`));\n      return null;\n    }\n\n    let suffix = this.parseSelector(selector.substring(content.end + 1));\n    if (suffix == null)\n      return null;\n\n    selectors.push(...suffix);\n\n    if (selectors.length == 1 && selectors[0] instanceof ContainsSelector)\n    {\n      console.warn(new SyntaxError(\"Failed to parse Adblock Plus \" +\n                                   `selector ${selector}, can't ` +\n                                   \"have a lonely :-abp-contains().\"));\n      return null;\n    }\n    return selectors;\n  }\n\n  /**\n   * Processes the current document and applies all rules to it.\n   * @param {CSSStyleSheet[]} [stylesheets]\n   *    The list of new stylesheets that have been added to the document and\n   *    made reprocessing necessary. This parameter shouldn't be passed in for\n   *    the initial processing, all of document's stylesheets will be considered\n   *    then and all rules, including the ones not dependent on styles.\n   * @param {MutationRecord[]} [mutations]\n   *    The list of DOM mutations that have been applied to the document and\n   *    made reprocessing necessary. This parameter shouldn't be passed in for\n   *    the initial processing, the entire document will be considered\n   *    then and all rules, including the ones not dependent on the DOM.\n   * @param {function} [done]\n   *    Callback to call when done.\n   */\n  _addSelectors(stylesheets, mutations, done)\n  {\n    if (testInfo)\n      testInfo.lastProcessedElements.clear();\n\n    let patterns = filterPatterns(this.patterns, {stylesheets, mutations});\n\n    let elements = [];\n    let elementFilters = [];\n\n    let cssStyles = [];\n\n    // If neither any style sheets nor any DOM mutations have been specified,\n    // do full processing.\n    if (!stylesheets && !mutations)\n      stylesheets = this.document.styleSheets;\n\n    // If there are any DOM mutations and any of the patterns depends on both\n    // style sheets and the DOM (e.g. -abp-has(-abp-properties)), find all the\n    // rules in every style sheet in the document, because we need to run\n    // querySelectorAll afterwards. On the other hand, if we only have patterns\n    // that depend on either styles or DOM both not both (e.g. -abp-contains),\n    // we can skip this part.\n    if (mutations && patterns.some(pattern => pattern.dependsOnStylesAndDOM))\n      stylesheets = this.document.styleSheets;\n\n    for (let stylesheet of stylesheets || [])\n    {\n      // Explicitly ignore third-party stylesheets to ensure consistent behavior\n      // between Firefox and Chrome.\n      if (!this.isSameOrigin(stylesheet))\n        continue;\n\n      let rules;\n      try\n      {\n        rules = stylesheet.cssRules;\n      }\n      catch (e)\n      {\n        // On Firefox, there is a chance that an InvalidAccessError\n        // get thrown when accessing cssRules. Just skip the stylesheet\n        // in that case.\n        // See https://searchfox.org/mozilla-central/rev/f65d7528e34ef1a7665b4a1a7b7cdb1388fcd3aa/layout/style/StyleSheet.cpp#699\n        continue;\n      }\n\n      if (!rules)\n        continue;\n\n      for (let rule of rules)\n      {\n        if (rule.type != rule.STYLE_RULE)\n          continue;\n\n        cssStyles.push(stringifyStyle(rule));\n      }\n    }\n\n    let targets = extractMutationTargets(mutations);\n\n    let pattern = null;\n    let generator = null;\n\n    let processPatterns = () =>\n    {\n      let cycleStart = performance.now();\n\n      if (!pattern)\n      {\n        if (!patterns.length)\n        {\n          if (elements.length > 0)\n            this.hideElemsFunc(elements, elementFilters);\n          if (typeof done == \"function\")\n            done();\n          return;\n        }\n\n        pattern = patterns.shift();\n\n        let evaluationTargets = targets;\n\n        // If the pattern appears to contain any sibling combinators, we can't\n        // easily optimize based on the mutation targets. Since this is a\n        // special case, skip the optimization. By setting it to null here we\n        // make sure we process the entire DOM.\n        if (pattern.maybeContainsSiblingCombinators)\n          evaluationTargets = null;\n\n        generator = evaluate(pattern.selectors, 0, \"\",\n                             this.document, cssStyles, evaluationTargets);\n      }\n      for (let selector of generator)\n      {\n        if (selector != null)\n        {\n          for (let element of this.document.querySelectorAll(selector))\n          {\n            elements.push(element);\n            elementFilters.push(pattern.text);\n          }\n        }\n        if (performance.now() - cycleStart > MAX_SYNCHRONOUS_PROCESSING_TIME)\n        {\n          setTimeout(processPatterns, 0);\n          return;\n        }\n      }\n      pattern = null;\n      return processPatterns();\n    };\n\n    processPatterns();\n  }\n\n  // This property is only used in the tests\n  // to shorten the invocation interval\n  get minInvocationInterval()\n  {\n    return this._minInvocationInterval;\n  }\n\n  set minInvocationInterval(interval)\n  {\n    this._minInvocationInterval = interval;\n  }\n\n  /**\n   * Re-run filtering either immediately or queued.\n   * @param {CSSStyleSheet[]} [stylesheets]\n   *    new stylesheets to be processed. This parameter should be omitted\n   *    for full reprocessing.\n   * @param {MutationRecord[]} [mutations]\n   *    new DOM mutations to be processed. This parameter should be omitted\n   *    for full reprocessing.\n   */\n  queueFiltering(stylesheets, mutations)\n  {\n    let completion = () =>\n    {\n      this._lastInvocation = performance.now();\n      this._filteringInProgress = false;\n      if (this._scheduledProcessing)\n      {\n        let params = Object.assign({}, this._scheduledProcessing);\n        this._scheduledProcessing = null;\n        this.queueFiltering(params.stylesheets, params.mutations);\n      }\n    };\n\n    if (this._scheduledProcessing)\n    {\n      if (!stylesheets && !mutations)\n      {\n        this._scheduledProcessing = {};\n      }\n      else if (this._scheduledProcessing.stylesheets ||\n               this._scheduledProcessing.mutations)\n      {\n        if (stylesheets)\n        {\n          if (!this._scheduledProcessing.stylesheets)\n            this._scheduledProcessing.stylesheets = [];\n          this._scheduledProcessing.stylesheets.push(...stylesheets);\n        }\n        if (mutations)\n        {\n          if (!this._scheduledProcessing.mutations)\n            this._scheduledProcessing.mutations = [];\n          this._scheduledProcessing.mutations.push(...mutations);\n        }\n      }\n    }\n    else if (this._filteringInProgress)\n    {\n      this._scheduledProcessing = {stylesheets, mutations};\n    }\n    else if (performance.now() - this._lastInvocation <\n             this.minInvocationInterval)\n    {\n      this._scheduledProcessing = {stylesheets, mutations};\n      setTimeout(\n        () =>\n        {\n          let params = Object.assign({}, this._scheduledProcessing);\n          this._filteringInProgress = true;\n          this._scheduledProcessing = null;\n          this._addSelectors(params.stylesheets, params.mutations, completion);\n        },\n        this.minInvocationInterval - (performance.now() - this._lastInvocation)\n      );\n    }\n    else if (this.document.readyState == \"loading\")\n    {\n      this._scheduledProcessing = {stylesheets, mutations};\n      let handler = () =>\n      {\n        this.document.removeEventListener(\"DOMContentLoaded\", handler);\n        let params = Object.assign({}, this._scheduledProcessing);\n        this._filteringInProgress = true;\n        this._scheduledProcessing = null;\n        this._addSelectors(params.stylesheets, params.mutations, completion);\n      };\n      this.document.addEventListener(\"DOMContentLoaded\", handler);\n    }\n    else\n    {\n      this._filteringInProgress = true;\n      this._addSelectors(stylesheets, mutations, completion);\n    }\n  }\n\n  onLoad(event)\n  {\n    let stylesheet = event.target.sheet;\n    if (stylesheet)\n      this.queueFiltering([stylesheet]);\n  }\n\n  observe(mutations)\n  {\n    if (testInfo)\n    {\n      // In test mode, filter out any mutations likely done by us\n      // (i.e. style=\"display: none !important\"). This makes it easier to\n      // observe how the code responds to DOM mutations.\n      mutations = mutations.filter(\n        ({type, attributeName, target: {style: newValue}, oldValue}) =>\n          !(type == \"attributes\" && attributeName == \"style\" &&\n            newValue.display == \"none\" &&\n            toCSSStyleDeclaration(oldValue).display != \"none\")\n      );\n\n      if (mutations.length == 0)\n        return;\n    }\n\n    this.queueFiltering(null, mutations);\n  }\n\n  apply(patterns)\n  {\n    this.patterns = [];\n    for (let pattern of patterns)\n    {\n      let selectors = this.parseSelector(pattern.selector);\n      if (selectors != null && selectors.length > 0)\n        this.patterns.push(new Pattern(selectors, pattern.text));\n    }\n\n    if (this.patterns.length > 0)\n    {\n      this.queueFiltering();\n      let attributes = shouldObserveAttributes(this.patterns);\n      this.observer.observe(\n        this.document,\n        {\n          childList: true,\n          attributes,\n          attributeOldValue: attributes && !!testInfo,\n          characterData: shouldObserveCharacterData(this.patterns),\n          subtree: true\n        }\n      );\n      this.document.addEventListener(\"load\", this.onLoad.bind(this), true);\n    }\n  }\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./adblockpluscore/lib/content/elemHideEmulation.js\n// module id = 2\n// module chunks = 0","/*\n * This file is part of Adblock Plus <https://adblockplus.org/>,\n * Copyright (C) 2006-present eyeo GmbH\n *\n * Adblock Plus is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License version 3 as\n * published by the Free Software Foundation.\n *\n * Adblock Plus is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with Adblock Plus.  If not, see <http://www.gnu.org/licenses/>.\n */\n\n/** @module */\n\n\"use strict\";\n\n/**\n * Converts raw text into a regular expression string\n * @param {string} text the string to convert\n * @return {string} regular expression representation of the text\n * @package\n */\nexports.textToRegExp = function textToRegExp(text)\n{\n  return text.replace(/[-/\\\\^$*+?.()|[\\]{}]/g, \"\\\\$&\");\n};\n\n/**\n * Converts filter text into regular expression string\n * @param {string} text as in Filter()\n * @return {string} regular expression representation of filter text\n * @package\n */\nexports.filterToRegExp = function filterToRegExp(text)\n{\n  // remove multiple wildcards\n  text = text.replace(/\\*+/g, \"*\");\n\n  // remove leading wildcard\n  if (text[0] == \"*\")\n    text = text.substring(1);\n\n  // remove trailing wildcard\n  if (text[text.length - 1] == \"*\")\n    text = text.substring(0, text.length - 1);\n\n  return text\n    // remove anchors following separator placeholder\n    .replace(/\\^\\|$/, \"^\")\n    // escape special symbols\n    .replace(/\\W/g, \"\\\\$&\")\n    // replace wildcards by .*\n    .replace(/\\\\\\*/g, \".*\")\n    // process separator placeholders (all ANSI characters but alphanumeric\n    // characters and _%.-)\n    .replace(/\\\\\\^/g, \"(?:[\\\\x00-\\\\x24\\\\x26-\\\\x2C\\\\x2F\\\\x3A-\\\\x40\\\\x5B-\\\\x5E\\\\x60\\\\x7B-\\\\x7F]|$)\")\n    // process extended anchor at expression start\n    .replace(/^\\\\\\|\\\\\\|/, \"^[\\\\w\\\\-]+:\\\\/+(?!\\\\/)(?:[^\\\\/]+\\\\.)?\")\n    // process anchor at expression start\n    .replace(/^\\\\\\|/, \"^\")\n    // process anchor at expression end\n    .replace(/\\\\\\|$/, \"$\");\n};\n\nlet splitSelector = exports.splitSelector = function splitSelector(selector)\n{\n  if (!selector.includes(\",\"))\n    return [selector];\n\n  let selectors = [];\n  let start = 0;\n  let level = 0;\n  let sep = \"\";\n\n  for (let i = 0; i < selector.length; i++)\n  {\n    let chr = selector[i];\n\n    if (chr == \"\\\\\")        // ignore escaped characters\n    {\n      i++;\n    }\n    else if (chr == sep)    // don't split within quoted text\n    {\n      sep = \"\";             // e.g. [attr=\",\"]\n    }\n    else if (sep == \"\")\n    {\n      if (chr == '\"' || chr == \"'\")\n      {\n        sep = chr;\n      }\n      else if (chr == \"(\")  // don't split between parentheses\n      {\n        level++;            // e.g. :matches(div,span)\n      }\n      else if (chr == \")\")\n      {\n        level = Math.max(0, level - 1);\n      }\n      else if (chr == \",\" && level == 0)\n      {\n        selectors.push(selector.substring(start, i));\n        start = i + 1;\n      }\n    }\n  }\n\n  selectors.push(selector.substring(start));\n  return selectors;\n};\n\nfunction findTargetSelectorIndex(selector)\n{\n  let index = 0;\n  let whitespace = 0;\n  let scope = [];\n\n  // Start from the end of the string and go character by character, where each\n  // character is a Unicode code point.\n  for (let character of [...selector].reverse())\n  {\n    let currentScope = scope[scope.length - 1];\n\n    if (character == \"'\" || character == \"\\\"\")\n    {\n      // If we're already within the same type of quote, close the scope;\n      // otherwise open a new scope.\n      if (currentScope == character)\n        scope.pop();\n      else\n        scope.push(character);\n    }\n    else if (character == \"]\" || character == \")\")\n    {\n      // For closing brackets and parentheses, open a new scope only if we're\n      // not within a quote. Within quotes these characters should have no\n      // meaning.\n      if (currentScope != \"'\" && currentScope != \"\\\"\")\n        scope.push(character);\n    }\n    else if (character == \"[\")\n    {\n      // If we're already within a bracket, close the scope.\n      if (currentScope == \"]\")\n        scope.pop();\n    }\n    else if (character == \"(\")\n    {\n      // If we're already within a parenthesis, close the scope.\n      if (currentScope == \")\")\n        scope.pop();\n    }\n    else if (!currentScope)\n    {\n      // At the top level (not within any scope), count the whitespace if we've\n      // encountered it. Otherwise if we've hit one of the combinators,\n      // terminate here; otherwise if we've hit a non-colon character,\n      // terminate here.\n      if (/\\s/.test(character))\n        whitespace++;\n      else if ((character == \">\" || character == \"+\" || character == \"~\") ||\n               (whitespace > 0 && character != \":\"))\n        break;\n    }\n\n    // Zero out the whitespace count if we've entered a scope.\n    if (scope.length > 0)\n      whitespace = 0;\n\n    // Increment the index by the size of the character. Note that for Unicode\n    // composite characters (like emoji) this will be more than one.\n    index += character.length;\n  }\n\n  return selector.length - index + whitespace;\n}\n\n/**\n * Qualifies a CSS selector with a qualifier, which may be another CSS selector\n * or an empty string. For example, given the selector \"div.bar\" and the\n * qualifier \"#foo\", this function returns \"div#foo.bar\".\n * @param {string} selector The selector to qualify.\n * @param {string} qualifier The qualifier with which to qualify the selector.\n * @returns {string} The qualified selector.\n * @package\n */\nexports.qualifySelector = function qualifySelector(selector, qualifier)\n{\n  let qualifiedSelector = \"\";\n\n  let qualifierTargetSelectorIndex = findTargetSelectorIndex(qualifier);\n  let [, qualifierType = \"\"] =\n    /^([a-z][a-z-]*)?/i.exec(qualifier.substring(qualifierTargetSelectorIndex));\n\n  for (let sub of splitSelector(selector))\n  {\n    sub = sub.trim();\n\n    qualifiedSelector += \", \";\n\n    let index = findTargetSelectorIndex(sub);\n\n    // Note that the first group in the regular expression is optional. If it\n    // doesn't match (e.g. \"#foo::nth-child(1)\"), type will be an empty string.\n    let [, type = \"\", rest] =\n      /^([a-z][a-z-]*)?\\*?(.*)/i.exec(sub.substring(index));\n\n    if (type == qualifierType)\n      type = \"\";\n\n    // If the qualifier ends in a combinator (e.g. \"body #foo>\"), we put the\n    // type and the rest of the selector after the qualifier\n    // (e.g. \"body #foo>div.bar\"); otherwise (e.g. \"body #foo\") we merge the\n    // type into the qualifier (e.g. \"body div#foo.bar\").\n    if (/[\\s>+~]$/.test(qualifier))\n      qualifiedSelector += sub.substring(0, index) + qualifier + type + rest;\n    else\n      qualifiedSelector += sub.substring(0, index) + type + qualifier + rest;\n  }\n\n  // Remove the initial comma and space.\n  return qualifiedSelector.substring(2);\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./adblockpluscore/lib/common.js\n// module id = 3\n// module chunks = 0","/*\n * This file is part of Adblock Plus <https://adblockplus.org/>,\n * Copyright (C) 2006-present eyeo GmbH\n *\n * Adblock Plus is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License version 3 as\n * published by the Free Software Foundation.\n *\n * Adblock Plus is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with Adblock Plus.  If not, see <http://www.gnu.org/licenses/>.\n */\n\n\"use strict\";\n\nlet randomEventName = \"abp-request-\" + Math.random().toString(36).substr(2);\n\n// Proxy \"should we block?\" messages from checkRequest inside the injected\n// code to the background page and back again.\ndocument.addEventListener(randomEventName, event =>\n{\n  let {url} = event.detail;\n\n  browser.runtime.sendMessage({\n    type: \"request.blockedByRTCWrapper\",\n    url\n  }).then(block =>\n  {\n    document.dispatchEvent(new CustomEvent(\n      randomEventName + \"-\" + url, {detail: block}\n    ));\n  });\n});\n\nfunction injected(eventName, injectedIntoContentWindow)\n{\n  let checkRequest;\n\n  /*\n   * Frame context wrapper\n   *\n   * For some edge-cases Chrome will not run content scripts inside of frames.\n   * Website have started to abuse this fact to access unwrapped APIs via a\n   * frame's contentWindow (#4586, 5207). Therefore until Chrome runs content\n   * scripts consistently for all frames we must take care to (re)inject our\n   * wrappers when the contentWindow is accessed.\n   */\n  let injectedToString = Function.prototype.toString.bind(injected);\n  let injectedFrames = new WeakSet();\n  let injectedFramesAdd = WeakSet.prototype.add.bind(injectedFrames);\n  let injectedFramesHas = WeakSet.prototype.has.bind(injectedFrames);\n\n  function injectIntoContentWindow(contentWindow)\n  {\n    if (contentWindow && !injectedFramesHas(contentWindow))\n    {\n      injectedFramesAdd(contentWindow);\n      try\n      {\n        contentWindow[eventName] = checkRequest;\n        contentWindow.eval(\n          \"(\" + injectedToString() + \")('\" + eventName + \"', true);\"\n        );\n        delete contentWindow[eventName];\n      }\n      catch (e) {}\n    }\n  }\n\n  for (let element of [HTMLFrameElement, HTMLIFrameElement, HTMLObjectElement])\n  {\n    let contentDocumentDesc = Object.getOwnPropertyDescriptor(\n      element.prototype, \"contentDocument\"\n    );\n    let contentWindowDesc = Object.getOwnPropertyDescriptor(\n      element.prototype, \"contentWindow\"\n    );\n\n    // Apparently in HTMLObjectElement.prototype.contentWindow does not exist\n    // in older versions of Chrome such as 51.\n    if (!contentWindowDesc)\n      continue;\n\n    let getContentDocument = Function.prototype.call.bind(\n      contentDocumentDesc.get\n    );\n    let getContentWindow = Function.prototype.call.bind(\n      contentWindowDesc.get\n    );\n\n    contentWindowDesc.get = function()\n    {\n      let contentWindow = getContentWindow(this);\n      injectIntoContentWindow(contentWindow);\n      return contentWindow;\n    };\n    contentDocumentDesc.get = function()\n    {\n      injectIntoContentWindow(getContentWindow(this));\n      return getContentDocument(this);\n    };\n    Object.defineProperty(element.prototype, \"contentWindow\",\n                          contentWindowDesc);\n    Object.defineProperty(element.prototype, \"contentDocument\",\n                          contentDocumentDesc);\n  }\n\n  /*\n   * RTCPeerConnection wrapper\n   *\n   * The webRequest API in Chrome does not yet allow the blocking of\n   * WebRTC connections.\n   * See https://bugs.chromium.org/p/chromium/issues/detail?id=707683\n   */\n  let RealCustomEvent = window.CustomEvent;\n\n  // If we've been injected into a frame via contentWindow then we can simply\n  // grab the copy of checkRequest left for us by the parent document. Otherwise\n  // we need to set it up now, along with the event handling functions.\n  if (injectedIntoContentWindow)\n    checkRequest = window[eventName];\n  else\n  {\n    let addEventListener = document.addEventListener.bind(document);\n    let dispatchEvent = document.dispatchEvent.bind(document);\n    let removeEventListener = document.removeEventListener.bind(document);\n    checkRequest = (url, callback) =>\n    {\n      let incomingEventName = eventName + \"-\" + url;\n\n      function listener(event)\n      {\n        callback(event.detail);\n        removeEventListener(incomingEventName, listener);\n      }\n      addEventListener(incomingEventName, listener);\n\n      dispatchEvent(new RealCustomEvent(eventName, {detail: {url}}));\n    };\n  }\n\n  // Only to be called before the page's code, not hardened.\n  function copyProperties(src, dest, properties)\n  {\n    for (let name of properties)\n    {\n      if (Object.prototype.hasOwnProperty.call(src, name))\n      {\n        Object.defineProperty(dest, name,\n                              Object.getOwnPropertyDescriptor(src, name));\n      }\n    }\n  }\n\n  let RealRTCPeerConnection = window.RTCPeerConnection ||\n                              window.webkitRTCPeerConnection;\n\n  // Firefox has the option (media.peerconnection.enabled) to disable WebRTC\n  // in which case RealRTCPeerConnection is undefined.\n  if (typeof RealRTCPeerConnection != \"undefined\")\n  {\n    let closeRTCPeerConnection = Function.prototype.call.bind(\n      RealRTCPeerConnection.prototype.close\n    );\n    let RealArray = Array;\n    let RealString = String;\n    let {create: createObject, defineProperty} = Object;\n\n    let normalizeUrl = url =>\n    {\n      if (typeof url != \"undefined\")\n        return RealString(url);\n    };\n\n    let safeCopyArray = (originalArray, transform) =>\n    {\n      if (originalArray == null || typeof originalArray != \"object\")\n        return originalArray;\n\n      let safeArray = RealArray(originalArray.length);\n      for (let i = 0; i < safeArray.length; i++)\n      {\n        defineProperty(safeArray, i, {\n          configurable: false, enumerable: false, writable: false,\n          value: transform(originalArray[i])\n        });\n      }\n      defineProperty(safeArray, \"length\", {\n        configurable: false, enumerable: false, writable: false,\n        value: safeArray.length\n      });\n      return safeArray;\n    };\n\n    // It would be much easier to use the .getConfiguration method to obtain\n    // the normalized and safe configuration from the RTCPeerConnection\n    // instance. Unfortunately its not implemented as of Chrome unstable 59.\n    // See https://www.chromestatus.com/feature/5271355306016768\n    let protectConfiguration = configuration =>\n    {\n      if (configuration == null || typeof configuration != \"object\")\n        return configuration;\n\n      let iceServers = safeCopyArray(\n        configuration.iceServers,\n        iceServer =>\n        {\n          let {url, urls} = iceServer;\n\n          // RTCPeerConnection doesn't iterate through pseudo Arrays of urls.\n          if (typeof urls != \"undefined\" && !(urls instanceof RealArray))\n            urls = [urls];\n\n          return createObject(iceServer, {\n            url: {\n              configurable: false, enumerable: false, writable: false,\n              value: normalizeUrl(url)\n            },\n            urls: {\n              configurable: false, enumerable: false, writable: false,\n              value: safeCopyArray(urls, normalizeUrl)\n            }\n          });\n        }\n      );\n\n      return createObject(configuration, {\n        iceServers: {\n          configurable: false, enumerable: false, writable: false,\n          value: iceServers\n        }\n      });\n    };\n\n    let checkUrl = (peerconnection, url) =>\n    {\n      checkRequest(url, blocked =>\n      {\n        if (blocked)\n        {\n          // Calling .close() throws if already closed.\n          try\n          {\n            closeRTCPeerConnection(peerconnection);\n          }\n          catch (e) {}\n        }\n      });\n    };\n\n    let checkConfiguration = (peerconnection, configuration) =>\n    {\n      if (configuration && configuration.iceServers)\n      {\n        for (let i = 0; i < configuration.iceServers.length; i++)\n        {\n          let iceServer = configuration.iceServers[i];\n          if (iceServer)\n          {\n            if (iceServer.url)\n              checkUrl(peerconnection, iceServer.url);\n\n            if (iceServer.urls)\n            {\n              for (let j = 0; j < iceServer.urls.length; j++)\n                checkUrl(peerconnection, iceServer.urls[j]);\n            }\n          }\n        }\n      }\n    };\n\n    // Chrome unstable (tested with 59) has already implemented\n    // setConfiguration, so we need to wrap that if it exists too.\n    // https://www.chromestatus.com/feature/5596193748942848\n    if (RealRTCPeerConnection.prototype.setConfiguration)\n    {\n      let realSetConfiguration = Function.prototype.call.bind(\n        RealRTCPeerConnection.prototype.setConfiguration\n      );\n\n      RealRTCPeerConnection.prototype.setConfiguration = function(configuration)\n      {\n        configuration = protectConfiguration(configuration);\n\n        // Call the real method first, so that validates the configuration for\n        // us. Also we might as well since checkRequest is asynchronous anyway.\n        realSetConfiguration(this, configuration);\n        checkConfiguration(this, configuration);\n      };\n    }\n\n    let WrappedRTCPeerConnection = function(...args)\n    {\n      if (!(this instanceof WrappedRTCPeerConnection))\n        return RealRTCPeerConnection();\n\n      let configuration = protectConfiguration(args[0]);\n\n      // Since the old webkitRTCPeerConnection constructor takes an optional\n      // second argument we need to take care to pass that through. Necessary\n      // for older versions of Chrome such as 51.\n      let constraints = undefined;\n      if (args.length > 1)\n        constraints = args[1];\n\n      let peerconnection = new RealRTCPeerConnection(configuration,\n                                                     constraints);\n      checkConfiguration(peerconnection, configuration);\n      return peerconnection;\n    };\n\n    WrappedRTCPeerConnection.prototype = RealRTCPeerConnection.prototype;\n\n    let boundWrappedRTCPeerConnection = WrappedRTCPeerConnection.bind();\n    copyProperties(RealRTCPeerConnection, boundWrappedRTCPeerConnection,\n                   [\"generateCertificate\", \"name\", \"prototype\"]);\n    RealRTCPeerConnection.prototype.constructor = boundWrappedRTCPeerConnection;\n\n    if (\"RTCPeerConnection\" in window)\n      window.RTCPeerConnection = boundWrappedRTCPeerConnection;\n    if (\"webkitRTCPeerConnection\" in window)\n      window.webkitRTCPeerConnection = boundWrappedRTCPeerConnection;\n  }\n}\n\nif (document instanceof HTMLDocument)\n{\n  let sandbox;\n\n  // We have to wrap the following code in a try catch\n  // because of this Microsoft Edge bug:\n  // https://developer.microsoft.com/en-us/microsoft-edge/platform/issues/19082980/\n  try\n  {\n    sandbox = window.frameElement &&\n              window.frameElement.getAttribute(\"sandbox\");\n  }\n  catch (e) {}\n\n  if (typeof sandbox != \"string\" || /(^|\\s)allow-scripts(\\s|$)/i.test(sandbox))\n  {\n    let script = document.createElement(\"script\");\n    let code = \"(\" + injected + \")('\" + randomEventName + \"');\";\n\n    script.type = \"application/javascript\";\n    script.async = false;\n\n    // Firefox 58 only bypasses site CSPs when assigning to 'src',\n    // while Chrome 67 and Microsoft Edge 44.17763.1.0\n    // only bypass site CSPs when using 'textContent'.\n    if (browser.runtime.getURL(\"\").startsWith(\"moz-extension://\"))\n    {\n      let url = URL.createObjectURL(new Blob([code]));\n      script.src = url;\n      document.documentElement.appendChild(script);\n      URL.revokeObjectURL(url);\n    }\n    else\n    {\n      script.textContent = code;\n      document.documentElement.appendChild(script);\n    }\n\n    document.documentElement.removeChild(script);\n  }\n}\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./inject.preload.js\n// module id = 4\n// module chunks = 0"],"sourceRoot":""}   
7
29 tháng 10 2021

máy tính bạn ý hư rồi nên mik xin gửi lời nói này cho máy tính của bạn

“xin vĩnh biệt cụ” ;-;

29 tháng 10 2021

trả lời đi

ĐÁP ÁN VÒNG 2 CUỘC THI TIN HỌC: * ĐỀ 1: Câu 1: CÂU 1: const fi='uc.inp'; fo='uc.out'; var f: text; a,b,c : integer; function uc(x,y): integer; var z: integer; begin while y<>0 do begin z:=x mod y; x:=y; y:=z; end; uc:=x; end; procedure ip; begin assign(f,fi); reset(f); read(f,a,b,c); close(f); end; procedure out; begin assign(f,fo); rewrite(f); write(f,uc(uc(a,b),c); close(f); end; begin ip; out; end. Câu 2: const fi='SN.inp'; ...
Đọc tiếp

ĐÁP ÁN VÒNG 2 CUỘC THI TIN HỌC:

* ĐỀ 1:

Câu 1:

CÂU 1:
const fi='uc.inp';
fo='uc.out';
var f: text;
a,b,c : integer;
function uc(x,y): integer;
var z: integer;
begin
while y<>0 do
begin
z:=x mod y;
x:=y;
y:=z;
end;
uc:=x;
end;
procedure ip;
begin
assign(f,fi);
reset(f);
read(f,a,b,c);
close(f);
end;
procedure out;
begin
assign(f,fo);
rewrite(f);
write(f,uc(uc(a,b),c);
close(f);
end;
begin
ip;
out;
end.

Câu 2:

const fi='SN.inp';
fo='SN.out';
var
f:text;
i,n:integer;
s:real;
procedure ip;
begin
assign(f,fi);
reset(f);
read(f,n);
close(f);
end;
procedure out;
begin
assign(f,fo);
rewrite(f);
s:=0;
for i:= 1 to n do
begin
if i mod 2 <> 0 then
s:=s+(i/(i+1));
if i mod 2 = 0 then
s:=s-(i/(i+1));
end;
write(f,s:0:2);
close(f);
end;
BEGIN
ip;
out;
END.

Câu 3:

const fi='SSNT.inp';
fo='SSNT.out';
var
f:text;
n,i,max,j:integer;
s:string;
a:array[1..32000] of integer;
function nt(x:integer):boolean;
var
i:integer;
begin
nt:=false;
if x < 2 then exit;
for i:= 2 to trunc(sqrt(x)) do
if x mod i = 0 then exit;
nt:=true;
end;
function snt(x:integer):boolean;
begin
snt:=false;
if x= 0 then exit;
while nt(x) = true do
x := x div 10;
if x = 0 then snt:=true;
end;
procedure ip;
begin
assign(f,fi);
reset(f);
max:=a[1];
readln(f,n);
for i:= 1 to n do
begin
read(f,a[i]);
if( a[i] < max ) and (nt(a[i]) = true) then
max:=a[i];
end;
close(f);
end;
procedure out;
begin
assign(f,fo);
rewrite(f);
writeln(f,max);
max:=0;
for i:= 1 to n do
begin
if snt(a[i]) = true then
begin
str(a[i],s);
if length(s) = 2 then
max:=max+a[i];
s:='';
end
else
a[i]:=-32000;
end;
writeln(f,max);
for i:= 1 to n-1 do
for j :=i+1 to n do
if a[i] > a[j] then
begin
max:=a[i];
a[i]:=a[j];
a[j]:=max;
end;
for i:= 1 to n do
if (a[i] > 0) and (a[i] <> a[i-1]) then write(f,a[i],' ');
close(f);
end;
BEGIN
ip;
out;
END.

CÂU 4:

const fi='TUOI.INP';
fo='TUOI.OUT';
var f: text;
a,b: byte;
procedure ip;
begin
assign(f,fi);
reset(f);
read(f,a,b);
close(f);
end;
procedure out;
begin
assign(f,fo);
rewrite(f);
if (x=y*2) and (x>18) and (x-y>=18) then write(f,'CO') else write(f,x-y*2);
close(f);
end;
begin
ip;
out;
end.

const fi='CM.INP';

fo='CM.OUT';

var f: text;

a,n,b,k: integer;

a1: array[1..32000] of integer;

function nt(x: integer): boolean;

var i: integer;

begin

nt:=false;

if x<2 then exit;

for i:=2 to trunc(sqrt(x)) do if x mod i=0 then exit;

nt:=true;

end;

procedure ip;

begin

assign(f,fi);

reset(f);

read(f,n);

close(f);

end;

procedure out;

begin

assign(f,fo);

rewrite(f);

d:=0;

for a:=1 to k do

if nt(a) then

begin

inc(d);

a1[d]:=a;

end;

for a:=1 to d do

for b:=x to d do

if a1[a]+a1[b]=k then writeln(f,a1[a],'+',a1[b]);

end;

close(f);

end;

begin

ip;

out;

end.

*ĐỀ 2 :

BÀI LÀM CỦA BẠN LÊ HOÀNG THẮNG:

//----------------------------CAU 1--------------------------------

var s,d,n,i,u:longint;
a:array[0..32001] of longint;
f:text;
function ucln(x,y:longint):longint;
begin
if y=0 then exit(x) else exit(ucln(y,x mod y));
end;
begin
assign(f,'ucln.inp');reset(f);
readln(f,n);
for i:=1 to n do read(f,a[i]); close(f);
u:=a[1];
for i:=2 to n do u:=ucln(u,a[i]);
assign(f,'ucln.out');rewrite(f);
write(f,'UCLN: ',u,'; UC: ');
for i:=1 to u do if u mod i=0 then
begin
if i<>u then write(f,i,',') else write(f,i);
if i<10 then inc(d) else inc(s,i);
end;
writeln(f);
writeln(f,d); write(f,s);
close(f);
end.

//----------------------------CAU 2--------------------------------

var n,i:longint;
s:real;
f:text;
begin
assign(f,'sn.inp');reset(f);
readln(f,n); close(f);
for i:=1 to n do if odd(i) then s:=s-i/(i+1) else s:=s+i/(i+1);
assign(f,'sn.out');rewrite(f);
write(f,s:0:2);
close(f);
end.

//----------------------------CAU 3--------------------------------

var a:array[0..1000000] of boolean;
b:array[0..1000000] of longint;
i,j,k,n,d:longint;
f:text;
procedure taosang(n:longint);
var i,j:longint;
begin
for i:=2 to trunc(sqrt(n)) do if not(a[i]) then
begin
j:=i*i;
while j<=n do begin a[j]:=true; inc(j,i); end;
end;
end;
begin
assign(f,'boso.inp');reset(f);
readln(f,n); taosang(n); close(f);
assign(f,'boso.out');rewrite(f);
for i:=2 to n do if not(a[i]) then
begin
inc(d);
b[d]:=i;
end;
for i:=1 to d do
for j:=i to d do
if (n-b[i]-b[j]>=b[j]) and not(a[n-b[i]-b[j]]) then
writeln(f,b[i],' ',b[j],' ',n-b[i]-b[j]);
close(f);
end.

//----------------------------CAU 4--------------------------------

THAM KHẢO ĐỀ 1.

//----------------------------CAU 5--------------------------------

var n,i,s,t:longint;
f:text;
begin
assign(f,'u.inp');reset(f);
readln(f,n); t:=n; close(f);
assign(f,'u.out');rewrite(f);
for i:=2 to trunc(sqrt(n)) do
begin
if n mod i=0 then
begin
write(f,i,' ');
repeat n:=n div i until n mod i>0;
end;
if t mod (i*i)=0 then inc(s,i*i);
end;
writeln(f);
write(f,s+1);
close(f);
end.

*ĐỀ CHUNG:

BÀI LÀM CỦA BẠN ĐÀO XUÂN SƠN :

Câu 1:

const fi='TCS.inp';
fo='TCS.out';
var
f:text;
x:char;
tg:byte;
s:integer;
CODE:integer;
procedure ip;
begin
assign(f,fi);
reset(f);
s:=0;
while not(eof(f)) do
begin
read(f,x);
if x in ['0'..'9'] then
begin
val(x,tg,CODE);
s:=s+tg;
end;
end;
close(f);
end;
procedure out;
begin
assign(f,fo);
rewrite(f);
write(f,s);
close(f);
end;
BEGIN
ip;
out;
END.

Câu 2:

const fi='t.inp';
fo='t.out';
var
f:text;
s:string;
i:byte;
procedure ip;
begin
assign(f,fi);
reset(f);
read(f,s);
close(f);
end;
procedure out;
begin
assign(f,fo);
rewrite(f);
s[1]:=upcase(s[1]);
for i:= 2 to length(s) do
if s[i-1] <> #32 then
s[i]:=lowercase(s[i]) else
s[i]:=upcase(s[i]);
write(f,s);
close(f);
end;
BEGIN
ip;
out;
END.

1
8 tháng 1 2020

Em dốt tin lắm cô ơi, cô tạo khóa học nào đi, cô còn kèm em học yeu

18 tháng 3 2020

Từ nào là các từ khóa trong chương trình:

A. Begin, Program, Write, Uses, Read

B. Program, Var, Begin, Uses, Const, End

C. End, Read, Var, Const, program

D. Program, Begin, End, Uses, integer

18 tháng 3 2020

D

20 tháng 10 2018

chắc có hoặc ko?

20 tháng 10 2018

ha

25 tháng 6 2020

A/ Sai.

Sửa: Var x:array[10..13] of integer;

B/ Sai.

Sửa: S:= 0; n:= 0; while S < 50 do

begin n:= n + 1; S:= S + n; end;

C/ Sai.

Sửa: for i:= 1 to 10 do writeln('A');

D/ Sai.

Sửa x: integer; begin for x:= 1 to 10 do writeln('A'); end.

BÀI THỰC HÀNHTuần 25 (Tiết 1)Bài 1: Cho mãng gồm n phần tử là số thực.a.Tìm hai phần tử liên tiếp nhau có tổng bằng n.b. Tính khoảng cáhc giữa hai vị trí của phần tửlớn nhất và bé nhất đầu tiên trên A.{Chương trình}Program Tuan25_Bai1;Uses crt;VarA: array[1…..100] of real;Max, min : realI, n, Vtmax, Vtmin = integer;BeginWriteln(‘nhap n:’); readln(n);For i: 1 to n do;BeginWrite(‘[‘,I,’]=’); readln(A[i]);End.i:=1;{Tìm...
Đọc tiếp

BÀI THỰC HÀNH

Tuần 25 (Tiết 1)

Bài 1: Cho mãng gồm n phần tử là số thực.

a.Tìm hai phần tử liên tiếp nhau có tổng bằng n.

b. Tính khoảng cáhc giữa hai vị trí của phần tửlớn nhất và bé nhất đầu tiên trên A.

{Chương trình}

Program Tuan25_Bai1;

Uses crt;

Var

A: array[1…..100] of real;

Max, min : real

I, n, Vtmax, Vtmin = integer;

Begin

Writeln(‘nhap n:’); readln(n);

For i: 1 to n do;

Begin

Write(‘[‘,I,’]=’); readln(A[i]);

End.

i:=1;

{Tìm hai phần tử liên tiếp nhau có tổng bằng n}

While (A[i] + A[i+1]) <> n) and (i<= n-1) do i:=i+1

If i>=n then write (‘hai phan tu co chi so la:’,i,’ va’,i+1);

{Tính khoảng cáhc giữa hai vị trí của phần tử lớn nhất và bé nhất đầu tiên trên A}

Max=A[1];

Min:A[1];

For i:1 to n do

If max < A[i] then

Begin

Vtmax:= i; Max:=A[i];

End

If min > A[i] then

Begin

Vtmin: i; Min=A[i];

End

Writeln (‘khoangr cach giua 2 phan tu max vaf min la:’,abs(Vtmax – Vtmin));

Readln;

End

1
2 tháng 3 2022

???!!!